UNPKG

@harmoniclabs/buildooor

Version:

Cardano transaction builder in typescript

80 lines (79 loc) 3.95 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.keepRelevant = void 0; var cardano_ledger_ts_1 = require("@harmoniclabs/cardano-ledger-ts"); var txBuild_1 = require("../txBuild/index.js"); var ints_1 = require("../utils/ints.js"); function keepRelevant(requestedOutputSet, initialUTxOSet, minimumLovelaceRequired) { if (minimumLovelaceRequired === void 0) { minimumLovelaceRequired = 5000000; } if (requestedOutputSet instanceof cardano_ledger_ts_1.Value) { requestedOutputSet = requestedOutputSet.toUnits(); } var reqOutputKeys = Object.keys(requestedOutputSet); var requestedLovelace = reqOutputKeys.includes("lovelace") ? (0, ints_1.forceBigUInt)(BigInt(requestedOutputSet["lovelace"])) + (0, ints_1.forceBigUInt)(minimumLovelaceRequired) : (0, ints_1.forceBigUInt)(minimumLovelaceRequired); var multiAssetIns = initialUTxOSet.filter(function (input) { return new cardano_ledger_ts_1.UTxO(input.utxo).resolved.value.toUnits() // .filter(( asset ) => asset.unit !== "lovelace") .some(function (asset) { return reqOutputKeys.includes(asset.unit); }); }); var totLovelaces = getTotLovelaces(multiAssetIns); var lovelaceIns = totLovelaces < requestedLovelace ? remainingLovelace(requestedLovelace - totLovelaces, // filter out initial utxos already included trough multi asset selection initialUTxOSet.filter(function (initialUtxo) { var idStr = initialUtxo.utxo.utxoRef.id.toString(); return !multiAssetIns.some(function (selectedUtxo) { return selectedUtxo.utxo.utxoRef.id.toString() === idStr; }); })) : []; return lovelaceIns.concat(multiAssetIns) .map(txBuild_1.cloneITxBuildInput); } exports.keepRelevant = keepRelevant; function getTotLovelaces(multiAsset) { return multiAsset.reduce(function (sum, input) { return sum + new cardano_ledger_ts_1.UTxO(input.utxo).resolved.value.lovelaces; }, BigInt(0)); } ; function remainingLovelace(quantity, initialUTxOSet) { var sortedUTxOs = initialUTxOSet.sort(function (a, b) { return parseInt(BigInt(new cardano_ledger_ts_1.UTxO(a.utxo).resolved.value.lovelaces - new cardano_ledger_ts_1.UTxO(b.utxo).resolved.value.lovelaces).toString()); }); var requestedOutputSet = { lovelace: quantity }; var selection = selectValue(sortedUTxOs, requestedOutputSet); return selection; } function enoughValueHasBeenSelected(selection, assets) { return Object.keys(assets) .every(function (unit) { return selection .filter(function (input) { return new cardano_ledger_ts_1.UTxO(input.utxo).resolved.value.toUnits() .some(function (a) { return a.unit === unit; }); }) .reduce(function (selectedQuantity, input) { var utxoQuantity = new cardano_ledger_ts_1.UTxO(input.utxo).resolved.value.toUnits() .reduce(function (quantity, a) { return quantity + unit === a.unit ? BigInt(a.quantity) : BigInt(0); }, BigInt(0)); return selectedQuantity + utxoQuantity; }, BigInt(0)) < BigInt(assets[unit]) === false; }); } function selectValue(inputUTxO, outputSet, selection) { if (selection === void 0) { selection = []; } if (inputUTxO.length === 0 || enoughValueHasBeenSelected(selection, outputSet)) { return selection; } if (canValueBeSelected(inputUTxO[0], outputSet)) { return selectValue(inputUTxO.slice(1), outputSet, selection.concat(inputUTxO[0])); } return selectValue(inputUTxO.slice(1), outputSet, selection); } function canValueBeSelected(input, assets) { return Object.keys(assets).some(function (unit) { return new cardano_ledger_ts_1.UTxO(input.utxo).resolved.value.toUnits() .some(function (asset) { return asset.unit === unit; }); }); }