UNPKG

@mutants/cardano-tx-builder

Version:

A package that provides utility functions to build and destructure a cardano transaction

136 lines (135 loc) 4.58 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ValueBuilder = void 0; const cardano_utils_1 = require("@mutants/cardano-utils"); const mocks_1 = require("./__mocks__/mocks"); const assetListToMap_1 = require("./assetListToMap"); const assetMapToList_1 = require("./assetMapToList"); const getMinUTxOCost_1 = require("./getMinUTxOCost"); class ValueBuilder { constructor() { this.totalLovelace = 0n; this.assetMap = {}; this.utxos = []; } addAsset(asset, quantity) { if (asset === "lovelace") { this.addLovelace(quantity); return; } const { assetPolicy: policyId, assetName } = (0, cardano_utils_1.getAssetDetails)(asset); this.assetMap[policyId] = this.assetMap[policyId] || {}; this.assetMap[policyId][assetName] = (this.assetMap[policyId][assetName] || 0n) + BigInt(quantity); if (this.assetMap[policyId][assetName] === 0n) { delete this.assetMap[policyId][assetName]; if (Object.keys(this.assetMap[policyId]).length === 0) { delete this.assetMap[policyId]; } } return this; } hasUTxO(utxo) { return this.utxos.some((u) => u.txHash === utxo.txHash && u.txIndex === utxo.txIndex); } addUTxO(utxo) { if (!this.hasUTxO(utxo)) { this.addValue(utxo.value); this.utxos.push(utxo); } return this; } addLovelace(quantity) { this.totalLovelace += quantity; return this; } addValue(value) { if (value.coin) { this.addLovelace(BigInt(value.coin)); } if (value.assets) { (0, assetMapToList_1.assetMapToList)(value.assets).forEach((asset) => { this.addAsset(asset.unit, asset.quantity); }); } return this; } getAssetQuantity(asset) { const assetDetails = (0, cardano_utils_1.getAssetDetails)(asset); return (this.assetMap?.[assetDetails.assetPolicy]?.[assetDetails.assetName] || 0n); } getTotalLovelace() { return this.totalLovelace; } getUnlockedLovelace() { return (this.totalLovelace - (0, getMinUTxOCost_1.getMinUTxOCost)({ address: mocks_1.MOCK_ADDRESSES.A, txHash: "", txIndex: 0, value: this.build(), })); } isEmpty() { return (this.totalLovelace <= 0n && (Object.keys(this.assetMap).length === 0 || this.areAllAssetsEmptyOrNegative())); } areAllAssetsEmptyOrNegative() { return (0, assetMapToList_1.assetMapToList)(this.assetMap).every((a) => a.quantity <= 0n); } hasAnyNegativeAssetOrLovelace() { return (this.totalLovelace < 0 || (0, assetMapToList_1.assetMapToList)(this.assetMap).some((a) => a.quantity <= 0)); } getNegativeValues() { return { coin: this.totalLovelace < 0 ? this.totalLovelace : 0, assets: (0, assetListToMap_1.assetListToMap)((0, assetMapToList_1.assetMapToList)(this.assetMap).filter((a) => a.quantity <= 0n)), }; } getUTxOs() { return this.utxos; } /** * Take an array of asset values and load them into the map * @param values */ loadValues(values) { for (const value of values) { this.addAsset(value.unit, BigInt(value.quantity)); } return this; } /** * Makes all asset quantities absolute */ abs() { this.totalLovelace = BigInt(Math.abs(Number(this.totalLovelace))); for (const policyId of Object.keys(this.assetMap)) { for (const assetName of Object.keys(this.assetMap[policyId])) { this.assetMap[policyId][assetName] = BigInt(Math.abs(Number(this.assetMap[policyId][assetName]))); } } return this; } /** * Revers all asset quantities */ revert() { this.totalLovelace = this.totalLovelace * -1n; for (const policyId of Object.keys(this.assetMap)) { for (const assetName of Object.keys(this.assetMap[policyId])) { this.assetMap[policyId][assetName] = BigInt(Number(this.assetMap[policyId][assetName])) * -1n; } } } build() { return { coin: this.totalLovelace, assets: this.assetMap, }; } } exports.ValueBuilder = ValueBuilder;