@bitgo-beta/sdk-coin-iota 1.0.1-beta.32 → 1.0.1-beta.320

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 (63) hide show
  1. package/README.md +1 -1
  2. package/dist/src/iota.d.ts +13 -2
  3. package/dist/src/iota.d.ts.map +1 -1
  4. package/dist/src/iota.js +142 -22
  5. package/dist/src/lib/constants.d.ts +10 -6
  6. package/dist/src/lib/constants.d.ts.map +1 -1
  7. package/dist/src/lib/constants.js +12 -8
  8. package/dist/src/lib/iface.d.ts +33 -1
  9. package/dist/src/lib/iface.d.ts.map +1 -1
  10. package/dist/src/lib/iface.js +1 -1
  11. package/dist/src/lib/index.d.ts +1 -0
  12. package/dist/src/lib/index.d.ts.map +1 -1
  13. package/dist/src/lib/index.js +4 -2
  14. package/dist/src/lib/transaction.d.ts +72 -5
  15. package/dist/src/lib/transaction.d.ts.map +1 -1
  16. package/dist/src/lib/transaction.js +270 -6
  17. package/dist/src/lib/transactionBuilder.d.ts +70 -9
  18. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  19. package/dist/src/lib/transactionBuilder.js +155 -14
  20. package/dist/src/lib/transactionBuilderFactory.d.ts +15 -2
  21. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  22. package/dist/src/lib/transactionBuilderFactory.js +45 -5
  23. package/dist/src/lib/transferBuilder.d.ts +10 -2
  24. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  25. package/dist/src/lib/transferBuilder.js +45 -3
  26. package/dist/src/lib/transferTransaction.d.ts +28 -0
  27. package/dist/src/lib/transferTransaction.d.ts.map +1 -0
  28. package/dist/src/lib/transferTransaction.js +173 -0
  29. package/dist/src/lib/utils.d.ts +2 -0
  30. package/dist/src/lib/utils.d.ts.map +1 -1
  31. package/dist/src/lib/utils.js +28 -4
  32. package/dist/test/resources/iota.d.ts +35 -0
  33. package/dist/test/resources/iota.d.ts.map +1 -0
  34. package/dist/test/resources/iota.js +93 -0
  35. package/dist/test/unit/index.d.ts +2 -0
  36. package/dist/test/unit/index.d.ts.map +1 -0
  37. package/dist/test/unit/index.js +16 -0
  38. package/dist/test/unit/iota.d.ts +2 -0
  39. package/dist/test/unit/iota.d.ts.map +1 -0
  40. package/dist/test/unit/iota.js +603 -0
  41. package/dist/test/unit/keyPair.d.ts +2 -0
  42. package/dist/test/unit/keyPair.d.ts.map +1 -0
  43. package/dist/test/unit/keyPair.js +135 -0
  44. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  45. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  46. package/dist/test/unit/transactionBuilder/transactionBuilder.js +306 -0
  47. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts +2 -0
  48. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts.map +1 -0
  49. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +243 -0
  50. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  51. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  52. package/dist/test/unit/transactionBuilder/transferBuilder.js +400 -0
  53. package/dist/test/unit/transferTransaction.d.ts +2 -0
  54. package/dist/test/unit/transferTransaction.d.ts.map +1 -0
  55. package/dist/test/unit/transferTransaction.js +465 -0
  56. package/dist/test/unit/utils.d.ts +2 -0
  57. package/dist/test/unit/utils.d.ts.map +1 -0
  58. package/dist/test/unit/utils.js +278 -0
  59. package/dist/tsconfig.tsbuildinfo +1 -0
  60. package/package.json +16 -10
  61. package/.eslintignore +0 -5
  62. package/.mocharc.yml +0 -8
  63. package/CHANGELOG.md +0 -0
