UNPKG

@harmoniclabs/buildooor

Version:

Cardano transaction builder in typescript

99 lines (98 loc) 4.65 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getScriptInfoData = exports.getSpendingPurposeData = void 0; var cardano_ledger_ts_1 = require("@harmoniclabs/cardano-ledger-ts"); var plutus_data_1 = require("@harmoniclabs/plutus-data"); var uint8array_utils_1 = require("@harmoniclabs/uint8array-utils"); function getSpendingPurposeData(rdmr, tx, version) { if (version === void 0) { version = "v3"; } var scriptInfos = getScriptInfoData(rdmr, tx, version); // for all versions, purpose has never the datum, // only script info has the datum if (rdmr.tag === cardano_ledger_ts_1.TxRedeemerTag.Spend) return new plutus_data_1.DataConstr(scriptInfos.constr, [scriptInfos.fields[0]]); return scriptInfos; } exports.getSpendingPurposeData = getSpendingPurposeData; function getScriptInfoData(rdmr, tx, version, datum) { var _a, _b, _c, _d, _e, _f; version = version !== null && version !== void 0 ? version : "v3"; var tag = rdmr.tag; var ctorIdx; var purposeArgs; if (tag === cardano_ledger_ts_1.TxRedeemerTag.Mint) { ctorIdx = 0; var policy = (_a = tx.mint) === null || _a === void 0 ? void 0 : _a.map[rdmr.index + 1].policy; if (!(policy instanceof cardano_ledger_ts_1.Hash28)) throw new Error("invalid minting policy for minting redeemer " + rdmr.index.toString()); purposeArgs = [new plutus_data_1.DataB(policy.toBuffer())]; } else if (tag === cardano_ledger_ts_1.TxRedeemerTag.Spend) { ctorIdx = 1; var sortedIns = tx.inputs.slice().sort(function (a, b) { var ord = (0, uint8array_utils_1.lexCompare)(a.utxoRef.id.toBuffer(), b.utxoRef.id.toBuffer()); // if equal tx id order based on tx output index if (ord === 0) return a.utxoRef.index - b.utxoRef.index; // else order by tx id return ord; }); var utxoRef = (_b = sortedIns[rdmr.index]) === null || _b === void 0 ? void 0 : _b.utxoRef; if (utxoRef === undefined) throw new Error("invalid 'Spend' redeemer index: " + rdmr.index.toString() + "; tx.inputs.length is: " + tx.inputs.length.toString()); purposeArgs = [utxoRef.toData(version)]; if (version === "v3") purposeArgs.push((0, plutus_data_1.isData)(datum) ? new plutus_data_1.DataConstr(0, [datum]) : // just datum new plutus_data_1.DataConstr(1, []) // nothing ); } else if (tag === cardano_ledger_ts_1.TxRedeemerTag.Withdraw) { ctorIdx = 2; var stakeAddr = (_d = (_c = tx.withdrawals) === null || _c === void 0 ? void 0 : _c.map[rdmr.index]) === null || _d === void 0 ? void 0 : _d.rewardAccount; if (stakeAddr === undefined) throw new Error("invalid stake credentials for rewarding redeemer " + rdmr.index.toString()); purposeArgs = [ cardano_ledger_ts_1.Credential.script(new cardano_ledger_ts_1.StakeValidatorHash(stakeAddr.credentials)) .toData(version) ]; } else if (tag === cardano_ledger_ts_1.TxRedeemerTag.Cert) { ctorIdx = 3; var cert = (_e = tx.certs) === null || _e === void 0 ? void 0 : _e.at(rdmr.index); if (cert === undefined) throw new Error("invalid certificate for certifyng redeemer " + rdmr.index.toString()); var tmp = void 0; tmp = cert.toData(version); while (tmp instanceof plutus_data_1.DataList) { tmp = tmp.list[0]; } purposeArgs = [tmp]; if (version === "v3") { purposeArgs.unshift(new plutus_data_1.DataI(rdmr.index)); } } else if (version !== "v3") { throw new Error("voting and proposing script purpose only introduced in plutus v3"); } else if (tag === cardano_ledger_ts_1.TxRedeemerTag.Voting) { ctorIdx = 4; var votingProcedure = (_f = tx.votingProcedures) === null || _f === void 0 ? void 0 : _f.procedures[rdmr.index]; if (!votingProcedure) { throw new Error("mismatching voting redeemer, couldn't find voting procedure at index " + rdmr.index.toString()); } purposeArgs = [ votingProcedure.voter.toData(version) ]; } else if (tag === cardano_ledger_ts_1.TxRedeemerTag.Proposing) { ctorIdx = 5; purposeArgs = []; } else throw new Error("invalid redeemer tag"); return new plutus_data_1.DataConstr(ctorIdx, purposeArgs); } exports.getScriptInfoData = getScriptInfoData;