@bitgo-beta/sdk-coin-ada 2.3.14-beta.142 → 2.3.14-beta.1421
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/ada.d.ts +12 -13
- package/dist/src/ada.d.ts.map +1 -1
- package/dist/src/ada.js +79 -27
- package/dist/src/adaToken.d.ts +3 -10
- package/dist/src/adaToken.d.ts.map +1 -1
- package/dist/src/adaToken.js +6 -3
- package/dist/src/index.js +6 -2
- package/dist/src/lib/index.d.ts +2 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +29 -9
- package/dist/src/lib/keyPair.js +29 -16
- package/dist/src/lib/messages/cip8/cip8Message.d.ts +25 -0
- package/dist/src/lib/messages/cip8/cip8Message.d.ts.map +1 -0
- package/dist/src/lib/messages/cip8/cip8Message.js +140 -0
- package/dist/src/lib/messages/cip8/cip8MessageBuilder.d.ts +19 -0
- package/dist/src/lib/messages/cip8/cip8MessageBuilder.d.ts.map +1 -0
- package/dist/src/lib/messages/cip8/cip8MessageBuilder.js +27 -0
- package/dist/src/lib/messages/cip8/index.d.ts +4 -0
- package/dist/src/lib/messages/cip8/index.d.ts.map +1 -0
- package/dist/src/lib/messages/cip8/index.js +20 -0
- package/dist/src/lib/messages/cip8/utils.d.ts +24 -0
- package/dist/src/lib/messages/cip8/utils.d.ts.map +1 -0
- package/dist/src/lib/messages/cip8/utils.js +73 -0
- package/dist/src/lib/messages/index.d.ts +3 -0
- package/dist/src/lib/messages/index.d.ts.map +1 -0
- package/dist/src/lib/messages/index.js +19 -0
- package/dist/src/lib/messages/messageBuilderFactory.d.ts +7 -0
- package/dist/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/messages/messageBuilderFactory.js +20 -0
- package/dist/src/lib/stakingActivateBuilder.d.ts +1 -1
- package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingActivateBuilder.js +30 -10
- package/dist/src/lib/stakingDeactivateBuilder.js +24 -10
- package/dist/src/lib/transaction.d.ts +13 -6
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +49 -16
- package/dist/src/lib/transactionBuilder.d.ts +82 -3
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +416 -22
- package/dist/src/lib/transactionBuilderFactory.d.ts +2 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +7 -1
- package/dist/src/lib/utils.d.ts +23 -0
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +153 -17
- package/dist/src/lib/voteDelegationBuilder.d.ts +24 -0
- package/dist/src/lib/voteDelegationBuilder.d.ts.map +1 -0
- package/dist/src/lib/voteDelegationBuilder.js +84 -0
- package/dist/test/resources/cip8Resources.d.ts +25 -0
- package/dist/test/resources/cip8Resources.d.ts.map +1 -0
- package/dist/test/resources/cip8Resources.js +76 -0
- package/dist/test/resources/index.d.ts +435 -0
- package/dist/test/resources/index.d.ts.map +1 -0
- package/dist/test/resources/index.js +635 -0
- package/dist/test/unit/StakingActivateBuilder.d.ts +2 -0
- package/dist/test/unit/StakingActivateBuilder.d.ts.map +1 -0
- package/dist/test/unit/StakingActivateBuilder.js +213 -0
- package/dist/test/unit/StakingDeactivateBuilder.d.ts +2 -0
- package/dist/test/unit/StakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/test/unit/StakingDeactivateBuilder.js +158 -0
- package/dist/test/unit/ada.d.ts +5 -0
- package/dist/test/unit/ada.d.ts.map +1 -0
- package/dist/test/unit/ada.js +997 -0
- package/dist/test/unit/getBuilderFactory.d.ts +3 -0
- package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/getBuilderFactory.js +10 -0
- package/dist/test/unit/index.d.ts +2 -0
- package/dist/test/unit/index.d.ts.map +1 -0
- package/dist/test/unit/index.js +32 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +88 -0
- package/dist/test/unit/messages/cip8/cip8Message.d.ts +2 -0
- package/dist/test/unit/messages/cip8/cip8Message.d.ts.map +1 -0
- package/dist/test/unit/messages/cip8/cip8Message.js +131 -0
- package/dist/test/unit/messages/cip8/cip8MessageBuilder.d.ts +2 -0
- package/dist/test/unit/messages/cip8/cip8MessageBuilder.d.ts.map +1 -0
- package/dist/test/unit/messages/cip8/cip8MessageBuilder.js +132 -0
- package/dist/test/unit/messages/cip8/utils.d.ts +2 -0
- package/dist/test/unit/messages/cip8/utils.d.ts.map +1 -0
- package/dist/test/unit/messages/cip8/utils.js +127 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/messages/messageBuilderFactory.js +35 -0
- package/dist/test/unit/stakingClaimRewardsBuilder.d.ts +2 -0
- package/dist/test/unit/stakingClaimRewardsBuilder.d.ts.map +1 -0
- package/dist/test/unit/stakingClaimRewardsBuilder.js +70 -0
- package/dist/test/unit/stakingPledgeBuilder.d.ts +2 -0
- package/dist/test/unit/stakingPledgeBuilder.d.ts.map +1 -0
- package/dist/test/unit/stakingPledgeBuilder.js +141 -0
- package/dist/test/unit/stakingWithdrawBuilder.d.ts +2 -0
- package/dist/test/unit/stakingWithdrawBuilder.d.ts.map +1 -0
- package/dist/test/unit/stakingWithdrawBuilder.js +167 -0
- package/dist/test/unit/tokenWithdrawal.d.ts +2 -0
- package/dist/test/unit/tokenWithdrawal.d.ts.map +1 -0
- package/dist/test/unit/tokenWithdrawal.js +316 -0
- package/dist/test/unit/transaction.d.ts +2 -0
- package/dist/test/unit/transaction.d.ts.map +1 -0
- package/dist/test/unit/transaction.js +100 -0
- package/dist/test/unit/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder.js +454 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +138 -0
- package/dist/test/unit/voteDelegationBuilder.d.ts +2 -0
- package/dist/test/unit/voteDelegationBuilder.d.ts.map +1 -0
- package/dist/test/unit/voteDelegationBuilder.js +96 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +17 -12
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -322
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const should_1 = __importDefault(require("should"));
|
|
40
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
41
|
+
const testData = __importStar(require("../resources"));
|
|
42
|
+
const src_1 = require("../../src");
|
|
43
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
44
|
+
describe('ADA Staking Withdraw Transaction Builder', async () => {
|
|
45
|
+
const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tada'));
|
|
46
|
+
it('start and build an unsigned staking withdraw tx', async () => {
|
|
47
|
+
const keyPairStake = new src_1.KeyPair({ prv: testData.privateKeys.prvKey2 });
|
|
48
|
+
const txBuilder = factory.getStakingWithdrawBuilder();
|
|
49
|
+
txBuilder.input({
|
|
50
|
+
transaction_id: '3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21',
|
|
51
|
+
transaction_index: 1,
|
|
52
|
+
});
|
|
53
|
+
const totalInput = '4000000';
|
|
54
|
+
txBuilder.changeAddress('addr1q8rm9z7w4yx5gz652kn2q238efvms6t0qelur9nlglun8eu4tr5knj4fu4adelzqhxg8adu5xca4jra0gtllfrpcawyq9psz23', totalInput);
|
|
55
|
+
const reward = 1239239;
|
|
56
|
+
txBuilder.addWithdrawal(keyPairStake.getKeys().pub, reward.toString());
|
|
57
|
+
txBuilder.ttl(800000000);
|
|
58
|
+
const tx = (await txBuilder.build());
|
|
59
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingWithdraw);
|
|
60
|
+
const txData = tx.toJson();
|
|
61
|
+
const fee = tx.getFee;
|
|
62
|
+
txData.certs.length.should.equal(0);
|
|
63
|
+
txData.withdrawals.length.should.equal(1);
|
|
64
|
+
txData.withdrawals[0].value.should.equal(reward.toString());
|
|
65
|
+
txData.outputs.length.should.equal(1);
|
|
66
|
+
txData.outputs[0].amount.should.equal((Number(totalInput) + reward - Number(fee)).toString());
|
|
67
|
+
fee.should.equal('167217');
|
|
68
|
+
tx.toBroadcastFormat().should.equal(testData.rawTx.unsignedStakingWithdrawTx);
|
|
69
|
+
should_1.default.equal(tx.id, testData.rawTx.unsignedStakingWithdrawTxHash);
|
|
70
|
+
});
|
|
71
|
+
it('build a staingDEactivate from rawTx', async () => {
|
|
72
|
+
const txBuilder = factory.from(testData.rawTx.unsignedStakingWithdrawTx);
|
|
73
|
+
const builtTx = (await txBuilder.build());
|
|
74
|
+
should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.StakingWithdraw);
|
|
75
|
+
should_1.default.equal(builtTx.id, testData.rawTx.unsignedStakingWithdrawTxHash);
|
|
76
|
+
const txData = builtTx.toJson();
|
|
77
|
+
const fee = builtTx.getFee;
|
|
78
|
+
txData.certs.length.should.equal(0);
|
|
79
|
+
txData.outputs.length.should.equal(1);
|
|
80
|
+
const totalInput = '4000000';
|
|
81
|
+
const reward = 1239239;
|
|
82
|
+
txData.outputs[0].amount.should.equal((Number(totalInput) + reward - Number(fee)).toString());
|
|
83
|
+
fee.should.equal('167217');
|
|
84
|
+
txData.withdrawals.length.should.equal(1);
|
|
85
|
+
txData.withdrawals[0].value.should.equal(reward.toString());
|
|
86
|
+
});
|
|
87
|
+
// xit('should withdraw rewards from a stake address', async () => {
|
|
88
|
+
// const axiosConfig = {
|
|
89
|
+
// headers: {
|
|
90
|
+
// 'Content-Type': 'application/cbor',
|
|
91
|
+
// },
|
|
92
|
+
// timeout: 10000,
|
|
93
|
+
// };
|
|
94
|
+
// const keyPairPayment = new KeyPair({ prv: testData.stakingAccount.paymentKey });
|
|
95
|
+
// const keyPairStake = new KeyPair({ prv: testData.stakingAccount.stakeKey });
|
|
96
|
+
// const enterpriseAddress = keyPairPayment.getAddress(AddressFormat.testnet);
|
|
97
|
+
// const txBuilder = factory.getStakingWithdrawBuilder();
|
|
98
|
+
// const utxoData = await axios.get('https://testnet.koios.rest/api/v0/address_info?_address=' + enterpriseAddress);
|
|
99
|
+
// const senderBalance = utxoData.data[0].balance;
|
|
100
|
+
// const utxoSet = utxoData.data[0].utxo_set;
|
|
101
|
+
// for (const utxo of utxoSet) {
|
|
102
|
+
// txBuilder.input({ transaction_id: utxo.tx_hash, transaction_index: utxo.tx_index });
|
|
103
|
+
// }
|
|
104
|
+
// txBuilder.changeAddress(enterpriseAddress, senderBalance);
|
|
105
|
+
//
|
|
106
|
+
// const fullAddress = Utils.default.createBaseAddressWithStakeAndPaymentKey(
|
|
107
|
+
// keyPairStake,
|
|
108
|
+
// keyPairPayment,
|
|
109
|
+
// AddressFormat.testnet
|
|
110
|
+
// );
|
|
111
|
+
// const rewardAcctData = await axios.get('https://testnet.koios.rest/api/v0/account_info?_address=' + fullAddress);
|
|
112
|
+
// console.log(rewardAcctData);
|
|
113
|
+
// const stakeAddressBalance = rewardAcctData.data[0].rewards;
|
|
114
|
+
// console.log('Stake account balance: ' + stakeAddressBalance);
|
|
115
|
+
// txBuilder.addWithdrawal(keyPairStake.getKeys().pub, stakeAddressBalance);
|
|
116
|
+
//
|
|
117
|
+
// txBuilder.ttl(900000000);
|
|
118
|
+
// txBuilder.sign({ key: keyPairPayment.getKeys().prv });
|
|
119
|
+
// txBuilder.sign({ key: keyPairStake.getKeys().prv });
|
|
120
|
+
// const tx = await txBuilder.build();
|
|
121
|
+
// const serializedTx = tx.toBroadcastFormat();
|
|
122
|
+
// const bytes = Uint8Array.from(Buffer.from(serializedTx, 'hex'));
|
|
123
|
+
//
|
|
124
|
+
// try {
|
|
125
|
+
// const res = await axios.post('https://testnet.koios.rest/api/v0/submittx', bytes, axiosConfig);
|
|
126
|
+
// console.log(res.data);
|
|
127
|
+
// } catch (err) {
|
|
128
|
+
// console.log(err);
|
|
129
|
+
// }
|
|
130
|
+
// });
|
|
131
|
+
it('should submit a staking withdraw using signature interface', async () => {
|
|
132
|
+
const keyPairPayment = new src_1.KeyPair({ prv: testData.privateKeys.prvKey9 });
|
|
133
|
+
const keyPairStake = new src_1.KeyPair({ prv: testData.privateKeys.prvKey10 });
|
|
134
|
+
const senderAddress = src_1.Utils.default.createBaseAddressWithStakeAndPaymentKey(keyPairStake, keyPairPayment, sdk_core_1.AddressFormat.testnet);
|
|
135
|
+
const txBuilder = factory.getStakingWithdrawBuilder();
|
|
136
|
+
const senderBalance = '22122071';
|
|
137
|
+
const reward = '1232323';
|
|
138
|
+
txBuilder.changeAddress(senderAddress, senderBalance);
|
|
139
|
+
txBuilder.addWithdrawal(keyPairStake.getKeys().pub, reward);
|
|
140
|
+
txBuilder.input({
|
|
141
|
+
transaction_id: '0a4f80d83ba9ce1f83306a79252909241308d7eff317d04c9ea018966d687fe3',
|
|
142
|
+
transaction_index: 0,
|
|
143
|
+
});
|
|
144
|
+
txBuilder.ttl(900000000);
|
|
145
|
+
const unsignedTx = await txBuilder.build();
|
|
146
|
+
const signableHex = unsignedTx.signablePayload.toString('hex');
|
|
147
|
+
const serializedTx = unsignedTx.toBroadcastFormat();
|
|
148
|
+
txBuilder.sign({ key: keyPairPayment.getKeys().prv });
|
|
149
|
+
txBuilder.sign({ key: keyPairStake.getKeys().prv });
|
|
150
|
+
const signedTransaction = await txBuilder.build();
|
|
151
|
+
const serializedTransaction = signedTransaction.toBroadcastFormat();
|
|
152
|
+
const txBuilder2 = factory.from(serializedTx);
|
|
153
|
+
const tx = await txBuilder2.build();
|
|
154
|
+
tx.type.should.equal(sdk_core_1.TransactionType.StakingWithdraw);
|
|
155
|
+
const signableHex2 = tx.signablePayload.toString('hex');
|
|
156
|
+
signableHex.should.equal(signableHex2);
|
|
157
|
+
const signaturePayment = keyPairPayment.signMessage(signableHex2);
|
|
158
|
+
const signatureStake = keyPairStake.signMessage(signableHex2);
|
|
159
|
+
txBuilder2.addSignature({ pub: keyPairPayment.getKeys().pub }, Buffer.from(signaturePayment));
|
|
160
|
+
txBuilder2.addSignature({ pub: keyPairStake.getKeys().pub }, Buffer.from(signatureStake));
|
|
161
|
+
const signedTransaction2 = await txBuilder2.build();
|
|
162
|
+
signedTransaction.id.should.equal(tx.id);
|
|
163
|
+
const serializedTransaction2 = signedTransaction2.toBroadcastFormat();
|
|
164
|
+
serializedTransaction2.should.equal(serializedTransaction);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ1dpdGhkcmF3QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9zdGFraW5nV2l0aGRyYXdCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG1EQUFzRTtBQUN0RSx1REFBeUM7QUFDekMsbUNBQXNFO0FBQ3RFLGlEQUE0QztBQUc1QyxRQUFRLENBQUMsMENBQTBDLEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFDOUQsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFakUsRUFBRSxDQUFDLGlEQUFpRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQy9ELE1BQU0sWUFBWSxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN4RSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUN0RCxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQ2QsY0FBYyxFQUFFLGtFQUFrRTtZQUNsRixpQkFBaUIsRUFBRSxDQUFDO1NBQ3JCLENBQUMsQ0FBQztRQUNILE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM3QixTQUFTLENBQUMsYUFBYSxDQUNyQix5R0FBeUcsRUFDekcsVUFBVSxDQUNYLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUM7UUFDdkIsU0FBUyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekIsTUFBTSxFQUFF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Q0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQzdELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBBZGRyZXNzRm9ybWF0LCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgS2V5UGFpciwgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgVXRpbHMgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbic7XG5cbmRlc2NyaWJlKCdBREEgU3Rha2luZyBXaXRoZHJhdyBUcmFuc2FjdGlvbiBCdWlsZGVyJywgYXN5bmMgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YWRhJykpO1xuXG4gIGl0KCdzdGFydCBhbmQgYnVpbGQgYW4gdW5zaWduZWQgc3Rha2luZyB3aXRoZHJhdyB0eCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBrZXlQYWlyU3Rha2UgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJpdmF0ZUtleXMucHJ2S2V5MiB9KTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdXaXRoZHJhd0J1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuaW5wdXQoe1xuICAgICAgdHJhbnNhY3Rpb25faWQ6ICczNjc3ZTc1YzdiYTY5OWJmZGM2Y2Q1N2Q0MmYyNDZmODZmNjNhZWZkNzYwMjUwMDZhYzc4MzEzZmFkMmJiYTIxJyxcbiAgICAgIHRyYW5zYWN0aW9uX2luZGV4OiAxLFxuICAgIH0pO1xuICAgIGNvbnN0IHRvdGFsSW5wdXQgPSAnNDAwMDAwMCc7XG4gICAgdHhCdWlsZGVyLmNoYW5nZUFkZHJlc3MoXG4gICAgICAnYWRkcjFxOHJtOXo3dzR5eDVnejY1MmtuMnEyMzhlZnZtczZ0MHFlbHVyOW5sZ2x1bjhldTR0cjVrbmo0ZnU0YWRlbHpxaHhnOGFkdTV4Y2E0anJhMGd0bGxmcnBjYXd5cTlwc3oyMycsXG4gICAgICB0b3RhbElucHV0XG4gICAgKTtcbiAgICBjb25zdCByZXdhcmQgPSAxMjM5MjM5O1xuICAgIHR4QnVpbGRlci5hZGRXaXRoZHJhd2FsKGtleVBhaXJTdGFrZS5nZXRLZXlzKCkucHViLCByZXdhcmQudG9TdHJpbmcoKSk7XG4gICAgdHhCdWlsZGVyLnR0bCg4MDAwMDAwMDApO1xuICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdyk7XG4gICAgY29uc3QgdHhEYXRhID0gdHgudG9Kc29uKCk7XG4gICAgY29uc3QgZmVlID0gdHguZ2V0RmVlO1xuICAgIHR4RGF0YS5jZXJ0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIHR4RGF0YS53aXRoZHJhd2Fscy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIHR4RGF0YS53aXRoZHJhd2Fsc1swXS52YWx1ZS5zaG91bGQuZXF1YWwocmV3YXJkLnRvU3RyaW5nKCkpO1xuXG4gICAgdHhEYXRhLm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB0eERhdGEub3V0cHV0c1swXS5hbW91bnQuc2hvdWxkLmVxdWFsKChOdW1iZXIodG90YWxJbnB1dCkgKyByZXdhcmQgLSBOdW1iZXIoZmVlKSkudG9TdHJpbmcoKSk7XG4gICAgZmVlLnNob3VsZC5lcXVhbCgnMTY3MjE3Jyk7XG4gICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodGVzdERhdGEucmF3VHgudW5zaWduZWRTdGFraW5nV2l0aGRyYXdUeCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LmlkLCB0ZXN0RGF0YS5yYXdUeC51bnNpZ25lZFN0YWtpbmdXaXRoZHJhd1R4SGFzaCk7XG4gIH0pO1xuXG4gIGl0KCdidWlsZCBhIHN0YWluZ0RFYWN0aXZhdGUgZnJvbSByYXdUeCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEucmF3VHgudW5zaWduZWRTdGFraW5nV2l0aGRyYXdUeCk7XG4gICAgY29uc3QgYnVpbHRUeCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgc2hvdWxkLmVxdWFsKGJ1aWx0VHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdyk7XG4gICAgc2hvdWxkLmVxdWFsKGJ1aWx0VHguaWQsIHRlc3REYXRhLnJhd1R4LnVuc2lnbmVkU3Rha2luZ1dpdGhkcmF3VHhIYXNoKTtcbiAgICBjb25zdCB0eERhdGEgPSBidWlsdFR4LnRvSnNvbigpO1xuICAgIGNvbnN0IGZlZSA9IGJ1aWx0VHguZ2V0RmVlO1xuICAgIHR4RGF0YS5jZXJ0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuXG4gICAgdHhEYXRhLm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICBjb25zdCB0b3RhbElucHV0ID0gJzQwMDAwMDAnO1xuICAgIGNvbnN0IHJld2FyZCA9IDEyMzkyMzk7XG4gICAgdHhEYXRhLm91dHB1dHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbCgoTnVtYmVyKHRvdGFsSW5wdXQpICsgcmV3YXJkIC0gTnVtYmVyKGZlZSkpLnRvU3RyaW5nKCkpO1xuICAgIGZlZS5zaG91bGQuZXF1YWwoJzE2NzIxNycpO1xuICAgIHR4RGF0YS53aXRoZHJhd2Fscy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIHR4RGF0YS53aXRoZHJhd2Fsc1swXS52YWx1ZS5zaG91bGQuZXF1YWwocmV3YXJkLnRvU3RyaW5nKCkpO1xuICB9KTtcblxuICAvLyB4aXQoJ3Nob3VsZCB3aXRoZHJhdyByZXdhcmRzIGZyb20gYSBzdGFrZSBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAvLyAgIGNvbnN0IGF4aW9zQ29uZmlnID0ge1xuICAvLyAgICAgaGVhZGVyczoge1xuICAvLyAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2Nib3InLFxuICAvLyAgICAgfSxcbiAgLy8gICAgIHRpbWVvdXQ6IDEwMDAwLFxuICAvLyAgIH07XG4gIC8vICAgY29uc3Qga2V5UGFpclBheW1lbnQgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuc3Rha2luZ0FjY291bnQucGF5bWVudEtleSB9KTtcbiAgLy8gICBjb25zdCBrZXlQYWlyU3Rha2UgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuc3Rha2luZ0FjY291bnQuc3Rha2VLZXkgfSk7XG4gIC8vICAgY29uc3QgZW50ZXJwcmlzZUFkZHJlc3MgPSBrZXlQYWlyUGF5bWVudC5nZXRBZGRyZXNzKEFkZHJlc3NGb3JtYXQudGVzdG5ldCk7XG4gIC8vICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nV2l0aGRyYXdCdWlsZGVyKCk7XG4gIC8vICAgY29uc3QgdXR4b0RhdGEgPSBhd2FpdCBheGlvcy5nZXQoJ2h0dHBzOi8vdGVzdG5ldC5rb2lvcy5yZXN0L2FwaS92MC9hZGRyZXNzX2luZm8/X2FkZHJlc3M9JyArIGVudGVycHJpc2VBZGRyZXNzKTtcbiAgLy8gICBjb25zdCBzZW5kZXJCYWxhbmNlID0gdXR4b0RhdGEuZGF0YVswXS5iYWxhbmNlO1xuICAvLyAgIGNvbnN0IHV0eG9TZXQgPSB1dHhvRGF0YS5kYXRhWzBdLnV0eG9fc2V0O1xuICAvLyAgIGZvciAoY29uc3QgdXR4byBvZiB1dHhvU2V0KSB7XG4gIC8vICAgICB0eEJ1aWxkZXIuaW5wdXQoeyB0cmFuc2FjdGlvbl9pZDogdXR4by50eF9oYXNoLCB0cmFuc2FjdGlvbl9pbmRleDogdXR4by50eF9pbmRleCB9KTtcbiAgLy8gICB9XG4gIC8vICAgdHhCdWlsZGVyLmNoYW5nZUFkZHJlc3MoZW50ZXJwcmlzZUFkZHJlc3MsIHNlbmRlckJhbGFuY2UpO1xuICAvL1xuICAvLyAgIGNvbnN0IGZ1bGxBZGRyZXNzID0gVXRpbHMuZGVmYXVsdC5jcmVhdGVCYXNlQWRkcmVzc1dpdGhTdGFrZUFuZFBheW1lbnRLZXkoXG4gIC8vICAgICBrZXlQYWlyU3Rha2UsXG4gIC8vICAgICBrZXlQYWlyUGF5bWVudCxcbiAgLy8gICAgIEFkZHJlc3NGb3JtYXQudGVzdG5ldFxuICAvLyAgICk7XG4gIC8vICAgY29uc3QgcmV3YXJkQWNjdERhdGEgPSBhd2FpdCBheGlvcy5nZXQoJ2h0dHBzOi8vdGVzdG5ldC5rb2lvcy5yZXN0L2FwaS92MC9hY2NvdW50X2luZm8/X2FkZHJlc3M9JyArIGZ1bGxBZGRyZXNzKTtcbiAgLy8gICBjb25zb2xlLmxvZyhyZXdhcmRBY2N0RGF0YSk7XG4gIC8vICAgY29uc3Qgc3Rha2VBZGRyZXNzQmFsYW5jZSA9IHJld2FyZEFjY3REYXRhLmRhdGFbMF0ucmV3YXJkcztcbiAgLy8gICBjb25zb2xlLmxvZygnU3Rha2UgYWNjb3VudCBiYWxhbmNlOiAnICsgc3Rha2VBZGRyZXNzQmFsYW5jZSk7XG4gIC8vICAgdHhCdWlsZGVyLmFkZFdpdGhkcmF3YWwoa2V5UGFpclN0YWtlLmdldEtleXMoKS5wdWIsIHN0YWtlQWRkcmVzc0JhbGFuY2UpO1xuICAvL1xuICAvLyAgIHR4QnVpbGRlci50dGwoOTAwMDAwMDAwKTtcbiAgLy8gICB0eEJ1aWxkZXIuc2lnbih7IGtleToga2V5UGFpclBheW1lbnQuZ2V0S2V5cygpLnBydiB9KTtcbiAgLy8gICB0eEJ1aWxkZXIuc2lnbih7IGtleToga2V5UGFpclN0YWtlLmdldEtleXMoKS5wcnYgfSk7XG4gIC8vICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgLy8gICBjb25zdCBzZXJpYWxpemVkVHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAvLyAgIGNvbnN0IGJ5dGVzID0gVWludDhBcnJheS5mcm9tKEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZWRUeCwgJ2hleCcpKTtcbiAgLy9cbiAgLy8gICB0cnkge1xuICAvLyAgICAgY29uc3QgcmVzID0gYXdhaXQgYXhpb3MucG9zdCgnaHR0cHM6Ly90ZXN0bmV0LmtvaW9zLnJlc3QvYXBpL3YwL3N1Ym1pdHR4JywgYnl0ZXMsIGF4aW9zQ29uZmlnKTtcbiAgLy8gICAgIGNvbnNvbGUubG9nKHJlcy5kYXRhKTtcbiAgLy8gICB9IGNhdGNoIChlcnIpIHtcbiAgLy8gICAgIGNvbnNvbGUubG9nKGVycik7XG4gIC8vICAgfVxuICAvLyB9KTtcblxuICBpdCgnc2hvdWxkIHN1Ym1pdCBhIHN0YWtpbmcgd2l0aGRyYXcgdXNpbmcgc2lnbmF0dXJlIGludGVyZmFjZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBrZXlQYWlyUGF5bWVudCA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcml2YXRlS2V5cy5wcnZLZXk5IH0pO1xuICAgIGNvbnN0IGtleVBhaXJTdGFrZSA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcml2YXRlS2V5cy5wcnZLZXkxMCB9KTtcbiAgICBjb25zdCBzZW5kZXJBZGRyZXNzID0gVXRpbHMuZGVmYXVsdC5jcmVhdGVCYXNlQWRkcmVzc1dpdGhTdGFrZUFuZFBheW1lbnRLZXkoXG4gICAgICBrZXlQYWlyU3Rha2UsXG4gICAgICBrZXlQYWlyUGF5bWVudCxcbiAgICAgIEFkZHJlc3NGb3JtYXQudGVzdG5ldFxuICAgICk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nV2l0aGRyYXdCdWlsZGVyKCk7XG4gICAgY29uc3Qgc2VuZGVyQmFsYW5jZSA9ICcyMjEyMjA3MSc7XG4gICAgY29uc3QgcmV3YXJkID0gJzEyMzIzMjMnO1xuICAgIHR4QnVpbGRlci5jaGFuZ2VBZGRyZXNzKHNlbmRlckFkZHJlc3MsIHNlbmRlckJhbGFuY2UpO1xuICAgIHR4QnVpbGRlci5hZGRXaXRoZHJhd2FsKGtleVBhaXJTdGFrZS5nZXRLZXlzKCkucHViLCByZXdhcmQpO1xuXG4gICAgdHhCdWlsZGVyLmlucHV0KHtcbiAgICAgIHRyYW5zYWN0aW9uX2lkOiAnMGE0ZjgwZDgzYmE5Y2UxZjgzMzA2YTc5MjUyOTA5MjQxMzA4ZDdlZmYzMTdkMDRjOWVhMDE4OTY2ZDY4N2ZlMycsXG4gICAgICB0cmFuc2FjdGlvbl9pbmRleDogMCxcbiAgICB9KTtcblxuICAgIHR4QnVpbGRlci50dGwoOTAwMDAwMDAwKTtcblxuICAgIGNvbnN0IHVuc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBzaWduYWJsZUhleCA9IHVuc2lnbmVkVHguc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVHggPSB1bnNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGtleVBhaXJQYXltZW50LmdldEtleXMoKS5wcnYgfSk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGtleVBhaXJTdGFrZS5nZXRLZXlzKCkucHJ2IH0pO1xuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFRyYW5zYWN0aW9uID0gc2lnbmVkVHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBmYWN0b3J5LmZyb20oc2VyaWFsaXplZFR4KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcbiAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3KTtcbiAgICBjb25zdCBzaWduYWJsZUhleDIgPSB0eC5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpO1xuICAgIHNpZ25hYmxlSGV4LnNob3VsZC5lcXVhbChzaWduYWJsZUhleDIpO1xuICAgIGNvbnN0IHNpZ25hdHVyZVBheW1lbnQgPSBrZXlQYWlyUGF5bWVudC5zaWduTWVzc2FnZShzaWduYWJsZUhleDIpO1xuICAgIGNvbnN0IHNpZ25hdHVyZVN0YWtlID0ga2V5UGFpclN0YWtlLnNpZ25NZXNzYWdlKHNpZ25hYmxlSGV4Mik7XG4gICAgdHhCdWlsZGVyMi5hZGRTaWduYXR1cmUoeyBwdWI6IGtleVBhaXJQYXltZW50LmdldEtleXMoKS5wdWIgfSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlUGF5bWVudCkpO1xuICAgIHR4QnVpbGRlcjIuYWRkU2lnbmF0dXJlKHsgcHViOiBrZXlQYWlyU3Rha2UuZ2V0S2V5cygpLnB1YiB9LCBCdWZmZXIuZnJvbShzaWduYXR1cmVTdGFrZSkpO1xuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uMiA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcbiAgICBzaWduZWRUcmFuc2FjdGlvbi5pZC5zaG91bGQuZXF1YWwodHguaWQpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUcmFuc2FjdGlvbjIgPSBzaWduZWRUcmFuc2FjdGlvbjIudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBzZXJpYWxpemVkVHJhbnNhY3Rpb24yLnNob3VsZC5lcXVhbChzZXJpYWxpemVkVHJhbnNhY3Rpb24pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenWithdrawal.d.ts","sourceRoot":"","sources":["../../../test/unit/tokenWithdrawal.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const should_1 = __importDefault(require("should"));
|
|
40
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
41
|
+
const testData = __importStar(require("../resources"));
|
|
42
|
+
const src_1 = require("../../src");
|
|
43
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
44
|
+
const CardanoWasm = __importStar(require("@emurgo/cardano-serialization-lib-nodejs"));
|
|
45
|
+
describe('ADA Token Operations', async () => {
|
|
46
|
+
const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tada'));
|
|
47
|
+
const receiverAddress = testData.rawTx.outputAddress2.address;
|
|
48
|
+
const senderAddress = testData.rawTx.outputAddress1.address;
|
|
49
|
+
const policyId = 'e16c2dc8ae937e8d3790c7fd7168d7b994621ba14ca11415f39fed72';
|
|
50
|
+
const policyScriptHash = CardanoWasm.ScriptHash.from_hex(policyId);
|
|
51
|
+
const assetName = 'tada:water';
|
|
52
|
+
const name = 'WATER';
|
|
53
|
+
const asciiEncodedName = Buffer.from(name, 'ascii').toString('hex');
|
|
54
|
+
const fingerprint = 'asset1n69xf60d0760xvn8v2ffd5frvsm0cl2r8hfjf6';
|
|
55
|
+
const unsupportedPolicyId = '279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f';
|
|
56
|
+
const unsupportedPolicyScriptHash = CardanoWasm.ScriptHash.from_hex(unsupportedPolicyId);
|
|
57
|
+
const unsupportedName = 'BITGO';
|
|
58
|
+
const unsupportedAsciiEncodedName = Buffer.from(unsupportedName, 'ascii').toString('hex');
|
|
59
|
+
const unsupportedFingerprint = 'asset1m8h0gk7f6x5j5qg0x5m4q5f5j5qg0x5m4q5f5j';
|
|
60
|
+
it(`should build a transaction with token ${assetName} - ada + ${assetName}`, async () => {
|
|
61
|
+
const quantity = '20';
|
|
62
|
+
const totalInput = 20000000;
|
|
63
|
+
const totalAssetList = {
|
|
64
|
+
[fingerprint]: {
|
|
65
|
+
quantity: '100',
|
|
66
|
+
policy_id: policyId,
|
|
67
|
+
asset_name: asciiEncodedName,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
const expectedChangeAda = (totalInput -
|
|
71
|
+
1500000 /* min ada for change token utxo */ -
|
|
72
|
+
1500000 /* min ada for recipient token utxo*/ -
|
|
73
|
+
173597) /* fee */
|
|
74
|
+
.toString();
|
|
75
|
+
const expectedChangeToken = '80';
|
|
76
|
+
const txBuilder = factory.getTransferBuilder();
|
|
77
|
+
txBuilder.input({
|
|
78
|
+
transaction_id: '3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21',
|
|
79
|
+
transaction_index: 1,
|
|
80
|
+
});
|
|
81
|
+
txBuilder.output({
|
|
82
|
+
address: receiverAddress,
|
|
83
|
+
amount: '0', // Set ADA amount to 0 for token transfer (min ADA is handled in sdk build)
|
|
84
|
+
multiAssets: {
|
|
85
|
+
asset_name: asciiEncodedName,
|
|
86
|
+
policy_id: policyId,
|
|
87
|
+
quantity,
|
|
88
|
+
fingerprint,
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
txBuilder.changeAddress(senderAddress, totalInput.toString(), totalAssetList);
|
|
92
|
+
txBuilder.ttl(800000000);
|
|
93
|
+
txBuilder.isTokenTransaction();
|
|
94
|
+
const tx = (await txBuilder.build());
|
|
95
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
96
|
+
const txData = tx.toJson();
|
|
97
|
+
// Check outputs (should include multi-asset and regular change)
|
|
98
|
+
txData.outputs.length.should.equal(3);
|
|
99
|
+
txData.inputs.length.should.equal(1);
|
|
100
|
+
// One output should have the multi-asset change and the other for the transfer
|
|
101
|
+
const assetOutput = txData.outputs.filter((output) => output.multiAssets !== undefined);
|
|
102
|
+
assetOutput.length.should.equal(2);
|
|
103
|
+
// Verify inputs and outputs
|
|
104
|
+
const input = txData.inputs[0];
|
|
105
|
+
input.transaction_id.should.equal('3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21');
|
|
106
|
+
input.transaction_index.should.equal(1);
|
|
107
|
+
// Validate receiver output
|
|
108
|
+
const receiverOutput = txData.outputs.filter((output) => output.address === receiverAddress);
|
|
109
|
+
receiverOutput.length.should.equal(1);
|
|
110
|
+
receiverOutput[0].amount.should.equal('1500000'); // Minimum ADA for asset output
|
|
111
|
+
receiverOutput[0].multiAssets
|
|
112
|
+
.get_asset(policyScriptHash, CardanoWasm.AssetName.new(Buffer.from(asciiEncodedName, 'hex')))
|
|
113
|
+
.to_str()
|
|
114
|
+
.should.equal(quantity);
|
|
115
|
+
// Validate change outputs (one with asset and one without)
|
|
116
|
+
const changeOutput = txData.outputs.filter((output) => output.address === senderAddress);
|
|
117
|
+
changeOutput.length.should.equal(2);
|
|
118
|
+
const changeWithAsset = changeOutput.find((output) => output.multiAssets !== undefined);
|
|
119
|
+
should_1.default.exist(changeWithAsset);
|
|
120
|
+
changeWithAsset.amount.should.equal('1500000'); // Minimum ADA for asset output
|
|
121
|
+
changeWithAsset.multiAssets
|
|
122
|
+
.get_asset(policyScriptHash, CardanoWasm.AssetName.new(Buffer.from(asciiEncodedName, 'hex')))
|
|
123
|
+
.to_str()
|
|
124
|
+
.should.equal(expectedChangeToken);
|
|
125
|
+
const changeWithoutAsset = changeOutput.find((output) => output.multiAssets === undefined);
|
|
126
|
+
should_1.default.exist(changeWithoutAsset);
|
|
127
|
+
changeWithoutAsset.amount.should.equal(expectedChangeAda); // Remaining ADA after fees and min ADAs
|
|
128
|
+
});
|
|
129
|
+
it(`should build a transaction with token ${assetName} - ada + ${assetName} + unsupported token`, async () => {
|
|
130
|
+
const quantity = '20';
|
|
131
|
+
const totalInput = 20000000;
|
|
132
|
+
const totalAssetList = {
|
|
133
|
+
[fingerprint]: {
|
|
134
|
+
quantity: '100',
|
|
135
|
+
policy_id: policyId,
|
|
136
|
+
asset_name: asciiEncodedName,
|
|
137
|
+
},
|
|
138
|
+
[unsupportedFingerprint]: {
|
|
139
|
+
quantity: '10000',
|
|
140
|
+
policy_id: unsupportedPolicyId,
|
|
141
|
+
asset_name: unsupportedAsciiEncodedName,
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
const expectedChangeAda = (totalInput -
|
|
145
|
+
1500000 /* min ada for change token utxo */ -
|
|
146
|
+
1500000 /* min ada for recipient token utxo*/ -
|
|
147
|
+
1500000 /* min ada for unsupported token change utxo */ -
|
|
148
|
+
179889) /* fee */
|
|
149
|
+
.toString();
|
|
150
|
+
const expectedChangeToken = '80';
|
|
151
|
+
const txBuilder = factory.getTransferBuilder();
|
|
152
|
+
txBuilder.input({
|
|
153
|
+
transaction_id: '3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21',
|
|
154
|
+
transaction_index: 1,
|
|
155
|
+
});
|
|
156
|
+
txBuilder.input({
|
|
157
|
+
transaction_id: '3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba22',
|
|
158
|
+
transaction_index: 1,
|
|
159
|
+
});
|
|
160
|
+
txBuilder.output({
|
|
161
|
+
address: receiverAddress,
|
|
162
|
+
amount: '0', // Set ADA amount to 0 for token transfer (min ADA is handled in sdk build)
|
|
163
|
+
multiAssets: {
|
|
164
|
+
asset_name: asciiEncodedName,
|
|
165
|
+
policy_id: policyId,
|
|
166
|
+
quantity,
|
|
167
|
+
fingerprint,
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
txBuilder.changeAddress(senderAddress, totalInput.toString(), totalAssetList);
|
|
171
|
+
txBuilder.ttl(800000000);
|
|
172
|
+
txBuilder.isTokenTransaction();
|
|
173
|
+
const tx = (await txBuilder.build());
|
|
174
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
175
|
+
const txData = tx.toJson();
|
|
176
|
+
// Check outputs (should include multi-asset and regular change)
|
|
177
|
+
txData.outputs.length.should.equal(4);
|
|
178
|
+
txData.inputs.length.should.equal(2);
|
|
179
|
+
// One output should have the multi-asset change and the other for the transfer
|
|
180
|
+
const assetOutput = txData.outputs.filter((output) => output.multiAssets !== undefined);
|
|
181
|
+
assetOutput.length.should.equal(3);
|
|
182
|
+
// Verify inputs and outputs
|
|
183
|
+
txData.inputs[0].transaction_id.should.equal('3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21');
|
|
184
|
+
txData.inputs[0].transaction_index.should.equal(1);
|
|
185
|
+
txData.inputs[1].transaction_id.should.equal('3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba22');
|
|
186
|
+
txData.inputs[1].transaction_index.should.equal(1);
|
|
187
|
+
// Validate receiver output
|
|
188
|
+
const receiverOutput = txData.outputs.filter((output) => output.address === receiverAddress);
|
|
189
|
+
receiverOutput.length.should.equal(1);
|
|
190
|
+
receiverOutput[0].amount.should.equal('1500000'); // Minimum ADA for asset output
|
|
191
|
+
receiverOutput[0].multiAssets
|
|
192
|
+
.get_asset(policyScriptHash, CardanoWasm.AssetName.new(Buffer.from(asciiEncodedName, 'hex')))
|
|
193
|
+
.to_str()
|
|
194
|
+
.should.equal(quantity);
|
|
195
|
+
// Validate change outputs (one with supported token, one with unsupported token and one for pure ada)
|
|
196
|
+
const changeOutput = txData.outputs.filter((output) => output.address === senderAddress);
|
|
197
|
+
changeOutput.length.should.equal(3);
|
|
198
|
+
const changeWithAsset = changeOutput.filter((output) => output.multiAssets !== undefined);
|
|
199
|
+
changeWithAsset.length.should.equal(2);
|
|
200
|
+
let tokens = 0;
|
|
201
|
+
changeWithAsset.forEach((output) => {
|
|
202
|
+
output.amount.should.equal('1500000'); // Minimum ADA for asset output
|
|
203
|
+
const supportedTokenChangeQty = output.multiAssets
|
|
204
|
+
.get_asset(policyScriptHash, CardanoWasm.AssetName.new(Buffer.from(asciiEncodedName, 'hex')))
|
|
205
|
+
.to_str();
|
|
206
|
+
const unsupportedTokenChangeQty = output.multiAssets
|
|
207
|
+
.get_asset(unsupportedPolicyScriptHash, CardanoWasm.AssetName.new(Buffer.from(unsupportedAsciiEncodedName, 'hex')))
|
|
208
|
+
.to_str();
|
|
209
|
+
if (supportedTokenChangeQty !== '0') {
|
|
210
|
+
supportedTokenChangeQty.should.equal(expectedChangeToken);
|
|
211
|
+
tokens++;
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
unsupportedTokenChangeQty.should.equal('10000');
|
|
215
|
+
tokens++;
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
tokens.should.equal(2);
|
|
219
|
+
const changeWithoutAsset = changeOutput.find((output) => output.multiAssets === undefined);
|
|
220
|
+
should_1.default.exist(changeWithoutAsset);
|
|
221
|
+
changeWithoutAsset.amount.should.equal(expectedChangeAda); // Remaining ADA after fees and min ADAs
|
|
222
|
+
});
|
|
223
|
+
it(`should fail to build a transaction with ${assetName} token and insufficient minimum ADA`, async () => {
|
|
224
|
+
const quantity = '20';
|
|
225
|
+
const totalInput = 2000000;
|
|
226
|
+
const totalAssetList = {
|
|
227
|
+
[fingerprint]: {
|
|
228
|
+
quantity: '100',
|
|
229
|
+
policy_id: policyId,
|
|
230
|
+
asset_name: asciiEncodedName,
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
const txBuilder = factory.getTransferBuilder();
|
|
234
|
+
txBuilder.input({
|
|
235
|
+
transaction_id: '3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21',
|
|
236
|
+
transaction_index: 1,
|
|
237
|
+
});
|
|
238
|
+
txBuilder.output({
|
|
239
|
+
address: receiverAddress,
|
|
240
|
+
amount: '0', // Set ADA amount to 0 for token transfer (min ADA is handled in sdk build)
|
|
241
|
+
multiAssets: {
|
|
242
|
+
asset_name: asciiEncodedName,
|
|
243
|
+
policy_id: policyId,
|
|
244
|
+
quantity,
|
|
245
|
+
fingerprint,
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
txBuilder.changeAddress(senderAddress, totalInput.toString(), totalAssetList);
|
|
249
|
+
txBuilder.ttl(800000000);
|
|
250
|
+
txBuilder.isTokenTransaction();
|
|
251
|
+
await txBuilder
|
|
252
|
+
.build()
|
|
253
|
+
.should.rejectedWith('Insufficient funds: need a minimum of 1500000 lovelace per output to construct token transactions');
|
|
254
|
+
});
|
|
255
|
+
it(`should fail to build a transaction with ${assetName} and insufficient token qty`, async () => {
|
|
256
|
+
const quantity = '20';
|
|
257
|
+
const totalInput = 20000000;
|
|
258
|
+
const totalAssetList = {
|
|
259
|
+
[fingerprint]: {
|
|
260
|
+
quantity: '5',
|
|
261
|
+
policy_id: policyId,
|
|
262
|
+
asset_name: asciiEncodedName,
|
|
263
|
+
},
|
|
264
|
+
};
|
|
265
|
+
const txBuilder = factory.getTransferBuilder();
|
|
266
|
+
txBuilder.input({
|
|
267
|
+
transaction_id: '3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21',
|
|
268
|
+
transaction_index: 1,
|
|
269
|
+
});
|
|
270
|
+
txBuilder.output({
|
|
271
|
+
address: receiverAddress,
|
|
272
|
+
amount: '0', // Set ADA amount to 0 for token transfer (min ADA is handled in sdk build)
|
|
273
|
+
multiAssets: {
|
|
274
|
+
asset_name: asciiEncodedName,
|
|
275
|
+
policy_id: policyId,
|
|
276
|
+
quantity,
|
|
277
|
+
fingerprint,
|
|
278
|
+
},
|
|
279
|
+
});
|
|
280
|
+
txBuilder.changeAddress(senderAddress, totalInput.toString(), totalAssetList);
|
|
281
|
+
txBuilder.ttl(800000000);
|
|
282
|
+
txBuilder.isTokenTransaction();
|
|
283
|
+
await txBuilder.build().should.rejectedWith('Insufficient qty: not enough token qty to cover receiver output');
|
|
284
|
+
});
|
|
285
|
+
it(`should build a transaction with ${assetName} when the token qty is exactly the qty in withdrawal`, async () => {
|
|
286
|
+
const quantity = '1';
|
|
287
|
+
const totalInput = 20000000;
|
|
288
|
+
const totalAssetList = {
|
|
289
|
+
[fingerprint]: {
|
|
290
|
+
quantity: '1',
|
|
291
|
+
policy_id: policyId,
|
|
292
|
+
asset_name: asciiEncodedName,
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
const txBuilder = factory.getTransferBuilder();
|
|
296
|
+
txBuilder.input({
|
|
297
|
+
transaction_id: '3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21',
|
|
298
|
+
transaction_index: 1,
|
|
299
|
+
});
|
|
300
|
+
txBuilder.output({
|
|
301
|
+
address: receiverAddress,
|
|
302
|
+
amount: '0', // Set ADA amount to 0 for token transfer (min ADA is handled in sdk build)
|
|
303
|
+
multiAssets: {
|
|
304
|
+
asset_name: asciiEncodedName,
|
|
305
|
+
policy_id: policyId,
|
|
306
|
+
quantity,
|
|
307
|
+
fingerprint,
|
|
308
|
+
},
|
|
309
|
+
});
|
|
310
|
+
txBuilder.changeAddress(senderAddress, totalInput.toString(), totalAssetList);
|
|
311
|
+
txBuilder.ttl(800000000);
|
|
312
|
+
txBuilder.isTokenTransaction();
|
|
313
|
+
await txBuilder.build().should.not.be.rejected();
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5XaXRoZHJhd2FsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3Rva2VuV2l0aGRyYXdhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixtREFBdUQ7QUFDdkQsdURBQXlDO0FBQ3pDLG1DQUFzRDtBQUN0RCxpREFBNEM7QUFDNUMsc0ZBQXdFO0FBR3hFLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLElBQUksRUFBRTtJQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUVqRSxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7SUFDOUQsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO0lBRTVELE1BQU0sUUFBUSxHQUFHLDBEQUEwRCxDQUFDO0lBQzVFLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkUsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDO0lBQy9CLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQztJQUNyQixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRSxNQUFNLFdBQVcsR0FBRyw4Q0FBOEMsQ0FBQztJQUVuRSxNQUFNLG1CQUFtQixHQUFHLDBEQUEwRCxDQUFDO0lBQ3ZGLE1BQU0sMkJBQTJCLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN6RixNQUFNLGVBQWUs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QVE7Z0JBQ25CLFFBQVE7Z0JBQ1IsV0FBVzthQUNaO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzlFLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekIsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFL0IsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgKiBhcyBDYXJkYW5vV2FzbSBmcm9tICdAZW11cmdvL2NhcmRhbm8tc2VyaWFsaXphdGlvbi1saWItbm9kZWpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbic7XG5cbmRlc2NyaWJlKCdBREEgVG9rZW4gT3BlcmF0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGFkYScpKTtcblxuICBjb25zdCByZWNlaXZlckFkZHJlc3MgPSB0ZXN0RGF0YS5yYXdUeC5vdXRwdXRBZGRyZXNzMi5hZGRyZXNzO1xuICBjb25zdCBzZW5kZXJBZGRyZXNzID0gdGVzdERhdGEucmF3VHgub3V0cHV0QWRkcmVzczEuYWRkcmVzcztcblxuICBjb25zdCBwb2xpY3lJZCA9ICdlMTZjMmRjOGFlOTM3ZThkMzc5MGM3ZmQ3MTY4ZDdiOTk0NjIxYmExNGNhMTE0MTVmMzlmZWQ3Mic7XG4gIGNvbnN0IHBvbGljeVNjcmlwdEhhc2ggPSBDYXJkYW5vV2FzbS5TY3JpcHRIYXNoLmZyb21faGV4KHBvbGljeUlkKTtcbiAgY29uc3QgYXNzZXROYW1lID0gJ3RhZGE6d2F0ZXInO1xuICBjb25zdCBuYW1lID0gJ1dBVEVSJztcbiAgY29uc3QgYXNjaWlFbmNvZGVkTmFtZSA9IEJ1ZmZlci5mcm9tKG5hbWUsICdhc2NpaScpLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgZmluZ2VycHJpbnQgPSAnYXNzZXQxbjY5eGY2MGQwNzYweHZuOHYyZmZkNWZydnNtMGNsMnI4aGZqZjYnO1xuXG4gIGNvbnN0IHVuc3VwcG9ydGVkUG9saWN5SWQgPSAnMjc5YzkwOWYzNDhlNTMzZGE1ODA4ODk4Zjg3ZjlhMTRiYjJjM2RmYmJhY2NjZDYzMWQ5MjdhM2YnO1xuICBjb25zdCB1bnN1cHBvcnRlZFBvbGljeVNjcmlwdEhhc2ggPSBDYXJkYW5vV2FzbS5TY3JpcHRIYXNoLmZyb21faGV4KHVuc3VwcG9ydGVkUG9saWN5SWQpO1xuICBjb25zdCB1bnN1cHBvcnRlZE5hbWUgPSAnQklUR08nO1xuICBjb25zdCB1bnN1cHBvcnRlZEFzY2lpRW5jb2RlZE5hbWUgPSBCdWZmZXIuZnJvbSh1bnN1cHBvcnRlZE5hbWUsICdhc2NpaScpLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgdW5zdXBwb3J0ZWRGaW5nZXJwcmludCA9ICdhc3NldDFtOGgwZ2s3ZjZ4NWo1cWcweDVtNHE1ZjVqNXFnMHg1bTRxNWY1aic7XG5cbiAgaXQoYHNob3VsZCBidWlsZCBhIHRyYW5zYWN0aW9uIHdpdGggdG9rZW4gJHthc3NldE5hbWV9IC0gYWRhICsgJHthc3NldE5hbWV9YCwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHF1YW50aXR5ID0gJzIwJztcbiAgICBjb25zdCB0b3RhbElucHV0ID0gMjAwMDAwMDA7XG4gICAgY29uc3QgdG90YWxBc3NldExpc3QgPSB7XG4gICAgICBbZmluZ2VycHJpbnRdOiB7XG4gICAgICAgIHF1YW50aXR5OiAnMTAwJyxcbiAgICAgICAgcG9saWN5X2lkOiBwb2xpY3lJZCxcbiAgICAgICAgYXNzZXRfbmFtZTogYXNjaWlFbmNvZGVkTmFtZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBleHBlY3RlZENoYW5nZUFkYSA9IChcbiAgICAgIHRvdGFsSW5wdXQgLVxuICAgICAgMTUwMDAwMCAvKiBtaW4gYWRhIGZvciBjaGFuZ2UgdG9rZW4gdXR4byAqLyAtXG4gICAgICAxNTAwMDAwIC8qIG1pbiBhZGEgZm9yIHJlY2lwaWVudCB0b2tlbiB1dHhvKi8gLVxuICAgICAgMTczNTk3XG4gICAgKSAvKiBmZWUgKi9cbiAgICAgIC50b1N0cmluZygpO1xuICAgIGNvbnN0IGV4cGVjdGVkQ2hhbmdlVG9rZW4gPSAnODAnO1xuXG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuaW5wdXQoe1xuICAgICAgdHJhbnNhY3Rpb25faWQ6ICczNjc3ZTc1YzdiYTY5OWJmZGM2Y2Q1N2Q0MmYyNDZmODZmNjNhZWZkNzYwMjUwMDZhYzc4MzEzZmFkMmJiYTIxJyxcbiAgICAgIHRyYW5zYWN0aW9uX2luZGV4OiAxLFxuICAgIH0pO1xuXG4gICAgdHhCdWlsZGVyLm91dHB1dCh7XG4gICAgICBhZGRyZXNzOiByZWNlaXZlckFkZHJlc3MsXG4gICAgICBhbW91bnQ6ICcwJywgLy8gU2V0IEFEQSBhbW91bnQgdG8gMCBmb3IgdG9rZW4gdHJhbnNmZXIgKG1pbiBBREEgaXMgaGFuZGxlZCBpbiBzZGsgYnVpbGQpXG4gICAgICBtdWx0aUFzc2V0czoge1xuICAgICAgICBhc3NldF9uYW1lOiBhc2NpaUVuY29kZWROYW1lLFxuICAgICAgICBwb2xpY3lfaWQ6IHBvbGljeUlkLFxuICAgICAgICBxdWFudGl0eSxcbiAgICAgICAgZmluZ2VycHJpbnQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdHhCdWlsZGVyLmNoYW5nZUFkZHJlc3Moc2VuZGVyQWRkcmVzcywgdG90YWxJbnB1dC50b1N0cmluZygpLCB0b3RhbEFzc2V0TGlzdCk7XG4gICAgdHhCdWlsZGVyLnR0bCg4MDAwMDAwMDApO1xuICAgIHR4QnVpbGRlci5pc1Rva2VuVHJhbnNhY3Rpb24oKTtcbiAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG5cbiAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgIGNvbnN0IHR4RGF0YSA9IHR4LnRvSnNvbigpO1xuXG4gICAgLy8gQ2hlY2sgb3V0cHV0cyAoc2hvdWxkIGluY2x1ZGUgbXVsdGktYXNzZXQgYW5kIHJlZ3VsYXIgY2hhbmdlKVxuICAgIHR4RGF0YS5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMyk7XG4gICAgdHhEYXRhLmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuXG4gICAgLy8gT25lIG91dHB1dCBzaG91bGQgaGF2ZSB0aGUgbXVsdGktYXNzZXQgY2hhbmdlIGFuZCB0aGUgb3RoZXIgZm9yIHRoZSB0cmFuc2ZlclxuICAgIGNvbnN0IGFzc2V0T3V0cHV0ID0gdHhEYXRhLm91dHB1dHMuZmlsdGVyKChvdXRwdXQpID0+IG91dHB1dC5tdWx0aUFzc2V0cyAhPT0gdW5kZWZpbmVkKTtcbiAgICBhc3NldE91dHB1dCEubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcblxuICAgIC8vIFZlcmlmeSBpbnB1dHMgYW5kIG91dHB1dHNcbiAgICBjb25zdCBpbnB1dCA9IHR4RGF0YS5pbnB1dHNbMF07XG4gICAgaW5wdXQudHJhbnNhY3Rpb25faWQuc2hvdWxkLmVxdWFsKCczNjc3ZTc1YzdiYTY5OWJmZGM2Y2Q1N2Q0MmYyNDZmODZmNjNhZWZkNzYwMjUwMDZhYzc4MzEzZmFkMmJiYTIxJyk7XG4gICAgaW5wdXQudHJhbnNhY3Rpb25faW5kZXguc2hvdWxkLmVxdWFsKDEpO1xuXG4gICAgLy8gVmFsaWRhdGUgcmVjZWl2ZXIgb3V0cHV0XG4gICAgY29uc3QgcmVjZWl2ZXJPdXRwdXQgPSB0eERhdGEub3V0cHV0cy5maWx0ZXIoKG91dHB1dCkgPT4gb3V0cHV0LmFkZHJlc3MgPT09IHJlY2VpdmVyQWRkcmVzcyk7XG4gICAgcmVjZWl2ZXJPdXRwdXQubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICByZWNlaXZlck91dHB1dFswXS5hbW91bnQuc2hvdWxkLmVxdWFsKCcxNTAwMDAwJyk7IC8vIE1pbmltdW0gQURBIGZvciBhc3NldCBvdXRwdXRcbiAgICAocmVjZWl2ZXJPdXRwdXRbMF0ubXVsdGlBc3NldHMhIGFzIENhcmRhbm9XYXNtLk11bHRpQXNzZXQpXG4gICAgICAuZ2V0X2Fzc2V0KHBvbGljeVNjcmlwdEhhc2gsIENhcmRhbm9XYXNtLkFzc2V0TmFtZS5uZXcoQnVmZmVyLmZyb20oYXNjaWlFbmNvZGVkTmFtZSwgJ2hleCcpKSlcbiAgICAgIC50b19zdHIoKVxuICAgICAgLnNob3VsZC5lcXVhbChxdWFudGl0eSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBjaGFuZ2Ugb3V0cHV0cyAob25lIHdpdGggYXNzZXQgYW5kIG9uZSB3aXRob3V0KVxuICAgIGNvbnN0IGNoYW5nZU91dHB1dCA9IHR4RGF0YS5vdXRwdXRzLmZpbHRlcigob3V0cHV0KSA9PiBvdXRwdXQuYWRkcmVzcyA9PT0gc2VuZGVyQWRkcmVzcyk7XG4gICAgY2hhbmdlT3V0cHV0Lmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgY29uc3QgY2hhbmdlV2l0aEFzc2V0ID0gY2hhbmdlT3V0cHV0LmZpbmQoKG91dHB1dCkgPT4gb3V0cHV0Lm11bHRpQXNzZXRzICE9PSB1bmRlZmluZWQpO1xuICAgIHNob3VsZC5leGlzdChjaGFuZ2VXaXRoQXNzZXQpO1xuICAgIGNoYW5nZVdpdGhBc3NldCEuYW1vdW50LnNob3VsZC5lcXVhbCgnMTUwMDAwMCcpOyAvLyBNaW5pbXVtIEFEQSBmb3IgYXNzZXQgb3V0cHV0XG4gICAgKGNoYW5nZVdpdGhBc3NldCEubXVsdGlBc3NldHMhIGFzIENhcmRhbm9XYXNtLk11bHRpQXNzZXQpXG4gICAgICAuZ2V0X2Fzc2V0KHBvbGljeVNjcmlwdEhhc2gsIENhcmRhbm9XYXNtLkFzc2V0TmFtZS5uZXcoQnVmZmVyLmZyb20oYXNjaWlFbmNvZGVkTmFtZSwgJ2hleCcpKSlcbiAgICAgIC50b19zdHIoKVxuICAgICAgLnNob3VsZC5lcXVhbChleHBlY3RlZENoYW5nZVRva2VuKTtcblxuICAgIGNvbnN0IGNoYW5nZVdpdGhvdXRBc3NldCA9IGNoYW5nZU91dHB1dC5maW5kKChvdXRwdXQpID0+IG91dHB1dC5tdWx0aUFzc2V0cyA9PT0gdW5kZWZpbmVkKTtcbiAgICBzaG91bGQuZXhpc3QoY2hhbmdlV2l0aG91dEFzc2V0KTtcbiAgICBjaGFuZ2VXaXRob3V0QXNzZXQhLmFtb3VudC5zaG91bGQuZXF1YWwoZXhwZWN0ZWRDaGFuZ2VBZGEpOyAvLyBSZW1haW5pbmcgQURBIGFmdGVyIGZlZXMgYW5kIG1pbiBBREFzXG4gIH0pO1xuXG4gIGl0KGBzaG91bGQgYnVpbGQgYSB0cmFuc2FjdGlvbiB3aXRoIHRva2VuICR7YXNzZXROYW1lfSAtIGFkYSArICR7YXNzZXROYW1lfSArIHVuc3VwcG9ydGVkIHRva2VuYCwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHF1YW50aXR5ID0gJzIwJztcbiAgICBjb25zdCB0b3RhbElucHV0ID0gMjAwMDAwMDA7XG4gICAgY29uc3QgdG90YWxBc3NldExpc3QgPSB7XG4gICAgICBbZmluZ2VycHJpbnRdOiB7XG4gICAgICAgIHF1YW50aXR5OiAnMTAwJyxcbiAgICAgICAgcG9saWN5X2lkOiBwb2xpY3lJZCxcbiAgICAgICAgYXNzZXRfbmFtZTogYXNjaWlFbmNvZGVkTmFtZSxcbiAgICAgIH0sXG4gICAgICBbdW5zdXBwb3J0ZWRGaW5nZXJwcmludF06IHtcbiAgICAgICAgcXVhbnRpdHk6ICcxMDAwMCcsXG4gICAgICAgIHBvbGljeV9pZDogdW5zdXBwb3J0ZWRQb2xpY3lJZCxcbiAgICAgICAgYXNzZXRfbmFtZTogdW5zdXBwb3J0ZWRBc2NpaUVuY29kZWROYW1lLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IGV4cGVjdGVkQ2hhbmdlQWRhID0gKFxuICAgICAgdG90YWxJbnB1dCAtXG4gICAgICAxNTAwMDAwIC8qIG1pbiBhZGEgZm9yIGNoYW5nZSB0b2tlbiB1dHhvICovIC1cbiAgICAgIDE1MDAwMDAgLyogbWluIGFkYSBmb3IgcmVjaXBpZW50IHRva2VuIHV0eG8qLyAtXG4gICAgICAxNTAwMDAwIC8qIG1pbiBhZGEgZm9yIHVuc3VwcG9ydGVkIHRva2VuIGNoYW5nZSB1dHhvICovIC1cbiAgICAgIDE3OTg4OVxuICAgICkgLyogZmVlICovXG4gICAgICAudG9TdHJpbmcoKTtcbiAgICBjb25zdCBleHBlY3RlZENoYW5nZVRva2VuID0gJzgwJztcblxuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmlucHV0KHtcbiAgICAgIHRyYW5zYWN0aW9uX2lkOiAnMzY3N2U3NWM3YmE2OTliZmRjNmNkNTdkNDJmMjQ2Zjg2ZjYzYWVmZDc2MDI1MDA2YWM3ODMxM2ZhZDJiYmEyMScsXG4gICAgICB0cmFuc2FjdGlvbl9pbmRleDogMSxcbiAgICB9KTtcbiAgICB0eEJ1aWxkZXIuaW5wdXQoe1xuICAgICAgdHJhbnNhY3Rpb25faWQ6ICczNjc3ZTc1YzdiYTY5OWJmZGM2Y2Q1N2Q0MmYyNDZmODZmNjNhZWZkNzYwMjUwMDZhYzc4MzEzZmFkMmJiYTIyJyxcbiAgICAgIHRyYW5zYWN0aW9uX2luZGV4OiAxLFxuICAgIH0pO1xuXG4gICAgdHhCdWlsZGVyLm91dHB1dCh7XG4gICAgICBhZGRyZXNzOiByZWNlaXZlckFkZHJlc3MsXG4gICAgICBhbW91bnQ6ICcwJywgLy8gU2V0IEFEQSBhbW91bnQgdG8gMCBmb3IgdG9rZW4gdHJhbnNmZXIgKG1pbiBBREEgaXMgaGFuZGxlZCBpbiBzZGsgYnVpbGQpXG4gICAgICBtdWx0aUFzc2V0czoge1xuICAgICAgICBhc3NldF9uYW1lOiBhc2NpaUVuY29kZWROYW1lLFxuICAgICAgICBwb2xpY3lfaWQ6IHBvbGljeUlkLFxuICAgICAgICBxdWFudGl0eSxcbiAgICAgICAgZmluZ2VycHJpbnQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdHhCdWlsZGVyLmNoYW5nZUFkZHJlc3Moc2VuZGVyQWRkcmVzcywgdG90YWxJbnB1dC50b1N0cmluZygpLCB0b3RhbEFzc2V0TGlzdCk7XG4gICAgdHhCdWlsZGVyLnR0bCg4MDAwMDAwMDApO1xuICAgIHR4QnVpbGRlci5pc1Rva2VuVHJhbnNhY3Rpb24oKTtcbiAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG5cbiAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgIGNvbnN0IHR4RGF0YSA9IHR4LnRvSnNvbigpO1xuXG4gICAgLy8gQ2hlY2sgb3V0cHV0cyAoc2hvdWxkIGluY2x1ZGUgbXVsdGktYXNzZXQgYW5kIHJlZ3VsYXIgY2hhbmdlKVxuICAgIHR4RGF0YS5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoNCk7XG4gICAgdHhEYXRhLmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuXG4gICAgLy8gT25lIG91dHB1dCBzaG91bGQgaGF2ZSB0aGUgbXVsdGktYXNzZXQgY2hhbmdlIGFuZCB0aGUgb3RoZXIgZm9yIHRoZSB0cmFuc2ZlclxuICAgIGNvbnN0IGFzc2V0T3V0cHV0ID0gdHhEYXRhLm91dHB1dHMuZmlsdGVyKChvdXRwdXQpID0+IG91dHB1dC5tdWx0aUFzc2V0cyAhPT0gdW5kZWZpbmVkKTtcbiAgICBhc3NldE91dHB1dCEubGVuZ3RoLnNob3VsZC5lcXVhbCgzKTtcblxuICAgIC8vIFZlcmlmeSBpbnB1dHMgYW5kIG91dHB1dHNcbiAgICB0eERhdGEuaW5wdXRzWzBdLnRyYW5zYWN0aW9uX2lkLnNob3VsZC5lcXVhbCgnMzY3N2U3NWM3YmE2OTliZmRjNmNkNTdkNDJmMjQ2Zjg2ZjYzYWVmZDc2MDI1MDA2YWM3ODMxM2ZhZDJiYmEyMScpO1xuICAgIHR4RGF0YS5pbnB1dHNbMF0udHJhbnNhY3Rpb25faW5kZXguc2hvdWxkLmVxdWFsKDEpO1xuXG4gICAgdHhEYXRhLmlucHV0c1sxXS50cmFuc2FjdGlvbl9pZC5zaG91bGQuZXF1YWwoJzM2NzdlNzVjN2JhNjk5YmZkYzZjZDU3ZDQyZjI0NmY4NmY2M2FlZmQ3NjAyNTAwNmFjNzgzMTNmYWQyYmJhMjInKTtcbiAgICB0eERhdGEuaW5wdXRzWzFdLnRyYW5zYWN0aW9uX2luZGV4LnNob3VsZC5lcXVhbCgxKTtcblxuICAgIC8vIFZhbGlkYXRlIHJlY2VpdmVyIG91dHB1dFxuICAgIGNvbnN0IHJlY2VpdmVyT3V0cHV0ID0gdHhEYXRhLm91dHB1dHMuZmlsdGVyKChvdXRwdXQpID0+IG91dHB1dC5hZGRyZXNzID09PSByZWNlaXZlckFkZHJlc3MpO1xuICAgIHJlY2VpdmVyT3V0cHV0Lmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgcmVjZWl2ZXJPdXRwdXRbMF0uYW1vdW50LnNob3VsZC5lcXVhbCgnMTUwMDAwMCcpOyAvLyBNaW5pbXVtIEFEQSBmb3IgYXNzZXQgb3V0cHV0XG4gICAgKHJlY2VpdmVyT3V0cHV0WzBdLm11bHRpQXNzZXRzISBhcyBDYXJkYW5vV2FzbS5NdWx0aUFzc2V0KVxuICAgICAgLmdldF9hc3NldChwb2xpY3lTY3JpcHRIYXNoLCBDYXJkYW5vV2FzbS5Bc3NldE5hbWUubmV3KEJ1ZmZlci5mcm9tKGFzY2lpRW5jb2RlZE5hbWUsICdoZXgnKSkpXG4gICAgICAudG9fc3RyKClcbiAgICAgIC5zaG91bGQuZXF1YWwocXVhbnRpdHkpO1xuXG4gICAgLy8gVmFsaWRhdGUgY2hhbmdlIG91dHB1dHMgKG9uZSB3aXRoIHN1cHBvcnRlZCB0b2tlbiwgb25lIHdpdGggdW5zdXBwb3J0ZWQgdG9rZW4gYW5kIG9uZSBmb3IgcHVyZSBhZGEpXG4gICAgY29uc3QgY2hhbmdlT3V0cHV0ID0gdHhEYXRhLm91dHB1dHMuZmlsdGVyKChvdXRwdXQpID0+IG91dHB1dC5hZGRyZXNzID09PSBzZW5kZXJBZGRyZXNzKTtcbiAgICBjaGFuZ2VPdXRwdXQubGVuZ3RoLnNob3VsZC5lcXVhbCgzKTtcblxuICAgIGNvbnN0IGNoYW5nZVdpdGhBc3NldCA9IGNoYW5nZU91dHB1dC5maWx0ZXIoKG91dHB1dCkgPT4gb3V0cHV0Lm11bHRpQXNzZXRzICE9PSB1bmRlZmluZWQpO1xuICAgIGNoYW5nZVdpdGhBc3NldC5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgIGxldCB0b2tlbnMgPSAwO1xuICAgIGNoYW5nZVdpdGhBc3NldC5mb3JFYWNoKChvdXRwdXQpID0+IHtcbiAgICAgIG91dHB1dCEuYW1vdW50LnNob3VsZC5lcXVhbCgnMTUwMDAwMCcpOyAvLyBNaW5pbXVtIEFEQSBmb3IgYXNzZXQgb3V0cHV0XG4gICAgICBjb25zdCBzdXBwb3J0ZWRUb2tlbkNoYW5nZVF0eSA9IChvdXRwdXQhLm11bHRpQXNzZXRzISBhcyBDYXJkYW5vV2FzbS5NdWx0aUFzc2V0KVxuICAgICAgICAuZ2V0X2Fzc2V0KHBvbGljeVNjcmlwdEhhc2gsIENhcmRhbm9XYXNtLkFzc2V0TmFtZS5uZXcoQnVmZmVyLmZyb20oYXNjaWlFbmNvZGVkTmFtZSwgJ2hleCcpKSlcbiAgICAgICAgLnRvX3N0cigpO1xuICAgICAgY29uc3QgdW5zdXBwb3J0ZWRUb2tlbkNoYW5nZVF0eSA9IChvdXRwdXQhLm11bHRpQXNzZXRzISBhcyBDYXJkYW5vV2FzbS5NdWx0aUFzc2V0KVxuICAgICAgICAuZ2V0X2Fzc2V0KFxuICAgICAgICAgIHVuc3VwcG9ydGVkUG9saWN5U2NyaXB0SGFzaCxcbiAgICAgICAgICBDYXJkYW5vV2FzbS5Bc3NldE5hbWUubmV3KEJ1ZmZlci5mcm9tKHVuc3VwcG9ydGVkQXNjaWlFbmNvZGVkTmFtZSwgJ2hleCcpKVxuICAgICAgICApXG4gICAgICAgIC50b19zdHIoKTtcbiAgICAgIGlmIChzdXBwb3J0ZWRUb2tlbkNoYW5nZVF0eSAhPT0gJzAnKSB7XG4gICAgICAgIHN1cHBvcnRlZFRva2VuQ2hhbmdlUXR5LnNob3VsZC5lcXVhbChleHBlY3RlZENoYW5nZVRva2VuKTtcbiAgICAgICAgdG9rZW5zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bnN1cHBvcnRlZFRva2VuQ2hhbmdlUXR5IS5zaG91bGQuZXF1YWwoJzEwMDAwJyk7XG4gICAgICAgIHRva2VucysrO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRva2Vucy5zaG91bGQuZXF1YWwoMik7XG5cbiAgICBjb25zdCBjaGFuZ2VXaXRob3V0QXNzZXQgPSBjaGFuZ2VPdXRwdXQuZmluZCgob3V0cHV0KSA9PiBvdXRwdXQubXVsdGlBc3NldHMgPT09IHVuZGVmaW5lZCk7XG4gICAgc2hvdWxkLmV4aXN0KGNoYW5nZVdpdGhvdXRBc3NldCk7XG4gICAgY2hhbmdlV2l0aG91dEFzc2V0IS5hbW91bnQuc2hvdWxkLmVxdWFsKGV4cGVjdGVkQ2hhbmdlQWRhKTsgLy8gUmVtYWluaW5nIEFEQSBhZnRlciBmZWVzIGFuZCBtaW4gQURBc1xuICB9KTtcblxuICBpdChgc2hvdWxkIGZhaWwgdG8gYnVpbGQgYSB0cmFuc2FjdGlvbiB3aXRoICR7YXNzZXROYW1lfSB0b2tlbiBhbmQgaW5zdWZmaWNpZW50IG1pbmltdW0gQURBYCwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHF1YW50aXR5ID0gJzIwJztcbiAgICBjb25zdCB0b3RhbElucHV0ID0gMjAwMDAwMDtcbiAgICBjb25zdCB0b3RhbEFzc2V0TGlzdCA9IHtcbiAgICAgIFtmaW5nZXJwcmludF06IHtcbiAgICAgICAgcXVhbnRpdHk6ICcxMDAnLFxuICAgICAgICBwb2xpY3lfaWQ6IHBvbGljeUlkLFxuICAgICAgICBhc3NldF9uYW1lOiBhc2NpaUVuY29kZWROYW1lLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuaW5wdXQoe1xuICAgICAgdHJhbnNhY3Rpb25faWQ6ICczNjc3ZTc1YzdiYTY5OWJmZGM2Y2Q1N2Q0MmYyNDZmODZmNjNhZWZkNzYwMjUwMDZhYzc4MzEzZmFkMmJiYTIxJyxcbiAgICAgIHRyYW5zYWN0aW9uX2luZGV4OiAxLFxuICAgIH0pO1xuXG4gICAgdHhCdWlsZGVyLm91dHB1dCh7XG4gICAgICBhZGRyZXNzOiByZWNlaXZlckFkZHJlc3MsXG4gICAgICBhbW91bnQ6ICcwJywgLy8gU2V0IEFEQSBhbW91bnQgdG8gMCBmb3IgdG9rZW4gdHJhbnNmZXIgKG1pbiBBREEgaXMgaGFuZGxlZCBpbiBzZGsgYnVpbGQpXG4gICAgICBtdWx0aUFzc2V0czoge1xuICAgICAgICBhc3NldF9uYW1lOiBhc2NpaUVuY29kZWROYW1lLFxuICAgICAgICBwb2xpY3lfaWQ6IHBvbGljeUlkLFxuICAgICAgICBxdWFudGl0eSxcbiAgICAgICAgZmluZ2VycHJpbnQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdHhCdWlsZGVyLmNoYW5nZUFkZHJlc3Moc2VuZGVyQWRkcmVzcywgdG90YWxJbnB1dC50b1N0cmluZygpLCB0b3RhbEFzc2V0TGlzdCk7XG4gICAgdHhCdWlsZGVyLnR0bCg4MDAwMDAwMDApO1xuICAgIHR4QnVpbGRlci5pc1Rva2VuVHJhbnNhY3Rpb24oKTtcblxuICAgIGF3YWl0IHR4QnVpbGRlclxuICAgICAgLmJ1aWxkKClcbiAgICAgIC5zaG91bGQucmVqZWN0ZWRXaXRoKFxuICAgICAgICAnSW5zdWZmaWNpZW50IGZ1bmRzOiBuZWVkIGEgbWluaW11bSBvZiAxNTAwMDAwIGxvdmVsYWNlIHBlciBvdXRwdXQgdG8gY29uc3RydWN0IHRva2VuIHRyYW5zYWN0aW9ucydcbiAgICAgICk7XG4gIH0pO1xuXG4gIGl0KGBzaG91bGQgZmFpbCB0byBidWlsZCBhIHRyYW5zYWN0aW9uIHdpdGggJHthc3NldE5hbWV9IGFuZCBpbnN1ZmZpY2llbnQgdG9rZW4gcXR5YCwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHF1YW50aXR5ID0gJzIwJztcbiAgICBjb25zdCB0b3RhbElucHV0ID0gMjAwMDAwMDA7XG4gICAgY29uc3QgdG90YWxBc3NldExpc3QgPSB7XG4gICAgICBbZmluZ2VycHJpbnRdOiB7XG4gICAgICAgIHF1YW50aXR5OiAnNScsXG4gICAgICAgIHBvbGljeV9pZDogcG9saWN5SWQsXG4gICAgICAgIGFzc2V0X25hbWU6IGFzY2lpRW5jb2RlZE5hbWUsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5pbnB1dCh7XG4gICAgICB0cmFuc2FjdGlvbl9pZDogJzM2NzdlNzVjN2JhNjk5YmZkYzZjZDU3ZDQyZjI0NmY4NmY2M2FlZmQ3NjAyNTAwNmFjNzgzMTNmYWQyYmJhMjEnLFxuICAgICAgdHJhbnNhY3Rpb25faW5kZXg6IDEsXG4gICAgfSk7XG5cbiAgICB0eEJ1aWxkZXIub3V0cHV0KHtcbiAgICAgIGFkZHJlc3M6IHJlY2VpdmVyQWRkcmVzcyxcbiAgICAgIGFtb3VudDogJzAnLCAvLyBTZXQgQURBIGFtb3VudCB0byAwIGZvciB0b2tlbiB0cmFuc2ZlciAobWluIEFEQSBpcyBoYW5kbGVkIGluIHNkayBidWlsZClcbiAgICAgIG11bHRpQXNzZXRzOiB7XG4gICAgICAgIGFzc2V0X25hbWU6IGFzY2lpRW5jb2RlZE5hbWUsXG4gICAgICAgIHBvbGljeV9pZDogcG9saWN5SWQsXG4gICAgICAgIHF1YW50aXR5LFxuICAgICAgICBmaW5nZXJwcmludCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0eEJ1aWxkZXIuY2hhbmdlQWRkcmVzcyhzZW5kZXJBZGRyZXNzLCB0b3RhbElucHV0LnRvU3RyaW5nKCksIHRvdGFsQXNzZXRMaXN0KTtcbiAgICB0eEJ1aWxkZXIudHRsKDgwMDAwMDAwMCk7XG4gICAgdHhCdWlsZGVyLmlzVG9rZW5UcmFuc2FjdGlvbigpO1xuXG4gICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnSW5zdWZmaWNpZW50IHF0eTogbm90IGVub3VnaCB0b2tlbiBxdHkgdG8gY292ZXIgcmVjZWl2ZXIgb3V0cHV0Jyk7XG4gIH0pO1xuXG4gIGl0KGBzaG91bGQgYnVpbGQgYSB0cmFuc2FjdGlvbiB3aXRoICR7YXNzZXROYW1lfSB3aGVuIHRoZSB0b2tlbiBxdHkgaXMgZXhhY3RseSB0aGUgcXR5IGluIHdpdGhkcmF3YWxgLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcXVhbnRpdHkgPSAnMSc7XG4gICAgY29uc3QgdG90YWxJbnB1dCA9IDIwMDAwMDAwO1xuICAgIGNvbnN0IHRvdGFsQXNzZXRMaXN0ID0ge1xuICAgICAgW2ZpbmdlcnByaW50XToge1xuICAgICAgICBxdWFudGl0eTogJzEnLFxuICAgICAgICBwb2xpY3lfaWQ6IHBvbGljeUlkLFxuICAgICAgICBhc3NldF9uYW1lOiBhc2NpaUVuY29kZWROYW1lLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuaW5wdXQoe1xuICAgICAgdHJhbnNhY3Rpb25faWQ6ICczNjc3ZTc1YzdiYTY5OWJmZGM2Y2Q1N2Q0MmYyNDZmODZmNjNhZWZkNzYwMjUwMDZhYzc4MzEzZmFkMmJiYTIxJyxcbiAgICAgIHRyYW5zYWN0aW9uX2luZGV4OiAxLFxuICAgIH0pO1xuXG4gICAgdHhCdWlsZGVyLm91dHB1dCh7XG4gICAgICBhZGRyZXNzOiByZWNlaXZlckFkZHJlc3MsXG4gICAgICBhbW91bnQ6ICcwJywgLy8gU2V0IEFEQSBhbW91bnQgdG8gMCBmb3IgdG9rZW4gdHJhbnNmZXIgKG1pbiBBREEgaXMgaGFuZGxlZCBpbiBzZGsgYnVpbGQpXG4gICAgICBtdWx0aUFzc2V0czoge1xuICAgICAgICBhc3NldF9uYW1lOiBhc2NpaUVuY29kZWROYW1lLFxuICAgICAgICBwb2xpY3lfaWQ6IHBvbGljeUlkLFxuICAgICAgICBxdWFudGl0eSxcbiAgICAgICAgZmluZ2VycHJpbnQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdHhCdWlsZGVyLmNoYW5nZUFkZHJlc3Moc2VuZGVyQWRkcmVzcywgdG90YWxJbnB1dC50b1N0cmluZygpLCB0b3RhbEFzc2V0TGlzdCk7XG4gICAgdHhCdWlsZGVyLnR0bCg4MDAwMDAwMDApO1xuICAgIHR4QnVpbGRlci5pc1Rva2VuVHJhbnNhY3Rpb24oKTtcblxuICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5ub3QuYmUucmVqZWN0ZWQoKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../test/unit/transaction.ts"],"names":[],"mappings":""}
|