UNPKG

@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
"use strict"; 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;