@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.
Files changed (133) hide show
  1. package/dist/resources/protobuf/Contract.proto +32 -0
  2. package/dist/resources/protobuf/tron.d.ts +1478 -214
  3. package/dist/resources/protobuf/tron.js +6312 -2600
  4. package/dist/resources/protobuf/tron.proto +6 -0
  5. package/dist/src/index.js +6 -2
  6. package/dist/src/lib/constants.d.ts +3 -0
  7. package/dist/src/lib/constants.d.ts.map +1 -0
  8. package/dist/src/lib/constants.js +6 -0
  9. package/dist/src/lib/contractCallBuilder.d.ts +1 -35
  10. package/dist/src/lib/contractCallBuilder.d.ts.map +1 -1
  11. package/dist/src/lib/contractCallBuilder.js +12 -75
  12. package/dist/src/lib/delegateResourceTxBuilder.d.ts +27 -0
  13. package/dist/src/lib/delegateResourceTxBuilder.d.ts.map +1 -0
  14. package/dist/src/lib/delegateResourceTxBuilder.js +104 -0
  15. package/dist/src/lib/enum.d.ts +36 -1
  16. package/dist/src/lib/enum.d.ts.map +1 -1
  17. package/dist/src/lib/enum.js +40 -4
  18. package/dist/src/lib/freezeBalanceTxBuilder.d.ts +71 -0
  19. package/dist/src/lib/freezeBalanceTxBuilder.d.ts.map +1 -0
  20. package/dist/src/lib/freezeBalanceTxBuilder.js +217 -0
  21. package/dist/src/lib/iface.d.ts +220 -2
  22. package/dist/src/lib/iface.d.ts.map +1 -1
  23. package/dist/src/lib/iface.js +1 -1
  24. package/dist/src/lib/index.js +23 -9
  25. package/dist/src/lib/keyPair.d.ts +0 -1
  26. package/dist/src/lib/keyPair.d.ts.map +1 -1
  27. package/dist/src/lib/keyPair.js +31 -18
  28. package/dist/src/lib/resourceManagementTxBuilder.d.ts +72 -0
  29. package/dist/src/lib/resourceManagementTxBuilder.d.ts.map +1 -0
  30. package/dist/src/lib/resourceManagementTxBuilder.js +150 -0
  31. package/dist/src/lib/tokenTransferBuilder.d.ts +1 -1
  32. package/dist/src/lib/tokenTransferBuilder.js +3 -3
  33. package/dist/src/lib/transaction.d.ts +3 -0
  34. package/dist/src/lib/transaction.d.ts.map +1 -1
  35. package/dist/src/lib/transaction.js +108 -6
  36. package/dist/src/lib/transactionBuilder.d.ts +53 -6
  37. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  38. package/dist/src/lib/transactionBuilder.js +114 -21
  39. package/dist/src/lib/undelegateResourceTxBuilder.d.ts +27 -0
  40. package/dist/src/lib/undelegateResourceTxBuilder.d.ts.map +1 -0
  41. package/dist/src/lib/undelegateResourceTxBuilder.js +104 -0
  42. package/dist/src/lib/unfreezeBalanceTxBuilder.d.ts +65 -0
  43. package/dist/src/lib/unfreezeBalanceTxBuilder.d.ts.map +1 -0
  44. package/dist/src/lib/unfreezeBalanceTxBuilder.js +210 -0
  45. package/dist/src/lib/utils.d.ts +85 -4
  46. package/dist/src/lib/utils.d.ts.map +1 -1
  47. package/dist/src/lib/utils.js +444 -47
  48. package/dist/src/lib/voteWitnessTxBuilder.d.ts +62 -0
  49. package/dist/src/lib/voteWitnessTxBuilder.d.ts.map +1 -0
  50. package/dist/src/lib/voteWitnessTxBuilder.js +219 -0
  51. package/dist/src/lib/withdrawBuilder.d.ts +49 -0
  52. package/dist/src/lib/withdrawBuilder.d.ts.map +1 -0
  53. package/dist/src/lib/withdrawBuilder.js +167 -0
  54. package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.d.ts +49 -0
  55. package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.d.ts.map +1 -0
  56. package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.js +167 -0
  57. package/dist/src/lib/wrappedBuilder.d.ts +59 -1
  58. package/dist/src/lib/wrappedBuilder.d.ts.map +1 -1
  59. package/dist/src/lib/wrappedBuilder.js +101 -4
  60. package/dist/src/trx.d.ts +93 -4
  61. package/dist/src/trx.d.ts.map +1 -1
  62. package/dist/src/trx.js +500 -147
  63. package/dist/src/trxToken.d.ts +2 -2
  64. package/dist/src/trxToken.d.ts.map +1 -1
  65. package/dist/src/trxToken.js +14 -6
  66. package/dist/test/fixtures.d.ts +40 -0
  67. package/dist/test/fixtures.d.ts.map +1 -0
  68. package/dist/test/fixtures.js +46 -0
  69. package/dist/test/resources.d.ts +586 -0
  70. package/dist/test/resources.d.ts.map +1 -0
  71. package/dist/test/resources.js +746 -0
  72. package/dist/test/unit/index.d.ts +2 -0
  73. package/dist/test/unit/index.d.ts.map +1 -0
  74. package/dist/test/unit/index.js +19 -0
  75. package/dist/test/unit/keyPair.d.ts +2 -0
  76. package/dist/test/unit/keyPair.d.ts.map +1 -0
  77. package/dist/test/unit/keyPair.js +163 -0
  78. package/dist/test/unit/transaction.d.ts +2 -0
  79. package/dist/test/unit/transaction.d.ts.map +1 -0
  80. package/dist/test/unit/transaction.js +38 -0
  81. package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts +2 -0
  82. package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts.map +1 -0
  83. package/dist/test/unit/transactionBuilder/contractCallBuilder.js +315 -0
  84. package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts +2 -0
  85. package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts.map +1 -0
  86. package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.js +339 -0
  87. package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts +2 -0
  88. package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts.map +1 -0
  89. package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.js +365 -0
  90. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  91. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  92. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +55 -0
  93. package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts +2 -0
  94. package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts.map +1 -0
  95. package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.js +339 -0
  96. package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts +2 -0
  97. package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts.map +1 -0
  98. package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.js +336 -0
  99. package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts +2 -0
  100. package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts.map +1 -0
  101. package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.js +277 -0
  102. package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts +2 -0
  103. package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts.map +1 -0
  104. package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.js +213 -0
  105. package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts +2 -0
  106. package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts.map +1 -0
  107. package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.js +213 -0
  108. package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts +2 -0
  109. package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts.map +1 -0
  110. package/dist/test/unit/transactionBuilder/wrappedBuilder.js +50 -0
  111. package/dist/test/unit/transactionBuilder.d.ts +2 -0
  112. package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
  113. package/dist/test/unit/transactionBuilder.js +178 -0
  114. package/dist/test/unit/trx.d.ts +2 -0
  115. package/dist/test/unit/trx.d.ts.map +1 -0
  116. package/dist/test/unit/trx.js +639 -0
  117. package/dist/test/unit/util.d.ts +2 -0
  118. package/dist/test/unit/util.d.ts.map +1 -0
  119. package/dist/test/unit/util.js +141 -0
  120. package/dist/test/unit/verifyTransaction.d.ts +2 -0
  121. package/dist/test/unit/verifyTransaction.d.ts.map +1 -0
  122. package/dist/test/unit/verifyTransaction.js +573 -0
  123. package/dist/tsconfig.tsbuildinfo +1 -0
  124. package/package.json +22 -16
  125. package/.eslintignore +0 -5
  126. package/.mocharc.yml +0 -8
  127. package/CHANGELOG.md +0 -134
  128. package/resources/README.md +0 -31
  129. package/resources/protobuf/Contract.proto +0 -256
  130. package/resources/protobuf/Discover.proto +0 -44
  131. package/resources/protobuf/tron.d.ts +0 -11205
  132. package/resources/protobuf/tron.js +0 -33480
  133. 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 DelegateResource builder', function () {
