@harmoniclabs/buildooor
Version:
Cardano transaction builder in typescript
99 lines (98 loc) • 4.65 kB
JavaScript
;
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;