@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
JavaScript
"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;