12
+ const initTxBuilder = () => {
13
+ const builder = (0, builder_1.getBuilder)('ttrx').getDelegateResourceTxBuilder();
14
+ builder.source({ address: resources_1.PARTICIPANTS.from.address });
15
+ builder.setReceiverAddress({ address: resources_1.PARTICIPANTS.to.address });
16
+ builder.setBalance(resources_1.DELEGATION_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.DelegateResource);
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.DELEGATE_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.DELEGATE_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.DELEGATE_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.DELEGATE_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 grater 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').getDelegateResourceTxBuilder();
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.DELEGATION_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').getDelegateResourceTxBuilder();
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.DELEGATION_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').getDelegateResourceTxBuilder();
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.DELEGATION_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').getDelegateResourceTxBuilder();
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').getDelegateResourceTxBuilder();
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.DELEGATION_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').getDelegateResourceTxBuilder();
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.DELEGATION_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').getDelegateResourceTxBuilder();
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.DELEGATION_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').getDelegateResourceTxBuilder();
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.DELEGATION_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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZWdhdGVSZXNvdXJjZVR4QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvZGVsZWdhdGVSZXNvdXJjZVR4QnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixtREFBdUQ7QUFDdkQseUNBQXlDO0FBRXpDLCtDQVN5QjtBQUN6QixzREFBc0Q7QUFHdEQsSUFBQSxvQkFBUSxFQUFDLCtCQUErQixFQUFFO0lBQ3hDLE1BQU0sYUFBYSxHQUFHLEdBQUcsRUFBRTtRQUN6QixNQUFNLE9BQU8sR0FBSSxJQUFBLG9CQUFVLEVBQUMsTUFBTSxDQUFvQixDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDdEYsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSx3QkFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSx3QkFBWSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sQ0FBQyxVQUFVLENBQUMsOEJBQWtCLENBQUMsQ0FBQztRQUN2QyxPQUFPLENBQUMsV0FBVyxDQUFDLDJCQUFlLENBQUMsQ0FBQztRQUNyQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLHdCQUFZLEVBQUUsSUFBSSxFQUFFLHNCQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRTFELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUMsQ0FBQztJQUVGLElBQUEsb0JBQVEsRUFBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUU7UUFDekMsSUFBQSxjQUFFLEVBQUMsdUNBQXVDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDckQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzdCLE1BQU0sU0FB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Q2pELFVBQVUsQ0FBQyw4QkFBa0IsQ0FBQztpQkFDOUIsV0FBVyxDQUFDLDhCQUFrQixDQUFDLENBQUM7WUFFbkMsTUFBTSxFQUFFLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFakMsc0JBQXNCO1lBQ3RCLE1BQU0sUUFBUSxHQUFHLElBQUEsb0JBQVUsRUFBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUNqRSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLHdCQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFeEMsNkJBQTZCO1lBQzdCLGdCQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSx1Q0FBdUMsQ0FBQyxDQUFDO1lBRTdGLHFDQUFxQztZQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FDVixRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFDL0QsOEJBQWtCLEVBQ2xCLGtEQUFrRCxDQUNuRCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgZGVzY3JpYmUsIGl0IH0gZnJvbSAnbm9kZTp0ZXN0JztcblxuaW1wb3J0IHtcbiAgUEFSVElDSVBBTlRTLFxuICBCTE9DS19IQVNILFxuICBCTE9DS19OVU1CRVIsXG4gIEVYUElSQVRJT04sXG4gIFJFU09VUkNFX0VORVJHWSxcbiAgUkVTT1VSQ0VfQkFORFdJRFRILFxuICBERUxFR0FUSU9OX0JBTEFOQ0UsXG4gIERFTEVHQVRFX1JFU09VUkNFX0NPTlRSQUNULFxufSBmcm9tICcuLi8uLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvYnVpbGRlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiwgV3JhcHBlZEJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnVHJvbiBEZWxlZ2F0ZVJlc291cmNlIGJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGluaXRUeEJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IChnZXRCdWlsZGVyKCd0dHJ4JykgYXMgV3JhcHBlZEJ1aWxkZXIpLmdldERlbGVnYXRlUmVzb3VyY2VUeEJ1aWxkZXIoKTtcbiAgICBidWlsZGVyLnNvdXJjZSh7IGFkZHJlc3M6IFBBUlRJQ0lQQU5UUy5mcm9tLmFkZHJlc3MgfSk7XG4gICAgYnVpbGRlci5zZXRSZWNlaXZlckFkZHJlc3MoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMudG8uYWRkcmVzcyB9KTtcbiAgICBidWlsZGVyLnNldEJhbGFuY2UoREVMRUdBVElPTl9CQUxBTkNFKTtcbiAgICBidWlsZGVyLnNldFJlc291cmNlKFJFU09VUkNFX0VORVJHWSk7XG4gICAgYnVpbGRlci5ibG9jayh7IG51bWJlcjogQkxPQ0tfTlVNQkVSLCBoYXNoOiBCTE9DS19IQVNIIH0pO1xuXG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBidWlsZCBzdWNjZXNzZnVsbHknLCAoKSA9PiB7XG4gICAgaXQoJ2EgdHJhbnNhY3Rpb24gd2l0aCBhbGwgY29ycmVjdCBpbnB1dHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnRpbWVzdGFtcCh0aW1lc3RhbXApO1xuXG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbih0aW1lc3RhbXAgKyA0MDAwMCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5EZWxlZ2F0ZVJlc291cmNlKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5pbnB1dHNbMF0uYWRkcmVzcywgUEFSVElDSVBBTlRTLmZyb20uYWRkcmVzcyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgub3V0cHV0c1swXS5hZGRyZXNzLCBQQVJUSUNJUEFOVFMudG8uYWRkcmVzcyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHguaW5wdXRzWzBdLnZhbHVlLCAnMTAwMDAwMCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4Lm91dHB1dHNbMF0udmFsdWUsICcxMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHR4SnNvbi5yYXdfZGF0YS5jb250cmFjdCwgREVMRUdBVEVfUkVTT1VSQ0VfQ09OVFJBQ1QpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIHVuc2lnbmVkIHRyYW5zYWN0aW9uIGZyb20gYSBzdHJpbmcgYW5kIGZyb20gYSBKU09OJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50aW1lc3RhbXAodGltZXN0YW1wKTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKHRpbWVzdGFtcCArIDQwMDAwKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIHR4QnVpbGRlcjIuc2lnbih7IGtleTogUEFSVElDSVBBTlRTLmZyb20ucGsgfSk7XG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjMgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0pzb24oKSk7XG4gICAgICB0eEJ1aWxkZXIzLnNpZ24oeyBrZXk6IFBBUlRJQ0lQQU5UUy5mcm9tLnBrIH0pO1xuICAgICAgY29uc3QgdHgzID0gYXdhaXQgdHhCdWlsZGVyMy5idWlsZCgpO1xuXG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHR4MiwgdHgzKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiB1bnNpZ25lZCB0cmFuc2FjdGlvbiB3aXRoIGV4dGVuZGVkIGR1cmF0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGV4cGlyYXRpb24gPSB0aW1lc3RhbXAgKyBFWFBJUkFUSU9OO1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gNjAwMDA7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKHRpbWVzdGFtcCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIHR4QnVpbGRlcjIuZXh0ZW5kVmFsaWRUbyhleHRlbnNpb24pO1xuICAgICAgdHhCdWlsZGVyMi5zaWduKHsga2V5OiBQQVJUSUNJUEFOVFMuZnJvbS5wayB9KTtcbiAgICAgIGNvbnN0IHR4MiA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKHR4Mi5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eDIuaW5wdXRzWzBdLmFkZHJlc3MsIFBBUlRJQ0lQQU5UUy5mcm9tLmFkZHJlc3MpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4Mi5pbnB1dHNbMF0udmFsdWUsICcxMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgyLm91dHB1dHNbMF0udmFsdWUsICcxMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgyLm91dHB1dHNbMF0uYWRkcmVzcywgUEFSVElDSVBBTlRTLnRvLmFkZHJlc3MpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgyLnRvSnNvbigpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4SnNvbi5yYXdfZGF0YS5leHBpcmF0aW9uLCBleHBpcmF0aW9uICsgZXh0ZW5zaW9uKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHRyYW5zYWN0aW9uIHNpZ25lZCBtdWx0aXBsZSB0aW1lcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKHRpbWVzdGFtcCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbih0aW1lc3RhbXAgKyBFWFBJUkFUSU9OKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBsZXQgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBsZXQgcmF3RGF0YSA9IHR4SnNvbi5yYXdfZGF0YTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmF3RGF0YS5jb250cmFjdCwgREVMRUdBVEVfUkVTT1VSQ0VfQ09OVFJBQ1QpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4SnNvbi5zaWduYXR1cmUubGVuZ3RoLCAwKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0pzb24oKSk7XG4gICAgICB0eEJ1aWxkZXIyLnNpZ24oeyBrZXk6IFBBUlRJQ0lQQU5UUy5jdXN0b2RpYW4ucGsgfSk7XG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICB0eEpzb24gPSB0eDIudG9Kc29uKCk7XG4gICAgICByYXdEYXRhID0gdHhKc29uLnJhd19kYXRhO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyYXdEYXRhLmNvbnRyYWN0LCBERUxFR0FURV9SRVNPVVJDRV9DT05UUkFDVCk7XG4gICAgICBhc3NlcnQuZXF1YWwodHhKc29uLnNpZ25hdHVyZS5sZW5ndGgsIDEpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIzID0gZ2V0QnVpbGRlcigndHRyeCcpLmZyb20odHgyLnRvSnNvbigpKTtcbiAgICAgIHR4QnVpbGRlcjMuc2lnbih7IGtleTogUEFSVElDSVBBTlRTLmZyb20ucGsgfSk7XG4gICAgICBjb25zdCB0eDMgPSBhd2FpdCB0eEJ1aWxkZXIzLmJ1aWxkKCk7XG5cbiAgICAgIHR4SnNvbiA9IHR4My50b0pzb24oKTtcbiAgICAgIHJhd0RhdGEgPSB0eEpzb24ucmF3X2RhdGE7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJhd0RhdGEuY29udHJhY3QsIERFTEVHQVRFX1JFU09VUkNFX0NPTlRSQUNUKTtcbiAgICAgIGFzc2VydC5lcXVhbChyYXdEYXRhLmV4cGlyYXRpb24sIHRpbWVzdGFtcCArIEVYUElSQVRJT04pO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJhd0RhdGEudGltZXN0YW1wLCB0aW1lc3RhbXApO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4SnNvbi5zaWduYXR1cmUubGVuZ3RoLCAyKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKHR4My5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eDMuaW5wdXRzWzBdLmFkZHJlc3MsIFBBUlRJQ0lQQU5UUy5mcm9tLmFkZHJlc3MpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4My5pbnB1dHNbMF0udmFsdWUsICcxMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgzLm91dHB1dHNbMF0udmFsdWUsICcxMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgzLm91dHB1dHNbMF0uYWRkcmVzcywgUEFSVElDSVBBTlRTLnRvLmFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIHZhbGlkYXRlJywgKCkgPT4ge1xuICAgIGl0KCdhIHZhbGlkIGV4cGlyYXRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IG5vdyArIEVYUElSQVRJT047XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKG5vdyk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uICsgMTAwMCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eEpzb24ucmF3X2RhdGEuZXhwaXJhdGlvbiwgZXhwaXJhdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gZXhwaXJhdGlvbiBncmVhdGVyIHRoYW4gb25lIHllYXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFR4QnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnRpbWVzdGFtcChub3cpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKG5vdyArIDMxNTM2MDAwMDAxKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnRXhwaXJhdGlvbiBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gb25lIGRheSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gZXhwaXJhdGlvbiBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgZGF0ZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKG5vdyAtIDIwMDApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKG5vdyAtIDEwMDApO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdFeHBpcmF0aW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIGN1cnJlbnQgdGltZSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gZXhwaXJhdGlvbiBsZXNzIHRoYW4gdGhlIHRpbWVzdGFtcCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudGltZXN0YW1wKG5vdyArIDIwMDApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKG5vdyArIDEwMDApO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdFeHBpcmF0aW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRpbWVzdGFtcCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gZXhwaXJhdGlvbiBzZXQgYWZ0ZXIgYnVpbGQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IG5vdyArIEVYUElSQVRJT047XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnRXhwaXJhdGlvbiBpcyBhbHJlYWR5IHNldCwgaXQgY2FuIG9ubHkgYmUgZXh0ZW5kZWQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIGV4cGlyYXRpb24gc2V0IGFmdGVyIGRlc2VyaWFsaXppbmcnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IG5vdyArIEVYUElSQVRJT047XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGdldEJ1aWxkZXIoJ3R0cngnKS5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlcjIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnRXhwaXJhdGlvbiBpcyBhbHJlYWR5IHNldCwgaXQgY2FuIG9ubHkgYmUgZXh0ZW5kZWQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIGV4dGVuc2lvbiB3aXRob3V0IGEgc2V0IGV4cGlyYXRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmV4dGVuZFZhbGlkVG8oMjAwMDApO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdUaGVyZSBpcyBub3QgZXhwaXJhdGlvbiB0byBleHRlbmQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgemVybyBtaWxsaXNlY29uZCBleHRlbnNpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICBjb25zdCBleHBpcmF0aW9uID0gRGF0ZS5ub3coKSArIEVYUElSQVRJT047XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIyLmV4dGVuZFZhbGlkVG8oMCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ1ZhbHVlIGNhbm5vdCBiZSBiZWxvdyB6ZXJvJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiBleHRlbnNpb24gZ3JhdGVyIHRoYW4gb25lIHllYXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhCdWlsZGVyKCk7XG4gICAgICBjb25zdCBleHBpcmF0aW9uID0gRGF0ZS5ub3coKSArIEVYUElSQVRJT047XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvbihleHBpcmF0aW9uKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIyLmV4dGVuZFZhbGlkVG8oMzE1MzYwMDAwMDEpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdUaGUgZXhwaXJhdGlvbiBjYW5ub3QgYmUgZXh0ZW5kZWQgbW9yZSB0aGFuIG9uZSB5ZWFyJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiBleHRlbnNpb24gYWZ0ZXIgc2lnbmluZycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRUeEJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBQQVJUSUNJUEFOVFMuZnJvbS5wayB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIyLmV4dGVuZFZhbGlkVG8oMjAwMDApO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdDYW5ub3QgZXh0ZW5kIGEgc2lnbmVkIHRyYW5zYWN0aW9uJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZCByZXNvdXJjZTogRU5FUkdZJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IChnZXRCdWlsZGVyKCd0dHJ4JykgYXMgV3JhcHBlZEJ1aWxkZXIpLmdldERlbGVnYXRlUmVzb3VyY2VUeEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLnNvdXJjZSh7IGFkZHJlc3M6IFBBUlRJQ0lQQU5UUy5mcm9tLmFkZHJlc3MgfSlcbiAgICAgICAgLmJsb2NrKHsgbnVtYmVyOiBCTE9DS19OVU1CRVIsIGhhc2g6IEJMT0NLX0hBU0ggfSlcbiAgICAgICAgLnNldEJhbGFuY2UoREVMRUdBVElPTl9CQUxBTkNFKVxuICAgICAgICAuc2V0UmVjZWl2ZXJBZGRyZXNzKHsgYWRkcmVzczogUEFSVElDSVBBTlRTLnRvLmFkZHJlc3MgfSk7XG4gICAgICBidWlsZGVyLnNldFJlc291cmNlKCdFTkVSR1knKTtcbiAgICAgIGFzc2VydC5kb2VzTm90UmVqZWN0KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkIHJlc291cmNlOiBCQU5EV0lEVEgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gKGdldEJ1aWxkZXIoJ3R0cngnKSBhcyBXcmFwcGVkQnVpbGRlcikuZ2V0RGVsZWdhdGVSZXNvdXJjZVR4QnVpbGRlcigpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuc291cmNlKHsgYWRkcmVzczogUEFSVElDSVBBTlRTLmZyb20uYWRkcmVzcyB9KVxuICAgICAgICAuYmxvY2soeyBudW1iZXI6IEJMT0NLX05VTUJFUiwgaGFzaDogQkxPQ0tfSEFTSCB9KVxuICAgICAgICAuc2V0QmFsYW5jZShERUxFR0FUSU9OX0JBTEFOQ0UpXG4gICAgICAgIC5zZXRSZWNlaXZlckFkZHJlc3MoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMudG8uYWRkcmVzcyB9KTtcbiAgICAgIGJ1aWxkZXIuc2V0UmVzb3VyY2UoJ0JBTkRXSURUSCcpO1xuICAgICAgYXNzZXJ0LmRvZXNOb3RSZWplY3QoKCkgPT4ge1xuICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW52YWxpZCByZXNvdXJjZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSAoZ2V0QnVpbGRlcigndHRyeCcpIGFzIFdyYXBwZWRCdWlsZGVyKS5nZXREZWxlZ2F0ZVJlc291cmNlVHhCdWlsZGVyKCk7XG4gICAgICBjb25zdCBpbnZhbGlkUmVzb3VyY2UgPSAnSU5WQUxJRCc7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zb3VyY2UoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMuY3VzdG9kaWFuLmFkZHJlc3MgfSlcbiAgICAgICAgLmJsb2NrKHsgbnVtYmVyOiBCTE9DS19OVU1CRVIsIGhhc2g6IEJMT0NLX0hBU0ggfSlcbiAgICAgICAgLnNldEJhbGFuY2UoREVMRUdBVElPTl9CQUxBTkNFKTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLnNldFJlc291cmNlKGludmFsaWRSZXNvdXJjZSksIGAke2ludmFsaWRSZXNvdXJjZX0gaXMgYSBub3QgdmFsaWQgcmVzb3VyY2UgdHlwZS5gKTtcbiAgICB9KTtcblxuICAgIGl0KCd0cmFuc2FjdGlvbiBtYW5kYXRvcnkgZmllbGRzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gKGdldEJ1aWxkZXIoJ3R0cngnKSBhcyBXcmFwcGVkQnVpbGRlcikuZ2V0RGVsZWdhdGVSZXNvdXJjZVR4QnVpbGRlcigpO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyh0eEJ1aWxkZXIuYnVpbGQoKSwge1xuICAgICAgICBtZXNzYWdlOiAnTWlzc2luZyBwYXJhbWV0ZXI6IGJhbGFuY2UnLFxuICAgICAgfSk7XG5cbiAgICAgIHR4QnVpbGRlci5zZXRCYWxhbmNlKCcxMDAwMDAwJyk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyh0eEJ1aWxkZXIuYnVpbGQoKSwge1xuICAgICAgICBtZXNzYWdlOiAnTWlzc2luZyBwYXJhbWV0ZXI6IHNvdXJjZScsXG4gICAgICB9KTtcblxuICAgICAgdHhCdWlsZGVyLnNvdXJjZSh7IGFkZHJlc3M6IFBBUlRJQ0lQQU5UUy5mcm9tLmFkZHJlc3MgfSk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyh0eEJ1aWxkZXIuYnVpbGQoKSwge1xuICAgICAgICBtZXNzYWdlOiAnTWlzc2luZyBwYXJhbWV0ZXI6IHJlc291cmNlJyxcbiAgICAgIH0pO1xuXG4gICAgICB0eEJ1aWxkZXIuc2V0UmVzb3VyY2UoJ0VORVJHWScpO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHModHhCdWlsZGVyLmJ1aWxkKCksIHtcbiAgICAgICAgbWVzc2FnZTogJ01pc3NpbmcgcGFyYW1ldGVyOiByZWNlaXZlciBhZGRyZXNzJyxcbiAgICAgIH0pO1xuXG4gICAgICB0eEJ1aWxkZXIuc2V0UmVjZWl2ZXJBZGRyZXNzKHsgYWRkcmVzczogUEFSVElDSVBBTlRTLnRvLmFkZHJlc3MgfSk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyh0eEJ1aWxkZXIuYnVpbGQoKSwge1xuICAgICAgICBtZXNzYWdlOiAnTWlzc2luZyBibG9jayByZWZlcmVuY2UgaW5mb3JtYXRpb24nLFxuICAgICAgfSk7XG5cbiAgICAgIHR4QnVpbGRlci5ibG9jayh7IG51bWJlcjogQkxPQ0tfTlVNQkVSLCBoYXNoOiBCTE9DS19IQVNIIH0pO1xuICAgICAgYXNzZXJ0LmRvZXNOb3RSZWplY3QoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0JBTkRXSURUSCBzZXJpYWxpemF0aW9uIChwcm90b2J1ZjMgY29tcGF0aWJpbGl0eSknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByb3VuZC10cmlwIEJBTkRXSURUSCB0cmFuc2FjdGlvbnMgY29ycmVjdGx5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gQnVpbGQgYSBCQU5EV0lEVEggdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSAoZ2V0QnVpbGRlcigndHRyeCcpIGFzIFdyYXBwZWRCdWlsZGVyKS5nZXREZWxlZ2F0ZVJlc291cmNlVHhCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zb3VyY2UoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMuZnJvbS5hZGRyZXNzIH0pXG4gICAgICAgIC5zZXRSZWNlaXZlckFkZHJlc3MoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMudG8uYWRkcmVzcyB9KVxuICAgICAgICAuYmxvY2soeyBudW1iZXI6IEJMT0NLX05VTUJFUiwgaGFzaDogQkxPQ0tfSEFTSCB9KVxuICAgICAgICAuc2V0QmFsYW5jZShERUxFR0FUSU9OX0JBTEFOQ0UpXG4gICAgICAgIC5zZXRSZXNvdXJjZShSRVNPVVJDRV9CQU5EV0lEVEgpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIGJ1aWx0IHRyYW5zYWN0aW9uIGhhcyBCQU5EV0lEVEggcmVzb3VyY2VcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgdHhKc29uLnJhd19kYXRhLmNvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZS5yZXNvdXJjZSxcbiAgICAgICAgUkVTT1VSQ0VfQkFORFdJRFRILFxuICAgICAgICAnQnVpbHQgdHJhbnNhY3Rpb24gc2hvdWxkIGhhdmUgQkFORFdJRFRIIHJlc291cmNlJ1xuICAgICAgKTtcblxuICAgICAgLy8gUm91bmQtdHJpcDogZGVzZXJpYWxpemUgZnJvbSBicm9hZGNhc3QgZm9ybWF0IGFuZCByZWJ1aWxkXG4gICAgICBjb25zdCBidWlsZGVyMiA9IGdldEJ1aWxkZXIoJ3R0cngnKS5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgY29uc3QgdHgyID0gYXdhaXQgYnVpbGRlcjIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4Mkpzb24gPSB0eDIudG9Kc29uKCk7XG5cbiAgICAgIC8vIFZlcmlmeSByZXNvdXJjZSBpcyBwcmVzZXJ2ZWQgYWZ0ZXIgcm91bmQtdHJpcFxuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICB0eDJKc29uLnJhd19kYXRhLmNvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZS5yZXNvdXJjZSxcbiAgICAgICAgUkVTT1VSQ0VfQkFORFdJRFRILFxuICAgICAgICAnUmVzb3VyY2Ugc2hvdWxkIGJlIEJBTkRXSURUSCBhZnRlciByb3VuZC10cmlwIGZyb20gYnJvYWRjYXN0IGZvcm1hdCdcbiAgICAgICk7XG5cbiAgICAgIC8vIFJvdW5kLXRyaXA6IGRlc2VyaWFsaXplIGZyb20gSlNPTiBhbmQgcmVidWlsZFxuICAgICAgY29uc3QgYnVpbGRlcjMgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0pzb24oKSk7XG4gICAgICBjb25zdCB0eDMgPSBhd2FpdCBidWlsZGVyMy5idWlsZCgpO1xuICAgICAgY29uc3QgdHgzSnNvbiA9IHR4My50b0pzb24oKTtcblxuICAgICAgLy8gVmVyaWZ5IHJlc291cmNlIGlzIHByZXNlcnZlZCBhZnRlciByb3VuZC10cmlwIGZyb20gSlNPTlxuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICB0eDNKc29uLnJhd19kYXRhLmNvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZS5yZXNvdXJjZSxcbiAgICAgICAgUkVTT1VSQ0VfQkFORFdJRFRILFxuICAgICAgICAnUmVzb3VyY2Ugc2hvdWxkIGJlIEJBTkRXSURUSCBhZnRlciByb3VuZC10cmlwIGZyb20gSlNPTidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJvdW5kLXRyaXAgRU5FUkdZIHRyYW5zYWN0aW9ucyBjb3JyZWN0bHknLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBCdWlsZCBhbiBFTkVSR1kgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSAoZ2V0QnVpbGRlcigndHRyeCcpIGFzIFdyYXBwZWRCdWlsZGVyKS5nZXREZWxlZ2F0ZVJlc291cmNlVHhCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zb3VyY2UoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMuZnJvbS5hZGRyZXNzIH0pXG4gICAgICAgIC5zZXRSZWNlaXZlckFkZHJlc3MoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMudG8uYWRkcmVzcyB9KVxuICAgICAgICAuYmxvY2soeyBudW1iZXI6IEJMT0NLX05VTUJFUiwgaGFzaDogQkxPQ0tfSEFTSCB9KVxuICAgICAgICAuc2V0QmFsYW5jZShERUxFR0FUSU9OX0JBTEFOQ0UpXG4gICAgICAgIC5zZXRSZXNvdXJjZShSRVNPVVJDRV9FTkVSR1kpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIGJ1aWx0IHRyYW5zYWN0aW9uIGhhcyBFTkVSR1kgcmVzb3VyY2VcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgdHhKc29uLnJhd19kYXRhLmNvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZS5yZXNvdXJjZSxcbiAgICAgICAgUkVTT1VSQ0VfRU5FUkdZLFxuICAgICAgICAnQnVpbHQgdHJhbnNhY3Rpb24gc2hvdWxkIGhhdmUgRU5FUkdZIHJlc291cmNlJ1xuICAgICAgKTtcblxuICAgICAgLy8gUm91bmQtdHJpcDogZGVzZXJpYWxpemUgZnJvbSBicm9hZGNhc3QgZm9ybWF0IGFuZCByZWJ1aWxkXG4gICAgICBjb25zdCBidWlsZGVyMiA9IGdldEJ1aWxkZXIoJ3R0cngnKS5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgY29uc3QgdHgyID0gYXdhaXQgYnVpbGRlcjIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4Mkpzb24gPSB0eDIudG9Kc29uKCk7XG5cbiAgICAgIC8vIFZlcmlmeSByZXNvdXJjZSBpcyBwcmVzZXJ2ZWQgYWZ0ZXIgcm91bmQtdHJpcFxuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICB0eDJKc29uLnJhd19kYXRhLmNvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZS5yZXNvdXJjZSxcbiAgICAgICAgUkVTT1VSQ0VfRU5FUkdZLFxuICAgICAgICAnUmVzb3VyY2Ugc2hvdWxkIGJlIEVORVJHWSBhZnRlciByb3VuZC10cmlwIGZyb20gYnJvYWRjYXN0IGZvcm1hdCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgY29uc2lzdGVudCB0cmFuc2FjdGlvbiBJRHMgZm9yIEJBTkRXSURUSCB0cmFuc2FjdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBCdWlsZCBhIEJBTkRXSURUSCB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgYnVpbGRlciA9IChnZXRCdWlsZGVyKCd0dHJ4JykgYXMgV3JhcHBlZEJ1aWxkZXIpLmdldERlbGVnYXRlUmVzb3VyY2VUeEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLnNvdXJjZSh7IGFkZHJlc3M6IFBBUlRJQ0lQQU5UUy5mcm9tLmFkZHJlc3MgfSlcbiAgICAgICAgLnNldFJlY2VpdmVyQWRkcmVzcyh7IGFkZHJlc3M6IFBBUlRJQ0lQQU5UUy50by5hZGRyZXNzIH0pXG4gICAgICAgIC5ibG9jayh7IG51bWJlcjogQkxPQ0tfTlVNQkVSLCBoYXNoOiBCTE9DS19IQVNIIH0pXG4gICAgICAgIC5zZXRCYWxhbmNlKERFTEVHQVRJT05fQkFMQU5DRSlcbiAgICAgICAgLnNldFJlc291cmNlKFJFU09VUkNFX0JBTkRXSURUSCk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qgb3JpZ2luYWxUeElkID0gdHgudG9Kc29uKCkudHhJRDtcblxuICAgICAgLy8gUm91bmQtdHJpcCBhbmQgdmVyaWZ5IHR4SUQgaXMgY29uc2lzdGVudFxuICAgICAgY29uc3QgYnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIGNvbnN0IHR4MiA9IGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByb3VuZFRyaXBUeElkID0gdHgyLnRvSnNvbigpLnR4SUQ7XG5cbiAgICAgIGFzc2VydC5lcXVhbChvcmlnaW5hbFR4SWQsIHJvdW5kVHJpcFR4SWQsICdUcmFuc2FjdGlvbiBJRCBzaG91bGQgYmUgY29uc2lzdGVudCBhZnRlciByb3VuZC10cmlwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IHNpZ25pbmcgQkFORFdJRFRIIHRyYW5zYWN0aW9ucyBhZnRlciByb3VuZC10cmlwJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gQnVpbGQgYSBCQU5EV0lEVEggdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSAoZ2V0QnVpbGRlcigndHRyeCcpIGFzIFdyYXBwZWRCdWlsZGVyKS5nZXREZWxlZ2F0ZVJlc291cmNlVHhCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zb3VyY2UoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMuZnJvbS5hZGRyZXNzIH0pXG4gICAgICAgIC5zZXRSZWNlaXZlckFkZHJlc3MoeyBhZGRyZXNzOiBQQVJUSUNJUEFOVFMudG8uYWRkcmVzcyB9KVxuICAgICAgICAuYmxvY2soeyBudW1iZXI6IEJMT0NLX05VTUJFUiwgaGFzaDogQkxPQ0tfSEFTSCB9KVxuICAgICAgICAuc2V0QmFsYW5jZShERUxFR0FUSU9OX0JBTEFOQ0UpXG4gICAgICAgIC5zZXRSZXNvdXJjZShSRVNPVVJDRV9CQU5EV0lEVEgpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgLy8gUm91bmQtdHJpcCBhbmQgc2lnblxuICAgICAgY29uc3QgYnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0dHJ4JykuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIGJ1aWxkZXIyLnNpZ24oeyBrZXk6IFBBUlRJQ0lQQU5UUy5mcm9tLnBrIH0pO1xuICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCBidWlsZGVyMi5idWlsZCgpO1xuXG4gICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlIHdhcyBhZGRlZFxuICAgICAgYXNzZXJ0LmVxdWFsKHNpZ25lZFR4LnRvSnNvbigpLnNpZ25hdHVyZS5sZW5ndGgsIDEsICdUcmFuc2FjdGlvbiBzaG91bGQgaGF2ZSBvbmUgc2lnbmF0dXJlJyk7XG5cbiAgICAgIC8vIFZlcmlmeSByZXNvdXJjZSBpcyBzdGlsbCBCQU5EV0lEVEhcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgc2lnbmVkVHgudG9Kc29uKCkucmF3X2RhdGEuY29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlLnJlc291cmNlLFxuICAgICAgICBSRVNPVVJDRV9CQU5EV0lEVEgsXG4gICAgICAgICdSZXNvdXJjZSBzaG91bGQgc3RpbGwgYmUgQkFORFdJRFRIIGFmdGVyIHNpZ25pbmcnXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=freezeBalanceTxBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"freezeBalanceTxBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/freezeBalanceTxBuilder.ts"],"names":[],"mappings":""}