@harmoniclabs/buildooor
Version:
Cardano transaction builder in typescript
80 lines (79 loc) • 3.95 kB
JavaScript
;
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; });
});
}