@mutants/cardano-tx-builder
Version:
A package that provides utility functions to build and destructure a cardano transaction
759 lines (758 loc) • 62.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const cbor_1 = require("cbor");
const cardano_utils_1 = require("@mutants/cardano-utils");
const mocks_1 = require("../__mocks__/mocks");
const constants_1 = require("../constants");
const transactionBuilder_1 = require("../transactionBuilder");
const types_1 = require("../types");
describe("TransactionBuilder", () => {
let builder;
let buildResult;
beforeEach(() => {
builder = new transactionBuilder_1.TransactionBuilder();
builder.setTtl(333);
});
test("should create a transaction builder", () => {
expect(new transactionBuilder_1.TransactionBuilder()).toBeInstanceOf(transactionBuilder_1.TransactionBuilder);
});
describe("Case 1. Send 50 ADA transaction", () => {
describe("when I add 2 inputs from address A with 30 Ada each and 1 random NFT on each", () => {
beforeEach(() => {
builder.setInputs([
{
address: mocks_1.MOCK_ADDRESSES.A,
txHash: mocks_1.MOCK_TX_HASHES.A,
txIndex: 0,
value: {
coin: 30000000,
assets: {
"2d37295347d9fbd197ecfd0e4ddef32ef757083c23985049326a5411": {
"000de1404d5554414e5432353537": 1n,
},
},
},
},
{
address: mocks_1.MOCK_ADDRESSES.A,
txHash: mocks_1.MOCK_TX_HASHES.B,
txIndex: 0,
value: {
coin: 30000000,
assets: {
"73056bffdf28f82da5db1f5ac7c06d030c8a551f43889f7f85746a4a": {
"505245443133383433": 1n,
},
},
},
},
]);
});
describe("and I set the output as 50 ADA to address B", () => {
beforeEach(() => {
builder.setOutputs([
{
address: mocks_1.MOCK_ADDRESSES.B,
value: {
coin: 50000000,
},
},
]);
builder.setChangeAddress(mocks_1.MOCK_ADDRESSES.A);
});
describe("when I build the transaction", () => {
beforeEach(() => {
builder.calculateFee();
buildResult = builder.build();
});
describe("Inputs", () => {
let inputs;
beforeEach(() => {
inputs = buildResult[0].get(0);
});
test("should have two inputs", () => {
expect(inputs).toHaveLength(2);
});
test("should have the input with transaction hash B in the first input", () => {
expect(inputs[0][0].toString("hex")).toEqual(mocks_1.MOCK_TX_HASHES.B);
});
test("should have the input with transaction hash A in the second input", () => {
expect(inputs[1][0].toString("hex")).toEqual(mocks_1.MOCK_TX_HASHES.A);
});
});
describe("Outputs", () => {
let outputs;
beforeEach(() => {
outputs = buildResult[0].get(1);
});
test("should have two outputs", () => {
expect(outputs).toHaveLength(2);
});
describe("and the first output", () => {
let output;
beforeEach(() => {
output = outputs[0];
});
test("should be for address B", () => {
const addressBuffer = output.get(0);
const address = addressBuffer instanceof Buffer
? addressBuffer.toString("hex")
: "";
expect((0, cardano_utils_1.toPaymentAddress)(address)).toEqual(mocks_1.MOCK_ADDRESSES.B);
});
test("should have exactly 50 ADA", () => {
const coin = output.get(1);
expect(coin).toBe(50000000);
});
});
describe("and the second output", () => {
let output;
beforeEach(() => {
output = outputs[1];
});
test("should be for address A", () => {
const addressBuffer = output.get(0);
const address = addressBuffer instanceof Buffer
? addressBuffer.toString("hex")
: "";
expect((0, cardano_utils_1.toPaymentAddress)(address)).toEqual(mocks_1.MOCK_ADDRESSES.A);
});
test("should have around 10 Ada (less fees)", () => {
const [coin] = output.get(1);
expect(coin).toBe(9816811);
});
test("should have the two NFTs as change", () => {
const [, assets] = output.get(1);
expect((0, cbor_1.encode)(assets).toString("hex")).toEqual("a2581c2d37295347d9fbd197ecfd0e4ddef32ef757083c23985049326a5411a14e000de1404d5554414e543235353701581c73056bffdf28f82da5db1f5ac7c06d030c8a551f43889f7f85746a4aa14950524544313338343301");
});
});
describe("when I remove the change address", () => {
beforeEach(() => {
builder.setChangeAddress(null);
buildResult = builder.build();
});
test("should have two outputs", () => {
expect(outputs).toHaveLength(2);
});
describe("and the first output", () => {
let output;
beforeEach(() => {
output = outputs[0];
});
test("should be for address B", () => {
const addressBuffer = output.get(0);
const address = addressBuffer instanceof Buffer
? addressBuffer.toString("hex")
: "";
expect((0, cardano_utils_1.toPaymentAddress)(address)).toEqual(mocks_1.MOCK_ADDRESSES.B);
});
test("should have exactly 50 ADA", () => {
const coin = output.get(1);
expect(coin).toBe(50000000);
});
});
describe("and the second output", () => {
let output;
beforeEach(() => {
output = outputs[1];
});
test("should be for address A", () => {
const addressBuffer = output.get(0);
const address = addressBuffer instanceof Buffer
? addressBuffer.toString("hex")
: "";
expect((0, cardano_utils_1.toPaymentAddress)(address)).toEqual(mocks_1.MOCK_ADDRESSES.A);
});
test("should have around 10 Ada (less fees)", () => {
const [coin] = output.get(1);
expect(coin).toBe(9816811);
});
test("should have the two NFTs as change", () => {
const [, assets] = output.get(1);
expect((0, cbor_1.encode)(assets).toString("hex")).toEqual("a2581c2d37295347d9fbd197ecfd0e4ddef32ef757083c23985049326a5411a14e000de1404d5554414e543235353701581c73056bffdf28f82da5db1f5ac7c06d030c8a551f43889f7f85746a4aa14950524544313338343301");
});
});
});
});
test("should have the correct output serialized", () => {
expect(builder.serialize()).toEqual("84a400828258201b6480013b12d018e70f206281add49117cfe74a710f9fb57fd0619e8555b50800825820d3d5bb30a2a7dce6c1d2202f7c0f089bd137a4d73c6f5454ccec81b8e587423e000182a200583901f52c28481365fa384138e4085e858e7653794ca6defa93010b30ad73500ed9cebc7535c4c49c9a8f3414ca34dbdfeda4fca29c06cccadbdf011a02faf080a200583901adde9a635f548fa97b666b25cf4f3ee4d86aedc83b62aa2c3785be28500ed9cebc7535c4c49c9a8f3414ca34dbdfeda4fca29c06cccadbdf01821a0095caeba2581c2d37295347d9fbd197ecfd0e4ddef32ef757083c23985049326a5411a14e000de1404d5554414e543235353701581c73056bffdf28f82da5db1f5ac7c06d030c8a551f43889f7f85746a4aa14950524544313338343301021a0002cb950319014da0f5f6");
});
});
describe("when I setup a plutus v2 validator to redeem the first input", () => {
beforeEach(() => {
builder.setPlutusV2Scripts([
"58BE010000332323232323232323232232222533300A32001323233001375866010601466010601400690002402000C6002002444A66602000429404C8C94CCC03CCDC78010018A5113330050050010033013003375C60220042930B1BAE00133001001480008888CCCC01CCDC38008018059199980280299B8000448008C0340040080088C014DD5000918019BAA0015734AAE7555CF2AB9F5742AE8930011E581C675061014F3EACE588951DE4B7FAB2DC0A7B4BA16C2944DACE6ED5050001",
]);
builder.setPlutusDatas([
{
constructor: 0,
fields: [
{
int: 42,
},
],
},
]);
builder.setRedeemers([
[
types_1.RedeemerTag.Spend,
{
txHash: mocks_1.MOCK_TX_HASHES.A,
txIndex: 0,
},
{ constructor: 0, fields: [] },
[0, 0],
],
]);
builder.setRequiredSigners([
"675061014f3eace588951de4b7fab2dc0a7b4ba16c2944dace6ed505",
]);
builder.setCollateralInputs([
{
address: mocks_1.MOCK_ADDRESSES.A,
txHash: mocks_1.MOCK_TX_HASHES.A,
txIndex: 0,
value: {
coin: 30000000,
assets: {
"2d37295347d9fbd197ecfd0e4ddef32ef757083c23985049326a5411": {
"000de1404d5554414e5432353537": 1n,
"000de1404d5554414e5432353536": 1n,
},
"0d37295347d9fbd197ecfd0e4ddef32ef757083c23985049326a5414": {
"000de1404d5554414e5432353533": 1n,
"000de1404d5554414e5432353532": 1n,
},
},
},
},
]);
});
describe("when I build the transaction", () => {
beforeEach(() => {
buildResult = builder.build();
});
test("should have the plutus script in the witness set", () => {
const script = buildResult[1].get(constants_1.BabbageWitnessSet.PlutusV2Script);
expect(script[0].toString("hex")).toBe("58be010000332323232323232323232232222533300a32001323233001375866010601466010601400690002402000c6002002444a66602000429404c8c94ccc03ccdc78010018a5113330050050010033013003375c60220042930b1bae00133001001480008888cccc01ccdc38008018059199980280299b8000448008c0340040080088c014dd5000918019baa0015734aae7555cf2ab9f5742ae8930011e581c675061014f3eace588951de4b7fab2dc0a7b4ba16c2944dace6ed5050001");
});
test("should have the correct plutus data in the witness set", () => {
const data = buildResult[1].get(constants_1.BabbageWitnessSet.PlutusData);
expect(data[0]).toEqual(new cbor_1.Tagged(121, [42]));
});
test("should have the correct redeemer", () => {
const data = buildResult[1].get(constants_1.BabbageWitnessSet.Redeemer);
expect(data[0]).toEqual([0, 1, new cbor_1.Tagged(121, []), [0, 0]]);
});
test("should have the correct default total collateral", () => {
const data = buildResult[0].get(constants_1.BabbageTransactionBody.TotalCollateral);
expect(data).toBe(1000000);
});
describe("when I calculate fee", () => {
beforeEach(() => {
builder.calculateFee();
buildResult = builder.build();
});
test("should have the correct fee", () => {
const data = buildResult[0].get(constants_1.BabbageTransactionBody.Fee);
expect(data).toBe(229037);
});
test("should have the correct total collateral", () => {
const data = buildResult[0].get(constants_1.BabbageTransactionBody.TotalCollateral);
expect(data).toBe(343556);
});
test("should serialize correctly", () => {
expect(builder.serialize()).toBe("84a900828258201b6480013b12d018e70f206281add49117cfe74a710f9fb57fd0619e8555b50800825820d3d5bb30a2a7dce6c1d2202f7c0f089bd137a4d73c6f5454ccec81b8e587423e000182a200583901f52c28481365fa384138e4085e858e7653794ca6defa93010b30ad73500ed9cebc7535c4c49c9a8f3414ca34dbdfeda4fca29c06cccadbdf011a02faf080a200583901adde9a635f548fa97b666b25cf4f3ee4d86aedc83b62aa2c3785be28500ed9cebc7535c4c49c9a8f3414ca34dbdfeda4fca29c06cccadbdf01821a009517d3a2581c2d37295347d9fbd197ecfd0e4ddef32ef757083c23985049326a5411a14e000de1404d5554414e543235353701581c73056bffdf28f82da5db1f5ac7c06d030c8a551f43889f7f85746a4aa14950524544313338343301021a00037ead0319014d0b58200f5bac380ea654f04584b7958e67461102ede7aa11b37aa2c67e9663f1e8e0e10d81825820d3d5bb30a2a7dce6c1d2202f7c0f089bd137a4d73c6f5454ccec81b8e587423e000e81581c675061014f3eace588951de4b7fab2dc0a7b4ba16c2944dace6ed50510a200583901adde9a635f548fa97b666b25cf4f3ee4d86aedc83b62aa2c3785be28500ed9cebc7535c4c49c9a8f3414ca34dbdfeda4fca29c06cccadbdf01821a01c4857ca2581c0d37295347d9fbd197ecfd0e4ddef32ef757083c23985049326a5414a24e000de1404d5554414e5432353532014e000de1404d5554414e543235353301581c2d37295347d9fbd197ecfd0e4ddef32ef757083c23985049326a5411a24e000de1404d5554414e5432353536014e000de1404d5554414e543235353701111a00053e04a30481d87981182a0581840001d87980820000068158c058be010000332323232323232323232232222533300a32001323233001375866010601466010601400690002402000c6002002444a66602000429404c8c94ccc03ccdc78010018a5113330050050010033013003375c60220042930b1bae00133001001480008888cccc01ccdc38008018059199980280299b8000448008c0340040080088c014dd5000918019baa0015734aae7555cf2ab9f5742ae8930011e581c675061014f3eace588951de4b7fab2dc0a7b4ba16c2944dace6ed5050001f5f6");
});
describe("when I change the collateral percent from protocol parameters to 200 instead of 150", () => {
beforeEach(() => {
builder.setProtocolParameters({
collateral_percent: 200,
min_fee_a: 44,
min_fee_b: 155381,
price_mem: 0.0577,
price_step: 0.0000721,
coins_per_utxo_word: "4310",
});
builder.calculateFee();
buildResult = builder.build();
});
test("should have the correct total collateral", () => {
const data = buildResult[0].get(constants_1.BabbageTransactionBody.TotalCollateral);
expect(data).toBe(458074);
});
});
describe("when I change the collateral percent from protocol parameters to null", () => {
beforeEach(() => {
builder.setProtocolParameters({
collateral_percent: null,
min_fee_a: 44,
min_fee_b: 155381,
price_mem: 0.0577,
price_step: 0.0000721,
coins_per_utxo_word: "4310",
});
builder.calculateFee();
buildResult = builder.build();
});
test("should have the correct total collateral", () => {
const data = buildResult[0].get(constants_1.BabbageTransactionBody.TotalCollateral);
expect(data).toBe(343556);
});
});
});
describe("when I set an encoded vkeyWitnesses map", () => {
beforeEach(() => {
builder.setEncodedVKeyWitnesses("a100818258209b3667e7d92d74c1efcb7eb4e0e2157dc2d6334b87167833eede33d7666096245840e7c843699b7ecaf079be19b74564fbcc7a5d97f8bdf8aaacdb91fb70753683fadeac24390f5f5a0414eef380d2b6ffea89ce8bc8abd54c4bb7ae0278220f230d");
});
describe("when I build the transaction", () => {
beforeEach(() => {
buildResult = builder.build();
});
test("should have the correct vkey witnesses", () => {
const data = buildResult[1].get(constants_1.BabbageWitnessSet.VKeyWitness);
expect(data[0][0].toString("hex")).toBe("9b3667e7d92d74c1efcb7eb4e0e2157dc2d6334b87167833eede33d766609624");
expect(data[0][1].toString("hex")).toBe("e7c843699b7ecaf079be19b74564fbcc7a5d97f8bdf8aaacdb91fb70753683fadeac24390f5f5a0414eef380d2b6ffea89ce8bc8abd54c4bb7ae0278220f230d");
});
});
});
describe("when I set an encoded invalid vkeyWitnesses map", () => {
beforeEach(() => {
builder.setEncodedVKeyWitnesses("a10001");
});
describe("when I build the transaction", () => {
beforeEach(() => {
buildResult = builder.build();
});
test("should have the correct vkey witnesses", () => {
const data = buildResult[1].get(constants_1.BabbageWitnessSet.VKeyWitness);
expect(data).toEqual(undefined);
});
});
});
describe("when I set an encoded vkeyWitnesses array", () => {
beforeEach(() => {
builder.setEncodedVKeyWitnesses("818258209b3667e7d92d74c1efcb7eb4e0e2157dc2d6334b87167833eede33d7666096245840e7c843699b7ecaf079be19b74564fbcc7a5d97f8bdf8aaacdb91fb70753683fadeac24390f5f5a0414eef380d2b6ffea89ce8bc8abd54c4bb7ae0278220f230d");
});
describe("when I build the transaction", () => {
beforeEach(() => {
buildResult = builder.build();
});
test("should have the correct vkey witnesses", () => {
const data = buildResult[1].get(constants_1.BabbageWitnessSet.VKeyWitness);
expect(data[0][0].toString("hex")).toBe("9b3667e7d92d74c1efcb7eb4e0e2157dc2d6334b87167833eede33d766609624");
expect(data[0][1].toString("hex")).toBe("e7c843699b7ecaf079be19b74564fbcc7a5d97f8bdf8aaacdb91fb70753683fadeac24390f5f5a0414eef380d2b6ffea89ce8bc8abd54c4bb7ae0278220f230d");
});
});
});
describe("when I build with multiple redeemers", () => {
beforeEach(() => {
builder.setProtocolParameters({
collateral_percent: 200,
min_fee_a: 44,
min_fee_b: 155381,
price_mem: null,
price_step: null,
coins_per_utxo_word: "4310",
});
builder.setRedeemers([
[
types_1.RedeemerTag.Spend,
{
txHash: mocks_1.MOCK_TX_HASHES.A,
txIndex: 0,
},
{ constructor: 0, fields: [] },
[42879, 15615619],
],
[
types_1.RedeemerTag.Spend,
{
txHash: mocks_1.MOCK_TX_HASHES.B,
txIndex: 0,
},
{ constructor: 0, fields: [] },
[100000, 25615619],
],
]);
builder.calculateFee();
buildResult = builder.build();
});
test("should have the correct fee", () => {
const data = buildResult[0].get(constants_1.BabbageTransactionBody.Fee);
expect(data).toBe(2610115);
});
});
});
describe("and I evaluate the redeemer by TxIn with cost units 42879, 15615619", () => {
beforeEach(() => {
builder.evaluateRedeemerByTxIn({
txHash: mocks_1.MOCK_TX_HASHES.A,
txIndex: 0,
}, [42879, 15615619]);
});
describe("when I build the transaction", () => {
beforeEach(() => {
buildResult = builder.build();
});
test("should have the correct redeemer", () => {
const data = buildResult[1].get(constants_1.BabbageWitnessSet.Redeemer);
expect(data[0]).toEqual([
0,
1,
new cbor_1.Tagged(121, []),
[42879, 15615619],
]);
});
});
});
describe("and I evaluate the redeemer by tag index with cost units 42879, 15615619", () => {
beforeEach(() => {
builder.evaluateRedeemerByTagIndex(0, 1, [42879, 15615619]);
});
describe("when I build the transaction", () => {
beforeEach(() => {
buildResult = builder.build();
});
test("should have the correct redeemer", () => {
const data = buildResult[1].get(constants_1.BabbageWitnessSet.Redeemer);
expect(data[0]).toEqual([
0,
1,
new cbor_1.Tagged(121, []),
[42879, 15615619],
]);
});
});
});
describe("and I set redeemer evaluations with cost units 42879, 15615619", () => {
beforeEach(() => {
builder.setRedeemerEvaluations([
{
index: 1,
memory: 42879,
steps: 15615619,
tag: 0,
},
]);
});
describe("when I build the transaction", () => {
beforeEach(() => {
buildResult = builder.build();
});
test("should have the correct redeemer", () => {
const data = buildResult[1].get(constants_1.BabbageWitnessSet.Redeemer);
expect(data[0]).toEqual([
0,
1,
new cbor_1.Tagged(121, []),
[42879, 15615619],
]);
});
});
});
});
describe("when I setup a plutus v1 validator to redeem the first input", () => {
beforeEach(() => {
builder.setPlutusV1Scripts([
"58BE010000332323232323232323232232222533300A32001323233001375866010601466010601400690002402000C6002002444A66602000429404C8C94CCC03CCDC78010018A5113330050050010033013003375C60220042930B1BAE00133001001480008888CCCC01CCDC38008018059199980280299B8000448008C0340040080088C014DD5000918019BAA0015734AAE7555CF2AB9F5742AE8930011E581C675061014F3EACE588951DE4B7FAB2DC0A7B4BA16C2944DACE6ED5050001",
]);
builder.setPlutusDatas([
{
constructor: 0,
fields: [
{
bytes: Buffer.from("D7C4967B97302DF103B002A8C13BD4A5E96BD6AD08CB52D8DC15C121", "hex"),
},
],
},
]);
builder.setRedeemers([
[
types_1.RedeemerTag.Spend,
{
txHash: mocks_1.MOCK_TX_HASHES.A,
txIndex: 0,
},
{ constructor: 0, fields: [] },
[0, 0],
],
]);
builder.setRequiredSigners([
"675061014f3eace588951de4b7fab2dc0a7b4ba16c2944dace6ed505",
]);
builder.setCollateralInputs([
{
address: mocks_1.MOCK_ADDRESSES.A,
txHash: mocks_1.MOCK_TX_HASHES.A,
txIndex: 0,
value: {
coin: 30000000,
assets: {
"2d37295347d9fbd197ecfd0e4ddef32ef757083c23985049326a5411": {
"000de1404d5554414e5432353537": 1n,
"000de1404d5554414e5432353536": 1n,
},
"0d37295347d9fbd197ecfd0e4ddef32ef757083c23985049326a5414": {
"000de1404d5554414e5432353533": 1n,
"000de1404d5554414e5432353532": 1n,
},
},
},
},
]);
});
describe("when I build the transaction", () => {
beforeEach(() => {
buildResult = builder.build();
});
test("should have the plutus script in the witness set", () => {
const script = buildResult[1].get(constants_1.BabbageWitnessSet.PlutusV1Script);
expect(script[0].toString("hex")).toBe("58be010000332323232323232323232232222533300a32001323233001375866010601466010601400690002402000c6002002444a66602000429404c8c94ccc03ccdc78010018a5113330050050010033013003375c60220042930b1bae00133001001480008888cccc01ccdc38008018059199980280299b8000448008c0340040080088c014dd5000918019baa0015734aae7555cf2ab9f5742ae8930011e581c675061014f3eace588951de4b7fab2dc0a7b4ba16c2944dace6ed5050001");
});
test("should have the correct plutus data in the witness set", () => {
const data = buildResult[1].get(constants_1.BabbageWitnessSet.PlutusData);
expect(data[0]).toEqual(new cbor_1.Tagged(121, [
Buffer.from("D7C4967B97302DF103B002A8C13BD4A5E96BD6AD08CB52D8DC15C121", "hex"),
]));
});
test("should have the correct redeemer", () => {
const data = buildResult[1].get(constants_1.BabbageWitnessSet.Redeemer);
expect(data[0]).toEqual([0, 1, new cbor_1.Tagged(121, []), [0, 0]]);
});
test("should have the correct default total collateral", () => {
const data = buildResult[0].get(constants_1.BabbageTransactionBody.TotalCollateral);
expect(data).toBe(1000000);
});
describe("when I calculate fee", () => {
beforeEach(() => {
builder.calculateFee();
buildResult = builder.build();
});
test("should have the correct fee", () => {
const data = buildResult[0].get(constants_1.BabbageTransactionBody.Fee);
expect(data).toBe(231501);
});
test("should have the correct total collateral", () => {
const data = buildResult[0].get(constants_1.BabbageTransactionBody.TotalCollateral);
expect(data).toBe(347252);
});
test("should serialize correctly", () => {
expect(builder.serialize()).toBe("84a900828258201b6480013b12d018e70f206281add49117cfe74a710f9fb57fd0619e8555b50800825820d3d5bb30a2a7dce6c1d2202f7c0f089bd137a4d73c6f5454ccec81b8e587423e000182a200583901f52c28481365fa384138e4085e858e7653794ca6defa93010b30ad73500ed9cebc7535c4c49c9a8f3414ca34dbdfeda4fca29c06cccadbdf011a02faf080a200583901adde9a635f548fa97b666b25cf4f3ee4d86aedc83b62aa2c3785be28500ed9cebc7535c4c49c9a8f3414ca34dbdfeda4fca29c06cccadbdf01821a00950e33a2581c2d37295347d9fbd197ecfd0e4ddef32ef757083c23985049326a5411a14e000de1404d5554414e543235353701581c73056bffdf28f82da5db1f5ac7c06d030c8a551f43889f7f85746a4aa14950524544313338343301021a0003884d0319014d0b58208cdd4c577aa12ff08f7caac8439081601e9156e1b936cb1da35aaacf477e09b60d81825820d3d5bb30a2a7dce6c1d2202f7c0f089bd137a4d73c6f5454ccec81b8e587423e000e81581c675061014f3eace588951de4b7fab2dc0a7b4ba16c2944dace6ed50510a200583901adde9a635f548fa97b666b25cf4f3ee4d86aedc83b62aa2c3785be28500ed9cebc7535c4c49c9a8f3414ca34dbdfeda4fca29c06cccadbdf01821a01c4770ca2581c0d37295347d9fbd197ecfd0e4ddef32ef757083c23985049326a5414a24e000de1404d5554414e5432353532014e000de1404d5554414e543235353301581c2d37295347d9fbd197ecfd0e4ddef32ef757083c23985049326a5411a24e000de1404d5554414e5432353536014e000de1404d5554414e543235353701111a00054c74a30481d87981581cd7c4967b97302df103b002a8c13bd4a5e96bd6ad08cb52d8dc15c1210581840001d87980820000038158c058be010000332323232323232323232232222533300a32001323233001375866010601466010601400690002402000c6002002444a66602000429404c8c94ccc03ccdc78010018a5113330050050010033013003375c60220042930b1bae00133001001480008888cccc01ccdc38008018059199980280299b8000448008c0340040080088c014dd5000918019baa0015734aae7555cf2ab9f5742ae8930011e581c675061014f3eace588951de4b7fab2dc0a7b4ba16c2944dace6ed5050001f5f6");
});
describe("when I change the collateral percent from protocol parameters to 200 instead of 150", () => {
beforeEach(() => {
builder.setProtocolParameters({
collateral_percent: 200,
min_fee_a: 44,
min_fee_b: 155381,
price_mem: 0.0577,
price_step: 0.0000721,
coins_per_utxo_word: "4310",
});
builder.calculateFee();
buildResult = builder.build();
});
test("should have the correct total collateral", () => {
const data = buildResult[0].get(constants_1.BabbageTransactionBody.TotalCollateral);
expect(data).toBe(463002);
});
});
describe("when I change the collateral percent from protocol parameters to null", () => {
beforeEach(() => {
builder.setProtocolParameters({
collateral_percent: null,
min_fee_a: 44,
min_fee_b: 155381,
price_mem: 0.0577,
price_step: 0.0000721,
coins_per_utxo_word: "4310",
});
builder.calculateFee();
buildResult = builder.build();
});
test("should have the correct total collateral", () => {
const data = buildResult[0].get(constants_1.BabbageTransactionBody.TotalCollateral);
expect(data).toBe(347252);
});
});
});
describe("when I set an encoded vkeyWitnesses map", () => {
beforeEach(() => {
builder.setEncodedVKeyWitnesses("a100818258209b3667e7d92d74c1efcb7eb4e0e2157dc2d6334b87167833eede33d7666096245840e7c843699b7ecaf079be19b74564fbcc7a5d97f8bdf8aaacdb91fb70753683fadeac24390f5f5a0414eef380d2b6ffea89ce8bc8abd54c4bb7ae0278220f230d");
});
describe("when I build the transaction", () => {
beforeEach(() => {
buildResult = builder.build();
});
test("should have the correct vkey witnesses", () => {
const data = buildResult[1].get(constants_1.BabbageWitnessSet.VKeyWitness);
expect(data[0][0].toString("hex")).toBe("9b3667e7d92d74c1efcb7eb4e0e2157dc2d6334b87167833eede33d766609624");
expect(data[0][1].toString("hex")).toBe("e7c843699b7ecaf079be19b74564fbcc7a5d97f8bdf8aaacdb91fb70753683fadeac24390f5f5a0414eef380d2b6ffea89ce8bc8abd54c4bb7ae0278220f230d");
});
});
});
describe("when I set an encoded invalid vkeyWitnesses map", () => {
beforeEach(() => {
builder.setEncodedVKeyWitnesses("a10001");
});
describe("when I build the transaction", () => {
beforeEach(() => {
buildResult = builder.build();
});
test("should have the correct vkey witnesses", () => {
const data = buildResult[1].get(constants_1.BabbageWitnessSet.VKeyWitness);
expect(data).toEqual(undefined);
});
});
});
describe("when I set an encoded vkeyWitnesses array", () => {
beforeEach(() => {
builder.setEncodedVKeyWitnesses("818258209b3667e7d92d74c1efcb7eb4e0e2157dc2d6334b87167833eede33d7666096245840e7c843699b7ecaf079be19b74564fbcc7a5d97f8bdf8aaacdb91fb70753683fadeac24390f5f5a0414eef380d2b6ffea89ce8bc8abd54c4bb7ae0278220f230d");
});
describe("when I build the transaction", () => {
beforeEach(() => {
buildResult = builder.build();
});
test("should have the correct vkey witnesses", () => {
const data = buildResult[1].get(constants_1.BabbageWitnessSet.VKeyWitness);
expect(data[0][0].toString("hex")).toBe("9b3667e7d92d74c1efcb7eb4e0e2157dc2d6334b87167833eede33d766609624");
expect(data[0][1].toString("hex")).toBe("e7c843699b7ecaf079be19b74564fbcc7a5d97f8bdf8aaacdb91fb70753683fadeac24390f5f5a0414eef380d2b6ffea89ce8bc8abd54c4bb7ae0278220f230d");
});
});
});
describe("when I build with multiple redeemers", () => {
beforeEach(() => {
builder.setProtocolParameters({
collateral_percent: 200,
min_fee_a: 44,
min_fee_b: 155381,
price_mem: null,
price_step: null,
coins_per_utxo_word: "4310",
});
builder.setRedeemers([
[
types_1.RedeemerTag.Spend,
{
txHash: mocks_1.MOCK_TX_HASHES.A,
txIndex: 0,
},
{ constructor: 0, fields: [] },
[42879, 15615619],
],
[
types_1.RedeemerTag.Spend,
{
txHash: mocks_1.MOCK_TX_HASHES.B,
txIndex: 0,
},
{ constructor: 0, fields: [] },
[100000, 25615619],
],
]);
builder.calculateFee();
buildResult = builder.build();
});
test("should have the correct fee", () => {
const data = buildResult[0].get(constants_1.BabbageTransactionBody.Fee);
expect(data).toBe(2612579);
});
});
});
describe("and I evaluate the redeemer by TxIn with cost units 42879, 15615619", () => {
beforeEach(() => {
builder.evaluateRedeemerByTxIn({
txHash: mocks_1.MOCK_TX_HASHES.A,
txIndex: 0,
}, [42879, 15615619]);
});
describe("when I build the transaction", () => {
beforeEach(() => {
buildResult = builder.build();
});
test("should have the correct redeemer", () => {
const data = buildResult[1].get(constants_1.BabbageWitnessSet.Redeemer);
expect(data[0]).toEqual([
0,
1,
new cbor_1.Tagged(121, []),
[42879, 15615619],
]);
});
});
});
describe("and I evaluate the redeemer by tag index with cost units 42879, 15615619", () => {
beforeEach(() => {
builder.evaluateRedeemerByTagIndex(0, 1, [42879, 15615619]);
});
describe("when I build the transaction", () => {
beforeEach(() => {
buildResult = builder.build();
});
test("should have the correct redeemer", () => {
const data = buildResult[1].get(constants_1.BabbageWitnessSet.Redeemer);
expect(data[0]).toEqual([
0,
1,
new cbor_1.Tagged(121, []),
[42879, 15615619],
]);
});
});
});
describe("and I set redeemer evaluations with cost units 42879, 15615619", () => {
beforeEach(() => {
builder.setRedeemerEvaluations([
{
index: 1,
memory: 42879,
steps: 15615619,
tag: 0,
},
]);
});
describe("when I build the transaction", () => {
beforeEach(() => {
buildResult = builder.build();
});
test("should have the correct redeemer", () => {
const data = buildResult[1].get(constants_1.BabbageWitnessSet.Redeemer);
expect(data[0]).toEqual([
0,
1,
new cbor_1.Tagged(121, []),
[42879, 15615619],
]);
});
});
});
});
describe("when I setup a plutus v2 validator without plutus data", () => {
beforeEach(() => {
builder.setPlutusV2Scripts([
"58BE010000332323232323232323232232222533300A32001323233001375866010601466010601400690002402000C6002002444A66602000429404C8C94CCC03CCDC78010018A5113330050050010033013003375C60220042930B1BAE00133001001480008888CCCC01CCDC38008018059199980280299B8000448008C0340040080088C014DD5000918019BAA0015734AAE7555CF2AB9F5742AE8930011E581C675061014F3EACE588951DE4B7FAB2DC0A7B4BA16C2944DACE6ED5050001",
]);
builder.setRedeemers([
[
types_1.RedeemerTag.Spend,
{
txHash: mocks_1.MOCK_TX_HASHES.A,
txIndex: 0,
},
{ constructor: 0, fields: [] },
[0, 0],
],
]);
builder.setRequiredSigners([
"675061014f3eace588951de4b7fab2dc0a7b4ba16c2944dace6ed505",
]);
builder.setCollateralInputs([
{
address: mocks_1.MOCK_ADDRESSES.A,
txHash: mocks_1.MOCK_TX_HASHES.A,
txIndex: 0,
value: {
coin: 30000000,
assets: {
"2d37295347d9fbd197ecfd0e4ddef32ef757083c23985049326a5411": {