@bitgo-beta/sdk-coin-trx 1.2.3-alpha.49 → 1.2.3-alpha.490
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/constants.d.ts +3 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +6 -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 +12 -75
- 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 +36 -1
- package/dist/src/lib/enum.d.ts.map +1 -1
- package/dist/src/lib/enum.js +40 -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 +220 -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.js +3 -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 +108 -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 +114 -21
- 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 +85 -4
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +444 -47
- 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 +59 -1
- package/dist/src/lib/wrappedBuilder.d.ts.map +1 -1
- package/dist/src/lib/wrappedBuilder.js +101 -4
- package/dist/src/trx.d.ts +93 -4
- package/dist/src/trx.d.ts.map +1 -1
- package/dist/src/trx.js +500 -147
- package/dist/src/trxToken.d.ts +2 -2
- package/dist/src/trxToken.d.ts.map +1 -1
- package/dist/src/trxToken.js +14 -6
- 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 +586 -0
- package/dist/test/resources.d.ts.map +1 -0
- package/dist/test/resources.js +746 -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/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 +55 -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 +50 -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 +639 -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 +141 -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 +573 -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 -134
- 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,339 @@
|
|
|
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
|
+
(0, node_test_1.describe)('Tron UnDelegateResource builder', function () {
|
|
12
|
+
const initTxBuilder = () => {
|
|
13
|
+
const builder = (0, builder_1.getBuilder)('ttrx').getUnDelegateResourceTxBuilder();
|
|
14
|
+
builder.source({ address: resources_1.PARTICIPANTS.from.address });
|
|
15
|
+
builder.setReceiverAddress({ address: resources_1.PARTICIPANTS.to.address });
|
|
16
|
+
builder.setBalance(resources_1.UNDELEGATION_BALANCE);
|
|
17
|
+
builder.setResource(resources_1.RESOURCE_ENERGY);
|
|
18
|
+
builder.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH });
|
|
19
|
+
return builder;
|
|
20
|
+
};
|
|
21
|
+
(0, node_test_1.describe)('should build successfully', () => {
|
|
22
|
+
(0, node_test_1.it)('a transaction with all correct inputs', async () => {
|
|
23
|
+
const timestamp = Date.now();
|
|
24
|
+
const txBuilder = initTxBuilder();
|
|
25
|
+
txBuilder.timestamp(timestamp);
|
|
26
|
+
txBuilder.expiration(timestamp + 40000);
|
|
27
|
+
const tx = (await txBuilder.build());
|
|
28
|
+
const txJson = tx.toJson();
|
|
29
|
+
assert_1.default.equal(tx.type, sdk_core_1.TransactionType.UnDelegateResource);
|
|
30
|
+
assert_1.default.equal(tx.inputs.length, 1);
|
|
31
|
+
assert_1.default.equal(tx.inputs[0].address, resources_1.PARTICIPANTS.from.address);
|
|
32
|
+
assert_1.default.equal(tx.outputs[0].address, resources_1.PARTICIPANTS.to.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.deepStrictEqual(txJson.raw_data.contract, resources_1.UNDELEGATE_RESOURCE_CONTRACT);
|
|
36
|
+
});
|
|
37
|
+
(0, node_test_1.it)('an unsigned transaction from a string and from a JSON', async () => {
|
|
38
|
+
const timestamp = Date.now();
|
|
39
|
+
const txBuilder = initTxBuilder();
|
|
40
|
+
txBuilder.timestamp(timestamp);
|
|
41
|
+
txBuilder.expiration(timestamp + 40000);
|
|
42
|
+
const tx = await txBuilder.build();
|
|
43
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
44
|
+
txBuilder2.sign({ key: resources_1.PARTICIPANTS.from.pk });
|
|
45
|
+
const tx2 = await txBuilder2.build();
|
|
46
|
+
const txBuilder3 = (0, builder_1.getBuilder)('ttrx').from(tx.toJson());
|
|
47
|
+
txBuilder3.sign({ key: resources_1.PARTICIPANTS.from.pk });
|
|
48
|
+
const tx3 = await txBuilder3.build();
|
|
49
|
+
assert_1.default.deepStrictEqual(tx2, tx3);
|
|
50
|
+
});
|
|
51
|
+
(0, node_test_1.it)('an unsigned transaction with extended duration', async () => {
|
|
52
|
+
const timestamp = Date.now();
|
|
53
|
+
const expiration = timestamp + resources_1.EXPIRATION;
|
|
54
|
+
const extension = 60000;
|
|
55
|
+
const txBuilder = initTxBuilder();
|
|
56
|
+
txBuilder.timestamp(timestamp);
|
|
57
|
+
txBuilder.expiration(expiration);
|
|
58
|
+
const tx = await txBuilder.build();
|
|
59
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
60
|
+
txBuilder2.extendValidTo(extension);
|
|
61
|
+
txBuilder2.sign({ key: resources_1.PARTICIPANTS.from.pk });
|
|
62
|
+
const tx2 = await txBuilder2.build();
|
|
63
|
+
assert_1.default.equal(tx2.inputs.length, 1);
|
|
64
|
+
assert_1.default.equal(tx2.inputs[0].address, resources_1.PARTICIPANTS.from.address);
|
|
65
|
+
assert_1.default.equal(tx2.inputs[0].value, '1000000');
|
|
66
|
+
assert_1.default.equal(tx2.outputs[0].value, '1000000');
|
|
67
|
+
assert_1.default.equal(tx2.outputs[0].address, resources_1.PARTICIPANTS.to.address);
|
|
68
|
+
const txJson = tx2.toJson();
|
|
69
|
+
assert_1.default.equal(txJson.raw_data.expiration, expiration + extension);
|
|
70
|
+
});
|
|
71
|
+
(0, node_test_1.it)('a transaction signed multiple times', async () => {
|
|
72
|
+
const timestamp = Date.now();
|
|
73
|
+
const txBuilder = initTxBuilder();
|
|
74
|
+
txBuilder.timestamp(timestamp);
|
|
75
|
+
txBuilder.expiration(timestamp + resources_1.EXPIRATION);
|
|
76
|
+
const tx = await txBuilder.build();
|
|
77
|
+
let txJson = tx.toJson();
|
|
78
|
+
let rawData = txJson.raw_data;
|
|
79
|
+
assert_1.default.deepStrictEqual(rawData.contract, resources_1.UNDELEGATE_RESOURCE_CONTRACT);
|
|
80
|
+
assert_1.default.equal(txJson.signature.length, 0);
|
|
81
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toJson());
|
|
82
|
+
txBuilder2.sign({ key: resources_1.PARTICIPANTS.custodian.pk });
|
|
83
|
+
const tx2 = await txBuilder2.build();
|
|
84
|
+
txJson = tx2.toJson();
|
|
85
|
+
rawData = txJson.raw_data;
|
|
86
|
+
assert_1.default.deepStrictEqual(rawData.contract, resources_1.UNDELEGATE_RESOURCE_CONTRACT);
|
|
87
|
+
assert_1.default.equal(txJson.signature.length, 1);
|
|
88
|
+
const txBuilder3 = (0, builder_1.getBuilder)('ttrx').from(tx2.toJson());
|
|
89
|
+
txBuilder3.sign({ key: resources_1.PARTICIPANTS.from.pk });
|
|
90
|
+
const tx3 = await txBuilder3.build();
|
|
91
|
+
txJson = tx3.toJson();
|
|
92
|
+
rawData = txJson.raw_data;
|
|
93
|
+
assert_1.default.deepStrictEqual(rawData.contract, resources_1.UNDELEGATE_RESOURCE_CONTRACT);
|
|
94
|
+
assert_1.default.equal(rawData.expiration, timestamp + resources_1.EXPIRATION);
|
|
95
|
+
assert_1.default.equal(rawData.timestamp, timestamp);
|
|
96
|
+
assert_1.default.equal(txJson.signature.length, 2);
|
|
97
|
+
assert_1.default.equal(tx3.inputs.length, 1);
|
|
98
|
+
assert_1.default.equal(tx3.inputs[0].address, resources_1.PARTICIPANTS.from.address);
|
|
99
|
+
assert_1.default.equal(tx3.inputs[0].value, '1000000');
|
|
100
|
+
assert_1.default.equal(tx3.outputs[0].value, '1000000');
|
|
101
|
+
assert_1.default.equal(tx3.outputs[0].address, resources_1.PARTICIPANTS.to.address);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
(0, node_test_1.describe)('should validate', () => {
|
|
105
|
+
(0, node_test_1.it)('a valid expiration', async () => {
|
|
106
|
+
const now = Date.now();
|
|
107
|
+
const expiration = now + resources_1.EXPIRATION;
|
|
108
|
+
const txBuilder = initTxBuilder();
|
|
109
|
+
txBuilder.timestamp(now);
|
|
110
|
+
txBuilder.expiration(expiration + 1000);
|
|
111
|
+
txBuilder.expiration(expiration);
|
|
112
|
+
const tx = await txBuilder.build();
|
|
113
|
+
const txJson = tx.toJson();
|
|
114
|
+
assert_1.default.equal(txJson.raw_data.expiration, expiration);
|
|
115
|
+
});
|
|
116
|
+
(0, node_test_1.it)('an expiration greater than one year', async () => {
|
|
117
|
+
const now = Date.now();
|
|
118
|
+
const txBuilder = initTxBuilder();
|
|
119
|
+
txBuilder.timestamp(now);
|
|
120
|
+
assert_1.default.throws(() => {
|
|
121
|
+
txBuilder.expiration(now + 31536000001);
|
|
122
|
+
}, (e) => e.message === 'Expiration must not be greater than one day');
|
|
123
|
+
});
|
|
124
|
+
(0, node_test_1.it)('an expiration less than the current date', async () => {
|
|
125
|
+
const now = Date.now();
|
|
126
|
+
const txBuilder = initTxBuilder();
|
|
127
|
+
txBuilder.timestamp(now - 2000);
|
|
128
|
+
assert_1.default.throws(() => {
|
|
129
|
+
txBuilder.expiration(now - 1000);
|
|
130
|
+
}, (e) => e.message === 'Expiration must be greater than current time');
|
|
131
|
+
});
|
|
132
|
+
(0, node_test_1.it)('an expiration less than the timestamp', 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 timestamp');
|
|
139
|
+
});
|
|
140
|
+
(0, node_test_1.it)('an expiration set after build', async () => {
|
|
141
|
+
const now = Date.now();
|
|
142
|
+
const expiration = now + resources_1.EXPIRATION;
|
|
143
|
+
const txBuilder = initTxBuilder();
|
|
144
|
+
await txBuilder.build();
|
|
145
|
+
assert_1.default.throws(() => {
|
|
146
|
+
txBuilder.expiration(expiration);
|
|
147
|
+
}, (e) => e.message === 'Expiration is already set, it can only be extended');
|
|
148
|
+
});
|
|
149
|
+
(0, node_test_1.it)('an expiration set after deserializing', async () => {
|
|
150
|
+
const now = Date.now();
|
|
151
|
+
const expiration = now + resources_1.EXPIRATION;
|
|
152
|
+
const txBuilder = initTxBuilder();
|
|
153
|
+
const tx = await txBuilder.build();
|
|
154
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
155
|
+
assert_1.default.throws(() => {
|
|
156
|
+
txBuilder2.expiration(expiration);
|
|
157
|
+
}, (e) => e.message === 'Expiration is already set, it can only be extended');
|
|
158
|
+
});
|
|
159
|
+
(0, node_test_1.it)('an extension without a set expiration', async () => {
|
|
160
|
+
const txBuilder = initTxBuilder();
|
|
161
|
+
assert_1.default.throws(() => {
|
|
162
|
+
txBuilder.extendValidTo(20000);
|
|
163
|
+
}, (e) => e.message === 'There is not expiration to extend');
|
|
164
|
+
});
|
|
165
|
+
(0, node_test_1.it)('a zero millisecond extension', async () => {
|
|
166
|
+
const txBuilder = initTxBuilder();
|
|
167
|
+
const expiration = Date.now() + resources_1.EXPIRATION;
|
|
168
|
+
txBuilder.expiration(expiration);
|
|
169
|
+
const tx = await txBuilder.build();
|
|
170
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
171
|
+
assert_1.default.throws(() => {
|
|
172
|
+
txBuilder2.extendValidTo(0);
|
|
173
|
+
}, (e) => e.message === 'Value cannot be below zero');
|
|
174
|
+
});
|
|
175
|
+
(0, node_test_1.it)('an extension greater than one year', async () => {
|
|
176
|
+
const txBuilder = initTxBuilder();
|
|
177
|
+
const expiration = Date.now() + resources_1.EXPIRATION;
|
|
178
|
+
txBuilder.expiration(expiration);
|
|
179
|
+
const tx = await txBuilder.build();
|
|
180
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
181
|
+
assert_1.default.throws(() => {
|
|
182
|
+
txBuilder2.extendValidTo(31536000001);
|
|
183
|
+
}, (e) => e.message === 'The expiration cannot be extended more than one year');
|
|
184
|
+
});
|
|
185
|
+
(0, node_test_1.it)('an extension after signing', async () => {
|
|
186
|
+
const txBuilder = initTxBuilder();
|
|
187
|
+
txBuilder.sign({ key: resources_1.PARTICIPANTS.from.pk });
|
|
188
|
+
const tx = await txBuilder.build();
|
|
189
|
+
const txBuilder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
190
|
+
assert_1.default.throws(() => {
|
|
191
|
+
txBuilder2.extendValidTo(20000);
|
|
192
|
+
}, (e) => e.message === 'Cannot extend a signed transaction');
|
|
193
|
+
});
|
|
194
|
+
(0, node_test_1.it)('valid resource: ENERGY', async () => {
|
|
195
|
+
const builder = (0, builder_1.getBuilder)('ttrx').getUnDelegateResourceTxBuilder();
|
|
196
|
+
builder
|
|
197
|
+
.source({ address: resources_1.PARTICIPANTS.from.address })
|
|
198
|
+
.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH })
|
|
199
|
+
.setBalance(resources_1.UNDELEGATION_BALANCE)
|
|
200
|
+
.setReceiverAddress({ address: resources_1.PARTICIPANTS.to.address });
|
|
201
|
+
builder.setResource('ENERGY');
|
|
202
|
+
assert_1.default.doesNotReject(() => {
|
|
203
|
+
return builder.build();
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
(0, node_test_1.it)('valid resource: BANDWIDTH', async () => {
|
|
207
|
+
const builder = (0, builder_1.getBuilder)('ttrx').getUnDelegateResourceTxBuilder();
|
|
208
|
+
builder
|
|
209
|
+
.source({ address: resources_1.PARTICIPANTS.from.address })
|
|
210
|
+
.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH })
|
|
211
|
+
.setBalance(resources_1.UNDELEGATION_BALANCE)
|
|
212
|
+
.setReceiverAddress({ address: resources_1.PARTICIPANTS.to.address });
|
|
213
|
+
builder.setResource('BANDWIDTH');
|
|
214
|
+
assert_1.default.doesNotReject(() => {
|
|
215
|
+
return builder.build();
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
(0, node_test_1.it)('invalid resource', async () => {
|
|
219
|
+
const builder = (0, builder_1.getBuilder)('ttrx').getUnDelegateResourceTxBuilder();
|
|
220
|
+
const invalidResource = 'INVALID';
|
|
221
|
+
builder
|
|
222
|
+
.source({ address: resources_1.PARTICIPANTS.custodian.address })
|
|
223
|
+
.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH })
|
|
224
|
+
.setBalance(resources_1.UNDELEGATION_BALANCE);
|
|
225
|
+
assert_1.default.throws(() => builder.setResource(invalidResource), `${invalidResource} is a not valid resource type.`);
|
|
226
|
+
});
|
|
227
|
+
(0, node_test_1.it)('transaction mandatory fields', async () => {
|
|
228
|
+
const txBuilder = (0, builder_1.getBuilder)('ttrx').getUnDelegateResourceTxBuilder();
|
|
229
|
+
await assert_1.default.rejects(txBuilder.build(), {
|
|
230
|
+
message: 'Missing parameter: balance',
|
|
231
|
+
});
|
|
232
|
+
txBuilder.setBalance('1000000');
|
|
233
|
+
await assert_1.default.rejects(txBuilder.build(), {
|
|
234
|
+
message: 'Missing parameter: source',
|
|
235
|
+
});
|
|
236
|
+
txBuilder.source({ address: resources_1.PARTICIPANTS.from.address });
|
|
237
|
+
await assert_1.default.rejects(txBuilder.build(), {
|
|
238
|
+
message: 'Missing parameter: resource',
|
|
239
|
+
});
|
|
240
|
+
txBuilder.setResource('ENERGY');
|
|
241
|
+
await assert_1.default.rejects(txBuilder.build(), {
|
|
242
|
+
message: 'Missing parameter: receiver address',
|
|
243
|
+
});
|
|
244
|
+
txBuilder.setReceiverAddress({ address: resources_1.PARTICIPANTS.to.address });
|
|
245
|
+
await assert_1.default.rejects(txBuilder.build(), {
|
|
246
|
+
message: 'Missing block reference information',
|
|
247
|
+
});
|
|
248
|
+
txBuilder.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH });
|
|
249
|
+
assert_1.default.doesNotReject(() => {
|
|
250
|
+
return txBuilder.build();
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
(0, node_test_1.describe)('BANDWIDTH serialization (protobuf3 compatibility)', () => {
|
|
255
|
+
(0, node_test_1.it)('should round-trip BANDWIDTH transactions correctly', async () => {
|
|
256
|
+
// Build a BANDWIDTH transaction
|
|
257
|
+
const builder = (0, builder_1.getBuilder)('ttrx').getUnDelegateResourceTxBuilder();
|
|
258
|
+
builder
|
|
259
|
+
.source({ address: resources_1.PARTICIPANTS.from.address })
|
|
260
|
+
.setReceiverAddress({ address: resources_1.PARTICIPANTS.to.address })
|
|
261
|
+
.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH })
|
|
262
|
+
.setBalance(resources_1.UNDELEGATION_BALANCE)
|
|
263
|
+
.setResource(resources_1.RESOURCE_BANDWIDTH);
|
|
264
|
+
const tx = await builder.build();
|
|
265
|
+
const txJson = tx.toJson();
|
|
266
|
+
// Verify the built transaction has BANDWIDTH resource
|
|
267
|
+
assert_1.default.equal(txJson.raw_data.contract[0].parameter.value.resource, resources_1.RESOURCE_BANDWIDTH, 'Built transaction should have BANDWIDTH resource');
|
|
268
|
+
// Round-trip: deserialize from broadcast format and rebuild
|
|
269
|
+
const builder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
270
|
+
const tx2 = await builder2.build();
|
|
271
|
+
const tx2Json = tx2.toJson();
|
|
272
|
+
// Verify resource is preserved after round-trip
|
|
273
|
+
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');
|
|
274
|
+
// Round-trip: deserialize from JSON and rebuild
|
|
275
|
+
const builder3 = (0, builder_1.getBuilder)('ttrx').from(tx.toJson());
|
|
276
|
+
const tx3 = await builder3.build();
|
|
277
|
+
const tx3Json = tx3.toJson();
|
|
278
|
+
// Verify resource is preserved after round-trip from JSON
|
|
279
|
+
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');
|
|
280
|
+
});
|
|
281
|
+
(0, node_test_1.it)('should round-trip ENERGY transactions correctly', async () => {
|
|
282
|
+
// Build an ENERGY transaction
|
|
283
|
+
const builder = (0, builder_1.getBuilder)('ttrx').getUnDelegateResourceTxBuilder();
|
|
284
|
+
builder
|
|
285
|
+
.source({ address: resources_1.PARTICIPANTS.from.address })
|
|
286
|
+
.setReceiverAddress({ address: resources_1.PARTICIPANTS.to.address })
|
|
287
|
+
.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH })
|
|
288
|
+
.setBalance(resources_1.UNDELEGATION_BALANCE)
|
|
289
|
+
.setResource(resources_1.RESOURCE_ENERGY);
|
|
290
|
+
const tx = await builder.build();
|
|
291
|
+
const txJson = tx.toJson();
|
|
292
|
+
// Verify the built transaction has ENERGY resource
|
|
293
|
+
assert_1.default.equal(txJson.raw_data.contract[0].parameter.value.resource, resources_1.RESOURCE_ENERGY, 'Built transaction should have ENERGY resource');
|
|
294
|
+
// Round-trip: deserialize from broadcast format and rebuild
|
|
295
|
+
const builder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
296
|
+
const tx2 = await builder2.build();
|
|
297
|
+
const tx2Json = tx2.toJson();
|
|
298
|
+
// Verify resource is preserved after round-trip
|
|
299
|
+
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');
|
|
300
|
+
});
|
|
301
|
+
(0, node_test_1.it)('should produce consistent transaction IDs for BANDWIDTH transactions', async () => {
|
|
302
|
+
// Build a BANDWIDTH transaction
|
|
303
|
+
const builder = (0, builder_1.getBuilder)('ttrx').getUnDelegateResourceTxBuilder();
|
|
304
|
+
builder
|
|
305
|
+
.source({ address: resources_1.PARTICIPANTS.from.address })
|
|
306
|
+
.setReceiverAddress({ address: resources_1.PARTICIPANTS.to.address })
|
|
307
|
+
.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH })
|
|
308
|
+
.setBalance(resources_1.UNDELEGATION_BALANCE)
|
|
309
|
+
.setResource(resources_1.RESOURCE_BANDWIDTH);
|
|
310
|
+
const tx = await builder.build();
|
|
311
|
+
const originalTxId = tx.toJson().txID;
|
|
312
|
+
// Round-trip and verify txID is consistent
|
|
313
|
+
const builder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
314
|
+
const tx2 = await builder2.build();
|
|
315
|
+
const roundTripTxId = tx2.toJson().txID;
|
|
316
|
+
assert_1.default.equal(originalTxId, roundTripTxId, 'Transaction ID should be consistent after round-trip');
|
|
317
|
+
});
|
|
318
|
+
(0, node_test_1.it)('should allow signing BANDWIDTH transactions after round-trip', async () => {
|
|
319
|
+
// Build a BANDWIDTH transaction
|
|
320
|
+
const builder = (0, builder_1.getBuilder)('ttrx').getUnDelegateResourceTxBuilder();
|
|
321
|
+
builder
|
|
322
|
+
.source({ address: resources_1.PARTICIPANTS.from.address })
|
|
323
|
+
.setReceiverAddress({ address: resources_1.PARTICIPANTS.to.address })
|
|
324
|
+
.block({ number: resources_1.BLOCK_NUMBER, hash: resources_1.BLOCK_HASH })
|
|
325
|
+
.setBalance(resources_1.UNDELEGATION_BALANCE)
|
|
326
|
+
.setResource(resources_1.RESOURCE_BANDWIDTH);
|
|
327
|
+
const tx = await builder.build();
|
|
328
|
+
// Round-trip and sign
|
|
329
|
+
const builder2 = (0, builder_1.getBuilder)('ttrx').from(tx.toBroadcastFormat());
|
|
330
|
+
builder2.sign({ key: resources_1.PARTICIPANTS.from.pk });
|
|
331
|
+
const signedTx = await builder2.build();
|
|
332
|
+
// Verify signature was added
|
|
333
|
+
assert_1.default.equal(signedTx.toJson().signature.length, 1, 'Transaction should have one signature');
|
|
334
|
+
// Verify resource is still BANDWIDTH
|
|
335
|
+
assert_1.default.equal(signedTx.toJson().raw_data.contract[0].parameter.value.resource, resources_1.RESOURCE_BANDWIDTH, 'Resource should still be BANDWIDTH after signing');
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5kZWxlZ2F0ZVJlc291cmNlVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci91bmRlbGVnYXRlUmVzb3VyY2VUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsbURBQXVEO0FBQ3ZELHlDQUF5QztBQUV6QywrQ0FTeUI7QUFDekIsc0RBQXNEO0FBR3RELElBQUEsb0JBQVEsRUFBQyxpQ0FBaUMsRUFBRTtJQUMxQyxNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUU7UUFDekIsTUFBTSxPQUFPLEdBQUksSUFBQSxvQkFBVSxFQUFDLE1BQU0sQ0FBb0IsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQ3hGLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsd0JBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN2RCxPQUFPLENBQUMsa0JBQWtCLENBQUMsRUFBRSxPQUFPLEVBQUUsd0JBQVksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNqRSxPQUFPLENBQUMsVUFBVSxDQUFDLGdDQUFvQixDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLFdBQVcsQ0FBQywyQkFBZSxDQUFDLENBQUM7UUFDckMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSx3QkFBWSxFQUFFLElBQUksRUFBRSxzQkFBVSxFQUFFLENBQUMsQ0FBQztRQUUxRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDLENBQUM7SUFFRixJQUFBLG9CQUFRLEVBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ3pDLElBQUEsY0FBRSxFQUFDLHVDQUF1QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3JELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUM3QixNQUFN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O2lCQUNqRCxVQUFVLENBQUMsZ0NBQW9CLENBQUM7aUJBQ2hDLFdBQVcsQ0FBQyw4QkFBa0IsQ0FBQyxDQUFDO1lBRW5DLE1BQU0sRUFBRSxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRWpDLHNCQUFzQjtZQUN0QixNQUFNLFFBQVEsR0FBRyxJQUFBLG9CQUFVLEVBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7WUFDakUsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSx3QkFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sUUFBUSxHQUFHLE1BQU0sUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRXhDLDZCQUE2QjtZQUM3QixnQkFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsdUNBQXVDLENBQUMsQ0FBQztZQUU3RixxQ0FBcUM7WUFDckMsZ0JBQU0sQ0FBQyxLQUFLLENBQ1YsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQy9ELDhCQUFrQixFQUNsQixrREFBa0QsQ0FDbkQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGRlc2NyaWJlLCBpdCB9IGZyb20gJ25vZGU6dGVzdCc7XG5cbmltcG9ydCB7XG4gIFBBUlRJQ0lQQU5UUyxcbiAgQkxPQ0tfSEFTSCxcbiAgQkxPQ0tfTlVNQkVSLFxuICBFWFBJUkFUSU9OLFxuICBSRVNPVVJDRV9FTkVSR1ksXG4gIFJFU09VUkNFX0JBTkRXSURUSCxcbiAgVU5ERUxFR0FUSU9OX0JBTEFOQ0UsXG4gIFVOREVMRUdBVEVfUkVTT1VSQ0VfQ09OVFJBQ1QsXG59IGZyb20gJy4uLy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9idWlsZGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBXcmFwcGVkQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5cbmRlc2NyaWJlKCdUcm9uIFVuRGVsZWdhdGVSZXNvdXJjZSBidWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBpbml0VHhCdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSAoZ2V0QnVpbGRlcigndHRyeCcpIGFzIFdyYXBwZWRCdWlsZGVyKS5nZXRVbkRlbGVnYXRlUmVzb3VyY2VUeEJ1aWxkZXIoKTtcbiAgICBidWlsZGVyLnNvdXJjZSh7IGFkZHJlc3M6IFBBUlRJQ0lQQU5UUy5mcm9tLmFkZHJlc3MgfSk7XG4gICAgYnVpbGRlci5zZXRSZWNlaXZlckFkZHJlc3MoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMudG8uYWRkcmVzcyB9KTtcbiAgICBidWlsZGVyLnNldEJhbGFuY2UoVU5ERUxFR0FUSU9OX0JBTEFOQ0UpO1xuICAgIGJ1aWxkZXIuc2V0UmVzb3VyY2UoUkVTT1VSQ0VfRU5FUkdZKTtcbiAgICBidWlsZGVyLmJsb2NrKHsgbnVtYmVyOiBCTE9DS19OVU1CRVIsIGhhc2g6IEJMT0NLX0hBU0ggfSk7XG5cbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICBkZXNjcmliZSgnc2hvdWxkIGJ1aWxkIHN1Y2Nlc3NmdWxseScsICgpID0+IHtcbiAgICBpdCgnYSB0cmFuc2FjdGlvbiB3aXRoIGFsbCBjb3JyZWN0IGlucHV0cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKHRpbWVzdGFtcCk7XG5cbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKHRpbWVzdGFtcCArIDQwMDAwKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlVuRGVsZWdhdGVSZXNvdXJjZSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHguaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwodHguaW5wdXRzWzBdLmFkZHJlc3MsIFBBUlRJQ0lQQU5UUy5mcm9tLmFkZHJlc3MpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4Lm91dHB1dHNbMF0uYWRkcmVzcywgUEFSVElDSVBBTlRTLnRvLmFkZHJlc3MpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LmlucHV0c1swXS52YWx1ZSwgJzEwMDAwMDAnKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5vdXRwdXRzWzBdLnZhbHVlLCAnMTAwMDAwMCcpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh0eEpzb24ucmF3X2RhdGEuY29udHJhY3QsIFVOREVMRUdBVEVfUkVTT1VSQ0VfQ09OVFJBQ1QpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIHVuc2lnbmVkIHRyYW5zYWN0aW9uIGZyb20gYSBzdHJpbmcgYW5kIGZyb20gYSBKU09OJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50aW1lc3RhbXAodGltZXN0YW1wKTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKHRpbWVzdGFtcCArIDQwMDAwKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIHR4QnVpbGRlcjIuc2lnbih7IGtleTogUEFSVElDSVBBTlRTLmZyb20ucGsgfSk7XG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjMgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0pzb24oKSk7XG4gICAgICB0eEJ1aWxkZXIzLnNpZ24oeyBrZXk6IFBBUlRJQ0lQQU5UUy5mcm9tLnBrIH0pO1xuICAgICAgY29uc3QgdHgzID0gYXdhaXQgdHhCdWlsZGVyMy5idWlsZCgpO1xuXG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHR4MiwgdHgzKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiB1bnNpZ25lZCB0cmFuc2FjdGlvbiB3aXRoIGV4dGVuZGVkIGR1cmF0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGV4cGlyYXRpb24gPSB0aW1lc3RhbXAgKyBFWFBJUkFUSU9OO1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gNjAwMDA7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKHRpbWVzdGFtcCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIHR4QnVpbGRlcjIuZXh0ZW5kVmFsaWRUbyhleHRlbnNpb24pO1xuICAgICAgdHhCdWlsZGVyMi5zaWduKHsga2V5OiBQQVJUSUNJUEFOVFMuZnJvbS5wayB9KTtcbiAgICAgIGNvbnN0IHR4MiA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKHR4Mi5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eDIuaW5wdXRzWzBdLmFkZHJlc3MsIFBBUlRJQ0lQQU5UUy5mcm9tLmFkZHJlc3MpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4Mi5pbnB1dHNbMF0udmFsdWUsICcxMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgyLm91dHB1dHNbMF0udmFsdWUsICcxMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgyLm91dHB1dHNbMF0uYWRkcmVzcywgUEFSVElDSVBBTlRTLnRvLmFkZHJlc3MpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgyLnRvSnNvbigpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4SnNvbi5yYXdfZGF0YS5leHBpcmF0aW9uLCBleHBpcmF0aW9uICsgZXh0ZW5zaW9uKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHRyYW5zYWN0aW9uIHNpZ25lZCBtdWx0aXBsZSB0aW1lcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKHRpbWVzdGFtcCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbih0aW1lc3RhbXAgKyBFWFBJUkFUSU9OKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBsZXQgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBsZXQgcmF3RGF0YSA9IHR4SnNvbi5yYXdfZGF0YTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmF3RGF0YS5jb250cmFjdCwgVU5ERUxFR0FURV9SRVNPVVJDRV9DT05UUkFDVCk7XG4gICAgICBhc3NlcnQuZXF1YWwodHhKc29uLnNpZ25hdHVyZS5sZW5ndGgsIDApO1xuICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGdldEJ1aWxkZXIoJ3R0cngnKS5mcm9tKHR4LnRvSnNvbigpKTtcbiAgICAgIHR4QnVpbGRlcjIuc2lnbih7IGtleTogUEFSVElDSVBBTlRTLmN1c3RvZGlhbi5wayB9KTtcbiAgICAgIGNvbnN0IHR4MiA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcbiAgICAgIHR4SnNvbiA9IHR4Mi50b0pzb24oKTtcbiAgICAgIHJhd0RhdGEgPSB0eEpzb24ucmF3X2RhdGE7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJhd0RhdGEuY29udHJhY3QsIFVOREVMRUdBVEVfUkVTT1VSQ0VfQ09OVFJBQ1QpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4SnNvbi5zaWduYXR1cmUubGVuZ3RoLCAxKTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyMyA9IGdldEJ1aWxkZXIoJ3R0cngnKS5mcm9tKHR4Mi50b0pzb24oKSk7XG4gICAgICB0eEJ1aWxkZXIzLnNpZ24oeyBrZXk6IFBBUlRJQ0lQQU5UUy5mcm9tLnBrIH0pO1xuICAgICAgY29uc3QgdHgzID0gYXdhaXQgdHhCdWlsZGVyMy5idWlsZCgpO1xuXG4gICAgICB0eEpzb24gPSB0eDMudG9Kc29uKCk7XG4gICAgICByYXdEYXRhID0gdHhKc29uLnJhd19kYXRhO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyYXdEYXRhLmNvbnRyYWN0LCBVTkRFTEVHQVRFX1JFU09VUkNFX0NPTlRSQUNUKTtcbiAgICAgIGFzc2VydC5lcXVhbChyYXdEYXRhLmV4cGlyYXRpb24sIHRpbWVzdGFtcCArIEVYUElSQVRJT04pO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJhd0RhdGEudGltZXN0YW1wLCB0aW1lc3RhbXApO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4SnNvbi5zaWduYXR1cmUubGVuZ3RoLCAyKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKHR4My5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eDMuaW5wdXRzWzBdLmFkZHJlc3MsIFBBUlRJQ0lQQU5UUy5mcm9tLmFkZHJlc3MpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4My5pbnB1dHNbMF0udmFsdWUsICcxMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgzLm91dHB1dHNbMF0udmFsdWUsICcxMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgzLm91dHB1dHNbMF0uYWRkcmVzcywgUEFSVElDSVBBTlRTLnRvLmFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIHZhbGlkYXRlJywgKCkgPT4ge1xuICAgIGl0KCdhIHZhbGlkIGV4cGlyYXRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IG5vdyArIEVYUElSQVRJT047XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKG5vdyk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uICsgMTAwMCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eEpzb24ucmF3X2RhdGEuZXhwaXJhdGlvbiwgZXhwaXJhdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gZXhwaXJhdGlvbiBncmVhdGVyIHRoYW4gb25lIHllYXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnRpbWVzdGFtcChub3cpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKG5vdyArIDMxNTM2MDAwMDAxKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnRXhwaXJhdGlvbiBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gb25lIGRheSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gZXhwaXJhdGlvbiBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgZGF0ZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKG5vdyAtIDIwMDApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKG5vdyAtIDEwMDApO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdFeHBpcmF0aW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIGN1cnJlbnQgdGltZSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gZXhwaXJhdGlvbiBsZXNzIHRoYW4gdGhlIHRpbWVzdGFtcCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKG5vdyArIDIwMDApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKG5vdyArIDEwMDApO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdFeHBpcmF0aW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRpbWVzdGFtcCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gZXhwaXJhdGlvbiBzZXQgYWZ0ZXIgYnVpbGQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IG5vdyArIEVYUElSQVRJT047XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnRXhwaXJhdGlvbiBpcyBhbHJlYWR5IHNldCwgaXQgY2FuIG9ubHkgYmUgZXh0ZW5kZWQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIGV4cGlyYXRpb24gc2V0IGFmdGVyIGRlc2VyaWFsaXppbmcnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IG5vdyArIEVYUElSQVRJT047XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGdldEJ1aWxkZXIoJ3R0cngnKS5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlcjIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnRXhwaXJhdGlvbiBpcyBhbHJlYWR5IHNldCwgaXQgY2FuIG9ubHkgYmUgZXh0ZW5kZWQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIGV4dGVuc2lvbiB3aXRob3V0IGEgc2V0IGV4cGlyYXRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmV4dGVuZFZhbGlkVG8oMjAwMDApO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdUaGVyZSBpcyBub3QgZXhwaXJhdGlvbiB0byBleHRlbmQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgemVybyBtaWxsaXNlY29uZCBleHRlbnNpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICBjb25zdCBleHBpcmF0aW9uID0gRGF0ZS5ub3coKSArIEVYUElSQVRJT047XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIyLmV4dGVuZFZhbGlkVG8oMCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ1ZhbHVlIGNhbm5vdCBiZSBiZWxvdyB6ZXJvJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiBleHRlbnNpb24gZ3JlYXRlciB0aGFuIG9uZSB5ZWFyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IERhdGUubm93KCkgKyBFWFBJUkFUSU9OO1xuICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb24oZXhwaXJhdGlvbik7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZ2V0QnVpbGRlcigndHRyeCcpLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyMi5leHRlbmRWYWxpZFRvKDMxNTM2MDAwMDAxKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnVGhlIGV4cGlyYXRpb24gY2Fubm90IGJlIGV4dGVuZGVkIG1vcmUgdGhhbiBvbmUgeWVhcidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gZXh0ZW5zaW9uIGFmdGVyIHNpZ25pbmcnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogUEFSVElDSVBBTlRTLmZyb20ucGsgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZ2V0QnVpbGRlcigndHRyeCcpLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyMi5leHRlbmRWYWxpZFRvKDIwMDAwKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnQ2Fubm90IGV4dGVuZCBhIHNpZ25lZCB0cmFuc2FjdGlvbidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWQgcmVzb3VyY2U6IEVORVJHWScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSAoZ2V0QnVpbGRlcigndHRyeCcpIGFzIFdyYXBwZWRCdWlsZGVyKS5nZXRVbkRlbGVnYXRlUmVzb3VyY2VUeEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLnNvdXJjZSh7IGFkZHJlc3M6IFBBUlRJQ0lQQU5UUy5mcm9tLmFkZHJlc3MgfSlcbiAgICAgICAgLmJsb2NrKHsgbnVtYmVyOiBCTE9DS19OVU1CRVIsIGhhc2g6IEJMT0NLX0hBU0ggfSlcbiAgICAgICAgLnNldEJhbGFuY2UoVU5ERUxFR0FUSU9OX0JBTEFOQ0UpXG4gICAgICAgIC5zZXRSZWNlaXZlckFkZHJlc3MoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMudG8uYWRkcmVzcyB9KTtcbiAgICAgIGJ1aWxkZXIuc2V0UmVzb3VyY2UoJ0VORVJHWScpO1xuICAgICAgYXNzZXJ0LmRvZXNOb3RSZWplY3QoKCkgPT4ge1xuICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWQgcmVzb3VyY2U6IEJBTkRXSURUSCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSAoZ2V0QnVpbGRlcigndHRyeCcpIGFzIFdyYXBwZWRCdWlsZGVyKS5nZXRVbkRlbGVnYXRlUmVzb3VyY2VUeEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLnNvdXJjZSh7IGFkZHJlc3M6IFBBUlRJQ0lQQU5UUy5mcm9tLmFkZHJlc3MgfSlcbiAgICAgICAgLmJsb2NrKHsgbnVtYmVyOiBCTE9DS19OVU1CRVIsIGhhc2g6IEJMT0NLX0hBU0ggfSlcbiAgICAgICAgLnNldEJhbGFuY2UoVU5ERUxFR0FUSU9OX0JBTEFOQ0UpXG4gICAgICAgIC5zZXRSZWNlaXZlckFkZHJlc3MoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMudG8uYWRkcmVzcyB9KTtcbiAgICAgIGJ1aWxkZXIuc2V0UmVzb3VyY2UoJ0JBTkRXSURUSCcpO1xuICAgICAgYXNzZXJ0LmRvZXNOb3RSZWplY3QoKCkgPT4ge1xuICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW52YWxpZCByZXNvdXJjZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSAoZ2V0QnVpbGRlcigndHRyeCcpIGFzIFdyYXBwZWRCdWlsZGVyKS5nZXRVbkRlbGVnYXRlUmVzb3VyY2VUeEJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IGludmFsaWRSZXNvdXJjZSA9ICdJTlZBTElEJztcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLnNvdXJjZSh7IGFkZHJlc3M6IFBBUlRJQ0lQQU5UUy5jdXN0b2RpYW4uYWRkcmVzcyB9KVxuICAgICAgICAuYmxvY2soeyBudW1iZXI6IEJMT0NLX05VTUJFUiwgaGFzaDogQkxPQ0tfSEFTSCB9KVxuICAgICAgICAuc2V0QmFsYW5jZShVTkRFTEVHQVRJT05fQkFMQU5DRSk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5zZXRSZXNvdXJjZShpbnZhbGlkUmVzb3VyY2UpLCBgJHtpbnZhbGlkUmVzb3VyY2V9IGlzIGEgbm90IHZhbGlkIHJlc291cmNlIHR5cGUuYCk7XG4gICAgfSk7XG5cbiAgICBpdCgndHJhbnNhY3Rpb24gbWFuZGF0b3J5IGZpZWxkcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IChnZXRCdWlsZGVyKCd0dHJ4JykgYXMgV3JhcHBlZEJ1aWxkZXIpLmdldFVuRGVsZWdhdGVSZXNvdXJjZVR4QnVpbGRlcigpO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyh0eEJ1aWxkZXIuYnVpbGQoKSwge1xuICAgICAgICBtZXNzYWdlOiAnTWlzc2luZyBwYXJhbWV0ZXI6IGJhbGFuY2UnLFxuICAgICAgfSk7XG5cbiAgICAgIHR4QnVpbGRlci5zZXRCYWxhbmNlKCcxMDAwMDAwJyk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyh0eEJ1aWxkZXIuYnVpbGQoKSwge1xuICAgICAgICBtZXNzYWdlOiAnTWlzc2luZyBwYXJhbWV0ZXI6IHNvdXJjZScsXG4gICAgICB9KTtcblxuICAgICAgdHhCdWlsZGVyLnNvdXJjZSh7IGFkZHJlc3M6IFBBUlRJQ0lQQU5UUy5mcm9tLmFkZHJlc3MgfSk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyh0eEJ1aWxkZXIuYnVpbGQoKSwge1xuICAgICAgICBtZXNzYWdlOiAnTWlzc2luZyBwYXJhbWV0ZXI6IHJlc291cmNlJyxcbiAgICAgIH0pO1xuXG4gICAgICB0eEJ1aWxkZXIuc2V0UmVzb3VyY2UoJ0VORVJHWScpO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHModHhCdWlsZGVyLmJ1aWxkKCksIHtcbiAgICAgICAgbWVzc2FnZTogJ01pc3NpbmcgcGFyYW1ldGVyOiByZWNlaXZlciBhZGRyZXNzJyxcbiAgICAgIH0pO1xuXG4gICAgICB0eEJ1aWxkZXIuc2V0UmVjZWl2ZXJBZGRyZXNzKHsgYWRkcmVzczogUEFSVElDSVBBTlRTLnRvLmFkZHJlc3MgfSk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyh0eEJ1aWxkZXIuYnVpbGQoKSwge1xuICAgICAgICBtZXNzYWdlOiAnTWlzc2luZyBibG9jayByZWZlcmVuY2UgaW5mb3JtYXRpb24nLFxuICAgICAgfSk7XG5cbiAgICAgIHR4QnVpbGRlci5ibG9jayh7IG51bWJlcjogQkxPQ0tfTlVNQkVSLCBoYXNoOiBCTE9DS19IQVNIIH0pO1xuICAgICAgYXNzZXJ0LmRvZXNOb3RSZWplY3QoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0JBTkRXSURUSCBzZXJpYWxpemF0aW9uIChwcm90b2J1ZjMgY29tcGF0aWJpbGl0eSknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByb3VuZC10cmlwIEJBTkRXSURUSCB0cmFuc2FjdGlvbnMgY29ycmVjdGx5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gQnVpbGQgYSBCQU5EV0lEVEggdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSAoZ2V0QnVpbGRlcigndHRyeCcpIGFzIFdyYXBwZWRCdWlsZGVyKS5nZXRVbkRlbGVnYXRlUmVzb3VyY2VUeEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLnNvdXJjZSh7IGFkZHJlc3M6IFBBUlRJQ0lQQU5UUy5mcm9tLmFkZHJlc3MgfSlcbiAgICAgICAgLnNldFJlY2VpdmVyQWRkcmVzcyh7IGFkZHJlc3M6IFBBUlRJQ0lQQU5UUy50by5hZGRyZXNzIH0pXG4gICAgICAgIC5ibG9jayh7IG51bWJlcjogQkxPQ0tfTlVNQkVSLCBoYXNoOiBCTE9DS19IQVNIIH0pXG4gICAgICAgIC5zZXRCYWxhbmNlKFVOREVMRUdBVElPTl9CQUxBTkNFKVxuICAgICAgICAuc2V0UmVzb3VyY2UoUkVTT1VSQ0VfQkFORFdJRFRIKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgLy8gVmVyaWZ5IHRoZSBidWlsdCB0cmFuc2FjdGlvbiBoYXMgQkFORFdJRFRIIHJlc291cmNlXG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIHR4SnNvbi5yYXdfZGF0YS5jb250cmFjdFswXS5wYXJhbWV0ZXIudmFsdWUucmVzb3VyY2UsXG4gICAgICAgIFJFU09VUkNFX0JBTkRXSURUSCxcbiAgICAgICAgJ0J1aWx0IHRyYW5zYWN0aW9uIHNob3VsZCBoYXZlIEJBTkRXSURUSCByZXNvdXJjZSdcbiAgICAgICk7XG5cbiAgICAgIC8vIFJvdW5kLXRyaXA6IGRlc2VyaWFsaXplIGZyb20gYnJvYWRjYXN0IGZvcm1hdCBhbmQgcmVidWlsZFxuICAgICAgY29uc3QgYnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIGNvbnN0IHR4MiA9IGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eDJKc29uID0gdHgyLnRvSnNvbigpO1xuXG4gICAgICAvLyBWZXJpZnkgcmVzb3VyY2UgaXMgcHJlc2VydmVkIGFmdGVyIHJvdW5kLXRyaXBcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgdHgySnNvbi5yYXdfZGF0YS5jb250cmFjdFswXS5wYXJhbWV0ZXIudmFsdWUucmVzb3VyY2UsXG4gICAgICAgIFJFU09VUkNFX0JBTkRXSURUSCxcbiAgICAgICAgJ1Jlc291cmNlIHNob3VsZCBiZSBCQU5EV0lEVEggYWZ0ZXIgcm91bmQtdHJpcCBmcm9tIGJyb2FkY2FzdCBmb3JtYXQnXG4gICAgICApO1xuXG4gICAgICAvLyBSb3VuZC10cmlwOiBkZXNlcmlhbGl6ZSBmcm9tIEpTT04gYW5kIHJlYnVpbGRcbiAgICAgIGNvbnN0IGJ1aWxkZXIzID0gZ2V0QnVpbGRlcigndHRyeCcpLmZyb20odHgudG9Kc29uKCkpO1xuICAgICAgY29uc3QgdHgzID0gYXdhaXQgYnVpbGRlcjMuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4M0pzb24gPSB0eDMudG9Kc29uKCk7XG5cbiAgICAgIC8vIFZlcmlmeSByZXNvdXJjZSBpcyBwcmVzZXJ2ZWQgYWZ0ZXIgcm91bmQtdHJpcCBmcm9tIEpTT05cbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgdHgzSnNvbi5yYXdfZGF0YS5jb250cmFjdFswXS5wYXJhbWV0ZXIudmFsdWUucmVzb3VyY2UsXG4gICAgICAgIFJFU09VUkNFX0JBTkRXSURUSCxcbiAgICAgICAgJ1Jlc291cmNlIHNob3VsZCBiZSBCQU5EV0lEVEggYWZ0ZXIgcm91bmQtdHJpcCBmcm9tIEpTT04nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByb3VuZC10cmlwIEVORVJHWSB0cmFuc2FjdGlvbnMgY29ycmVjdGx5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gQnVpbGQgYW4gRU5FUkdZIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCBidWlsZGVyID0gKGdldEJ1aWxkZXIoJ3R0cngnKSBhcyBXcmFwcGVkQnVpbGRlcikuZ2V0VW5EZWxlZ2F0ZVJlc291cmNlVHhCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zb3VyY2UoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMuZnJvbS5hZGRyZXNzIH0pXG4gICAgICAgIC5zZXRSZWNlaXZlckFkZHJlc3MoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMudG8uYWRkcmVzcyB9KVxuICAgICAgICAuYmxvY2soeyBudW1iZXI6IEJMT0NLX05VTUJFUiwgaGFzaDogQkxPQ0tfSEFTSCB9KVxuICAgICAgICAuc2V0QmFsYW5jZShVTkRFTEVHQVRJT05fQkFMQU5DRSlcbiAgICAgICAgLnNldFJlc291cmNlKFJFU09VUkNFX0VORVJHWSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgYnVpbHQgdHJhbnNhY3Rpb24gaGFzIEVORVJHWSByZXNvdXJjZVxuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICB0eEpzb24ucmF3X2RhdGEuY29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlLnJlc291cmNlLFxuICAgICAgICBSRVNPVVJDRV9FTkVSR1ksXG4gICAgICAgICdCdWlsdCB0cmFuc2FjdGlvbiBzaG91bGQgaGF2ZSBFTkVSR1kgcmVzb3VyY2UnXG4gICAgICApO1xuXG4gICAgICAvLyBSb3VuZC10cmlwOiBkZXNlcmlhbGl6ZSBmcm9tIGJyb2FkY2FzdCBmb3JtYXQgYW5kIHJlYnVpbGRcbiAgICAgIGNvbnN0IGJ1aWxkZXIyID0gZ2V0QnVpbGRlcigndHRyeCcpLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCBidWlsZGVyMi5idWlsZCgpO1xuICAgICAgY29uc3QgdHgySnNvbiA9IHR4Mi50b0pzb24oKTtcblxuICAgICAgLy8gVmVyaWZ5IHJlc291cmNlIGlzIHByZXNlcnZlZCBhZnRlciByb3VuZC10cmlwXG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIHR4Mkpzb24ucmF3X2RhdGEuY29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlLnJlc291cmNlLFxuICAgICAgICBSRVNPVVJDRV9FTkVSR1ksXG4gICAgICAgICdSZXNvdXJjZSBzaG91bGQgYmUgRU5FUkdZIGFmdGVyIHJvdW5kLXRyaXAgZnJvbSBicm9hZGNhc3QgZm9ybWF0J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBjb25zaXN0ZW50IHRyYW5zYWN0aW9uIElEcyBmb3IgQkFORFdJRFRIIHRyYW5zYWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEJ1aWxkIGEgQkFORFdJRFRIIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCBidWlsZGVyID0gKGdldEJ1aWxkZXIoJ3R0cngnKSBhcyBXcmFwcGVkQnVpbGRlcikuZ2V0VW5EZWxlZ2F0ZVJlc291cmNlVHhCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zb3VyY2UoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMuZnJvbS5hZGRyZXNzIH0pXG4gICAgICAgIC5zZXRSZWNlaXZlckFkZHJlc3MoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMudG8uYWRkcmVzcyB9KVxuICAgICAgICAuYmxvY2soeyBudW1iZXI6IEJMT0NLX05VTUJFUiwgaGFzaDogQkxPQ0tfSEFTSCB9KVxuICAgICAgICAuc2V0QmFsYW5jZShVTkRFTEVHQVRJT05fQkFMQU5DRSlcbiAgICAgICAgLnNldFJlc291cmNlKFJFU09VUkNFX0JBTkRXSURUSCk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qgb3JpZ2luYWxUeElkID0gdHgudG9Kc29uKCkudHhJRDtcblxuICAgICAgLy8gUm91bmQtdHJpcCBhbmQgdmVyaWZ5IHR4SUQgaXMgY29uc2lzdGVudFxuICAgICAgY29uc3QgYnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIGNvbnN0IHR4MiA9IGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByb3VuZFRyaXBUeElkID0gdHgyLnRvSnNvbigpLnR4SUQ7XG5cbiAgICAgIGFzc2VydC5lcXVhbChvcmlnaW5hbFR4SWQsIHJvdW5kVHJpcFR4SWQsICdUcmFuc2FjdGlvbiBJRCBzaG91bGQgYmUgY29uc2lzdGVudCBhZnRlciByb3VuZC10cmlwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IHNpZ25pbmcgQkFORFdJRFRIIHRyYW5zYWN0aW9ucyBhZnRlciByb3VuZC10cmlwJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gQnVpbGQgYSBCQU5EV0lEVEggdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSAoZ2V0QnVpbGRlcigndHRyeCcpIGFzIFdyYXBwZWRCdWlsZGVyKS5nZXRVbkRlbGVnYXRlUmVzb3VyY2VUeEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLnNvdXJjZSh7IGFkZHJlc3M6IFBBUlRJQ0lQQU5UUy5mcm9tLmFkZHJlc3MgfSlcbiAgICAgICAgLnNldFJlY2VpdmVyQWRkcmVzcyh7IGFkZHJlc3M6IFBBUlRJQ0lQQU5UUy50by5hZGRyZXNzIH0pXG4gICAgICAgIC5ibG9jayh7IG51bWJlcjogQkxPQ0tfTlVNQkVSLCBoYXNoOiBCTE9DS19IQVNIIH0pXG4gICAgICAgIC5zZXRCYWxhbmNlKFVOREVMRUdBVElPTl9CQUxBTkNFKVxuICAgICAgICAuc2V0UmVzb3VyY2UoUkVTT1VSQ0VfQkFORFdJRFRIKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIC8vIFJvdW5kLXRyaXAgYW5kIHNpZ25cbiAgICAgIGNvbnN0IGJ1aWxkZXIyID0gZ2V0QnVpbGRlcigndHRyeCcpLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBidWlsZGVyMi5zaWduKHsga2V5OiBQQVJUSUNJUEFOVFMuZnJvbS5wayB9KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgYnVpbGRlcjIuYnVpbGQoKTtcblxuICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZSB3YXMgYWRkZWRcbiAgICAgIGFzc2VydC5lcXVhbChzaWduZWRUeC50b0pzb24oKS5zaWduYXR1cmUubGVuZ3RoLCAxLCAnVHJhbnNhY3Rpb24gc2hvdWxkIGhhdmUgb25lIHNpZ25hdHVyZScpO1xuXG4gICAgICAvLyBWZXJpZnkgcmVzb3VyY2UgaXMgc3RpbGwgQkFORFdJRFRIXG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIHNpZ25lZFR4LnRvSnNvbigpLnJhd19kYXRhLmNvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZS5yZXNvdXJjZSxcbiAgICAgICAgUkVTT1VSQ0VfQkFORFdJRFRILFxuICAgICAgICAnUmVzb3VyY2Ugc2hvdWxkIHN0aWxsIGJlIEJBTkRXSURUSCBhZnRlciBzaWduaW5nJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unfreezeBalanceTxBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/unfreezeBalanceTxBuilder.ts"],"names":[],"mappings":""}
|