@@ -0,0 +1,400 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const should_1 = __importDefault(require("should"));
40
+ const statics_1 = require("@bitgo-beta/statics");
41
+ const src_1 = require("../../../src");
42
+ const testData = __importStar(require("../../resources/iota"));
43
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
44
+ const utils_1 = __importDefault(require("../../../src/lib/utils"));
45
+ const constants_1 = require("../../../src/lib/constants");
46
+ describe('Iota Transfer Builder', () => {
47
+ const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tiota'));
48
+ describe('Succeed', () => {
49
+ it('should build a transfer tx with simulate mode', async function () {
50
+ const txBuilder = factory.getTransferBuilder();
51
+ txBuilder.sender(testData.sender.address);
52
+ txBuilder.recipients(testData.recipients);
53
+ txBuilder.paymentObjects(testData.paymentObjects);
54
+ const tx = (await txBuilder.build());
55
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
56
+ should_1.default.equal(tx.sender, testData.sender.address);
57
+ should_1.default.equal(tx.isSimulateTx, true);
58
+ should_1.default.deepEqual(tx.recipients, testData.recipients);
59
+ should_1.default.deepEqual(tx.paymentObjects, testData.paymentObjects);
60
+ const rawTx = await tx.toBroadcastFormat();
61
+ should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
62
+ });
63
+ it('should build a transfer tx with gas data', async function () {
64
+ const txBuilder = factory.getTransferBuilder();
65
+ txBuilder.sender(testData.sender.address);
66
+ txBuilder.recipients(testData.recipients);
67
+ txBuilder.paymentObjects(testData.paymentObjects);
68
+ txBuilder.gasData(testData.gasData);
69
+ const tx = (await txBuilder.build());
70
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
71
+ should_1.default.equal(tx.sender, testData.sender.address);
72
+ should_1.default.equal(tx.isSimulateTx, false);
73
+ should_1.default.equal(tx.gasBudget, testData.GAS_BUDGET);
74
+ should_1.default.equal(tx.gasPrice, testData.GAS_PRICE);
75
+ should_1.default.deepEqual(tx.gasPaymentObjects, testData.gasPaymentObjects);
76
+ tx.inputs.length.should.equal(1);
77
+ tx.inputs[0].should.deepEqual({
78
+ address: testData.sender.address,
79
+ value: (testData.AMOUNT + testData.AMOUNT * 2).toString(),
80
+ coin: 'tiota',
81
+ });
82
+ tx.outputs.length.should.equal(2);
83
+ tx.outputs[0].should.deepEqual({
84
+ address: testData.recipients[0].address,
85
+ value: testData.recipients[0].amount,
86
+ coin: 'tiota',
87
+ });
88
+ tx.outputs[1].should.deepEqual({
89
+ address: testData.recipients[1].address,
90
+ value: testData.recipients[1].amount,
91
+ coin: 'tiota',
92
+ });
93
+ const rawTx = await tx.toBroadcastFormat();
94
+ should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
95
+ });
96
+ it('should build a transfer tx with gas sponsor', async function () {
97
+ const txBuilder = factory.getTransferBuilder();
98
+ txBuilder.sender(testData.sender.address);
99
+ txBuilder.recipients(testData.recipients);
100
+ txBuilder.paymentObjects(testData.paymentObjects);
101
+ txBuilder.gasData(testData.gasData);
102
+ txBuilder.gasSponsor(testData.gasSponsor.address);
103
+ const tx = (await txBuilder.build());
104
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
105
+ should_1.default.equal(tx.sender, testData.sender.address);
106
+ should_1.default.equal(tx.gasSponsor, testData.gasSponsor.address);
107
+ should_1.default.equal(tx.isSimulateTx, false);
108
+ const rawTx = await tx.toBroadcastFormat();
109
+ should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
110
+ });
111
+ it('should build a transfer tx with multiple recipients', async function () {
112
+ const amount = 1000;
113
+ const numberOfRecipients = 10;
114
+ const txBuilder = factory.getTransferBuilder();
115
+ txBuilder.sender(testData.sender.address);
116
+ const recipients = new Array(numberOfRecipients).fill({
117
+ address: testData.addresses.validAddresses[0],
118
+ amount: amount.toString(),
119
+ });
120
+ txBuilder.recipients(recipients);
121
+ txBuilder.paymentObjects(testData.paymentObjects);
122
+ txBuilder.gasData(testData.gasData);
123
+ const tx = (await txBuilder.build());
124
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
125
+ tx.inputs.length.should.equal(1);
126
+ tx.inputs[0].should.deepEqual({
127
+ address: testData.sender.address,
128
+ value: (amount * numberOfRecipients).toString(),
129
+ coin: 'tiota',
130
+ });
131
+ tx.outputs.length.should.equal(numberOfRecipients);
132
+ tx.outputs.forEach((output) => output.should.deepEqual({
133
+ address: testData.addresses.validAddresses[0],
134
+ value: amount.toString(),
135
+ coin: 'tiota',
136
+ }));
137
+ });
138
+ it('should parse from JSON and rebuild transaction', async function () {
139
+ const txBuilder = factory.getTransferBuilder();
140
+ txBuilder.sender(testData.sender.address);
141
+ txBuilder.recipients(testData.recipients);
142
+ txBuilder.paymentObjects(testData.paymentObjects);
143
+ txBuilder.gasData(testData.gasData);
144
+ const tx = (await txBuilder.build());
145
+ const txJson = tx.toJson();
146
+ const rebuiltTxBuilder = factory.getTransferBuilder();
147
+ rebuiltTxBuilder.transaction.parseFromJSON(txJson);
148
+ const rebuiltTx = (await rebuiltTxBuilder.build());
149
+ should_1.default.equal(rebuiltTx.sender, tx.sender);
150
+ should_1.default.deepEqual(rebuiltTx.recipients, tx.recipients);
151
+ should_1.default.equal(rebuiltTx.gasBudget, tx.gasBudget);
152
+ should_1.default.equal(rebuiltTx.gasPrice, tx.gasPrice);
153
+ });
154
+ it('should serialize to broadcast format consistently', async function () {
155
+ const txBuilder1 = factory.getTransferBuilder();
156
+ txBuilder1.sender(testData.sender.address);
157
+ txBuilder1.recipients(testData.recipients);
158
+ txBuilder1.paymentObjects(testData.paymentObjects);
159
+ txBuilder1.gasData(testData.gasData);
160
+ const tx1 = (await txBuilder1.build());
161
+ const rawTx1 = await tx1.toBroadcastFormat();
162
+ const txBuilder2 = factory.getTransferBuilder();
163
+ txBuilder2.sender(testData.sender.address);
164
+ txBuilder2.recipients(testData.recipients);
165
+ txBuilder2.paymentObjects(testData.paymentObjects);
166
+ txBuilder2.gasData(testData.gasData);
167
+ const tx2 = (await txBuilder2.build());
168
+ const rawTx2 = await tx2.toBroadcastFormat();
169
+ should_1.default.equal(rawTx1, rawTx2);
170
+ should_1.default.equal(tx1.type, sdk_core_1.TransactionType.Send);
171
+ });
172
+ it('should build tx with signable payload', async function () {
173
+ const txBuilder = factory.getTransferBuilder();
174
+ txBuilder.sender(testData.sender.address);
175
+ txBuilder.recipients(testData.recipients);
176
+ txBuilder.paymentObjects(testData.paymentObjects);
177
+ txBuilder.gasData(testData.gasData);
178
+ const tx = (await txBuilder.build());
179
+ should_1.default.equal(tx.isSimulateTx, false);
180
+ const signablePayload = tx.signablePayload;
181
+ should_1.default.exist(signablePayload);
182
+ should_1.default.equal(Buffer.isBuffer(signablePayload), true);
183
+ should_1.default.equal(signablePayload.length, 32); // Blake2b hash is 32 bytes
184
+ });
185
+ it('should validate toJSON output', async function () {
186
+ const txBuilder = factory.getTransferBuilder();
187
+ txBuilder.sender(testData.sender.address);
188
+ txBuilder.recipients(testData.recipients);
189
+ txBuilder.paymentObjects(testData.paymentObjects);
190
+ txBuilder.gasData(testData.gasData);
191
+ const tx = (await txBuilder.build());
192
+ const txJson = tx.toJson();
193
+ should_1.default.equal(txJson.sender, testData.sender.address);
194
+ should_1.default.deepEqual(txJson.recipients, testData.recipients);
195
+ should_1.default.deepEqual(txJson.paymentObjects, testData.paymentObjects);
196
+ should_1.default.equal(txJson.gasBudget, testData.GAS_BUDGET);
197
+ should_1.default.equal(txJson.gasPrice, testData.GAS_PRICE);
198
+ should_1.default.deepEqual(txJson.gasPaymentObjects, testData.gasPaymentObjects);
199
+ should_1.default.equal(txJson.type, sdk_core_1.TransactionType.Send);
200
+ });
201
+ });
202
+ describe('Fail', () => {
203
+ it('should fail for invalid sender', function () {
204
+ const builder = factory.getTransferBuilder();
205
+ (0, should_1.default)(() => builder.sender('randomString')).throwError('Invalid address randomString');
206
+ });
207
+ it('should fail for invalid recipient address', function () {
208
+ const builder = factory.getTransferBuilder();
209
+ builder.sender(testData.sender.address);
210
+ (0, should_1.default)(() => builder.recipients([{ address: 'invalidAddress', amount: '1000' }])).throwError('Invalid address invalidAddress');
211
+ });
212
+ it('should fail for invalid recipient amount', function () {
213
+ const builder = factory.getTransferBuilder();
214
+ builder.sender(testData.sender.address);
215
+ (0, should_1.default)(() => builder.recipients([{ address: testData.addresses.validAddresses[0], amount: '-1000' }])).throwError('Value cannot be less than zero');
216
+ });
217
+ it('should fail for empty recipients during build', async function () {
218
+ const builder = factory.getTransferBuilder();
219
+ builder.sender(testData.sender.address);
220
+ builder.recipients([]);
221
+ builder.paymentObjects(testData.paymentObjects);
222
+ builder.gasData(testData.gasData);
223
+ await builder.build().should.be.rejected();
224
+ });
225
+ it('should fail for empty payment objects', function () {
226
+ const builder = factory.getTransferBuilder();
227
+ builder.sender(testData.sender.address);
228
+ builder.recipients(testData.recipients);
229
+ (0, should_1.default)(() => builder.paymentObjects([])).throwError('No Objects provided for payment');
230
+ });
231
+ it('should fail when gas payment objects exceed maximum', async function () {
232
+ const builder = factory.getTransferBuilder();
233
+ builder.sender(testData.sender.address);
234
+ builder.recipients(testData.recipients);
235
+ builder.paymentObjects(testData.paymentObjects);
236
+ const tooManyGasObjects = testData.generateObjects(constants_1.MAX_GAS_PAYMENT_OBJECTS + 1);
237
+ builder.gasData({
238
+ gasBudget: testData.GAS_BUDGET,
239
+ gasPrice: testData.GAS_PRICE,
240
+ gasPaymentObjects: tooManyGasObjects,
241
+ });
242
+ await builder.build().should.be.rejected();
243
+ });
244
+ it('should fail to build without sender', async function () {
245
+ const builder = factory.getTransferBuilder();
246
+ builder.recipients(testData.recipients);
247
+ builder.paymentObjects(testData.paymentObjects);
248
+ builder.gasData(testData.gasData);
249
+ await builder.build().should.be.rejected();
250
+ });
251
+ it('should fail to build without recipients', async function () {
252
+ const builder = factory.getTransferBuilder();
253
+ builder.sender(testData.sender.address);
254
+ builder.paymentObjects(testData.paymentObjects);
255
+ builder.gasData(testData.gasData);
256
+ await builder.build().should.be.rejected();
257
+ });
258
+ it('should fail to build without payment objects', async function () {
259
+ const builder = factory.getTransferBuilder();
260
+ builder.sender(testData.sender.address);
261
+ builder.recipients(testData.recipients);
262
+ builder.gasData(testData.gasData);
263
+ await builder.build().should.be.rejected();
264
+ });
265
+ it('should fail to get signable payload for simulate tx', async function () {
266
+ const builder = factory.getTransferBuilder();
267
+ builder.sender(testData.sender.address);
268
+ builder.recipients(testData.recipients);
269
+ builder.paymentObjects(testData.paymentObjects);
270
+ const tx = (await builder.build());
271
+ should_1.default.equal(tx.isSimulateTx, true);
272
+ (0, should_1.default)(() => tx.signablePayload).throwError('Cannot sign a simulate tx');
273
+ });
274
+ it('should fail when payment and gas payment objects overlap', async function () {
275
+ const builder = factory.getTransferBuilder();
276
+ builder.sender(testData.sender.address);
277
+ builder.recipients(testData.recipients);
278
+ // Use same objects for payment and gas
279
+ builder.paymentObjects(testData.gasPaymentObjects);
280
+ builder.gasData(testData.gasData);
281
+ await builder.build().should.be.rejected();
282
+ });
283
+ it('should fail to parse invalid raw transaction', function () {
284
+ (0, should_1.default)(() => factory.from('invalidRawTransaction')).throwError();
285
+ });
286
+ });
287
+ describe('Transaction Signing', () => {
288
+ it('should build transaction with sender signature', async function () {
289
+ const txBuilder = factory.getTransferBuilder();
290
+ txBuilder.sender(testData.sender.address);
291
+ txBuilder.recipients(testData.recipients);
292
+ txBuilder.paymentObjects(testData.paymentObjects);
293
+ txBuilder.gasData(testData.gasData);
294
+ const tx = (await txBuilder.build());
295
+ // Add signature
296
+ tx.addSignature(testData.testSignature.publicKey, testData.testSignature.signature);
297
+ // Rebuild to trigger serialization
298
+ await tx.build();
299
+ should_1.default.exist(tx.serializedSignature);
300
+ should_1.default.equal(tx.serializedSignature.length > 0, true);
301
+ });
302
+ it('should build transaction with gas sponsor signature', async function () {
303
+ const txBuilder = factory.getTransferBuilder();
304
+ txBuilder.sender(testData.sender.address);
305
+ txBuilder.recipients(testData.recipients);
306
+ txBuilder.paymentObjects(testData.paymentObjects);
307
+ txBuilder.gasData(testData.gasData);
308
+ txBuilder.gasSponsor(testData.gasSponsor.address);
309
+ const tx = (await txBuilder.build());
310
+ // Add gas sponsor signature
311
+ tx.addGasSponsorSignature(testData.testGasSponsorSignature.publicKey, testData.testGasSponsorSignature.signature);
312
+ // Rebuild to trigger serialization
313
+ await tx.build();
314
+ should_1.default.exist(tx.serializedGasSponsorSignature);
315
+ should_1.default.equal(tx.serializedGasSponsorSignature.length > 0, true);
316
+ });
317
+ it('should build transaction with both sender and gas sponsor signatures', async function () {
318
+ const txBuilder = factory.getTransferBuilder();
319
+ txBuilder.sender(testData.sender.address);
320
+ txBuilder.recipients(testData.recipients);
321
+ txBuilder.paymentObjects(testData.paymentObjects);
322
+ txBuilder.gasData(testData.gasData);
323
+ txBuilder.gasSponsor(testData.gasSponsor.address);
324
+ const tx = (await txBuilder.build());
325
+ // Add both signatures
326
+ tx.addSignature(testData.testSignature.publicKey, testData.testSignature.signature);
327
+ tx.addGasSponsorSignature(testData.testGasSponsorSignature.publicKey, testData.testGasSponsorSignature.signature);
328
+ // Rebuild to trigger serialization
329
+ await tx.build();
330
+ should_1.default.exist(tx.serializedSignature);
331
+ should_1.default.exist(tx.serializedGasSponsorSignature);
332
+ tx.signature.length.should.equal(2);
333
+ });
334
+ it('should add signature through builder and serialize correctly', async function () {
335
+ const txBuilder = factory.getTransferBuilder();
336
+ txBuilder.sender(testData.sender.address);
337
+ txBuilder.recipients(testData.recipients);
338
+ txBuilder.paymentObjects(testData.paymentObjects);
339
+ txBuilder.gasData(testData.gasData);
340
+ // Add signature through builder
341
+ txBuilder.addSignature(testData.testSignature.publicKey, testData.testSignature.signature);
342
+ const tx = (await txBuilder.build());
343
+ should_1.default.exist(tx.serializedSignature);
344
+ should_1.default.equal(typeof tx.serializedSignature, 'string');
345
+ // Verify signature array is populated
346
+ tx.signature.length.should.equal(1);
347
+ });
348
+ it('should add gas sponsor signature through builder and serialize correctly', async function () {
349
+ const txBuilder = factory.getTransferBuilder();
350
+ txBuilder.sender(testData.sender.address);
351
+ txBuilder.recipients(testData.recipients);
352
+ txBuilder.paymentObjects(testData.paymentObjects);
353
+ txBuilder.gasData(testData.gasData);
354
+ txBuilder.gasSponsor(testData.gasSponsor.address);
355
+ // Add gas sponsor signature through builder
356
+ txBuilder.addGasSponsorSignature(testData.testGasSponsorSignature.publicKey, testData.testGasSponsorSignature.signature);
357
+ const tx = (await txBuilder.build());
358
+ should_1.default.exist(tx.serializedGasSponsorSignature);
359
+ should_1.default.equal(typeof tx.serializedGasSponsorSignature, 'string');
360
+ // Verify signature array is populated
361
+ tx.signature.length.should.equal(1);
362
+ });
363
+ it('should serialize signatures in correct order', async function () {
364
+ const txBuilder = factory.getTransferBuilder();
365
+ txBuilder.sender(testData.sender.address);
366
+ txBuilder.recipients(testData.recipients);
367
+ txBuilder.paymentObjects(testData.paymentObjects);
368
+ txBuilder.gasData(testData.gasData);
369
+ txBuilder.gasSponsor(testData.gasSponsor.address);
370
+ // Add signatures through builder
371
+ txBuilder.addSignature(testData.testSignature.publicKey, testData.testSignature.signature);
372
+ txBuilder.addGasSponsorSignature(testData.testGasSponsorSignature.publicKey, testData.testGasSponsorSignature.signature);
373
+ const tx = (await txBuilder.build());
374
+ // Verify signatures are in correct order: sender first, gas sponsor second
375
+ tx.signature.length.should.equal(2);
376
+ tx.signature[0].should.equal(tx.serializedSignature);
377
+ tx.signature[1].should.equal(tx.serializedGasSponsorSignature);
378
+ });
379
+ it('should fail to add invalid sender signature via builder', function () {
380
+ const txBuilder = factory.getTransferBuilder();
381
+ txBuilder.sender(testData.sender.address);
382
+ txBuilder.recipients(testData.recipients);
383
+ txBuilder.paymentObjects(testData.paymentObjects);
384
+ txBuilder.gasData(testData.gasData);
385
+ // Builder should validate and throw when adding invalid signature
386
+ (0, should_1.default)(() => txBuilder.addSignature({ pub: 'tooshort' }, testData.testSignature.signature)).throwError('Invalid transaction signature');
387
+ });
388
+ it('should fail to add invalid gas sponsor signature via builder', function () {
389
+ const txBuilder = factory.getTransferBuilder();
390
+ txBuilder.sender(testData.sender.address);
391
+ txBuilder.recipients(testData.recipients);
392
+ txBuilder.paymentObjects(testData.paymentObjects);
393
+ txBuilder.gasData(testData.gasData);
394
+ txBuilder.gasSponsor(testData.gasSponsor.address);
395
+ // Builder should validate and throw when adding invalid signature
396
+ (0, should_1.default)(() => txBuilder.addGasSponsorSignature(testData.testGasSponsorSignature.publicKey, Buffer.from('invalid'))).throwError('Invalid transaction signature');
397
+ });
398
+ });
399
+ });
400
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsaURBQTRDO0FBQzVDLHNDQUE4RTtBQUM5RSwrREFBaUQ7QUFDakQsbURBQXVEO0FBQ3ZELG1FQUEyQztBQUMzQywwREFBcUU7QUFFckUsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtJQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUVsRSxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN2QixFQUFFLENBQUMsK0NBQStDLEVBQUUsS0FBSztZQUN2RCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMvQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFbEQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBd0IsQ0FBQztZQUM1RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pE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QUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDbEQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRWxELGtFQUFrRTtZQUNsRSxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQ1YsU0FBUyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUNyRyxDQUFDLFVBQVUsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBUcmFuc2ZlclRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9pb3RhJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB1dGlscyBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7IE1BWF9HQVNfUEFZTUVOVF9PQkpFQ1RTIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9jb25zdGFudHMnO1xuXG5kZXNjcmliZSgnSW90YSBUcmFuc2ZlciBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0aW90YScpKTtcblxuICBkZXNjcmliZSgnU3VjY2VlZCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNmZXIgdHggd2l0aCBzaW11bGF0ZSBtb2RlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguc2VuZGVyLCB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaXNTaW11bGF0ZVR4LCB0cnVlKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgucmVjaXBpZW50cywgdGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnBheW1lbnRPYmplY3RzLCB0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gYXdhaXQgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0cmFuc2ZlciB0eCB3aXRoIGdhcyBkYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pc1NpbXVsYXRlVHgsIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNCdWRnZXQsIHRlc3REYXRhLkdBU19CVURHRVQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc1ByaWNlLCB0ZXN0RGF0YS5HQVNfUFJJQ0UpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5nYXNQYXltZW50T2JqZWN0cywgdGVzdERhdGEuZ2FzUGF5bWVudE9iamVjdHMpO1xuXG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiAodGVzdERhdGEuQU1PVU5UICsgdGVzdERhdGEuQU1PVU5UICogMikudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogJ3Rpb3RhJyxcbiAgICAgIH0pO1xuXG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rpb3RhJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0c1sxXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1sxXS5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogdGVzdERhdGEucmVjaXBpZW50c1sxXS5hbW91bnQsXG4gICAgICAgIGNvaW46ICd0aW90YScsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmF3VHggPSBhd2FpdCB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIHR4IHdpdGggZ2FzIHNwb25zb3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5nYXNTcG9uc29yKHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcyk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNTcG9uc29yLCB0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlzU2ltdWxhdGVUeCwgZmFsc2UpO1xuXG4gICAgICBjb25zdCByYXdUeCA9IGF3YWl0IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNmZXIgdHggd2l0aCBtdWx0aXBsZSByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYW1vdW50ID0gMTAwMDtcbiAgICAgIGNvbnN0IG51bWJlck9mUmVjaXBpZW50cyA9IDEwO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBuZXcgQXJyYXkobnVtYmVyT2ZSZWNpcGllbnRzKS5maWxsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzBdLFxuICAgICAgICBhbW91bnQ6IGFtb3VudC50b1N0cmluZygpLFxuICAgICAgfSk7XG5cbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiAoYW1vdW50ICogbnVtYmVyT2ZSZWNpcGllbnRzKS50b1N0cmluZygpLFxuICAgICAgICBjb2luOiAndGlvdGEnLFxuICAgICAgfSk7XG5cbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbChudW1iZXJPZlJlY2lwaWVudHMpO1xuICAgICAgdHgub3V0cHV0cy5mb3JFYWNoKChvdXRwdXQpID0+XG4gICAgICAgIG91dHB1dC5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sXG4gICAgICAgICAgdmFsdWU6IGFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgIGNvaW46ICd0aW90YScsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBmcm9tIEpTT04gYW5kIHJlYnVpbGQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgY29uc3QgcmVidWlsdFR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAocmVidWlsdFR4QnVpbGRlci50cmFuc2FjdGlvbiBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uKS5wYXJzZUZyb21KU09OKHR4SnNvbik7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSAoYXdhaXQgcmVidWlsdFR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4LnNlbmRlciwgdHguc2VuZGVyKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwocmVidWlsdFR4LnJlY2lwaWVudHMsIHR4LnJlY2lwaWVudHMpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJlYnVpbHRUeC5nYXNCdWRnZXQsIHR4Lmdhc0J1ZGdldCk7XG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4Lmdhc1ByaWNlLCB0eC5nYXNQcmljZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNlcmlhbGl6ZSB0byBicm9hZGNhc3QgZm9ybWF0IGNvbnNpc3RlbnRseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjEgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyMS5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyMS5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyMS5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIxLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4MSA9IChhd2FpdCB0eEJ1aWxkZXIxLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCByYXdUeDEgPSBhd2FpdCB0eDEudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlcjIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHgyID0gKGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHJhd1R4MiA9IGF3YWl0IHR4Mi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgxLCByYXdUeDIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4MS50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHR4IHdpdGggc2lnbmFibGUgcGF5bG9hZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pc1NpbXVsYXRlVHgsIGZhbHNlKTtcblxuICAgICAgY29uc3Qgc2lnbmFibGVQYXlsb2FkID0gdHguc2lnbmFibGVQYXlsb2FkO1xuICAgICAgc2hvdWxkLmV4aXN0KHNpZ25hYmxlUGF5bG9hZCk7XG4gICAgICBzaG91bGQuZXF1YWwoQnVmZmVyLmlzQnVmZmVyKHNpZ25hYmxlUGF5bG9hZCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25hYmxlUGF5bG9hZC5sZW5ndGgsIDMyKTsgLy8gQmxha2UyYiBoYXNoIGlzIDMyIGJ5dGVzXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRvSlNPTiBvdXRwdXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5zZW5kZXIsIHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnJlY2lwaWVudHMsIHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ucGF5bWVudE9iamVjdHMsIHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZ2FzQnVkZ2V0LCB0ZXN0RGF0YS5HQVNfQlVER0VUKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZ2FzUHJpY2UsIHRlc3REYXRhLkdBU19QUklDRSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5nYXNQYXltZW50T2JqZWN0cywgdGVzdERhdGEuZ2FzUGF5bWVudE9iamVjdHMpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGYWlsJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCBzZW5kZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnNlbmRlcigncmFuZG9tU3RyaW5nJykpLnRocm93RXJyb3IoJ0ludmFsaWQgYWRkcmVzcyByYW5kb21TdHJpbmcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCByZWNpcGllbnQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIucmVjaXBpZW50cyhbeyBhZGRyZXNzOiAnaW52YWxpZEFkZHJlc3MnLCBhbW91bnQ6ICcxMDAwJyB9XSkpLnRocm93RXJyb3IoXG4gICAgICAgICdJbnZhbGlkIGFkZHJlc3MgaW52YWxpZEFkZHJlc3MnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIHJlY2lwaWVudCBhbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnJlY2lwaWVudHMoW3sgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzBdLCBhbW91bnQ6ICctMTAwMCcgfV0pKS50aHJvd0Vycm9yKFxuICAgICAgICAnVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgZW1wdHkgcmVjaXBpZW50cyBkdXJpbmcgYnVpbGQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGJ1aWxkZXIucmVjaXBpZW50cyhbXSk7XG4gICAgICBidWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIGJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBlbXB0eSBwYXltZW50IG9iamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnBheW1lbnRPYmplY3RzKFtdKSkudGhyb3dFcnJvcignTm8gT2JqZWN0cyBwcm92aWRlZCBmb3IgcGF5bWVudCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdoZW4gZ2FzIHBheW1lbnQgb2JqZWN0cyBleGNlZWQgbWF4aW11bScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgYnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgYnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG5cbiAgICAgIGNvbnN0IHRvb01hbnlHYXNPYmplY3RzID0gdGVzdERhdGEuZ2VuZXJhdGVPYmplY3RzKE1BWF9HQVNfUEFZTUVOVF9PQkpFQ1RTICsgMSk7XG4gICAgICBidWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICBnYXNCdWRnZXQ6IHRlc3REYXRhLkdBU19CVURHRVQsXG4gICAgICAgIGdhc1ByaWNlOiB0ZXN0RGF0YS5HQVNfUFJJQ0UsXG4gICAgICAgIGdhc1BheW1lbnRPYmplY3RzOiB0b29NYW55R2FzT2JqZWN0cyxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgd2l0aG91dCBzZW5kZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIGJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgYnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgd2l0aG91dCByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBidWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIGJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIHdpdGhvdXQgcGF5bWVudCBvYmplY3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBidWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICBidWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBnZXQgc2lnbmFibGUgcGF5bG9hZCBmb3Igc2ltdWxhdGUgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIGJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwodHguaXNTaW11bGF0ZVR4LCB0cnVlKTtcblxuICAgICAgc2hvdWxkKCgpID0+IHR4LnNpZ25hYmxlUGF5bG9hZCkudGhyb3dFcnJvcignQ2Fubm90IHNpZ24gYSBzaW11bGF0ZSB0eCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdoZW4gcGF5bWVudCBhbmQgZ2FzIHBheW1lbnQgb2JqZWN0cyBvdmVybGFwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBidWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICAvLyBVc2Ugc2FtZSBvYmplY3RzIGZvciBwYXltZW50IGFuZCBnYXNcbiAgICAgIGJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEuZ2FzUGF5bWVudE9iamVjdHMpO1xuICAgICAgYnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gcGFyc2UgaW52YWxpZCByYXcgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQoKCkgPT4gZmFjdG9yeS5mcm9tKCdpbnZhbGlkUmF3VHJhbnNhY3Rpb24nKSkudGhyb3dFcnJvcigpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gU2lnbmluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHRyYW5zYWN0aW9uIHdpdGggc2VuZGVyIHNpZ25hdHVyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgLy8gQWRkIHNpZ25hdHVyZVxuICAgICAgdHguYWRkU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RTaWduYXR1cmUucHVibGljS2V5LCB0ZXN0RGF0YS50ZXN0U2lnbmF0dXJlLnNpZ25hdHVyZSk7XG5cbiAgICAgIC8vIFJlYnVpbGQgdG8gdHJpZ2dlciBzZXJpYWxpemF0aW9uXG4gICAgICBhd2FpdCB0eC5idWlsZCgpO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHguc2VyaWFsaXplZFNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQuZXF1YWwodHguc2VyaWFsaXplZFNpZ25hdHVyZSEubGVuZ3RoID4gMCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHRyYW5zYWN0aW9uIHdpdGggZ2FzIHNwb25zb3Igc2lnbmF0dXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzU3BvbnNvcih0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgLy8gQWRkIGdhcyBzcG9uc29yIHNpZ25hdHVyZVxuICAgICAgdHguYWRkR2FzU3BvbnNvclNpZ25hdHVyZSh0ZXN0RGF0YS50ZXN0R2FzU3BvbnNvclNpZ25hdHVyZS5wdWJsaWNLZXksIHRlc3REYXRhLnRlc3RHYXNTcG9uc29yU2lnbmF0dXJlLnNpZ25hdHVyZSk7XG5cbiAgICAgIC8vIFJlYnVpbGQgdG8gdHJpZ2dlciBzZXJpYWxpemF0aW9uXG4gICAgICBhd2FpdCB0eC5idWlsZCgpO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHguc2VyaWFsaXplZEdhc1Nwb25zb3JTaWduYXR1cmUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlcmlhbGl6ZWRHYXNTcG9uc29yU2lnbmF0dXJlIS5sZW5ndGggPiAwLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgdHJhbnNhY3Rpb24gd2l0aCBib3RoIHNlbmRlciBhbmQgZ2FzIHNwb25zb3Igc2lnbmF0dXJlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgdHhCdWlsZGVyLmdhc1Nwb25zb3IodGVzdERhdGEuZ2FzU3BvbnNvci5hZGRyZXNzKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIC8vIEFkZCBib3RoIHNpZ25hdHVyZXNcbiAgICAgIHR4LmFkZFNpZ25hdHVyZSh0ZXN0RGF0YS50ZXN0U2lnbmF0dXJlLnB1YmxpY0tleSwgdGVzdERhdGEudGVzdFNpZ25hdHVyZS5zaWduYXR1cmUpO1xuICAgICAgdHguYWRkR2FzU3BvbnNvclNpZ25hdHVyZSh0ZXN0RGF0YS50ZXN0R2FzU3BvbnNvclNpZ25hdHVyZS5wdWJsaWNLZXksIHRlc3REYXRhLnRlc3RHYXNTcG9uc29yU2lnbmF0dXJlLnNpZ25hdHVyZSk7XG5cbiAgICAgIC8vIFJlYnVpbGQgdG8gdHJpZ2dlciBzZXJpYWxpemF0aW9uXG4gICAgICBhd2FpdCB0eC5idWlsZCgpO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHguc2VyaWFsaXplZFNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQuZXhpc3QodHguc2VyaWFsaXplZEdhc1Nwb25zb3JTaWduYXR1cmUpO1xuICAgICAgdHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFkZCBzaWduYXR1cmUgdGhyb3VnaCBidWlsZGVyIGFuZCBzZXJpYWxpemUgY29ycmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIC8vIEFkZCBzaWduYXR1cmUgdGhyb3VnaCBidWlsZGVyXG4gICAgICB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RTaWduYXR1cmUucHVibGljS2V5LCB0ZXN0RGF0YS50ZXN0U2lnbmF0dXJlLnNpZ25hdHVyZSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHguc2VyaWFsaXplZFNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQuZXF1YWwodHlwZW9mIHR4LnNlcmlhbGl6ZWRTaWduYXR1cmUsICdzdHJpbmcnKTtcbiAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUgYXJyYXkgaXMgcG9wdWxhdGVkXG4gICAgICB0eC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWRkIGdhcyBzcG9uc29yIHNpZ25hdHVyZSB0aHJvdWdoIGJ1aWxkZXIgYW5kIHNlcmlhbGl6ZSBjb3JyZWN0bHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5nYXNTcG9uc29yKHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcyk7XG5cbiAgICAgIC8vIEFkZCBnYXMgc3BvbnNvciBzaWduYXR1cmUgdGhyb3VnaCBidWlsZGVyXG4gICAgICB0eEJ1aWxkZXIuYWRkR2FzU3BvbnNvclNpZ25hdHVyZShcbiAgICAgICAgdGVzdERhdGEudGVzdEdhc1Nwb25zb3JTaWduYXR1cmUucHVibGljS2V5LFxuICAgICAgICB0ZXN0RGF0YS50ZXN0R2FzU3BvbnNvclNpZ25hdHVyZS5zaWduYXR1cmVcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHguc2VyaWFsaXplZEdhc1Nwb25zb3JTaWduYXR1cmUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR5cGVvZiB0eC5zZXJpYWxpemVkR2FzU3BvbnNvclNpZ25hdHVyZSwgJ3N0cmluZycpO1xuICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZSBhcnJheSBpcyBwb3B1bGF0ZWRcbiAgICAgIHR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXJpYWxpemUgc2lnbmF0dXJlcyBpbiBjb3JyZWN0IG9yZGVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzU3BvbnNvcih0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpO1xuXG4gICAgICAvLyBBZGQgc2lnbmF0dXJlcyB0aHJvdWdoIGJ1aWxkZXJcbiAgICAgIHR4QnVpbGRlci5hZGRTaWduYXR1cmUodGVzdERhdGEudGVzdFNpZ25hdHVyZS5wdWJsaWNLZXksIHRlc3REYXRhLnRlc3RTaWduYXR1cmUuc2lnbmF0dXJlKTtcbiAgICAgIHR4QnVpbGRlci5hZGRHYXNTcG9uc29yU2lnbmF0dXJlKFxuICAgICAgICB0ZXN0RGF0YS50ZXN0R2FzU3BvbnNvclNpZ25hdHVyZS5wdWJsaWNLZXksXG4gICAgICAgIHRlc3REYXRhLnRlc3RHYXNTcG9uc29yU2lnbmF0dXJlLnNpZ25hdHVyZVxuICAgICAgKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmVzIGFyZSBpbiBjb3JyZWN0IG9yZGVyOiBzZW5kZXIgZmlyc3QsIGdhcyBzcG9uc29yIHNlY29uZFxuICAgICAgdHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICB0eC5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKHR4LnNlcmlhbGl6ZWRTaWduYXR1cmUpO1xuICAgICAgdHguc2lnbmF0dXJlWzFdLnNob3VsZC5lcXVhbCh0eC5zZXJpYWxpemVkR2FzU3BvbnNvclNpZ25hdHVyZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYWRkIGludmFsaWQgc2VuZGVyIHNpZ25hdHVyZSB2aWEgYnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICAvLyBCdWlsZGVyIHNob3VsZCB2YWxpZGF0ZSBhbmQgdGhyb3cgd2hlbiBhZGRpbmcgaW52YWxpZCBzaWduYXR1cmVcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiAndG9vc2hvcnQnIH0sIHRlc3REYXRhLnRlc3RTaWduYXR1cmUuc2lnbmF0dXJlKSkudGhyb3dFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb24gc2lnbmF0dXJlJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBhZGQgaW52YWxpZCBnYXMgc3BvbnNvciBzaWduYXR1cmUgdmlhIGJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5nYXNTcG9uc29yKHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcyk7XG5cbiAgICAgIC8vIEJ1aWxkZXIgc2hvdWxkIHZhbGlkYXRlIGFuZCB0aHJvdyB3aGVuIGFkZGluZyBpbnZhbGlkIHNpZ25hdHVyZVxuICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgIHR4QnVpbGRlci5hZGRHYXNTcG9uc29yU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RHYXNTcG9uc29yU2lnbmF0dXJlLnB1YmxpY0tleSwgQnVmZmVyLmZyb20oJ2ludmFsaWQnKSlcbiAgICAgICkudGhyb3dFcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbiBzaWduYXR1cmUnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transferTransaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transferTransaction.d.ts","sourceRoot":"","sources":["../../../test/unit/transferTransaction.ts"],"names":[],"mappings":""}