@bitgo-beta/sdk-coin-trx 1.0.2-beta.232 → 1.0.2-beta.2321
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/resources/protobuf/Contract.proto +32 -0
- package/dist/resources/protobuf/tron.d.ts +1478 -214
- package/dist/resources/protobuf/tron.js +6312 -2600
- package/dist/resources/protobuf/tron.proto +6 -0
- package/dist/src/index.js +6 -2
- package/dist/src/lib/accountCreateTxBuilder.d.ts +60 -0
- package/dist/src/lib/accountCreateTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/accountCreateTxBuilder.js +191 -0
- package/dist/src/lib/constants.d.ts +4 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +7 -0
- package/dist/src/lib/contractCallBuilder.d.ts +1 -35
- package/dist/src/lib/contractCallBuilder.d.ts.map +1 -1
- package/dist/src/lib/contractCallBuilder.js +13 -76
- package/dist/src/lib/delegateResourceTxBuilder.d.ts +27 -0
- package/dist/src/lib/delegateResourceTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/delegateResourceTxBuilder.js +104 -0
- package/dist/src/lib/enum.d.ts +40 -1
- package/dist/src/lib/enum.d.ts.map +1 -1
- package/dist/src/lib/enum.js +44 -4
- package/dist/src/lib/freezeBalanceTxBuilder.d.ts +71 -0
- package/dist/src/lib/freezeBalanceTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/freezeBalanceTxBuilder.js +217 -0
- package/dist/src/lib/iface.d.ts +248 -2
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.js +23 -9
- package/dist/src/lib/keyPair.d.ts +0 -1
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +31 -18
- package/dist/src/lib/resourceManagementTxBuilder.d.ts +72 -0
- package/dist/src/lib/resourceManagementTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/resourceManagementTxBuilder.js +150 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts +1 -1
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -1
- package/dist/src/lib/tokenTransferBuilder.js +5 -3
- package/dist/src/lib/transaction.d.ts +3 -0
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +115 -6
- package/dist/src/lib/transactionBuilder.d.ts +53 -6
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +121 -22
- package/dist/src/lib/undelegateResourceTxBuilder.d.ts +27 -0
- package/dist/src/lib/undelegateResourceTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/undelegateResourceTxBuilder.js +104 -0
- package/dist/src/lib/unfreezeBalanceTxBuilder.d.ts +65 -0
- package/dist/src/lib/unfreezeBalanceTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/unfreezeBalanceTxBuilder.js +210 -0
- package/dist/src/lib/utils.d.ts +115 -8
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +534 -55
- package/dist/src/lib/voteWitnessTxBuilder.d.ts +62 -0
- package/dist/src/lib/voteWitnessTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/voteWitnessTxBuilder.js +219 -0
- package/dist/src/lib/withdrawBuilder.d.ts +49 -0
- package/dist/src/lib/withdrawBuilder.d.ts.map +1 -0
- package/dist/src/lib/withdrawBuilder.js +167 -0
- package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.d.ts +49 -0
- package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.js +167 -0
- package/dist/src/lib/wrappedBuilder.d.ts +67 -1
- package/dist/src/lib/wrappedBuilder.d.ts.map +1 -1
- package/dist/src/lib/wrappedBuilder.js +114 -4
- package/dist/src/trx.d.ts +146 -8
- package/dist/src/trx.d.ts.map +1 -1
- package/dist/src/trx.js +705 -160
- package/dist/src/trxToken.d.ts +2 -2
- package/dist/src/trxToken.d.ts.map +1 -1
- package/dist/src/trxToken.js +22 -7
- package/dist/test/fixtures.d.ts +40 -0
- package/dist/test/fixtures.d.ts.map +1 -0
- package/dist/test/fixtures.js +46 -0
- package/dist/test/resources.d.ts +614 -0
- package/dist/test/resources.d.ts.map +1 -0
- package/dist/test/resources.js +782 -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 +19 -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 +163 -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 +38 -0
- package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.js +248 -0
- package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/contractCallBuilder.js +315 -0
- package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.js +339 -0
- package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.js +365 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +87 -0
- package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.js +339 -0
- package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.js +336 -0
- package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.js +277 -0
- package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.js +213 -0
- package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.js +213 -0
- package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/wrappedBuilder.js +68 -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 +178 -0
- package/dist/test/unit/trx.d.ts +2 -0
- package/dist/test/unit/trx.d.ts.map +1 -0
- package/dist/test/unit/trx.js +843 -0
- package/dist/test/unit/trxToken.d.ts +2 -0
- package/dist/test/unit/trxToken.d.ts.map +1 -0
- package/dist/test/unit/trxToken.js +152 -0
- package/dist/test/unit/util.d.ts +2 -0
- package/dist/test/unit/util.d.ts.map +1 -0
- package/dist/test/unit/util.js +156 -0
- package/dist/test/unit/verifyTransaction.d.ts +2 -0
- package/dist/test/unit/verifyTransaction.d.ts.map +1 -0
- package/dist/test/unit/verifyTransaction.js +695 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +22 -16
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -118
- package/resources/README.md +0 -31
- package/resources/protobuf/Contract.proto +0 -256
- package/resources/protobuf/Discover.proto +0 -44
- package/resources/protobuf/tron.d.ts +0 -11205
- package/resources/protobuf/tron.js +0 -33480
- package/resources/protobuf/tron.proto +0 -677
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
8
|
+
const node_test_1 = require("node:test");
|
|
9
|
+
const resources_1 = require("../../resources");
|
|
10
|
+
const builder_1 = require("../../../src/lib/builder");
|
|
11
|
+
const utils_1 = require("../../../src/lib/utils");
|
|
12
|
+
(0, node_test_1.describe)('Tron FreezeBalanceV2 builder', function () {
|
|
13
|
+
const initTxBuilder = () => {
|
|
14
|
+
const builder = (0, builder_1.getBuilder)('ttrx').getFreezeBalanceV2TxBuilder();
|
|
15
|
+
builder
|
|
16
|
+
.source({ address: resources_1.PARTICIPANTS.custodian.address })
|
|
17
|
+
.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH })
|
|
18
|
+
.setFrozenBalance(resources_1.FROZEN_BALANCE)
|
|
19
|
+
.setResource(resources_1.RESOURCE_ENERGY);
|
|
20
|
+
return builder;
|
|
21
|
+
};
|
|
22
|
+
(0, node_test_1.describe)('should build successfully', () => {
|
|
23
|
+
(0, node_test_1.it)('a transaction with correct inputs', async () => {
|
|
24
|
+
const timestamp = Date.now();
|
|
25
|
+
const txBuilder = initTxBuilder();
|
|
26
|
+
txBuilder.timestamp(timestamp);
|
|
27
|
+
txBuilder.expiration(timestamp + 40000);
|
|
28
|
+
const tx = (await txBuilder.build());
|
|
29
|
+
const txJson = tx.toJson();
|
|
30
|
+
assert_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingActivate);
|
|
31
|
+
assert_1.default.equal(tx.inputs.length, 1);
|
|
32
|
+
assert_1.default.equal(tx.inputs[0].address, resources_1.PARTICIPANTS.custodian.address);
|
|
33
|
+
assert_1.default.equal(tx.inputs[0].value, '1000000');
|
|
34
|
+
assert_1.default.equal(tx.outputs[0].value, '1000000');
|
|
35
|
+
assert_1.default.equal(tx.outputs[0].address, resources_1.PARTICIPANTS.custodian.address);
|
|
36
|
+
assert_1.default.deepStrictEqual(txJson.raw_data.contract, resources_1.FREEZE_BALANCE_V2_CONTRACT);
|
|
37
|
+
});
|
|
38
|
+
(0, node_test_1.it)('an unsigned transaction from a string and from a JSON', async () => {
|
|
39
|
+
const timestamp = Date.now();
|
|
40
|
+
const txBuilder = initTxBuilder();
|
|
41
|
+
txBuilder.timestamp(timestamp);
|
|
42
|
+
txBuilder.expiration(timestamp + 40000);
|
|
43
|
+
const tx = await txBuilder.build();
|
|
44
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
45
|
+
txBuilder2.sign({ key: resources_1.PARTICIPANTS.custodian.pk });
|
|
46
|
+
const tx2 = await txBuilder2.build();
|
|
47
|
+
const txBuilder3 = (0, builder_1.getBuilder)('ttrx').from(tx.toJson());
|
|
48
|
+
txBuilder3.sign({ key: resources_1.PARTICIPANTS.custodian.pk });
|
|
49
|
+
const tx3 = await txBuilder3.build();
|
|
50
|
+
assert_1.default.deepStrictEqual(tx2, tx3);
|
|
51
|
+
});
|
|
52
|
+
(0, node_test_1.it)('an unsigned transaction with extended duration', async () => {
|
|
53
|
+
const timestamp = Date.now();
|
|
54
|
+
const expiration = timestamp + resources_1.EXPIRATION;
|
|
55
|
+
const extension = 60000;
|
|
56
|
+
const txBuilder = initTxBuilder();
|
|
57
|
+
txBuilder.timestamp(timestamp);
|
|
58
|
+
txBuilder.expiration(expiration);
|
|
59
|
+
const tx = await txBuilder.build();
|
|
60
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
61
|
+
txBuilder2.extendValidTo(extension);
|
|
62
|
+
txBuilder2.sign({ key: resources_1.PARTICIPANTS.custodian.pk });
|
|
63
|
+
const tx2 = await txBuilder2.build();
|
|
64
|
+
assert_1.default.equal(tx2.inputs.length, 1);
|
|
65
|
+
assert_1.default.equal(tx2.inputs[0].address, resources_1.PARTICIPANTS.custodian.address);
|
|
66
|
+
assert_1.default.equal(tx2.inputs[0].value, '1000000');
|
|
67
|
+
assert_1.default.equal(tx2.outputs[0].value, '1000000');
|
|
68
|
+
assert_1.default.equal(tx2.outputs[0].address, resources_1.PARTICIPANTS.custodian.address);
|
|
69
|
+
const txJson = tx2.toJson();
|
|
70
|
+
assert_1.default.equal(txJson.raw_data.expiration, expiration + extension);
|
|
71
|
+
});
|
|
72
|
+
(0, node_test_1.it)('a transaction signed multiple times', async () => {
|
|
73
|
+
const timestamp = Date.now();
|
|
74
|
+
const txBuilder = initTxBuilder();
|
|
75
|
+
txBuilder.timestamp(timestamp);
|
|
76
|
+
txBuilder.expiration(timestamp + resources_1.EXPIRATION);
|
|
77
|
+
const tx = await txBuilder.build();
|
|
78
|
+
let txJson = tx.toJson();
|
|
79
|
+
let rawData = txJson.raw_data;
|
|
80
|
+
assert_1.default.deepStrictEqual(rawData.contract, resources_1.FREEZE_BALANCE_V2_CONTRACT);
|
|
81
|
+
assert_1.default.equal(txJson.signature.length, 0);
|
|
82
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toJson());
|
|
83
|
+
txBuilder2.sign({ key: resources_1.PARTICIPANTS.custodian.pk });
|
|
84
|
+
const tx2 = await txBuilder2.build();
|
|
85
|
+
txJson = tx2.toJson();
|
|
86
|
+
rawData = txJson.raw_data;
|
|
87
|
+
assert_1.default.deepStrictEqual(rawData.contract, resources_1.FREEZE_BALANCE_V2_CONTRACT);
|
|
88
|
+
assert_1.default.equal(txJson.signature.length, 1);
|
|
89
|
+
const txBuilder3 = (0, builder_1.getBuilder)('ttrx').from(tx2.toJson());
|
|
90
|
+
txBuilder3.sign({ key: resources_1.PARTICIPANTS.from.pk });
|
|
91
|
+
const tx3 = await txBuilder3.build();
|
|
92
|
+
txJson = tx3.toJson();
|
|
93
|
+
rawData = txJson.raw_data;
|
|
94
|
+
assert_1.default.deepStrictEqual(rawData.contract, resources_1.FREEZE_BALANCE_V2_CONTRACT);
|
|
95
|
+
assert_1.default.equal(txJson.signature.length, 2);
|
|
96
|
+
const txBuilder4 = (0, builder_1.getBuilder)('ttrx').from(tx3.toJson());
|
|
97
|
+
txBuilder4.sign({ key: resources_1.PARTICIPANTS.multisig.pk });
|
|
98
|
+
const tx4 = await txBuilder4.build();
|
|
99
|
+
assert_1.default.equal(tx4.inputs.length, 1);
|
|
100
|
+
assert_1.default.equal(tx4.inputs[0].address, resources_1.PARTICIPANTS.custodian.address);
|
|
101
|
+
assert_1.default.equal(tx4.inputs[0].value, '1000000');
|
|
102
|
+
assert_1.default.equal(tx4.outputs[0].value, '1000000');
|
|
103
|
+
assert_1.default.equal(tx4.outputs[0].address, resources_1.PARTICIPANTS.custodian.address);
|
|
104
|
+
txJson = tx4.toJson();
|
|
105
|
+
rawData = txJson.raw_data;
|
|
106
|
+
assert_1.default.deepStrictEqual(rawData.contract, resources_1.FREEZE_BALANCE_V2_CONTRACT);
|
|
107
|
+
assert_1.default.equal(txJson.signature.length, 3);
|
|
108
|
+
assert_1.default.equal(rawData.expiration, timestamp + resources_1.EXPIRATION);
|
|
109
|
+
assert_1.default.equal(rawData.timestamp, timestamp);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
(0, node_test_1.describe)('should validate', () => {
|
|
113
|
+
(0, node_test_1.it)('a valid expiration', async () => {
|
|
114
|
+
const now = Date.now();
|
|
115
|
+
const expiration = now + resources_1.EXPIRATION;
|
|
116
|
+
const txBuilder = initTxBuilder();
|
|
117
|
+
txBuilder.timestamp(now);
|
|
118
|
+
txBuilder.expiration(expiration + 1000);
|
|
119
|
+
txBuilder.expiration(expiration);
|
|
120
|
+
const tx = await txBuilder.build();
|
|
121
|
+
const txJson = tx.toJson();
|
|
122
|
+
assert_1.default.equal(txJson.raw_data.expiration, expiration);
|
|
123
|
+
});
|
|
124
|
+
(0, node_test_1.it)('an expiration greater than one year', async () => {
|
|
125
|
+
const now = Date.now();
|
|
126
|
+
const txBuilder = initTxBuilder();
|
|
127
|
+
txBuilder.timestamp(now);
|
|
128
|
+
assert_1.default.throws(() => {
|
|
129
|
+
txBuilder.expiration(now + 31536000001);
|
|
130
|
+
}, (e) => e.message === 'Expiration must not be greater than one day');
|
|
131
|
+
});
|
|
132
|
+
(0, node_test_1.it)('an expiration less than the current date', async () => {
|
|
133
|
+
const now = Date.now();
|
|
134
|
+
const txBuilder = initTxBuilder();
|
|
135
|
+
txBuilder.timestamp(now - 2000);
|
|
136
|
+
assert_1.default.throws(() => {
|
|
137
|
+
txBuilder.expiration(now - 1000);
|
|
138
|
+
}, (e) => e.message === 'Expiration must be greater than current time');
|
|
139
|
+
});
|
|
140
|
+
(0, node_test_1.it)('an expiration less than the timestamp', async () => {
|
|
141
|
+
const now = Date.now();
|
|
142
|
+
const txBuilder = initTxBuilder();
|
|
143
|
+
txBuilder.timestamp(now + 2000);
|
|
144
|
+
assert_1.default.throws(() => {
|
|
145
|
+
txBuilder.expiration(now + 1000);
|
|
146
|
+
}, (e) => e.message === 'Expiration must be greater than timestamp');
|
|
147
|
+
});
|
|
148
|
+
(0, node_test_1.it)('an expiration set after build', async () => {
|
|
149
|
+
const now = Date.now();
|
|
150
|
+
const expiration = now + resources_1.EXPIRATION;
|
|
151
|
+
const txBuilder = initTxBuilder();
|
|
152
|
+
await txBuilder.build();
|
|
153
|
+
assert_1.default.throws(() => {
|
|
154
|
+
txBuilder.expiration(expiration);
|
|
155
|
+
}, (e) => e.message === 'Expiration is already set, it can only be extended');
|
|
156
|
+
});
|
|
157
|
+
(0, node_test_1.it)('an expiration set after deserializing', async () => {
|
|
158
|
+
const now = Date.now();
|
|
159
|
+
const expiration = now + resources_1.EXPIRATION;
|
|
160
|
+
const txBuilder = initTxBuilder();
|
|
161
|
+
const tx = await txBuilder.build();
|
|
162
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
163
|
+
assert_1.default.throws(() => {
|
|
164
|
+
txBuilder2.expiration(expiration);
|
|
165
|
+
}, (e) => e.message === 'Expiration is already set, it can only be extended');
|
|
166
|
+
});
|
|
167
|
+
(0, node_test_1.it)('an extension without a set expiration', async () => {
|
|
168
|
+
const txBuilder = initTxBuilder();
|
|
169
|
+
assert_1.default.throws(() => {
|
|
170
|
+
txBuilder.extendValidTo(20000);
|
|
171
|
+
}, (e) => e.message === 'There is not expiration to extend');
|
|
172
|
+
});
|
|
173
|
+
(0, node_test_1.it)('a zero millisecond extension', async () => {
|
|
174
|
+
const txBuilder = initTxBuilder();
|
|
175
|
+
const expiration = Date.now() + resources_1.EXPIRATION;
|
|
176
|
+
txBuilder.expiration(expiration);
|
|
177
|
+
const tx = await txBuilder.build();
|
|
178
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
179
|
+
assert_1.default.throws(() => {
|
|
180
|
+
txBuilder2.extendValidTo(0);
|
|
181
|
+
}, (e) => e.message === 'Value cannot be below zero');
|
|
182
|
+
});
|
|
183
|
+
(0, node_test_1.it)('an extension grater than one year', async () => {
|
|
184
|
+
const txBuilder = initTxBuilder();
|
|
185
|
+
const expiration = Date.now() + resources_1.EXPIRATION;
|
|
186
|
+
txBuilder.expiration(expiration);
|
|
187
|
+
const tx = await txBuilder.build();
|
|
188
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
189
|
+
assert_1.default.throws(() => {
|
|
190
|
+
txBuilder2.extendValidTo(31536000001);
|
|
191
|
+
}, (e) => e.message === 'The expiration cannot be extended more than one day');
|
|
192
|
+
});
|
|
193
|
+
(0, node_test_1.it)('an extension after signing', async () => {
|
|
194
|
+
const txBuilder = initTxBuilder();
|
|
195
|
+
txBuilder.sign({ key: resources_1.PARTICIPANTS.custodian.pk });
|
|
196
|
+
const tx = await txBuilder.build();
|
|
197
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
198
|
+
assert_1.default.throws(() => {
|
|
199
|
+
txBuilder2.extendValidTo(20000);
|
|
200
|
+
}, (e) => e.message === 'Cannot extend a signed transaction');
|
|
201
|
+
});
|
|
202
|
+
(0, node_test_1.it)('valid resource: ENERGY', async () => {
|
|
203
|
+
const builder = (0, builder_1.getBuilder)('ttrx').getFreezeBalanceV2TxBuilder();
|
|
204
|
+
builder
|
|
205
|
+
.source({ address: resources_1.PARTICIPANTS.custodian.address })
|
|
206
|
+
.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH })
|
|
207
|
+
.setFrozenBalance(resources_1.FROZEN_BALANCE);
|
|
208
|
+
builder.setResource('ENERGY');
|
|
209
|
+
assert_1.default.doesNotReject(() => {
|
|
210
|
+
return builder.build();
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
(0, node_test_1.it)('valid resource: BANDWIDTH', async () => {
|
|
214
|
+
const builder = (0, builder_1.getBuilder)('ttrx').getFreezeBalanceV2TxBuilder();
|
|
215
|
+
builder
|
|
216
|
+
.source({ address: resources_1.PARTICIPANTS.custodian.address })
|
|
217
|
+
.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH })
|
|
218
|
+
.setFrozenBalance(resources_1.FROZEN_BALANCE);
|
|
219
|
+
builder.setResource('BANDWIDTH');
|
|
220
|
+
assert_1.default.doesNotReject(() => {
|
|
221
|
+
return builder.build();
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
(0, node_test_1.it)('invalid resource', async () => {
|
|
225
|
+
const builder = (0, builder_1.getBuilder)('ttrx').getFreezeBalanceV2TxBuilder();
|
|
226
|
+
const invalidResource = 'INVALID';
|
|
227
|
+
builder
|
|
228
|
+
.source({ address: resources_1.PARTICIPANTS.custodian.address })
|
|
229
|
+
.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH })
|
|
230
|
+
.setFrozenBalance(resources_1.FROZEN_BALANCE);
|
|
231
|
+
assert_1.default.throws(() => builder.setResource(invalidResource), `${invalidResource} is a not valid resource type.`);
|
|
232
|
+
});
|
|
233
|
+
(0, node_test_1.it)('transaction mandatory fields', async () => {
|
|
234
|
+
const txBuilder = (0, builder_1.getBuilder)('ttrx').getFreezeBalanceV2TxBuilder();
|
|
235
|
+
await assert_1.default.rejects(txBuilder.build(), {
|
|
236
|
+
message: 'Missing parameter: frozenBalance',
|
|
237
|
+
});
|
|
238
|
+
txBuilder.setFrozenBalance('1000000');
|
|
239
|
+
await assert_1.default.rejects(txBuilder.build(), {
|
|
240
|
+
message: 'Missing parameter: source',
|
|
241
|
+
});
|
|
242
|
+
txBuilder.source({ address: resources_1.PARTICIPANTS.custodian.address });
|
|
243
|
+
await assert_1.default.rejects(txBuilder.build(), {
|
|
244
|
+
message: 'Missing parameter: resource',
|
|
245
|
+
});
|
|
246
|
+
txBuilder.setResource('ENERGY');
|
|
247
|
+
await assert_1.default.rejects(txBuilder.build(), {
|
|
248
|
+
message: 'Missing block reference information',
|
|
249
|
+
});
|
|
250
|
+
txBuilder.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH });
|
|
251
|
+
assert_1.default.doesNotReject(() => {
|
|
252
|
+
return txBuilder.build();
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
(0, node_test_1.describe)('decode freeze txns correctly', () => {
|
|
257
|
+
(0, node_test_1.it)('should decode a freeze transaction with resource as ENERGY', async () => {
|
|
258
|
+
const rawHex = '0a0263562208aeb6dfb8e968626440bc91f6c39c335a5a083612560a34747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e467265657a6542616c616e63655632436f6e7472616374121e0a154160b9ab837fd7153c1baa5e55a16d05d60e21d0d31080e1eb17180170fcd8f3c39c33';
|
|
259
|
+
const decodedTransaction = (0, utils_1.decodeTransaction)(rawHex);
|
|
260
|
+
// Verify transaction has contracts
|
|
261
|
+
assert_1.default.ok(decodedTransaction.contract?.length > 0, 'Transaction should have at least one contract');
|
|
262
|
+
const contract = decodedTransaction.contract[0];
|
|
263
|
+
assert_1.default.ok(contract, 'contract should exist');
|
|
264
|
+
if (!('parameter' in contract) || !contract.parameter?.value || !('resource' in contract.parameter.value)) {
|
|
265
|
+
throw new Error('Invalid contract format: missing parameter or resource');
|
|
266
|
+
}
|
|
267
|
+
// Verify resource type
|
|
268
|
+
assert_1.default.equal(contract.parameter.value.resource, resources_1.RESOURCE_ENERGY, 'Resource type should be ENERGY');
|
|
269
|
+
});
|
|
270
|
+
(0, node_test_1.it)('should decode a freeze transaction with resource as BANDWIDTH', async () => {
|
|
271
|
+
const rawHex = '0a028d372208f403372490b5b8e240bbaab7f69b335a5b083612570a34747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e467265657a6542616c616e63655632436f6e7472616374121f0a154160b9ab837fd7153c1baa5e55a16d05d60e21d0d31080cab5ee01180070bbcddbf49b33';
|
|
272
|
+
const decodedTransaction = (0, utils_1.decodeTransaction)(rawHex);
|
|
273
|
+
// Verify transaction has contracts
|
|
274
|
+
assert_1.default.ok(decodedTransaction.contract?.length > 0, 'Transaction should have at least one contract');
|
|
275
|
+
const contract = decodedTransaction.contract[0];
|
|
276
|
+
assert_1.default.ok(contract, 'contract should exist');
|
|
277
|
+
if (!('parameter' in contract) || !contract.parameter?.value || !('resource' in contract.parameter.value)) {
|
|
278
|
+
throw new Error('Invalid contract format: missing parameter or resource');
|
|
279
|
+
}
|
|
280
|
+
// Verify resource type
|
|
281
|
+
assert_1.default.equal(contract.parameter.value.resource, resources_1.RESOURCE_BANDWIDTH, 'Resource type should be BANDWIDTH');
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
(0, node_test_1.describe)('BANDWIDTH serialization (protobuf3 compatibility)', () => {
|
|
285
|
+
(0, node_test_1.it)('should round-trip BANDWIDTH transactions correctly', async () => {
|
|
286
|
+
// Build a BANDWIDTH transaction
|
|
287
|
+
const builder = (0, builder_1.getBuilder)('ttrx').getFreezeBalanceV2TxBuilder();
|
|
288
|
+
builder
|
|
289
|
+
.source({ address: resources_1.PARTICIPANTS.custodian.address })
|
|
290
|
+
.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH })
|
|
291
|
+
.setFrozenBalance(resources_1.FROZEN_BALANCE)
|
|
292
|
+
.setResource(resources_1.RESOURCE_BANDWIDTH);
|
|
293
|
+
const tx = await builder.build();
|
|
294
|
+
const txJson = tx.toJson();
|
|
295
|
+
// Verify the built transaction has BANDWIDTH resource
|
|
296
|
+
assert_1.default.equal(txJson.raw_data.contract[0].parameter.value.resource, resources_1.RESOURCE_BANDWIDTH, 'Built transaction should have BANDWIDTH resource');
|
|
297
|
+
// Round-trip: deserialize from broadcast format and rebuild
|
|
298
|
+
const builder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
299
|
+
const tx2 = await builder2.build();
|
|
300
|
+
const tx2Json = tx2.toJson();
|
|
301
|
+
// Verify resource is preserved after round-trip
|
|
302
|
+
assert_1.default.equal(tx2Json.raw_data.contract[0].parameter.value.resource, resources_1.RESOURCE_BANDWIDTH, 'Resource should be BANDWIDTH after round-trip from broadcast format');
|
|
303
|
+
// Round-trip: deserialize from JSON and rebuild
|
|
304
|
+
const builder3 = (0, builder_1.getBuilder)('ttrx').from(tx.toJson());
|
|
305
|
+
const tx3 = await builder3.build();
|
|
306
|
+
const tx3Json = tx3.toJson();
|
|
307
|
+
// Verify resource is preserved after round-trip from JSON
|
|
308
|
+
assert_1.default.equal(tx3Json.raw_data.contract[0].parameter.value.resource, resources_1.RESOURCE_BANDWIDTH, 'Resource should be BANDWIDTH after round-trip from JSON');
|
|
309
|
+
});
|
|
310
|
+
(0, node_test_1.it)('should round-trip ENERGY transactions correctly', async () => {
|
|
311
|
+
// Build an ENERGY transaction
|
|
312
|
+
const builder = (0, builder_1.getBuilder)('ttrx').getFreezeBalanceV2TxBuilder();
|
|
313
|
+
builder
|
|
314
|
+
.source({ address: resources_1.PARTICIPANTS.custodian.address })
|
|
315
|
+
.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH })
|
|
316
|
+
.setFrozenBalance(resources_1.FROZEN_BALANCE)
|
|
317
|
+
.setResource(resources_1.RESOURCE_ENERGY);
|
|
318
|
+
const tx = await builder.build();
|
|
319
|
+
const txJson = tx.toJson();
|
|
320
|
+
// Verify the built transaction has ENERGY resource
|
|
321
|
+
assert_1.default.equal(txJson.raw_data.contract[0].parameter.value.resource, resources_1.RESOURCE_ENERGY, 'Built transaction should have ENERGY resource');
|
|
322
|
+
// Round-trip: deserialize from broadcast format and rebuild
|
|
323
|
+
const builder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
324
|
+
const tx2 = await builder2.build();
|
|
325
|
+
const tx2Json = tx2.toJson();
|
|
326
|
+
// Verify resource is preserved after round-trip
|
|
327
|
+
assert_1.default.equal(tx2Json.raw_data.contract[0].parameter.value.resource, resources_1.RESOURCE_ENERGY, 'Resource should be ENERGY after round-trip from broadcast format');
|
|
328
|
+
});
|
|
329
|
+
(0, node_test_1.it)('should produce consistent transaction IDs for BANDWIDTH transactions', async () => {
|
|
330
|
+
// Build a BANDWIDTH transaction
|
|
331
|
+
const builder = (0, builder_1.getBuilder)('ttrx').getFreezeBalanceV2TxBuilder();
|
|
332
|
+
builder
|
|
333
|
+
.source({ address: resources_1.PARTICIPANTS.custodian.address })
|
|
334
|
+
.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH })
|
|
335
|
+
.setFrozenBalance(resources_1.FROZEN_BALANCE)
|
|
336
|
+
.setResource(resources_1.RESOURCE_BANDWIDTH);
|
|
337
|
+
const tx = await builder.build();
|
|
338
|
+
const originalTxId = tx.toJson().txID;
|
|
339
|
+
// Round-trip and verify txID is consistent
|
|
340
|
+
const builder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
341
|
+
const tx2 = await builder2.build();
|
|
342
|
+
const roundTripTxId = tx2.toJson().txID;
|
|
343
|
+
assert_1.default.equal(originalTxId, roundTripTxId, 'Transaction ID should be consistent after round-trip');
|
|
344
|
+
});
|
|
345
|
+
(0, node_test_1.it)('should allow signing BANDWIDTH transactions after round-trip', async () => {
|
|
346
|
+
// Build a BANDWIDTH transaction
|
|
347
|
+
const builder = (0, builder_1.getBuilder)('ttrx').getFreezeBalanceV2TxBuilder();
|
|
348
|
+
builder
|
|
349
|
+
.source({ address: resources_1.PARTICIPANTS.custodian.address })
|
|
350
|
+
.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH })
|
|
351
|
+
.setFrozenBalance(resources_1.FROZEN_BALANCE)
|
|
352
|
+
.setResource(resources_1.RESOURCE_BANDWIDTH);
|
|
353
|
+
const tx = await builder.build();
|
|
354
|
+
// Round-trip and sign
|
|
355
|
+
const builder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
356
|
+
builder2.sign({ key: resources_1.PARTICIPANTS.custodian.pk });
|
|
357
|
+
const signedTx = await builder2.build();
|
|
358
|
+
// Verify signature was added
|
|
359
|
+
assert_1.default.equal(signedTx.toJson().signature.length, 1, 'Transaction should have one signature');
|
|
360
|
+
// Verify resource is still BANDWIDTH
|
|
361
|
+
assert_1.default.equal(signedTx.toJson().raw_data.contract[0].parameter.value.resource, resources_1.RESOURCE_BANDWIDTH, 'Resource should still be BANDWIDTH after signing');
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlZXplQmFsYW5jZVR4QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvZnJlZXplQmFsYW5jZVR4QnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixtREFBdUQ7QUFDdkQseUNBQXlDO0FBQ3pDLCtDQVN5QjtBQUN6QixzREFBc0Q7QUFFdEQsa0RBQTJEO0FBRTNELElBQUEsb0JBQVEsRUFBQyw4QkFBOEIsRUFBRTtJQUN2QyxNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUU7UUFDekIsTUFBTSxPQUFPLEdBQUksSUFBQSxvQkFBVSxFQUFDLE1BQU0sQ0FBb0IsQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ3JGLE9BQU87YUFDSixNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsd0JBQVksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDbkQsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLHdCQUFZLEVBQUUsSUFBSSxFQUFFLHNCQUFVLEVBQUUsQ0FBQzthQUNqRCxnQkFBZ0IsQ0FBQywwQkFBYyxDQUFDO2FBQ2hDLFdBQVcsQ0FBQywyQkFBZSxDQUFDLENBQUM7UUFFaEMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQyxDQUFDO0lBRUYsSUFBQSxvQkFBUSxFQUFDLDJCQUEyQixFQUFFLEdBQUcsRUFBRTtRQUN6QyxJQUFBLGNBQUUsRUFBQyxtQ0FBbUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDN0IsTUFBTSxTQUFTLEdBQUcsYUFBYSxFQUFFLENBQUM7WUFDbEMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvQixTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQztZQUN4QyxN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QUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGRlc2NyaWJlLCBpdCB9IGZyb20gJ25vZGU6dGVzdCc7XG5pbXBvcnQge1xuICBQQVJUSUNJUEFOVFMsXG4gIEJMT0NLX0hBU0gsXG4gIEJMT0NLX05VTUJFUixcbiAgRVhQSVJBVElPTixcbiAgUkVTT1VSQ0VfRU5FUkdZLFxuICBSRVNPVVJDRV9CQU5EV0lEVEgsXG4gIEZST1pFTl9CQUxBTkNFLFxuICBGUkVFWkVfQkFMQU5DRV9WMl9DT05UUkFDVCxcbn0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7IGdldEJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL2J1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24sIFdyYXBwZWRCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IGRlY29kZVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi91dGlscyc7XG5cbmRlc2NyaWJlKCdUcm9uIEZyZWV6ZUJhbGFuY2VWMiBidWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBpbml0VHhCdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSAoZ2V0QnVpbGRlcigndHRyeCcpIGFzIFdyYXBwZWRCdWlsZGVyKS5nZXRGcmVlemVCYWxhbmNlVjJUeEJ1aWxkZXIoKTtcbiAgICBidWlsZGVyXG4gICAgICAuc291cmNlKHsgYWRkcmVzczogUEFSVElDSVBBTlRTLmN1c3RvZGlhbi5hZGRyZXNzIH0pXG4gICAgICAuYmxvY2soeyBudW1iZXI6IEJMT0NLX05VTUJFUiwgaGFzaDogQkxPQ0tfSEFTSCB9KVxuICAgICAgLnNldEZyb3plbkJhbGFuY2UoRlJPWkVOX0JBTEFOQ0UpXG4gICAgICAuc2V0UmVzb3VyY2UoUkVTT1VSQ0VfRU5FUkdZKTtcblxuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQgc3VjY2Vzc2Z1bGx5JywgKCkgPT4ge1xuICAgIGl0KCdhIHRyYW5zYWN0aW9uIHdpdGggY29ycmVjdCBpbnB1dHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnRpbWVzdGFtcCh0aW1lc3RhbXApO1xuICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb24odGltZXN0YW1wICsgNDAwMDApO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHguaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHguaW5wdXRzWzBdLmFkZHJlc3MsIFBBUlRJQ0lQQU5UUy5jdXN0b2RpYW4uYWRkcmVzcyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHguaW5wdXRzWzBdLnZhbHVlLCAnMTAwMDAwMCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4Lm91dHB1dHNbMF0udmFsdWUsICcxMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgub3V0cHV0c1swXS5hZGRyZXNzLCBQQVJUSUNJUEFOVFMuY3VzdG9kaWFuLmFkZHJlc3MpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh0eEpzb24ucmF3X2RhdGEuY29udHJhY3QsIEZSRUVaRV9CQUxBTkNFX1YyX0NPTlRSQUNUKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiB1bnNpZ25lZCB0cmFuc2FjdGlvbiBmcm9tIGEgc3RyaW5nIGFuZCBmcm9tIGEgSlNPTicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKHRpbWVzdGFtcCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbih0aW1lc3RhbXAgKyA0MDAwMCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZ2V0QnVpbGRlcigndHRyeCcpLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICB0eEJ1aWxkZXIyLnNpZ24oeyBrZXk6IFBBUlRJQ0lQQU5UUy5jdXN0b2RpYW4ucGsgfSk7XG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjMgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0pzb24oKSk7XG4gICAgICB0eEJ1aWxkZXIzLnNpZ24oeyBrZXk6IFBBUlRJQ0lQQU5UUy5jdXN0b2RpYW4ucGsgfSk7XG4gICAgICBjb25zdCB0eDMgPSBhd2FpdCB0eEJ1aWxkZXIzLmJ1aWxkKCk7XG5cbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwodHgyLCB0eDMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIHVuc2lnbmVkIHRyYW5zYWN0aW9uIHdpdGggZXh0ZW5kZWQgZHVyYXRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IHRpbWVzdGFtcCArIEVYUElSQVRJT047XG4gICAgICBjb25zdCBleHRlbnNpb24gPSA2MDAwMDtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50aW1lc3RhbXAodGltZXN0YW1wKTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKGV4cGlyYXRpb24pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGdldEJ1aWxkZXIoJ3R0cngnKS5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgdHhCdWlsZGVyMi5leHRlbmRWYWxpZFRvKGV4dGVuc2lvbik7XG4gICAgICB0eEJ1aWxkZXIyLnNpZ24oeyBrZXk6IFBBUlRJQ0lQQU5UUy5jdXN0b2RpYW4ucGsgfSk7XG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG5cbiAgICAgIGFzc2VydC5lcXVhbCh0eDIuaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgyLmlucHV0c1swXS5hZGRyZXNzLCBQQVJUSUNJUEFOVFMuY3VzdG9kaWFuLmFkZHJlc3MpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4Mi5pbnB1dHNbMF0udmFsdWUsICcxMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgyLm91dHB1dHNbMF0udmFsdWUsICcxMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgyLm91dHB1dHNbMF0uYWRkcmVzcywgUEFSVElDSVBBTlRTLmN1c3RvZGlhbi5hZGRyZXNzKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4Mi50b0pzb24oKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eEpzb24ucmF3X2RhdGEuZXhwaXJhdGlvbiwgZXhwaXJhdGlvbiArIGV4dGVuc2lvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnYSB0cmFuc2FjdGlvbiBzaWduZWQgbXVsdGlwbGUgdGltZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnRpbWVzdGFtcCh0aW1lc3RhbXApO1xuICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb24odGltZXN0YW1wICsgRVhQSVJBVElPTik7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgbGV0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgbGV0IHJhd0RhdGEgPSB0eEpzb24ucmF3X2RhdGE7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJhd0RhdGEuY29udHJhY3QsIEZSRUVaRV9CQUxBTkNFX1YyX0NPTlRSQUNUKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eEpzb24uc2lnbmF0dXJlLmxlbmd0aCwgMCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0pzb24oKSk7XG4gICAgICB0eEJ1aWxkZXIyLnNpZ24oeyBrZXk6IFBBUlRJQ0lQQU5UUy5jdXN0b2RpYW4ucGsgfSk7XG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICB0eEpzb24gPSB0eDIudG9Kc29uKCk7XG4gICAgICByYXdEYXRhID0gdHhKc29uLnJhd19kYXRhO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyYXdEYXRhLmNvbnRyYWN0LCBGUkVFWkVfQkFMQU5DRV9WMl9DT05UUkFDVCk7XG4gICAgICBhc3NlcnQuZXF1YWwodHhKc29uLnNpZ25hdHVyZS5sZW5ndGgsIDEpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIzID0gZ2V0QnVpbGRlcigndHRyeCcpLmZyb20odHgyLnRvSnNvbigpKTtcbiAgICAgIHR4QnVpbGRlcjMuc2lnbih7IGtleTogUEFSVElDSVBBTlRTLmZyb20ucGsgfSk7XG4gICAgICBjb25zdCB0eDMgPSBhd2FpdCB0eEJ1aWxkZXIzLmJ1aWxkKCk7XG4gICAgICB0eEpzb24gPSB0eDMudG9Kc29uKCk7XG4gICAgICByYXdEYXRhID0gdHhKc29uLnJhd19kYXRhO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyYXdEYXRhLmNvbnRyYWN0LCBGUkVFWkVfQkFMQU5DRV9WMl9DT05UUkFDVCk7XG4gICAgICBhc3NlcnQuZXF1YWwodHhKc29uLnNpZ25hdHVyZS5sZW5ndGgsIDIpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXI0ID0gZ2V0QnVpbGRlcigndHRyeCcpLmZyb20odHgzLnRvSnNvbigpKTtcbiAgICAgIHR4QnVpbGRlcjQuc2lnbih7IGtleTogUEFSVElDSVBBTlRTLm11bHRpc2lnLnBrIH0pO1xuICAgICAgY29uc3QgdHg0ID0gYXdhaXQgdHhCdWlsZGVyNC5idWlsZCgpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4NC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eDQuaW5wdXRzWzBdLmFkZHJlc3MsIFBBUlRJQ0lQQU5UUy5jdXN0b2RpYW4uYWRkcmVzcyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHg0LmlucHV0c1swXS52YWx1ZSwgJzEwMDAwMDAnKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eDQub3V0cHV0c1swXS52YWx1ZSwgJzEwMDAwMDAnKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eDQub3V0cHV0c1swXS5hZGRyZXNzLCBQQVJUSUNJUEFOVFMuY3VzdG9kaWFuLmFkZHJlc3MpO1xuICAgICAgdHhKc29uID0gdHg0LnRvSnNvbigpO1xuICAgICAgcmF3RGF0YSA9IHR4SnNvbi5yYXdfZGF0YTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmF3RGF0YS5jb250cmFjdCwgRlJFRVpFX0JBTEFOQ0VfVjJfQ09OVFJBQ1QpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4SnNvbi5zaWduYXR1cmUubGVuZ3RoLCAzKTtcbiAgICAgIGFzc2VydC5lcXVhbChyYXdEYXRhLmV4cGlyYXRpb24sIHRpbWVzdGFtcCArIEVYUElSQVRJT04pO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJhd0RhdGEudGltZXN0YW1wLCB0aW1lc3RhbXApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIHZhbGlkYXRlJywgKCkgPT4ge1xuICAgIGl0KCdhIHZhbGlkIGV4cGlyYXRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IG5vdyArIEVYUElSQVRJT047XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKG5vdyk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uICsgMTAwMCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eEpzb24ucmF3X2RhdGEuZXhwaXJhdGlvbiwgZXhwaXJhdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gZXhwaXJhdGlvbiBncmVhdGVyIHRoYW4gb25lIHllYXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnRpbWVzdGFtcChub3cpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKG5vdyArIDMxNTM2MDAwMDAxKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnRXhwaXJhdGlvbiBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gb25lIGRheSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gZXhwaXJhdGlvbiBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgZGF0ZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKG5vdyAtIDIwMDApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKG5vdyAtIDEwMDApO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdFeHBpcmF0aW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIGN1cnJlbnQgdGltZSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gZXhwaXJhdGlvbiBsZXNzIHRoYW4gdGhlIHRpbWVzdGFtcCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKG5vdyArIDIwMDApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKG5vdyArIDEwMDApO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdFeHBpcmF0aW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRpbWVzdGFtcCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gZXhwaXJhdGlvbiBzZXQgYWZ0ZXIgYnVpbGQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IG5vdyArIEVYUElSQVRJT047XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnRXhwaXJhdGlvbiBpcyBhbHJlYWR5IHNldCwgaXQgY2FuIG9ubHkgYmUgZXh0ZW5kZWQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIGV4cGlyYXRpb24gc2V0IGFmdGVyIGRlc2VyaWFsaXppbmcnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IG5vdyArIEVYUElSQVRJT047XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGdldEJ1aWxkZXIoJ3R0cngnKS5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlcjIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnRXhwaXJhdGlvbiBpcyBhbHJlYWR5IHNldCwgaXQgY2FuIG9ubHkgYmUgZXh0ZW5kZWQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIGV4dGVuc2lvbiB3aXRob3V0IGEgc2V0IGV4cGlyYXRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmV4dGVuZFZhbGlkVG8oMjAwMDApO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdUaGVyZSBpcyBub3QgZXhwaXJhdGlvbiB0byBleHRlbmQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgemVybyBtaWxsaXNlY29uZCBleHRlbnNpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICBjb25zdCBleHBpcmF0aW9uID0gRGF0ZS5ub3coKSArIEVYUElSQVRJT047XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIyLmV4dGVuZFZhbGlkVG8oMCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ1ZhbHVlIGNhbm5vdCBiZSBiZWxvdyB6ZXJvJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiBleHRlbnNpb24gZ3JhdGVyIHRoYW4gb25lIHllYXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICBjb25zdCBleHBpcmF0aW9uID0gRGF0ZS5ub3coKSArIEVYUElSQVRJT047XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIyLmV4dGVuZFZhbGlkVG8oMzE1MzYwMDAwMDEpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdUaGUgZXhwaXJhdGlvbiBjYW5ub3QgYmUgZXh0ZW5kZWQgbW9yZSB0aGFuIG9uZSBkYXknXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIGV4dGVuc2lvbiBhZnRlciBzaWduaW5nJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IFBBUlRJQ0lQQU5UUy5jdXN0b2RpYW4ucGsgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZ2V0QnVpbGRlcigndHRyeCcpLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyMi5leHRlbmRWYWxpZFRvKDIwMDAwKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnQ2Fubm90IGV4dGVuZCBhIHNpZ25lZCB0cmFuc2FjdGlvbidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWQgcmVzb3VyY2U6IEVORVJHWScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSAoZ2V0QnVpbGRlcigndHRyeCcpIGFzIFdyYXBwZWRCdWlsZGVyKS5nZXRGcmVlemVCYWxhbmNlVjJUeEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLnNvdXJjZSh7IGFkZHJlc3M6IFBBUlRJQ0lQQU5UUy5jdXN0b2RpYW4uYWRkcmVzcyB9KVxuICAgICAgICAuYmxvY2soeyBudW1iZXI6IEJMT0NLX05VTUJFUiwgaGFzaDogQkxPQ0tfSEFTSCB9KVxuICAgICAgICAuc2V0RnJvemVuQmFsYW5jZShGUk9aRU5fQkFMQU5DRSk7XG4gICAgICBidWlsZGVyLnNldFJlc291cmNlKCdFTkVSR1knKTtcbiAgICAgIGFzc2VydC5kb2VzTm90UmVqZWN0KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkIHJlc291cmNlOiBCQU5EV0lEVEgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gKGdldEJ1aWxkZXIoJ3R0cngnKSBhcyBXcmFwcGVkQnVpbGRlcikuZ2V0RnJlZXplQmFsYW5jZVYyVHhCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zb3VyY2UoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMuY3VzdG9kaWFuLmFkZHJlc3MgfSlcbiAgICAgICAgLmJsb2NrKHsgbnVtYmVyOiBCTE9DS19OVU1CRVIsIGhhc2g6IEJMT0NLX0hBU0ggfSlcbiAgICAgICAgLnNldEZyb3plbkJhbGFuY2UoRlJPWkVOX0JBTEFOQ0UpO1xuICAgICAgYnVpbGRlci5zZXRSZXNvdXJjZSgnQkFORFdJRFRIJyk7XG4gICAgICBhc3NlcnQuZG9lc05vdFJlamVjdCgoKSA9PiB7XG4gICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdpbnZhbGlkIHJlc291cmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IChnZXRCdWlsZGVyKCd0dHJ4JykgYXMgV3JhcHBlZEJ1aWxkZXIpLmdldEZyZWV6ZUJhbGFuY2VWMlR4QnVpbGRlcigpO1xuICAgICAgY29uc3QgaW52YWxpZFJlc291cmNlID0gJ0lOVkFMSUQnO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuc291cmNlKHsgYWRkcmVzczogUEFSVElDSVBBTlRTLmN1c3RvZGlhbi5hZGRyZXNzIH0pXG4gICAgICAgIC5ibG9jayh7IG51bWJlcjogQkxPQ0tfTlVNQkVSLCBoYXNoOiBCTE9DS19IQVNIIH0pXG4gICAgICAgIC5zZXRGcm96ZW5CYWxhbmNlKEZST1pFTl9CQUxBTkNFKTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLnNldFJlc291cmNlKGludmFsaWRSZXNvdXJjZSksIGAke2ludmFsaWRSZXNvdXJjZX0gaXMgYSBub3QgdmFsaWQgcmVzb3VyY2UgdHlwZS5gKTtcbiAgICB9KTtcblxuICAgIGl0KCd0cmFuc2FjdGlvbiBtYW5kYXRvcnkgZmllbGRzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gKGdldEJ1aWxkZXIoJ3R0cngnKSBhcyBXcmFwcGVkQnVpbGRlcikuZ2V0RnJlZXplQmFsYW5jZVYyVHhCdWlsZGVyKCk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKHR4QnVpbGRlci5idWlsZCgpLCB7XG4gICAgICAgIG1lc3NhZ2U6ICdNaXNzaW5nIHBhcmFtZXRlcjogZnJvemVuQmFsYW5jZScsXG4gICAgICB9KTtcblxuICAgICAgdHhCdWlsZGVyLnNldEZyb3plbkJhbGFuY2UoJzEwMDAwMDAnKTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKHR4QnVpbGRlci5idWlsZCgpLCB7XG4gICAgICAgIG1lc3NhZ2U6ICdNaXNzaW5nIHBhcmFtZXRlcjogc291cmNlJyxcbiAgICAgIH0pO1xuXG4gICAgICB0eEJ1aWxkZXIuc291cmNlKHsgYWRkcmVzczogUEFSVElDSVBBTlRTLmN1c3RvZGlhbi5hZGRyZXNzIH0pO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHModHhCdWlsZGVyLmJ1aWxkKCksIHtcbiAgICAgICAgbWVzc2FnZTogJ01pc3NpbmcgcGFyYW1ldGVyOiByZXNvdXJjZScsXG4gICAgICB9KTtcblxuICAgICAgdHhCdWlsZGVyLnNldFJlc291cmNlKCdFTkVSR1knKTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKHR4QnVpbGRlci5idWlsZCgpLCB7XG4gICAgICAgIG1lc3NhZ2U6ICdNaXNzaW5nIGJsb2NrIHJlZmVyZW5jZSBpbmZvcm1hdGlvbicsXG4gICAgICB9KTtcblxuICAgICAgdHhCdWlsZGVyLmJsb2NrKHsgbnVtYmVyOiBCTE9DS19OVU1CRVIsIGhhc2g6IEJMT0NLX0hBU0ggfSk7XG4gICAgICBhc3NlcnQuZG9lc05vdFJlamVjdCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGVjb2RlIGZyZWV6ZSB0eG5zIGNvcnJlY3RseScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGRlY29kZSBhIGZyZWV6ZSB0cmFuc2FjdGlvbiB3aXRoIHJlc291cmNlIGFzIEVORVJHWScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJhd0hleCA9XG4gICAgICAgICcwYTAyNjM1NjIyMDhhZWI2ZGZiOGU5Njg2MjY0NDBiYzkxZjZjMzljMzM1YTVhMDgzNjEyNTYwYTM0NzQ3OTcwNjUyZTY3NmY2ZjY3NmM2NTYxNzA2OTczMmU2MzZmNmQyZjcwNzI2Zjc0NmY2MzZmNmMyZTQ2NzI2NTY1N2E2NTQyNjE2YzYxNmU2MzY1NTYzMjQzNmY2ZTc0NzI2MTYzNzQxMjFlMGExNTQxNjBiOWFiODM3ZmQ3MTUzYzFiYWE1ZTU1YTE2ZDA1ZDYwZTIxZDBkMzEwODBlMWViMTcxODAxNzBmY2Q4ZjNjMzljMzMnO1xuICAgICAgY29uc3QgZGVjb2RlZFRyYW5zYWN0aW9uID0gZGVjb2RlVHJhbnNhY3Rpb24ocmF3SGV4KTtcblxuICAgICAgLy8gVmVyaWZ5IHRyYW5zYWN0aW9uIGhhcyBjb250cmFjdHNcbiAgICAgIGFzc2VydC5vayhkZWNvZGVkVHJhbnNhY3Rpb24uY29udHJhY3Q/Lmxlbmd0aCA+IDAsICdUcmFuc2FjdGlvbiBzaG91bGQgaGF2ZSBhdCBsZWFzdCBvbmUgY29udHJhY3QnKTtcblxuICAgICAgY29uc3QgY29udHJhY3QgPSBkZWNvZGVkVHJhbnNhY3Rpb24uY29udHJhY3RbMF07XG4gICAgICBhc3NlcnQub2soY29udHJhY3QsICdjb250cmFjdCBzaG91bGQgZXhpc3QnKTtcblxuICAgICAgaWYgKCEoJ3BhcmFtZXRlcicgaW4gY29udHJhY3QpIHx8ICFjb250cmFjdC5wYXJhbWV0ZXI/LnZhbHVlIHx8ICEoJ3Jlc291cmNlJyBpbiBjb250cmFjdC5wYXJhbWV0ZXIudmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb250cmFjdCBmb3JtYXQ6IG1pc3NpbmcgcGFyYW1ldGVyIG9yIHJlc291cmNlJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmeSByZXNvdXJjZSB0eXBlXG4gICAgICBhc3NlcnQuZXF1YWwoY29udHJhY3QucGFyYW1ldGVyLnZhbHVlLnJlc291cmNlLCBSRVNPVVJDRV9FTkVSR1ksICdSZXNvdXJjZSB0eXBlIHNob3VsZCBiZSBFTkVSR1knKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVjb2RlIGEgZnJlZXplIHRyYW5zYWN0aW9uIHdpdGggcmVzb3VyY2UgYXMgQkFORFdJRFRIJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmF3SGV4ID1cbiAgICAgICAgJzBhMDI4ZDM3MjIwOGY0MDMzNzI0OTBiNWI4ZTI0MGJiYWFiN2Y2OWIzMzVhNWIwODM2MTI1NzBhMzQ3NDc5NzA2NTJlNjc2ZjZmNjc2YzY1NjE3MDY5NzMyZTYzNmY2ZDJmNzA3MjZmNzQ2ZjYzNmY2YzJlNDY3MjY1NjU3YTY1NDI2MTZjNjE2ZTYzNjU1NjMyNDM2ZjZlNzQ3MjYxNjM3NDEyMWYwYTE1NDE2MGI5YWI4MzdmZDcxNTNjMWJhYTVlNTVhMTZkMDVkNjBlMjFkMGQzMTA4MGNhYjVlZTAxMTgwMDcwYmJjZGRiZjQ5YjMzJztcbiAgICAgIGNvbnN0IGRlY29kZWRUcmFuc2FjdGlvbiA9IGRlY29kZVRyYW5zYWN0aW9uKHJhd0hleCk7XG5cbiAgICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiBoYXMgY29udHJhY3RzXG4gICAgICBhc3NlcnQub2soZGVjb2RlZFRyYW5zYWN0aW9uLmNvbnRyYWN0Py5sZW5ndGggPiAwLCAnVHJhbnNhY3Rpb24gc2hvdWxkIGhhdmUgYXQgbGVhc3Qgb25lIGNvbnRyYWN0Jyk7XG5cbiAgICAgIGNvbnN0IGNvbnRyYWN0ID0gZGVjb2RlZFRyYW5zYWN0aW9uLmNvbnRyYWN0WzBdO1xuICAgICAgYXNzZXJ0Lm9rKGNvbnRyYWN0LCAnY29udHJhY3Qgc2hvdWxkIGV4aXN0Jyk7XG5cbiAgICAgIGlmICghKCdwYXJhbWV0ZXInIGluIGNvbnRyYWN0KSB8fCAhY29udHJhY3QucGFyYW1ldGVyPy52YWx1ZSB8fCAhKCdyZXNvdXJjZScgaW4gY29udHJhY3QucGFyYW1ldGVyLnZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29udHJhY3QgZm9ybWF0OiBtaXNzaW5nIHBhcmFtZXRlciBvciByZXNvdXJjZScpO1xuICAgICAgfVxuXG4gICAgICAvLyBWZXJpZnkgcmVzb3VyY2UgdHlwZVxuICAgICAgYXNzZXJ0LmVxdWFsKGNvbnRyYWN0LnBhcmFtZXRlci52YWx1ZS5yZXNvdXJjZSwgUkVTT1VSQ0VfQkFORFdJRFRILCAnUmVzb3VyY2UgdHlwZSBzaG91bGQgYmUgQkFORFdJRFRIJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCQU5EV0lEVEggc2VyaWFsaXphdGlvbiAocHJvdG9idWYzIGNvbXBhdGliaWxpdHkpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcm91bmQtdHJpcCBCQU5EV0lEVEggdHJhbnNhY3Rpb25zIGNvcnJlY3RseScsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEJ1aWxkIGEgQkFORFdJRFRIIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCBidWlsZGVyID0gKGdldEJ1aWxkZXIoJ3R0cngnKSBhcyBXcmFwcGVkQnVpbGRlcikuZ2V0RnJlZXplQmFsYW5jZVYyVHhCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zb3VyY2UoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMuY3VzdG9kaWFuLmFkZHJlc3MgfSlcbiAgICAgICAgLmJsb2NrKHsgbnVtYmVyOiBCTE9DS19OVU1CRVIsIGhhc2g6IEJMT0NLX0hBU0ggfSlcbiAgICAgICAgLnNldEZyb3plbkJhbGFuY2UoRlJPWkVOX0JBTEFOQ0UpXG4gICAgICAgIC5zZXRSZXNvdXJjZShSRVNPVVJDRV9CQU5EV0lEVEgpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIGJ1aWx0IHRyYW5zYWN0aW9uIGhhcyBCQU5EV0lEVEggcmVzb3VyY2VcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgdHhKc29uLnJhd19kYXRhLmNvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZS5yZXNvdXJjZSxcbiAgICAgICAgUkVTT1VSQ0VfQkFORFdJRFRILFxuICAgICAgICAnQnVpbHQgdHJhbnNhY3Rpb24gc2hvdWxkIGhhdmUgQkFORFdJRFRIIHJlc291cmNlJ1xuICAgICAgKTtcblxuICAgICAgLy8gUm91bmQtdHJpcDogZGVzZXJpYWxpemUgZnJvbSBicm9hZGNhc3QgZm9ybWF0IGFuZCByZWJ1aWxkXG4gICAgICBjb25zdCBidWlsZGVyMiA9IGdldEJ1aWxkZXIoJ3R0cngnKS5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgY29uc3QgdHgyID0gYXdhaXQgYnVpbGRlcjIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4Mkpzb24gPSB0eDIudG9Kc29uKCk7XG5cbiAgICAgIC8vIFZlcmlmeSByZXNvdXJjZSBpcyBwcmVzZXJ2ZWQgYWZ0ZXIgcm91bmQtdHJpcFxuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICB0eDJKc29uLnJhd19kYXRhLmNvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZS5yZXNvdXJjZSxcbiAgICAgICAgUkVTT1VSQ0VfQkFORFdJRFRILFxuICAgICAgICAnUmVzb3VyY2Ugc2hvdWxkIGJlIEJBTkRXSURUSCBhZnRlciByb3VuZC10cmlwIGZyb20gYnJvYWRjYXN0IGZvcm1hdCdcbiAgICAgICk7XG5cbiAgICAgIC8vIFJvdW5kLXRyaXA6IGRlc2VyaWFsaXplIGZyb20gSlNPTiBhbmQgcmVidWlsZFxuICAgICAgY29uc3QgYnVpbGRlcjMgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0pzb24oKSk7XG4gICAgICBjb25zdCB0eDMgPSBhd2FpdCBidWlsZGVyMy5idWlsZCgpO1xuICAgICAgY29uc3QgdHgzSnNvbiA9IHR4My50b0pzb24oKTtcblxuICAgICAgLy8gVmVyaWZ5IHJlc291cmNlIGlzIHByZXNlcnZlZCBhZnRlciByb3VuZC10cmlwIGZyb20gSlNPTlxuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICB0eDNKc29uLnJhd19kYXRhLmNvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZS5yZXNvdXJjZSxcbiAgICAgICAgUkVTT1VSQ0VfQkFORFdJRFRILFxuICAgICAgICAnUmVzb3VyY2Ugc2hvdWxkIGJlIEJBTkRXSURUSCBhZnRlciByb3VuZC10cmlwIGZyb20gSlNPTidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJvdW5kLXRyaXAgRU5FUkdZIHRyYW5zYWN0aW9ucyBjb3JyZWN0bHknLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBCdWlsZCBhbiBFTkVSR1kgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSAoZ2V0QnVpbGRlcigndHRyeCcpIGFzIFdyYXBwZWRCdWlsZGVyKS5nZXRGcmVlemVCYWxhbmNlVjJUeEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLnNvdXJjZSh7IGFkZHJlc3M6IFBBUlRJQ0lQQU5UUy5jdXN0b2RpYW4uYWRkcmVzcyB9KVxuICAgICAgICAuYmxvY2soeyBudW1iZXI6IEJMT0NLX05VTUJFUiwgaGFzaDogQkxPQ0tfSEFTSCB9KVxuICAgICAgICAuc2V0RnJvemVuQmFsYW5jZShGUk9aRU5fQkFMQU5DRSlcbiAgICAgICAgLnNldFJlc291cmNlKFJFU09VUkNFX0VORVJHWSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgYnVpbHQgdHJhbnNhY3Rpb24gaGFzIEVORVJHWSByZXNvdXJjZVxuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICB0eEpzb24ucmF3X2RhdGEuY29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlLnJlc291cmNlLFxuICAgICAgICBSRVNPVVJDRV9FTkVSR1ksXG4gICAgICAgICdCdWlsdCB0cmFuc2FjdGlvbiBzaG91bGQgaGF2ZSBFTkVSR1kgcmVzb3VyY2UnXG4gICAgICApO1xuXG4gICAgICAvLyBSb3VuZC10cmlwOiBkZXNlcmlhbGl6ZSBmcm9tIGJyb2FkY2FzdCBmb3JtYXQgYW5kIHJlYnVpbGRcbiAgICAgIGNvbnN0IGJ1aWxkZXIyID0gZ2V0QnVpbGRlcigndHRyeCcpLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCBidWlsZGVyMi5idWlsZCgpO1xuICAgICAgY29uc3QgdHgySnNvbiA9IHR4Mi50b0pzb24oKTtcblxuICAgICAgLy8gVmVyaWZ5IHJlc291cmNlIGlzIHByZXNlcnZlZCBhZnRlciByb3VuZC10cmlwXG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIHR4Mkpzb24ucmF3X2RhdGEuY29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlLnJlc291cmNlLFxuICAgICAgICBSRVNPVVJDRV9FTkVSR1ksXG4gICAgICAgICdSZXNvdXJjZSBzaG91bGQgYmUgRU5FUkdZIGFmdGVyIHJvdW5kLXRyaXAgZnJvbSBicm9hZGNhc3QgZm9ybWF0J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBjb25zaXN0ZW50IHRyYW5zYWN0aW9uIElEcyBmb3IgQkFORFdJRFRIIHRyYW5zYWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEJ1aWxkIGEgQkFORFdJRFRIIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCBidWlsZGVyID0gKGdldEJ1aWxkZXIoJ3R0cngnKSBhcyBXcmFwcGVkQnVpbGRlcikuZ2V0RnJlZXplQmFsYW5jZVYyVHhCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zb3VyY2UoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMuY3VzdG9kaWFuLmFkZHJlc3MgfSlcbiAgICAgICAgLmJsb2NrKHsgbnVtYmVyOiBCTE9DS19OVU1CRVIsIGhhc2g6IEJMT0NLX0hBU0ggfSlcbiAgICAgICAgLnNldEZyb3plbkJhbGFuY2UoRlJPWkVOX0JBTEFOQ0UpXG4gICAgICAgIC5zZXRSZXNvdXJjZShSRVNPVVJDRV9CQU5EV0lEVEgpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsVHhJZCA9IHR4LnRvSnNvbigpLnR4SUQ7XG5cbiAgICAgIC8vIFJvdW5kLXRyaXAgYW5kIHZlcmlmeSB0eElEIGlzIGNvbnNpc3RlbnRcbiAgICAgIGNvbnN0IGJ1aWxkZXIyID0gZ2V0QnVpbGRlcigndHRyeCcpLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCBidWlsZGVyMi5idWlsZCgpO1xuICAgICAgY29uc3Qgcm91bmRUcmlwVHhJZCA9IHR4Mi50b0pzb24oKS50eElEO1xuXG4gICAgICBhc3NlcnQuZXF1YWwob3JpZ2luYWxUeElkLCByb3VuZFRyaXBUeElkLCAnVHJhbnNhY3Rpb24gSUQgc2hvdWxkIGJlIGNvbnNpc3RlbnQgYWZ0ZXIgcm91bmQtdHJpcCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbGxvdyBzaWduaW5nIEJBTkRXSURUSCB0cmFuc2FjdGlvbnMgYWZ0ZXIgcm91bmQtdHJpcCcsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEJ1aWxkIGEgQkFORFdJRFRIIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCBidWlsZGVyID0gKGdldEJ1aWxkZXIoJ3R0cngnKSBhcyBXcmFwcGVkQnVpbGRlcikuZ2V0RnJlZXplQmFsYW5jZVYyVHhCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zb3VyY2UoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMuY3VzdG9kaWFuLmFkZHJlc3MgfSlcbiAgICAgICAgLmJsb2NrKHsgbnVtYmVyOiBCTE9DS19OVU1CRVIsIGhhc2g6IEJMT0NLX0hBU0ggfSlcbiAgICAgICAgLnNldEZyb3plbkJhbGFuY2UoRlJPWkVOX0JBTEFOQ0UpXG4gICAgICAgIC5zZXRSZXNvdXJjZShSRVNPVVJDRV9CQU5EV0lEVEgpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgLy8gUm91bmQtdHJpcCBhbmQgc2lnblxuICAgICAgY29uc3QgYnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIGJ1aWxkZXIyLnNpZ24oeyBrZXk6IFBBUlRJQ0lQQU5UUy5jdXN0b2RpYW4ucGsgfSk7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCk7XG5cbiAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUgd2FzIGFkZGVkXG4gICAgICBhc3NlcnQuZXF1YWwoc2lnbmVkVHgudG9Kc29uKCkuc2lnbmF0dXJlLmxlbmd0aCwgMSwgJ1RyYW5zYWN0aW9uIHNob3VsZCBoYXZlIG9uZSBzaWduYXR1cmUnKTtcblxuICAgICAgLy8gVmVyaWZ5IHJlc291cmNlIGlzIHN0aWxsIEJBTkRXSURUSFxuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICBzaWduZWRUeC50b0pzb24oKS5yYXdfZGF0YS5jb250cmFjdFswXS5wYXJhbWV0ZXIudmFsdWUucmVzb3VyY2UsXG4gICAgICAgIFJFU09VUkNFX0JBTkRXSURUSCxcbiAgICAgICAgJ1Jlc291cmNlIHNob3VsZCBzdGlsbCBiZSBCQU5EV0lEVEggYWZ0ZXIgc2lnbmluZydcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenTransferBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/tokenTransferBuilder.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
7
|
+
const node_test_1 = require("node:test");
|
|
8
|
+
const builder_1 = require("../../../src/lib/builder");
|
|
9
|
+
const utils_1 = require("../../../src/lib/utils");
|
|
10
|
+
const resources_1 = require("../../resources");
|
|
11
|
+
(0, node_test_1.describe)('TRX Token Transfer Builder', () => {
|
|
12
|
+
const initTxBuilder = (amount = 1000000000) => {
|
|
13
|
+
const builder = (0, builder_1.getBuilder)('ttrx:usdt').getTokenTransferBuilder();
|
|
14
|
+
builder
|
|
15
|
+
.source({ address: resources_1.PARTICIPANTS.custodian.address })
|
|
16
|
+
.to({ address: resources_1.USDT_CONTRACT_ADDRESS })
|
|
17
|
+
.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH })
|
|
18
|
+
.fee({ feeLimit: resources_1.FEE_LIMIT });
|
|
19
|
+
return builder;
|
|
20
|
+
};
|
|
21
|
+
(0, node_test_1.describe)('should build', () => {
|
|
22
|
+
(0, node_test_1.describe)('non serialized transactions', () => {
|
|
23
|
+
(0, node_test_1.it)('a signed token contract call transaction', async () => {
|
|
24
|
+
const txBuilder = initTxBuilder();
|
|
25
|
+
txBuilder.tokenTransferData(resources_1.TOKEN_TRANSFER_RECIPIENT, '1000000000').sign({ key: resources_1.PARTICIPANTS.custodian.pk });
|
|
26
|
+
const tx = await txBuilder.build();
|
|
27
|
+
const txJson = tx.toJson();
|
|
28
|
+
const rawData = txJson.raw_data;
|
|
29
|
+
node_assert_1.default.deepStrictEqual(rawData.contract, resources_1.TOKEN_TX_CONTRACT);
|
|
30
|
+
});
|
|
31
|
+
(0, node_test_1.it)('a token transfer transaction should have a default expiration of 3 hours', async () => {
|
|
32
|
+
const before = Date.now();
|
|
33
|
+
const txBuilder = initTxBuilder();
|
|
34
|
+
txBuilder.tokenTransferData(resources_1.TOKEN_TRANSFER_RECIPIENT, '1000000000').sign({ key: resources_1.PARTICIPANTS.custodian.pk });
|
|
35
|
+
const tx = await txBuilder.build();
|
|
36
|
+
const after = Date.now();
|
|
37
|
+
const txJson = tx.toJson();
|
|
38
|
+
const expiration = txJson.raw_data.expiration;
|
|
39
|
+
node_assert_1.default.equal(utils_1.TRANSACTION_DEFAULT_EXPIRATION, 10800000, 'TRANSACTION_DEFAULT_EXPIRATION should be 3 hours');
|
|
40
|
+
// The default expiration should be ~3 hours (10800000ms) from when the tx was built
|
|
41
|
+
node_assert_1.default.ok(expiration >= before + utils_1.TRANSACTION_DEFAULT_EXPIRATION && expiration <= after + utils_1.TRANSACTION_DEFAULT_EXPIRATION, `Expiration ${expiration} should be approximately 3 hours from now`);
|
|
42
|
+
});
|
|
43
|
+
(0, node_test_1.it)('from a signed token contract call transaction', async () => {
|
|
44
|
+
const txHex = '{"raw_data":{"contractType":2,"contract":[{"parameter":{"value":{"data":"a9059cbb0000000000000000000000008483618ca85c35a9b923d98bebca718f5a1db2790000000000000000000000000000000000000000000000000000000005f5e100","owner_address":"41c51fbeea78910b15b1d3e8a9b62914ca94d1a4ac","contract_address":"4142a1e39aefa49290f2b3f9ed688d7cecf86cd6e0"},"type_url":"type.googleapis.com/protocol.TriggerSmartContract"},"type":"TriggerSmartContract"}],"expiration":1674581767432,"timestamp":1674578167432,"ref_block_bytes":"578b","ref_block_hash":"6113bb9ac351432b","fee_limit":15000000},"raw_data_hex":"0a02578b22086113bb9ac351432b4088eae7a6de305aae01081f12a9010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412740a1541c51fbeea78910b15b1d3e8a9b62914ca94d1a4ac12154142a1e39aefa49290f2b3f9ed688d7cecf86cd6e02244a9059cbb0000000000000000000000008483618ca85c35a9b923d98bebca718f5a1db2790000000000000000000000000000000000000000000000000000000005f5e10070888d8ca5de309001c0c39307","txID":"fe21c49f4febd9089125e3a006943c145721d8fcb7ab84136f8c6663ff92f8ed","signature":["0775cde302689eb8293883c66a89b31e80d608bfc3ad3c283b64a490ea4cc712c55a2fd2e62c75843dd7e77d8c4cb52e0f371fbb29b332c259f8cb63c2e6195301"]}';
|
|
45
|
+
const txBuilder = (0, builder_1.getBuilder)('ttrx:usdt').from(txHex);
|
|
46
|
+
const tx = await txBuilder.build();
|
|
47
|
+
node_assert_1.default.equal(tx.id, resources_1.TOKEN_TXID);
|
|
48
|
+
const txJson = tx.toJson();
|
|
49
|
+
const rawData = txJson.raw_data;
|
|
50
|
+
node_assert_1.default.deepStrictEqual(rawData.contract, resources_1.TOKEN_TX_CONTRACT_2);
|
|
51
|
+
});
|
|
52
|
+
// Hex and base58 are alternative encodings of the same TRON address, so every accepted
|
|
53
|
+
// form must produce identical transaction data — this is the COINS-1575 regression.
|
|
54
|
+
(0, node_test_1.it)('accepts a 0x-prefixed hex recipient and encodes the same data as the base58 form', async () => {
|
|
55
|
+
const buildData = async (recipient) => {
|
|
56
|
+
const txBuilder = initTxBuilder();
|
|
57
|
+
txBuilder.tokenTransferData(recipient, '1000000000').sign({ key: resources_1.PARTICIPANTS.custodian.pk });
|
|
58
|
+
const tx = await txBuilder.build();
|
|
59
|
+
return tx.toJson().raw_data.contract[0].parameter.value.data;
|
|
60
|
+
};
|
|
61
|
+
const fromBase58 = await buildData(resources_1.TOKEN_TRANSFER_RECIPIENT);
|
|
62
|
+
// 0x-form of TOKEN_TRANSFER_RECIPIENT (TGai5uHgBcoLERrzDXMepqZB8Et7D8nV8K)
|
|
63
|
+
const fromHex = await buildData('0x4887974f42a789ef6d4dfc7ba28b1583219434b3');
|
|
64
|
+
node_assert_1.default.equal(fromHex, fromBase58);
|
|
65
|
+
});
|
|
66
|
+
(0, node_test_1.it)('accepts a 41-prefixed hex recipient and encodes the same data as the base58 form', async () => {
|
|
67
|
+
const buildData = async (recipient) => {
|
|
68
|
+
const txBuilder = initTxBuilder();
|
|
69
|
+
txBuilder.tokenTransferData(recipient, '1000000000').sign({ key: resources_1.PARTICIPANTS.custodian.pk });
|
|
70
|
+
const tx = await txBuilder.build();
|
|
71
|
+
return tx.toJson().raw_data.contract[0].parameter.value.data;
|
|
72
|
+
};
|
|
73
|
+
const fromBase58 = await buildData(resources_1.TOKEN_TRANSFER_RECIPIENT);
|
|
74
|
+
// 41-prefixed hex of TOKEN_TRANSFER_RECIPIENT
|
|
75
|
+
const fromHex = await buildData('414887974f42a789ef6d4dfc7ba28b1583219434b3');
|
|
76
|
+
node_assert_1.default.equal(fromHex, fromBase58);
|
|
77
|
+
});
|
|
78
|
+
(0, node_test_1.it)('still rejects addresses in neither base58 nor hex form with the same error', () => {
|
|
79
|
+
const txBuilder = initTxBuilder();
|
|
80
|
+
node_assert_1.default.throws(() => txBuilder.tokenTransferData('not-an-address', '1000000000'), (e) => e instanceof Error &&
|
|
81
|
+
e.message ===
|
|
82
|
+
'not-an-address is not a valid base58 address: contains invalid Base58 character(s): "o", "-".');
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5UcmFuc2ZlckJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3Rva2VuVHJhbnNmZXJCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOERBQWlDO0FBQ2pDLHlDQUF5QztBQUN6QyxzREFBc0Q7QUFFdEQsa0RBQXdFO0FBQ3hFLCtDQVV5QjtBQUV6QixJQUFBLG9CQUFRLEVBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO0lBQzFDLE1BQU0sYUFBYSxHQUFHLENBQUMsTUFBTSxHQUFHLFVBQVUsRUFBRSxFQUFFO1FBQzVDLE1BQU0sT0FBTyxHQUFJLElBQUEsb0JBQVUsRUFBQyxXQUFXLENBQW9CLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUN0RixPQUFPO2FBQ0osTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLHdCQUFZLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ25ELEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxpQ0FBcUIsRUFBRSxDQUFDO2FBQ3RDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSx3QkFBWSxFQUFFLElBQUksRUFBRSxzQkFBVSxFQUFFLENBQUM7YUFDakQsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLHFCQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUMsQ0FBQztJQUVGLElBQUEsb0JBQVEsRUFBQyxjQUFjLEVBQUUsR0FBRyxFQUFFO1FBQzVCLElBQUEsb0JBQVEsRUFBQyw2QkFBNkIsRUFBRSxHQUFHLEVBQUU7WUFDM0MsSUFBQSxjQUFFLEVBQUMsMENBQTBDLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3hELE1BQU0sU0FBUyxHQUFHLGFBQWEsRUFBRSxDQUFDO2dCQUNsQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsb0NBQXdCLEVBQUUsWUFBWSxDQUFD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RSxFQUFDLDRFQUE0RSxFQUFFLEdBQUcsRUFBRTtnQkFDcEYsTUFBTSxTQUFTLEdBQUcsYUFBYSxFQUFFLENBQUM7Z0JBQ2xDLHFCQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsRUFDakUsQ0FBQyxDQUFVLEVBQUUsRUFBRSxDQUNiLENBQUMsWUFBWSxLQUFLO29CQUNsQixDQUFDLENBQUMsT0FBTzt3QkFDUCwrRkFBK0YsQ0FDcEcsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydCc7XG5pbXBvcnQgeyBkZXNjcmliZSwgaXQgfSBmcm9tICdub2RlOnRlc3QnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvYnVpbGRlcic7XG5pbXBvcnQgeyBXcmFwcGVkQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBUUkFOU0FDVElPTl9ERUZBVUxUX0VYUElSQVRJT04gfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7XG4gIFBBUlRJQ0lQQU5UUyxcbiAgQkxPQ0tfSEFTSCxcbiAgQkxPQ0tfTlVNQkVSLFxuICBUT0tFTl9UWF9DT05UUkFDVCxcbiAgRkVFX0xJTUlULFxuICBVU0RUX0NPTlRSQUNUX0FERFJFU1MsXG4gIFRPS0VOX1RSQU5TRkVSX1JFQ0lQSUVOVCxcbiAgVE9LRU5fVFhJRCxcbiAgVE9LRU5fVFhfQ09OVFJBQ1RfMixcbn0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzJztcblxuZGVzY3JpYmUoJ1RSWCBUb2tlbiBUcmFuc2ZlciBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBpbml0VHhCdWlsZGVyID0gKGFtb3VudCA9IDEwMDAwMDAwMDApID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gKGdldEJ1aWxkZXIoJ3R0cng6dXNkdCcpIGFzIFdyYXBwZWRCdWlsZGVyKS5nZXRUb2tlblRyYW5zZmVyQnVpbGRlcigpO1xuICAgIGJ1aWxkZXJcbiAgICAgIC5zb3VyY2UoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMuY3VzdG9kaWFuLmFkZHJlc3MgfSlcbiAgICAgIC50byh7IGFkZHJlc3M6IFVTRFRfQ09OVFJBQ1RfQUREUkVTUyB9KVxuICAgICAgLmJsb2NrKHsgbnVtYmVyOiBCTE9DS19OVU1CRVIsIGhhc2g6IEJMT0NLX0hBU0ggfSlcbiAgICAgIC5mZWUoeyBmZWVMaW1pdDogRkVFX0xJTUlUIH0pO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQnLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ25vbiBzZXJpYWxpemVkIHRyYW5zYWN0aW9ucycsICgpID0+IHtcbiAgICAgIGl0KCdhIHNpZ25lZCB0b2tlbiBjb250cmFjdCBjYWxsIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlblRyYW5zZmVyRGF0YShUT0tFTl9UUkFOU0ZFUl9SRUNJUElFTlQsICcxMDAwMDAwMDAwJykuc2lnbih7IGtleTogUEFSVElDSVBBTlRTLmN1c3RvZGlhbi5wayB9KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICAgIGNvbnN0IHJhd0RhdGEgPSB0eEpzb24ucmF3X2RhdGE7XG4gICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmF3RGF0YS5jb250cmFjdCwgVE9LRU5fVFhfQ09OVFJBQ1QpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHRva2VuIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHNob3VsZCBoYXZlIGEgZGVmYXVsdCBleHBpcmF0aW9uIG9mIDMgaG91cnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuVHJhbnNmZXJEYXRhKFRPS0VOX1RSQU5TRkVSX1JFQ0lQSUVOVCwgJzEwMDAwMDAwMDAnKS5zaWduKHsga2V5OiBQQVJUSUNJUEFOVFMuY3VzdG9kaWFuLnBrIH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCBhZnRlciA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgICBjb25zdCBleHBpcmF0aW9uID0gdHhKc29uLnJhd19kYXRhLmV4cGlyYXRpb247XG5cbiAgICAgICAgYXNzZXJ0LmVxdWFsKFRSQU5TQUNUSU9OX0RFRkFVTFRfRVhQSVJBVElPTiwgMTA4MDAwMDAsICdUUkFOU0FDVElPTl9ERUZBVUxUX0VYUElSQVRJT04gc2hvdWxkIGJlIDMgaG91cnMnKTtcbiAgICAgICAgLy8gVGhlIGRlZmF1bHQgZXhwaXJhdGlvbiBzaG91bGQgYmUgfjMgaG91cnMgKDEwODAwMDAwbXMpIGZyb20gd2hlbiB0aGUgdHggd2FzIGJ1aWx0XG4gICAgICAgIGFzc2VydC5vayhcbiAgICAgICAgICBleHBpcmF0aW9uID49IGJlZm9yZSArIFRSQU5TQUNUSU9OX0RFRkFVTFRfRVhQSVJBVElPTiAmJiBleHBpcmF0aW9uIDw9IGFmdGVyICsgVFJBTlNBQ1RJT05fREVGQVVMVF9FWFBJUkFUSU9OLFxuICAgICAgICAgIGBFeHBpcmF0aW9uICR7ZXhwaXJhdGlvbn0gc2hvdWxkIGJlIGFwcHJveGltYXRlbHkgMyBob3VycyBmcm9tIG5vd2BcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnZnJvbSBhIHNpZ25lZCB0b2tlbiBjb250cmFjdCBjYWxsIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEhleCA9XG4gICAgICAgICAgJ3tcInJhd19kYXRhXCI6e1wiY29udHJhY3RUeXBlXCI6MixcImNvbnRyYWN0XCI6W3tcInBhcmFtZXRlclwiOntcInZhbHVlXCI6e1wiZGF0YVwiOlwiYTkwNTljYmIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4NDgzNjE4Y2E4NWMzNWE5YjkyM2Q5OGJlYmNhNzE4ZjVhMWRiMjc5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNWY1ZTEwMFwiLFwib3duZXJfYWRkcmVzc1wiOlwiNDFjNTFmYmVlYTc4OTEwYjE1YjFkM2U4YTliNjI5MTRjYTk0ZDFhNGFjXCIsXCJjb250cmFjdF9hZGRyZXNzXCI6XCI0MTQyYTFlMzlhZWZhNDkyOTBmMmIzZjllZDY4OGQ3Y2VjZjg2Y2Q2ZTBcIn0sXCJ0eXBlX3VybFwiOlwidHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2NvbC5UcmlnZ2VyU21hcnRDb250cmFjdFwifSxcInR5cGVcIjpcIlRyaWdnZXJTbWFydENvbnRyYWN0XCJ9XSxcImV4cGlyYXRpb25cIjoxNjc0NTgxNzY3NDMyLFwidGltZXN0YW1wXCI6MTY3NDU3ODE2NzQzMixcInJlZl9ibG9ja19ieXRlc1wiOlwiNTc4YlwiLFwicmVmX2Jsb2NrX2hhc2hcIjpcIjYxMTNiYjlhYzM1MTQzMmJcIixcImZlZV9saW1pdFwiOjE1MDAwMDAwfSxcInJhd19kYXRhX2hleFwiOlwiMGEwMjU3OGIyMjA4NjExM2JiOWFjMzUxNDMyYjQwODhlYWU3YTZkZTMwNWFhZTAxMDgxZjEyYTkwMTBhMzE3NDc5NzA2NTJlNjc2ZjZmNjc2YzY1NjE3MDY5NzMyZTYzNmY2ZDJmNzA3MjZmNzQ2ZjYzNmY2YzJlNTQ3MjY5Njc2NzY1NzI1MzZkNjE3Mjc0NDM2ZjZlNzQ3MjYxNjM3NDEyNzQwYTE1NDFjNTFmYmVlYTc4OTEwYjE1YjFkM2U4YTliNjI5MTRjYTk0ZDFhNGFjMTIxNTQxNDJhMWUzOWFlZmE0OTI5MGYyYjNmOWVkNjg4ZDdjZWNmODZjZDZlMDIyNDRhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg0ODM2MThjYTg1YzM1YTliOTIzZDk4YmViY2E3MThmNWExZGIyNzkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1ZjVlMTAwNzA4ODhkOGNhNWRlMzA5MDAxYzBjMzkzMDdcIixcInR4SURcIjpcImZlMjFjNDlmNGZlYmQ5MDg5MTI1ZTNhMDA2OTQzYzE0NTcyMWQ4ZmNiN2FiODQxMzZmOGM2NjYzZmY5MmY4ZWRcIixcInNpZ25hdHVyZVwiOltcIjA3NzVjZGUzMDI2ODllYjgyOTM4ODNjNjZhODliMzFlODBkNjA4YmZjM2FkM2MyODNiNjRhNDkwZWE0Y2M3MTJjNTVhMmZkMmU2MmM3NTg0M2RkN2U3N2Q4YzRjYjUyZTBmMzcxZmJiMjliMzMyYzI1OWY4Y2I2M2MyZTYxOTUzMDFcIl19JztcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZ2V0QnVpbGRlcigndHRyeDp1c2R0JykuZnJvbSh0eEhleCk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGFzc2VydC5lcXVhbCh0eC5pZCwgVE9LRU5fVFhJRCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgICBjb25zdCByYXdEYXRhID0gdHhKc29uLnJhd19kYXRhO1xuICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJhd0RhdGEuY29udHJhY3QsIFRPS0VOX1RYX0NPTlRSQUNUXzIpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEhleCBhbmQgYmFzZTU4IGFyZSBhbHRlcm5hdGl2ZSBlbmNvZGluZ3Mgb2YgdGhlIHNhbWUgVFJPTiBhZGRyZXNzLCBzbyBldmVyeSBhY2NlcHRlZFxuICAgICAgLy8gZm9ybSBtdXN0IHByb2R1Y2UgaWRlbnRpY2FsIHRyYW5zYWN0aW9uIGRhdGEg4oCUIHRoaXMgaXMgdGhlIENPSU5TLTE1NzUgcmVncmVzc2lvbi5cbiAgICAgIGl0KCdhY2NlcHRzIGEgMHgtcHJlZml4ZWQgaGV4IHJlY2lwaWVudCBhbmQgZW5jb2RlcyB0aGUgc2FtZSBkYXRhIGFzIHRoZSBiYXNlNTggZm9ybScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGREYXRhID0gYXN5bmMgKHJlY2lwaWVudDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICAgIHR4QnVpbGRlci50b2tlblRyYW5zZmVyRGF0YShyZWNpcGllbnQsICcxMDAwMDAwMDAwJykuc2lnbih7IGtleTogUEFSVElDSVBBTlRTLmN1c3RvZGlhbi5wayB9KTtcbiAgICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICAgIHJldHVybiB0eC50b0pzb24oKS5yYXdfZGF0YS5jb250cmFjdFswXS5wYXJhbWV0ZXIudmFsdWUuZGF0YTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZnJvbUJhc2U1OCA9IGF3YWl0IGJ1aWxkRGF0YShUT0tFTl9UUkFOU0ZFUl9SRUNJUElFTlQpO1xuICAgICAgICAvLyAweC1mb3JtIG9mIFRPS0VOX1RSQU5TRkVSX1JFQ0lQSUVOVCAoVEdhaTV1SGdCY29MRVJyekRYTWVwcVpCOEV0N0Q4blY4SylcbiAgICAgICAgY29uc3QgZnJvbUhleCA9IGF3YWl0IGJ1aWxkRGF0YSgnMHg0ODg3OTc0ZjQyYTc4OWVmNmQ0ZGZjN2JhMjhiMTU4MzIxOTQzNGIzJyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChmcm9tSGV4LCBmcm9tQmFzZTU4KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYWNjZXB0cyBhIDQxLXByZWZpeGVkIGhleCByZWNpcGllbnQgYW5kIGVuY29kZXMgdGhlIHNhbWUgZGF0YSBhcyB0aGUgYmFzZTU4IGZvcm0nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkRGF0YSA9IGFzeW5jIChyZWNpcGllbnQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgICAgICB0eEJ1aWxkZXIudG9rZW5UcmFuc2ZlckRhdGEocmVjaXBpZW50LCAnMTAwMDAwMDAwMCcpLnNpZ24oeyBrZXk6IFBBUlRJQ0lQQU5UUy5jdXN0b2RpYW4ucGsgfSk7XG4gICAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgICByZXR1cm4gdHgudG9Kc29uKCkucmF3X2RhdGEuY29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlLmRhdGE7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGZyb21CYXNlNTggPSBhd2FpdCBidWlsZERhdGEoVE9LRU5fVFJBTlNGRVJfUkVDSVBJRU5UKTtcbiAgICAgICAgLy8gNDEtcHJlZml4ZWQgaGV4IG9mIFRPS0VOX1RSQU5TRkVSX1JFQ0lQSUVOVFxuICAgICAgICBjb25zdCBmcm9tSGV4ID0gYXdhaXQgYnVpbGREYXRhKCc0MTQ4ODc5NzRmNDJhNzg5ZWY2ZDRkZmM3YmEyOGIxNTgzMjE5NDM0YjMnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGZyb21IZXgsIGZyb21CYXNlNTgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzdGlsbCByZWplY3RzIGFkZHJlc3NlcyBpbiBuZWl0aGVyIGJhc2U1OCBub3IgaGV4IGZvcm0gd2l0aCB0aGUgc2FtZSBlcnJvcicsICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAgICgpID0+IHR4QnVpbGRlci50b2tlblRyYW5zZmVyRGF0YSgnbm90LWFuLWFkZHJlc3MnLCAnMTAwMDAwMDAwMCcpLFxuICAgICAgICAgIChlOiB1bmtub3duKSA9PlxuICAgICAgICAgICAgZSBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAgICAgICBlLm1lc3NhZ2UgPT09XG4gICAgICAgICAgICAgICdub3QtYW4tYWRkcmVzcyBpcyBub3QgYSB2YWxpZCBiYXNlNTggYWRkcmVzczogY29udGFpbnMgaW52YWxpZCBCYXNlNTggY2hhcmFjdGVyKHMpOiBcIm9cIiwgXCItXCIuJ1xuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"undelegateResourceTxBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/undelegateResourceTxBuilder.ts"],"names":[],"mappings":""}
|