@mutants/cardano-tx-builder
Version:
A package that provides utility functions to build and destructure a cardano transaction
61 lines (60 loc) • 2.78 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.selectUtxosByValue = void 0;
const assetMapToList_1 = require("./assetMapToList");
const getMinUTxOCost_1 = require("./getMinUTxOCost");
const utxoContainsAsset_1 = require("./utxoContainsAsset");
const valueBuilder_1 = require("./valueBuilder");
const selectUtxosByValue = (utxos, valueToSelect, coinsPerUTxOWord = "4310") => {
const missingValueBuilder = new valueBuilder_1.ValueBuilder();
const totalSelectedBuilder = new valueBuilder_1.ValueBuilder();
missingValueBuilder.addValue(valueToSelect);
missingValueBuilder.revert();
if (valueToSelect.assets) {
const assetList = (0, assetMapToList_1.assetMapToList)(valueToSelect.assets);
for (const asset of assetList) {
const assetUtxos = utxos.filter((utxo) => (0, utxoContainsAsset_1.utxoContainsAsset)(utxo, asset.unit));
if (assetUtxos.length) {
for (const assetUtxo of assetUtxos) {
missingValueBuilder.addUTxO(assetUtxo);
totalSelectedBuilder.addUTxO(assetUtxo);
if (missingValueBuilder.getAssetQuantity(asset.unit) >= 0) {
break;
}
}
}
}
}
if (totalSelectedBuilder.getUnlockedLovelace() < valueToSelect.coin) {
const sortedByUnlockedAda = [...utxos].sort((u1, u2) => {
const unlockedCoin1 = parseFloat(u1.value.coin.toString()) -
parseFloat((0, getMinUTxOCost_1.getMinUTxOCost)(u1, coinsPerUTxOWord).toString());
const unlockedCoin2 = parseFloat(u2.value.coin.toString()) -
parseFloat((0, getMinUTxOCost_1.getMinUTxOCost)(u2, coinsPerUTxOWord).toString());
return unlockedCoin2 - unlockedCoin1;
});
for (const utxo of sortedByUnlockedAda) {
const totalUtxoLovelace = BigInt(utxo.value.coin);
if (totalUtxoLovelace) {
missingValueBuilder.addUTxO(utxo);
totalSelectedBuilder.addUTxO(utxo);
}
if (totalSelectedBuilder.getUnlockedLovelace() >= valueToSelect.coin) {
break;
}
}
}
const isMissingValues = missingValueBuilder.hasAnyNegativeAssetOrLovelace();
return {
fulfilled: !isMissingValues,
missing: isMissingValues
? new valueBuilder_1.ValueBuilder()
.addValue(missingValueBuilder.getNegativeValues())
.abs()
.build()
: undefined,
selectedUtxos: missingValueBuilder.getUTxOs(),
totalValueSelected: totalSelectedBuilder.build(),
};
};
exports.selectUtxosByValue = selectUtxosByValue;