@bitgo/sdk-coin-eth 25.3.2 → 25.3.4

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 (74) hide show
  1. package/dist/test/fixtures/eth.d.ts +39 -0
  2. package/dist/test/fixtures/eth.d.ts.map +1 -0
  3. package/dist/test/fixtures/eth.js +262 -0
  4. package/dist/test/resources/erc1155Abi.d.ts +40 -0
  5. package/dist/test/resources/erc1155Abi.d.ts.map +1 -0
  6. package/dist/test/resources/erc1155Abi.js +329 -0
  7. package/dist/test/resources/erc721Abi.d.ts +12 -0
  8. package/dist/test/resources/erc721Abi.d.ts.map +1 -0
  9. package/dist/test/resources/erc721Abi.js +34 -0
  10. package/dist/test/resources/eth.d.ts +51 -0
  11. package/dist/test/resources/eth.d.ts.map +1 -0
  12. package/dist/test/resources/eth.js +72 -0
  13. package/dist/test/resources/nftEncodings.d.ts +4 -0
  14. package/dist/test/resources/nftEncodings.d.ts.map +1 -0
  15. package/dist/test/resources/nftEncodings.js +7 -0
  16. package/dist/test/resources/walletSimpleAbi.d.ts +12 -0
  17. package/dist/test/resources/walletSimpleAbi.d.ts.map +1 -0
  18. package/dist/test/resources/walletSimpleAbi.js +44 -0
  19. package/dist/test/unit/eth.d.ts +2 -0
  20. package/dist/test/unit/eth.d.ts.map +1 -0
  21. package/dist/test/unit/eth.js +1171 -0
  22. package/dist/test/unit/ethWallet.d.ts +2 -0
  23. package/dist/test/unit/ethWallet.d.ts.map +1 -0
  24. package/dist/test/unit/ethWallet.js +472 -0
  25. package/dist/test/unit/fixtures/ethMultiSigBackupKey.d.ts +4 -0
  26. package/dist/test/unit/fixtures/ethMultiSigBackupKey.d.ts.map +1 -0
  27. package/dist/test/unit/fixtures/ethMultiSigBackupKey.js +10 -0
  28. package/dist/test/unit/fixtures/ethTssBackupKey.d.ts +5 -0
  29. package/dist/test/unit/fixtures/ethTssBackupKey.d.ts.map +1 -0
  30. package/dist/test/unit/fixtures/ethTssBackupKey.js +25 -0
  31. package/dist/test/unit/getBuilder.d.ts +3 -0
  32. package/dist/test/unit/getBuilder.d.ts.map +1 -0
  33. package/dist/test/unit/getBuilder.js +10 -0
  34. package/dist/test/unit/keyPair.d.ts +2 -0
  35. package/dist/test/unit/keyPair.d.ts.map +1 -0
  36. package/dist/test/unit/keyPair.js +175 -0
  37. package/dist/test/unit/transaction.d.ts +2 -0
  38. package/dist/test/unit/transaction.d.ts.map +1 -0
  39. package/dist/test/unit/transaction.js +96 -0
  40. package/dist/test/unit/transactionBuilder/addressInitialization.d.ts +2 -0
  41. package/dist/test/unit/transactionBuilder/addressInitialization.d.ts.map +1 -0
  42. package/dist/test/unit/transactionBuilder/addressInitialization.js +101 -0
  43. package/dist/test/unit/transactionBuilder/contractCall.d.ts +2 -0
  44. package/dist/test/unit/transactionBuilder/contractCall.d.ts.map +1 -0
  45. package/dist/test/unit/transactionBuilder/contractCall.js +101 -0
  46. package/dist/test/unit/transactionBuilder/flushCoins.d.ts +2 -0
  47. package/dist/test/unit/transactionBuilder/flushCoins.d.ts.map +1 -0
  48. package/dist/test/unit/transactionBuilder/flushCoins.js +133 -0
  49. package/dist/test/unit/transactionBuilder/flushTokens.d.ts +2 -0
  50. package/dist/test/unit/transactionBuilder/flushTokens.d.ts.map +1 -0
  51. package/dist/test/unit/transactionBuilder/flushTokens.js +281 -0
  52. package/dist/test/unit/transactionBuilder/send.d.ts +2 -0
  53. package/dist/test/unit/transactionBuilder/send.d.ts.map +1 -0
  54. package/dist/test/unit/transactionBuilder/send.js +331 -0
  55. package/dist/test/unit/transactionBuilder/sendNFT.d.ts +2 -0
  56. package/dist/test/unit/transactionBuilder/sendNFT.d.ts.map +1 -0
  57. package/dist/test/unit/transactionBuilder/sendNFT.js +250 -0
  58. package/dist/test/unit/transactionBuilder/singleSigSend.d.ts +2 -0
  59. package/dist/test/unit/transactionBuilder/singleSigSend.d.ts.map +1 -0
  60. package/dist/test/unit/transactionBuilder/singleSigSend.js +196 -0
  61. package/dist/test/unit/transactionBuilder/walletInitialization.d.ts +2 -0
  62. package/dist/test/unit/transactionBuilder/walletInitialization.d.ts.map +1 -0
  63. package/dist/test/unit/transactionBuilder/walletInitialization.js +423 -0
  64. package/dist/test/unit/transferBuilder.d.ts +2 -0
  65. package/dist/test/unit/transferBuilder.d.ts.map +1 -0
  66. package/dist/test/unit/transferBuilder.js +124 -0
  67. package/dist/test/unit/utils.d.ts +2 -0
  68. package/dist/test/unit/utils.d.ts.map +1 -0
  69. package/dist/test/unit/utils.js +74 -0
  70. package/dist/tsconfig.tsbuildinfo +1 -0
  71. package/package.json +11 -8
  72. package/.eslintignore +0 -5
  73. package/.mocharc.yml +0 -8
  74. package/CHANGELOG.md +0 -1858
@@ -0,0 +1,423 @@
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 assert_1 = __importDefault(require("assert"));
40
+ const should_1 = __importDefault(require("should"));
41
+ const sdk_core_1 = require("@bitgo/sdk-core");
42
+ const src_1 = require("../../../src");
43
+ const testData = __importStar(require("../../resources/eth"));
44
+ const getBuilder_1 = require("../getBuilder");
45
+ describe('Eth Transaction builder wallet initialization', function () {
46
+ const sourcePrv = 'xprv9s21ZrQH143K3D8TXfvAJgHVfTEeQNW5Ys9wZtnUZkqPzFzSjbEJrWC1vZ4GnXCvR7rQL2UFX3RSuYeU9MrERm1XBvACow7c36vnz5iYyj2';
47
+ const pub1 = 'xpub661MyMwAqRbcGpyL5QvWah4XZYHuTK21mSQ4NVwYaX67A35Kzb42nmTdf2WArW4tettXrWpfpwFbEFdEVqcSvnHLB8F6p1D41ssmbnRMXpc';
48
+ const pub2 = 'xpub661MyMwAqRbcFWzoz8qnYRDYEFQpPLYwxVFoG6WLy3ck5ZupRGJTG4ju6yGb7Dj3ey6GsC4kstLRER2nKzgjLtmxyPgC4zHy7kVhUt6yfGn';
49
+ const defaultKeyPair = new src_1.KeyPair({
50
+ prv: 'FAC4D04AA0025ECF200D74BC9B5E4616E4B8338B69B61362AAAD49F76E68EF28',
51
+ });
52
+ const buildTransaction = async function (details) {
53
+ const txBuilder = (0, getBuilder_1.getBuilder)('teth');
54
+ if (details.type !== undefined) {
55
+ txBuilder.type(details.type);
56
+ }
57
+ if (details.fee !== undefined) {
58
+ txBuilder.fee(details.fee);
59
+ }
60
+ if (details.counter !== undefined) {
61
+ txBuilder.counter(details.counter);
62
+ }
63
+ if (details.owners !== undefined) {
64
+ for (const owner of details.owners) {
65
+ txBuilder.owner(owner);
66
+ }
67
+ }
68
+ return await txBuilder.build();
69
+ };
70
+ describe('should build', () => {
71
+ it('a wallet initialization transaction', async () => {
72
+ const tx = await buildTransaction({
73
+ type: sdk_core_1.TransactionType.WalletInitialization,
74
+ fee: {
75
+ fee: '10',
76
+ gasLimit: '1000',
77
+ },
78
+ source: new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
79
+ owners: [
80
+ new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
81
+ new src_1.KeyPair({ pub: pub1 }).getAddress(),
82
+ new src_1.KeyPair({ pub: pub2 }).getAddress(),
83
+ ],
84
+ counter: 1,
85
+ });
86
+ tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
87
+ const txJson = tx.toJson();
88
+ txJson.gasLimit.should.equal('1000');
89
+ txJson._type.should.equals(src_1.ETHTransactionType.LEGACY);
90
+ txJson.gasPrice.should.equal('10');
91
+ should_1.default.equal(txJson.nonce, 1);
92
+ should_1.default.equal(txJson.chainId, 42);
93
+ should_1.default.equal(txJson.v, '0x77');
94
+ });
95
+ it('a wallet initialization transaction with nonce 0', async () => {
96
+ const tx = await buildTransaction({
97
+ type: sdk_core_1.TransactionType.WalletInitialization,
98
+ fee: {
99
+ fee: '10',
100
+ gasLimit: '1000',
101
+ },
102
+ owners: [
103
+ new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
104
+ new src_1.KeyPair({ pub: pub1 }).getAddress(),
105
+ new src_1.KeyPair({ pub: pub2 }).getAddress(),
106
+ ],
107
+ counter: 0,
108
+ });
109
+ tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
110
+ const txJson = tx.toJson();
111
+ txJson.gasLimit.should.equal('1000');
112
+ txJson._type.should.equals(src_1.ETHTransactionType.LEGACY);
113
+ txJson.gasPrice.should.equal('10');
114
+ should_1.default.equal(txJson.nonce, 0);
115
+ should_1.default.equal(txJson.chainId, 42);
116
+ should_1.default.equal(txJson.v, '0x77');
117
+ });
118
+ it('an unsigned init transaction from serialized with 0-prefixed address', async () => {
119
+ const txBuilder = (0, getBuilder_1.getBuilder)('eth');
120
+ txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
121
+ txBuilder.counter(1);
122
+ txBuilder.fee({
123
+ fee: '10000000000',
124
+ gasLimit: '2000000',
125
+ });
126
+ txBuilder.owner('0x6461EC4E9dB87CFE2aeEc7d9b02Aa264edFbf41f');
127
+ txBuilder.owner('0xf10C8f42BD63D0AeD3338A6B2b661BC6D9fa7C44');
128
+ txBuilder.owner('0x07ee8b845b8bf0e807e096d6b1599b121b82cbe1');
129
+ const tx = await txBuilder.build();
130
+ const serialized = tx.toBroadcastFormat();
131
+ // now rebuild from the signed serialized tx and make sure it stays the same
132
+ const newTxBuilder = (0, getBuilder_1.getBuilder)('eth');
133
+ newTxBuilder.from(serialized);
134
+ const newTx = await newTxBuilder.build();
135
+ should_1.default.equal(newTx.toBroadcastFormat(), serialized);
136
+ });
137
+ it('an unsigned init transaction from serialized', async () => {
138
+ const txBuilder = (0, getBuilder_1.getBuilder)('eth');
139
+ txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
140
+ txBuilder.counter(1);
141
+ txBuilder.fee({
142
+ fee: '10000000000',
143
+ gasLimit: '2000000',
144
+ });
145
+ txBuilder.owner('0x6461EC4E9dB87CFE2aeEc7d9b02Aa264edFbf41f');
146
+ txBuilder.owner('0xf10C8f42BD63D0AeD3338A6B2b661BC6D9fa7C44');
147
+ txBuilder.owner('0xa4b5666FB4fFEA84Dd848845E1114b84146de4b3');
148
+ const tx = await txBuilder.build();
149
+ const serialized = tx.toBroadcastFormat();
150
+ // now rebuild from the signed serialized tx and make sure it stays the same
151
+ const newTxBuilder = (0, getBuilder_1.getBuilder)('eth');
152
+ newTxBuilder.from(serialized);
153
+ const newTx = await newTxBuilder.build();
154
+ should_1.default.equal(newTx.toBroadcastFormat(), serialized);
155
+ });
156
+ it('a signed init transaction from serialized', async () => {
157
+ const txBuilder = (0, getBuilder_1.getBuilder)('teth');
158
+ txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
159
+ txBuilder.counter(1);
160
+ txBuilder.fee({
161
+ fee: '10000000000',
162
+ gasLimit: '2000000',
163
+ });
164
+ txBuilder.owner('0x6461EC4E9dB87CFE2aeEc7d9b02Aa264edFbf41f');
165
+ txBuilder.owner('0xf10C8f42BD63D0AeD3338A6B2b661BC6D9fa7C44');
166
+ txBuilder.owner('0xa4b5666FB4fFEA84Dd848845E1114b84146de4b3');
167
+ txBuilder.sign({ key: defaultKeyPair.getKeys().prv });
168
+ const tx = await txBuilder.build();
169
+ const serialized = tx.toBroadcastFormat();
170
+ // now rebuild from the signed serialized tx and make sure it stays the same
171
+ const newTxBuilder = (0, getBuilder_1.getBuilder)('teth');
172
+ newTxBuilder.from(serialized);
173
+ const newTx = await newTxBuilder.build();
174
+ should_1.default.equal(newTx.toBroadcastFormat(), serialized);
175
+ should_1.default.equal(newTx.id, '0xef04334f21ba844100b9aee6485f14afe177e88308ad2b8c1b0878576a31d47b');
176
+ const txJson = newTx.toJson();
177
+ should_1.default.exist(txJson.v);
178
+ should_1.default.exist(txJson.r);
179
+ should_1.default.exist(txJson.s);
180
+ should_1.default.exist(txJson.from);
181
+ });
182
+ it('correct transaction id', async () => {
183
+ const newTxBuilder = (0, getBuilder_1.getBuilder)('eth');
184
+ newTxBuilder.from(testData.WALLET_INITIALIZATION);
185
+ const newTx = await newTxBuilder.build();
186
+ should_1.default.equal(newTx.toJson().id, '0xc65f9802df3b559b297779ec06d3e71ba7f5b1b47cc961ad2efba54d82347bec');
187
+ });
188
+ });
189
+ describe('should fail to build', () => {
190
+ it('an unsupported type of transaction', async () => {
191
+ await buildTransaction({
192
+ type: sdk_core_1.TransactionType.AccountUpdate,
193
+ fee: {
194
+ fee: '10',
195
+ gasLimit: '10',
196
+ },
197
+ source: new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
198
+ counter: 0,
199
+ }).should.be.rejectedWith('Unsupported transaction type');
200
+ });
201
+ it('a transaction without fee', async () => {
202
+ await buildTransaction({
203
+ source: new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
204
+ counter: 0,
205
+ }).should.be.rejectedWith('Invalid transaction: missing fee');
206
+ });
207
+ it('a wallet initialization the wrong number of owners', async () => {
208
+ await buildTransaction({
209
+ type: sdk_core_1.TransactionType.WalletInitialization,
210
+ fee: {
211
+ fee: '10',
212
+ gasLimit: '10',
213
+ },
214
+ source: new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
215
+ owners: [new src_1.KeyPair({ pub: pub1 }).getAddress(), new src_1.KeyPair({ pub: pub2 }).getAddress()],
216
+ counter: 0,
217
+ }).should.be.rejectedWith('Invalid transaction: wrong number of owners -- required: 3, found: 2');
218
+ await buildTransaction({
219
+ type: sdk_core_1.TransactionType.WalletInitialization,
220
+ fee: {
221
+ fee: '10',
222
+ gasLimit: '10',
223
+ },
224
+ source: new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
225
+ owners: [
226
+ new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
227
+ new src_1.KeyPair({ pub: pub1 }).getAddress(),
228
+ new src_1.KeyPair({ pub: pub1 }).getAddress(),
229
+ new src_1.KeyPair({ pub: pub2 }).getAddress(),
230
+ ],
231
+ counter: 0,
232
+ }).should.be.rejectedWith('Repeated owner address: ' + new src_1.KeyPair({ pub: pub1 }).getAddress());
233
+ await buildTransaction({
234
+ type: sdk_core_1.TransactionType.WalletInitialization,
235
+ fee: {
236
+ fee: '10',
237
+ gasLimit: '10',
238
+ },
239
+ source: new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
240
+ owners: [],
241
+ counter: 0,
242
+ }).should.be.rejectedWith('Invalid transaction: wrong number of owners -- required: 3, found: 0');
243
+ });
244
+ it('a transaction with invalid counter', async () => {
245
+ await buildTransaction({
246
+ fee: {
247
+ fee: '10',
248
+ gasLimit: '10',
249
+ },
250
+ source: new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
251
+ counter: -1,
252
+ owners: [
253
+ new src_1.KeyPair({ prv: sourcePrv }).getAddress(),
254
+ new src_1.KeyPair({ pub: pub1 }).getAddress(),
255
+ new src_1.KeyPair({ pub: pub2 }).getAddress(),
256
+ ],
257
+ }).should.be.rejectedWith('Invalid counter: -1');
258
+ });
259
+ });
260
+ describe('should fail to sign', () => {
261
+ it('a wallet initialization transaction without owners', () => {
262
+ const txBuilder = (0, getBuilder_1.getBuilder)('eth');
263
+ txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
264
+ txBuilder.fee({
265
+ fee: '10',
266
+ gasLimit: '1000',
267
+ });
268
+ txBuilder.counter(1);
269
+ assert_1.default.throws(() => txBuilder.sign({ key: defaultKeyPair.getKeys().prv }));
270
+ });
271
+ it('a signed wallet initialization transaction', () => {
272
+ const txBuilder = (0, getBuilder_1.getBuilder)('eth');
273
+ txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
274
+ txBuilder.fee({
275
+ fee: '10',
276
+ gasLimit: '1000',
277
+ });
278
+ txBuilder.counter(1);
279
+ txBuilder.owner(new src_1.KeyPair({ pub: pub1 }).getAddress());
280
+ txBuilder.owner(new src_1.KeyPair({ pub: pub2 }).getAddress());
281
+ txBuilder.owner(new src_1.KeyPair({ prv: sourcePrv }).getAddress());
282
+ txBuilder.sign({ key: defaultKeyPair.getKeys().prv });
283
+ assert_1.default.throws(() => txBuilder.sign({ key: defaultKeyPair.getKeys().prv }), new RegExp('Cannot sign multiple times a non send-type transaction'));
284
+ });
285
+ });
286
+ describe('should validate', () => {
287
+ it('an address', async () => {
288
+ const txBuilder = (0, getBuilder_1.getBuilder)('eth');
289
+ txBuilder.validateAddress(testData.VALID_ADDRESS);
290
+ assert_1.default.throws(() => txBuilder.validateAddress(testData.INVALID_ADDRESS), new RegExp('Invalid address ' + testData.INVALID_ADDRESS.address));
291
+ });
292
+ it('value should be greater than zero', () => {
293
+ const txBuilder = (0, getBuilder_1.getBuilder)('eth');
294
+ assert_1.default.throws(() => txBuilder.fee({ fee: '-10' }));
295
+ should_1.default.doesNotThrow(() => txBuilder.fee({ fee: '10' }));
296
+ });
297
+ it('a private key', () => {
298
+ const txBuilder = (0, getBuilder_1.getBuilder)('eth');
299
+ assert_1.default.throws(() => txBuilder.validateKey({ key: 'abc' }), /Invalid key/);
300
+ assert_1.default.throws(() => txBuilder.validateKey({ key: testData.PUBLIC_KEY }), /Invalid key/);
301
+ should_1.default.doesNotThrow(() => txBuilder.validateKey({ key: testData.PRIVATE_KEY }));
302
+ });
303
+ it('a raw transaction', async () => {
304
+ const builder = (0, getBuilder_1.getBuilder)('eth');
305
+ should_1.default.doesNotThrow(() => builder.from(testData.TX_BROADCAST));
306
+ should_1.default.doesNotThrow(() => builder.from(testData.TX_JSON));
307
+ assert_1.default.throws(() => builder.from('0x00001000'), /There was error in decoding the hex string/);
308
+ assert_1.default.throws(() => builder.from(''), /Raw transaction is empty/);
309
+ assert_1.default.throws(() => builder.from('pqrs'), /There was error in parsing the JSON string/);
310
+ assert_1.default.throws(() => builder.from(1234), /Transaction is not a hex string or stringified json/);
311
+ });
312
+ it('a transaction to build', async () => {
313
+ const txBuilder = (0, getBuilder_1.getBuilder)('eth');
314
+ txBuilder.counter(undefined);
315
+ txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
316
+ assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing fee/);
317
+ txBuilder.fee({
318
+ fee: '10',
319
+ gasLimit: '1000',
320
+ });
321
+ assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing address counter/);
322
+ assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing address counter/);
323
+ const source = {
324
+ prv: sourcePrv,
325
+ };
326
+ const sourceKeyPair = new src_1.KeyPair(source);
327
+ assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing address counter/);
328
+ txBuilder.counter(1);
329
+ assert_1.default.throws(() => txBuilder.validateTransaction(), /wrong number of owners -- required: 3, found: 0/);
330
+ txBuilder.owner(sourceKeyPair.getAddress());
331
+ assert_1.default.throws(() => txBuilder.validateTransaction(), /wrong number of owners -- required: 3, found: 1/);
332
+ txBuilder.owner(new src_1.KeyPair({ pub: pub1 }).getAddress());
333
+ assert_1.default.throws(() => txBuilder.validateTransaction(), /wrong number of owners -- required: 3, found: 2/);
334
+ txBuilder.owner(new src_1.KeyPair({ pub: pub2 }).getAddress());
335
+ should_1.default.doesNotThrow(() => txBuilder.validateTransaction());
336
+ });
337
+ });
338
+ describe('set owner', () => {
339
+ it('should be wallet initializaion', () => {
340
+ const txBuilder = (0, getBuilder_1.getBuilder)('eth');
341
+ txBuilder.type(sdk_core_1.TransactionType.Send);
342
+ const sourceKeyPair = new src_1.KeyPair({ prv: sourcePrv });
343
+ assert_1.default.throws(() => txBuilder.owner(sourceKeyPair.getAddress()), new RegExp('Multisig wallet owner can only be set for initialization transactions'));
344
+ });
345
+ it('should be only 3 owners', () => {
346
+ const txBuilder = (0, getBuilder_1.getBuilder)('eth');
347
+ txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
348
+ txBuilder.fee({
349
+ fee: '10',
350
+ gasLimit: '1000',
351
+ });
352
+ const sourceKeyPair = new src_1.KeyPair({ prv: sourcePrv });
353
+ txBuilder.counter(1);
354
+ txBuilder.owner(sourceKeyPair.getAddress());
355
+ txBuilder.owner('0x7325A3F7d4f9E86AE62Cf742426078C3755730d5');
356
+ txBuilder.owner('0x603e077acd3F01e81b95fB92ce42FF60dFf3D4C7');
357
+ assert_1.default.throws(() => txBuilder.owner('0x1A88Ee4Bc80BE080fC91AC472Af2F59260695060'), new RegExp('A maximum of 3 owners can be set for a multisig wallet'));
358
+ });
359
+ it('should be a valid address', () => {
360
+ const txBuilder = (0, getBuilder_1.getBuilder)('eth');
361
+ txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
362
+ txBuilder.fee({
363
+ fee: '10',
364
+ gasLimit: '1000',
365
+ });
366
+ txBuilder.counter(1);
367
+ assert_1.default.throws(() => txBuilder.owner('0x7325A3F7d4f9E86AE62C'), /Invalid address/);
368
+ });
369
+ });
370
+ it('Should getting same tx hash from raw tx', async function () {
371
+ const txBuilder = (0, getBuilder_1.getBuilder)('eth');
372
+ txBuilder.fee({
373
+ fee: '280000000000',
374
+ gasLimit: '7000000',
375
+ });
376
+ txBuilder.counter(1);
377
+ txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
378
+ txBuilder.owner(new src_1.KeyPair({ pub: pub1 }).getAddress());
379
+ txBuilder.owner(new src_1.KeyPair({ pub: pub2 }).getAddress());
380
+ txBuilder.owner(new src_1.KeyPair({ prv: sourcePrv }).getAddress());
381
+ txBuilder.sign({ key: defaultKeyPair.getKeys().prv });
382
+ const tx = await txBuilder.build();
383
+ const txBuiderFromRaw = (0, getBuilder_1.getBuilder)('eth');
384
+ txBuiderFromRaw.from(tx.toBroadcastFormat());
385
+ const txFromRaw = await txBuiderFromRaw.build();
386
+ should_1.default.deepEqual(tx.id, txFromRaw.id);
387
+ });
388
+ describe('Recovery Wallet', function () {
389
+ it('should build and sign using txHex', async () => {
390
+ const txBuilder = (0, getBuilder_1.getBuilder)('gteth');
391
+ const txHex = testData.RECOVERY_WALLET_DEPLOYMENT_TXHEX;
392
+ txBuilder.from(txHex);
393
+ const xpriv = 'xprv9s21ZrQH143K2YKSzZa2fv7QTzZ5Ui45ZUzygDwhfeHodwHbWtUUSKqikMKZR9Z751NMekrjXKBykb8mhvoTrKMRodKBvNDH4XKPkccF1K4';
394
+ txBuilder.sign({ key: xpriv });
395
+ const signedTx = await txBuilder.build();
396
+ should_1.default.exists(signedTx.toBroadcastFormat());
397
+ });
398
+ it('succeed when build via contract call', async () => {
399
+ const txBuilder = (0, getBuilder_1.getBuilder)('hteth');
400
+ txBuilder.type(sdk_core_1.TransactionType.ContractCall);
401
+ txBuilder.fee({
402
+ eip1559: {
403
+ maxFeePerGas: '100',
404
+ maxPriorityFeePerGas: '10',
405
+ },
406
+ fee: '100',
407
+ gasLimit: '10000',
408
+ });
409
+ const data = testData.SEND_FUNDS_METHOD_CALL;
410
+ txBuilder.counter(1);
411
+ txBuilder.data(data);
412
+ txBuilder.contract('0xd536f4b9f9127a39f19820ca18baac7cd157471f');
413
+ const tx = await txBuilder.build();
414
+ const txhex = tx.toBroadcastFormat();
415
+ const builderFrom = (0, getBuilder_1.getBuilder)('hteth');
416
+ builderFrom.from(txhex);
417
+ const txFrom = await builderFrom.build();
418
+ should_1.default.deepEqual(tx.id, txFrom.id);
419
+ should_1.default.deepEqual(tx.toJson(), txFrom.toJson());
420
+ });
421
+ });
422
+ });
423
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0SW5pdGlhbGl6YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3dhbGxldEluaXRpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1Qiw4Q0FBa0Q7QUFDbEQsc0NBQWlHO0FBQ2pHLDhEQUFnRDtBQUNoRCw4Q0FBMkM7QUFFM0MsUUFBUSxDQUFDLCtDQUErQyxFQUFFO0lBQ3hELE1BQU0sU0FBUyxHQUNiLGlIQUFpSCxDQUFDO0lBQ3BILE1BQU0sSUFBSSxHQUNSLGlIQUFpSCxDQUFDO0lBQ3BILE1BQU0sSUFBSSxHQUNSLGlIQUFpSCxDQUFDO0lBQ3BILE1BQU0sY0FBYyxHQUFHLElBQUksYUFBTyxDQUFDO1FBQ2pDLEdBQUcsRUFBRSxrRUFBa0U7S0FDeEUsQ0FBQyxDQUFDO0lBV0gsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLFdBQVcsT0FBOEI7UUFDckUsTUFBTSxTQUFTLEdBQVEsSUFBQSx1QkFBVSxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQixTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzlCLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUVELElB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LFlBQVksRUFBRSxLQUFLO29CQUNuQixvQkFBb0IsRUFBRSxJQUFJO2lCQUMzQjtnQkFDRCxHQUFHLEVBQUUsS0FBSztnQkFDVixRQUFRLEVBQUUsT0FBTzthQUNsQixDQUFDLENBQUM7WUFFSCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUM7WUFDN0MsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQixTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JCLFNBQVMsQ0FBQyxRQUFRLENBQUMsNENBQTRDLENBQUMsQ0FBQztZQUNqRSxNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNyQyxNQUFNLFdBQVcsR0FBRyxJQUFBLHVCQUFVLEVBQUMsT0FBTyxDQUF1QixDQUFDO1lBQzlELFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekMsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkMsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiwgS2V5UGFpciwgRVRIVHJhbnNhY3Rpb25UeXBlLCBGZWUsIFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvZXRoJztcbmltcG9ydCB7IGdldEJ1aWxkZXIgfSBmcm9tICcuLi9nZXRCdWlsZGVyJztcblxuZGVzY3JpYmUoJ0V0aCBUcmFuc2FjdGlvbiBidWlsZGVyIHdhbGxldCBpbml0aWFsaXphdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qgc291cmNlUHJ2ID1cbiAgICAneHBydjlzMjFaclFIMTQzSzNEOFRYZnZBSmdIVmZURWVRTlc1WXM5d1p0blVaa3FQekZ6U2piRUpyV0Mxdlo0R25YQ3ZSN3JRTDJVRlgzUlN1WWVVOU1yRVJtMVhCdkFDb3c3YzM2dm56NWlZeWoyJztcbiAgY29uc3QgcHViMSA9XG4gICAgJ3hwdWI2NjFNeU13QXFSYmNHcHlMNVF2V2FoNFhaWUh1VEsyMW1TUTROVndZYVg2N0EzNUt6YjQybm1UZGYyV0FyVzR0ZXR0WHJXcGZwd0ZiRUZkRVZxY1N2bkhMQjhGNnAxRDQxc3NtYm5STVhwYyc7XG4gIGNvbnN0IHB1YjIgPVxuICAgICd4cHViNjYxTXlNd0FxUmJjRld6b3o4cW5ZUkRZRUZRcFBMWXd4VkZvRzZXTHkzY2s1WnVwUkdKVEc0anU2eUdiN0RqM2V5NkdzQzRrc3RMUkVSMm5LemdqTHRteHlQZ0M0ekh5N2tWaFV0NnlmR24nO1xuICBjb25zdCBkZWZhdWx0S2V5UGFpciA9IG5ldyBLZXlQYWlyKHtcbiAgICBwcnY6ICdGQUM0RDA0QUEwMDI1RUNGMjAwRDc0QkM5QjVFNDYxNkU0QjgzMzhCNjlCNjEzNjJBQUFENDlGNzZFNjhFRjI4JyxcbiAgfSk7XG5cbiAgaW50ZXJmYWNlIFdhbGxldENyZWF0aW9uRGV0YWlscyB7XG4gICAgZmVlPzogRmVlO1xuICAgIGNoYWluSWQ/OiBudW1iZXI7XG4gICAgY291bnRlcj86IG51bWJlcjtcbiAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgb3duZXJzPzogc3RyaW5nW107XG4gICAgdHlwZT86IFRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIGNvbnN0IGJ1aWxkVHJhbnNhY3Rpb24gPSBhc3luYyBmdW5jdGlvbiAoZGV0YWlsczogV2FsbGV0Q3JlYXRpb25EZXRhaWxzKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gZ2V0QnVpbGRlcigndGV0aCcpO1xuICAgIGlmIChkZXRhaWxzLnR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHhCdWlsZGVyLnR5cGUoZGV0YWlscy50eXBlKTtcbiAgICB9XG4gICAgaWYgKGRldGFpbHMuZmVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHR4QnVpbGRlci5mZWUoZGV0YWlscy5mZWUpO1xuICAgIH1cblxuICAgIGlmIChkZXRhaWxzLmNvdW50ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoZGV0YWlscy5jb3VudGVyKTtcbiAgICB9XG5cbiAgICBpZiAoZGV0YWlscy5vd25lcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCBvd25lciBvZiBkZXRhaWxzLm93bmVycykge1xuICAgICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgfTtcblxuICBkZXNjcmliZSgnc2hvdWxkIGJ1aWxkJywgKCkgPT4ge1xuICAgIGl0KCdhIHdhbGxldCBpbml0aWFsaXphdGlvbiB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRUcmFuc2FjdGlvbih7XG4gICAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbixcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiAnMTAnLFxuICAgICAgICAgIGdhc0xpbWl0OiAnMTAwMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZTogbmV3IEtleVBhaXIoeyBwcnY6IHNvdXJjZVBydiB9KS5nZXRBZGRyZXNzKCksXG4gICAgICAgIG93bmVyczogW1xuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHJ2OiBzb3VyY2VQcnYgfSkuZ2V0QWRkcmVzcygpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiBwdWIxIH0pLmdldEFkZHJlc3MoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogcHViMiB9KS5nZXRBZGRyZXNzKCksXG4gICAgICAgIF0sXG4gICAgICAgIGNvdW50ZXI6IDEsXG4gICAgICB9KTtcblxuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgdHhKc29uLmdhc0xpbWl0LnNob3VsZC5lcXVhbCgnMTAwMCcpO1xuICAgICAgdHhKc29uLl90eXBlLnNob3VsZC5lcXVhbHMoRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSk7XG4gICAgICB0eEpzb24uZ2FzUHJpY2UhLnNob3VsZC5lcXVhbCgnMTAnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24ubm9uY2UsIDEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5jaGFpbklkLCA0Mik7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLnYsICcweDc3Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSB3YWxsZXQgaW5pdGlhbGl6YXRpb24gdHJhbnNhY3Rpb24gd2l0aCBub25jZSAwJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICcxMCcsXG4gICAgICAgICAgZ2FzTGltaXQ6ICcxMDAwJyxcbiAgICAgICAgfSxcbiAgICAgICAgb3duZXJzOiBbXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwcnY6IHNvdXJjZVBydiB9KS5nZXRBZGRyZXNzKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHB1YjEgfSkuZ2V0QWRkcmVzcygpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiBwdWIyIH0pLmdldEFkZHJlc3MoKSxcbiAgICAgICAgXSxcbiAgICAgICAgY291bnRlcjogMCxcbiAgICAgIH0pO1xuXG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICB0eEpzb24uZ2FzTGltaXQuc2hvdWxkLmVxdWFsKCcxMDAwJyk7XG4gICAgICB0eEpzb24uX3R5cGUuc2hvdWxkLmVxdWFscyhFVEhUcmFuc2FjdGlvblR5cGUuTEVHQUNZKTtcbiAgICAgIHR4SnNvbi5nYXNQcmljZSEuc2hvdWxkLmVxdWFsKCcxMCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5ub25jZSwgMCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmNoYWluSWQsIDQyKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24udiwgJzB4NzcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiB1bnNpZ25lZCBpbml0IHRyYW5zYWN0aW9uIGZyb20gc2VyaWFsaXplZCB3aXRoIDAtcHJlZml4ZWQgYWRkcmVzcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gZ2V0QnVpbGRlcignZXRoJyk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZmVlOiAnMTAwMDAwMDAwMDAnLFxuICAgICAgICBnYXNMaW1pdDogJzIwMDAwMDAnLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoJzB4NjQ2MUVDNEU5ZEI4N0NGRTJhZUVjN2Q5YjAyQWEyNjRlZEZiZjQxZicpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKCcweGYxMEM4ZjQyQkQ2M0QwQWVEMzMzOEE2QjJiNjYxQkM2RDlmYTdDNDQnKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcignMHgwN2VlOGI4NDViOGJmMGU4MDdlMDk2ZDZiMTU5OWIxMjFiODJjYmUxJyk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIC8vIG5vdyByZWJ1aWxkIGZyb20gdGhlIHNpZ25lZCBzZXJpYWxpemVkIHR4IGFuZCBtYWtlIHN1cmUgaXQgc3RheXMgdGhlIHNhbWVcbiAgICAgIGNvbnN0IG5ld1R4QnVpbGRlcjogYW55ID0gZ2V0QnVpbGRlcignZXRoJyk7XG4gICAgICBuZXdUeEJ1aWxkZXIuZnJvbShzZXJpYWxpemVkKTtcbiAgICAgIGNvbnN0IG5ld1R4ID0gYXdhaXQgbmV3VHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwobmV3VHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgc2VyaWFsaXplZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gdW5zaWduZWQgaW5pdCB0cmFuc2FjdGlvbiBmcm9tIHNlcmlhbGl6ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXI6IGFueSA9IGdldEJ1aWxkZXIoJ2V0aCcpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKDEpO1xuICAgICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICAgIGZlZTogJzEwMDAwMDAwMDAwJyxcbiAgICAgICAgZ2FzTGltaXQ6ICcyMDAwMDAwJyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKCcweDY0NjFFQzRFOWRCODdDRkUyYWVFYzdkOWIwMkFhMjY0ZWRGYmY0MWYnKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcignMHhmMTBDOGY0MkJENjNEMEFlRDMzMzhBNkIyYjY2MUJDNkQ5ZmE3QzQ0Jyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoJzB4YTRiNTY2NkZCNGZGRUE4NERkODQ4ODQ1RTExMTRiODQxNDZkZTRiMycpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBub3cgcmVidWlsZCBmcm9tIHRoZSBzaWduZWQgc2VyaWFsaXplZCB0eCBhbmQgbWFrZSBzdXJlIGl0IHN0YXlzIHRoZSBzYW1lXG4gICAgICBjb25zdCBuZXdUeEJ1aWxkZXI6IGFueSA9IGdldEJ1aWxkZXIoJ2V0aCcpO1xuICAgICAgbmV3VHhCdWlsZGVyLmZyb20oc2VyaWFsaXplZCk7XG4gICAgICBjb25zdCBuZXdUeCA9IGF3YWl0IG5ld1R4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKG5ld1R4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHNlcmlhbGl6ZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Egc2lnbmVkIGluaXQgdHJhbnNhY3Rpb24gZnJvbSBzZXJpYWxpemVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBnZXRCdWlsZGVyKCd0ZXRoJyk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZmVlOiAnMTAwMDAwMDAwMDAnLFxuICAgICAgICBnYXNMaW1pdDogJzIwMDAwMDAnLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoJzB4NjQ2MUVDNEU5ZEI4N0NGRTJhZUVjN2Q5YjAyQWEyNjRlZEZiZjQxZicpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKCcweGYxMEM4ZjQyQkQ2M0QwQWVEMzMzOEE2QjJiNjYxQkM2RDlmYTdDNDQnKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcignMHhhNGI1NjY2RkI0ZkZFQTg0RGQ4NDg4NDVFMTExNGI4NDE0NmRlNGIzJyk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogZGVmYXVsdEtleVBhaXIuZ2V0S2V5cygpLnBydiB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBzZXJpYWxpemVkID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgLy8gbm93IHJlYnVpbGQgZnJvbSB0aGUgc2lnbmVkIHNlcmlhbGl6ZWQgdHggYW5kIG1ha2Ugc3VyZSBpdCBzdGF5cyB0aGUgc2FtZVxuICAgICAgY29uc3QgbmV3VHhCdWlsZGVyOiBhbnkgPSBnZXRCdWlsZGVyKCd0ZXRoJyk7XG4gICAgICBuZXdUeEJ1aWxkZXIuZnJvbShzZXJpYWxpemVkKTtcbiAgICAgIGNvbnN0IG5ld1R4ID0gYXdhaXQgbmV3VHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwobmV3VHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgc2VyaWFsaXplZCk7XG4gICAgICBzaG91bGQuZXF1YWwobmV3VHguaWQsICcweGVmMDQzMzRmMjFiYTg0NDEwMGI5YWVlNjQ4NWYxNGFmZTE3N2U4ODMwOGFkMmI4YzFiMDg3ODU3NmEzMWQ0N2InKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IG5ld1R4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi52KTtcbiAgICAgIHNob3VsZC5leGlzdCh0eEpzb24ucik7XG4gICAgICBzaG91bGQuZXhpc3QodHhKc29uLnMpO1xuICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5mcm9tKTtcbiAgICB9KTtcblxuICAgIGl0KCdjb3JyZWN0IHRyYW5zYWN0aW9uIGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbmV3VHhCdWlsZGVyID0gZ2V0QnVpbGRlcignZXRoJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgbmV3VHhCdWlsZGVyLmZyb20odGVzdERhdGEuV0FMTEVUX0lOSVRJQUxJWkFUSU9OKTtcbiAgICAgIGNvbnN0IG5ld1R4ID0gYXdhaXQgbmV3VHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwobmV3VHgudG9Kc29uKCkuaWQsICcweGM2NWY5ODAyZGYzYjU1OWIyOTc3NzllYzA2ZDNlNzFiYTdmNWIxYjQ3Y2M5NjFhZDJlZmJhNTRkODIzNDdiZWMnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkJywgKCkgPT4ge1xuICAgIGl0KCdhbiB1bnN1cHBvcnRlZCB0eXBlIG9mIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgYnVpbGRUcmFuc2FjdGlvbih7XG4gICAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5BY2NvdW50VXBkYXRlLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICcxMCcsXG4gICAgICAgICAgZ2FzTGltaXQ6ICcxMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZTogbmV3IEtleVBhaXIoeyBwcnY6IHNvdXJjZVBydiB9KS5nZXRBZGRyZXNzKCksXG4gICAgICAgIGNvdW50ZXI6IDAsXG4gICAgICB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdVbnN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSB0cmFuc2FjdGlvbiB3aXRob3V0IGZlZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGJ1aWxkVHJhbnNhY3Rpb24oe1xuICAgICAgICBzb3VyY2U6IG5ldyBLZXlQYWlyKHsgcHJ2OiBzb3VyY2VQcnYgfSkuZ2V0QWRkcmVzcygpLFxuICAgICAgICBjb3VudGVyOiAwLFxuICAgICAgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBmZWUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHdhbGxldCBpbml0aWFsaXphdGlvbiB0aGUgd3JvbmcgbnVtYmVyIG9mIG93bmVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGJ1aWxkVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24sXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJzEwJyxcbiAgICAgICAgICBnYXNMaW1pdDogJzEwJyxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlOiBuZXcgS2V5UGFpcih7IHBydjogc291cmNlUHJ2IH0pLmdldEFkZHJlc3MoKSxcbiAgICAgICAgb3duZXJzOiBbbmV3IEtleVBhaXIoeyBwdWI6IHB1YjEgfSkuZ2V0QWRkcmVzcygpLCBuZXcgS2V5UGFpcih7IHB1YjogcHViMiB9KS5nZXRBZGRyZXNzKCldLFxuICAgICAgICBjb3VudGVyOiAwLFxuICAgICAgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnSW52YWxpZCB0cmFuc2FjdGlvbjogd3JvbmcgbnVtYmVyIG9mIG93bmVycyAtLSByZXF1aXJlZDogMywgZm91bmQ6IDInKTtcblxuICAgICAgYXdhaXQgYnVpbGRUcmFuc2FjdGlvbih7XG4gICAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbixcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiAnMTAnLFxuICAgICAgICAgIGdhc0xpbWl0OiAnMTAnLFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2U6IG5ldyBLZXlQYWlyKHsgcHJ2OiBzb3VyY2VQcnYgfSkuZ2V0QWRkcmVzcygpLFxuICAgICAgICBvd25lcnM6IFtcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHBydjogc291cmNlUHJ2IH0pLmdldEFkZHJlc3MoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogcHViMSB9KS5nZXRBZGRyZXNzKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHB1YjEgfSkuZ2V0QWRkcmVzcygpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiBwdWIyIH0pLmdldEFkZHJlc3MoKSxcbiAgICAgICAgXSxcbiAgICAgICAgY291bnRlcjogMCxcbiAgICAgIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ1JlcGVhdGVkIG93bmVyIGFkZHJlc3M6ICcgKyBuZXcgS2V5UGFpcih7IHB1YjogcHViMSB9KS5nZXRBZGRyZXNzKCkpO1xuXG4gICAgICBhd2FpdCBidWlsZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICcxMCcsXG4gICAgICAgICAgZ2FzTGltaXQ6ICcxMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZTogbmV3IEtleVBhaXIoeyBwcnY6IHNvdXJjZVBydiB9KS5nZXRBZGRyZXNzKCksXG4gICAgICAgIG93bmVyczogW10sXG4gICAgICAgIGNvdW50ZXI6IDAsXG4gICAgICB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiB3cm9uZyBudW1iZXIgb2Ygb3duZXJzIC0tIHJlcXVpcmVkOiAzLCBmb3VuZDogMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIGNvdW50ZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBidWlsZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiAnMTAnLFxuICAgICAgICAgIGdhc0xpbWl0OiAnMTAnLFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2U6IG5ldyBLZXlQYWlyKHsgcHJ2OiBzb3VyY2VQcnYgfSkuZ2V0QWRkcmVzcygpLFxuICAgICAgICBjb3VudGVyOiAtMSxcbiAgICAgICAgb3duZXJzOiBbXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwcnY6IHNvdXJjZVBydiB9KS5nZXRBZGRyZXNzKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHB1YjEgfSkuZ2V0QWRkcmVzcygpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiBwdWIyIH0pLmdldEFkZHJlc3MoKSxcbiAgICAgICAgXSxcbiAgICAgIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ludmFsaWQgY291bnRlcjogLTEnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsIHRvIHNpZ24nLCAoKSA9PiB7XG4gICAgaXQoJ2Egd2FsbGV0IGluaXRpYWxpemF0aW9uIHRyYW5zYWN0aW9uIHdpdGhvdXQgb3duZXJzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBnZXRCdWlsZGVyKCdldGgnKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZmVlOiAnMTAnLFxuICAgICAgICBnYXNMaW1pdDogJzEwMDAnLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGRlZmF1bHRLZXlQYWlyLmdldEtleXMoKS5wcnYgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Egc2lnbmVkIHdhbGxldCBpbml0aWFsaXphdGlvbiB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gZ2V0QnVpbGRlcignZXRoJyk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICAgIGZlZTogJzEwJyxcbiAgICAgICAgZ2FzTGltaXQ6ICcxMDAwJyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIobmV3IEtleVBhaXIoeyBwdWI6IHB1YjEgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihuZXcgS2V5UGFpcih7IHB1YjogcHViMiB9KS5nZXRBZGRyZXNzKCkpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG5ldyBLZXlQYWlyKHsgcHJ2OiBzb3VyY2VQcnYgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBkZWZhdWx0S2V5UGFpci5nZXRLZXlzKCkucHJ2IH0pO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGRlZmF1bHRLZXlQYWlyLmdldEtleXMoKS5wcnYgfSksXG4gICAgICAgIG5ldyBSZWdFeHAoJ0Nhbm5vdCBzaWduIG11bHRpcGxlIHRpbWVzIGEgbm9uIHNlbmQtdHlwZSB0cmFuc2FjdGlvbicpXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIHZhbGlkYXRlJywgKCkgPT4ge1xuICAgIGl0KCdhbiBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBnZXRCdWlsZGVyKCdldGgnKTtcbiAgICAgIHR4QnVpbGRlci52YWxpZGF0ZUFkZHJlc3ModGVzdERhdGEuVkFMSURfQUREUkVTUyk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVBZGRyZXNzKHRlc3REYXRhLklOVkFMSURfQUREUkVTUyksXG4gICAgICAgIG5ldyBSZWdFeHAoJ0ludmFsaWQgYWRkcmVzcyAnICsgdGVzdERhdGEuSU5WQUxJRF9BRERSRVNTLmFkZHJlc3MpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbHVlIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gemVybycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gZ2V0QnVpbGRlcignZXRoJyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5mZWUoeyBmZWU6ICctMTAnIH0pKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdHhCdWlsZGVyLmZlZSh7IGZlZTogJzEwJyB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSBwcml2YXRlIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gZ2V0QnVpbGRlcignZXRoJyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZUtleSh7IGtleTogJ2FiYycgfSksIC9JbnZhbGlkIGtleS8pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVLZXkoeyBrZXk6IHRlc3REYXRhLlBVQkxJQ19LRVkgfSksIC9JbnZhbGlkIGtleS8pO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVLZXkoeyBrZXk6IHRlc3REYXRhLlBSSVZBVEVfS0VZIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHJhdyB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXI6IGFueSA9IGdldEJ1aWxkZXIoJ2V0aCcpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLmZyb20odGVzdERhdGEuVFhfQlJPQURDQVNUKSk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIuZnJvbSh0ZXN0RGF0YS5UWF9KU09OKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuZnJvbSgnMHgwMDAwMTAwMCcpLCAvVGhlcmUgd2FzIGVycm9yIGluIGRlY29kaW5nIHRoZSBoZXggc3RyaW5nLyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuZnJvbSgnJyksIC9SYXcgdHJhbnNhY3Rpb24gaXMgZW1wdHkvKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5mcm9tKCdwcXJzJyksIC9UaGVyZSB3YXMgZXJyb3IgaW4gcGFyc2luZyB0aGUgSlNPTiBzdHJpbmcvKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5mcm9tKDEyMzQpLCAvVHJhbnNhY3Rpb24gaXMgbm90IGEgaGV4IHN0cmluZyBvciBzdHJpbmdpZmllZCBqc29uLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSB0cmFuc2FjdGlvbiB0byBidWlsZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gZ2V0QnVpbGRlcignZXRoJyk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcih1bmRlZmluZWQpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKSwgL0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3NpbmcgZmVlLyk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZmVlOiAnMTAnLFxuICAgICAgICBnYXNMaW1pdDogJzEwMDAnLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKCksIC9JbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIGFkZHJlc3MgY291bnRlci8pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbigpLCAvSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBhZGRyZXNzIGNvdW50ZXIvKTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHtcbiAgICAgICAgcHJ2OiBzb3VyY2VQcnYsXG4gICAgICB9O1xuICAgICAgY29uc3Qgc291cmNlS2V5UGFpciA9IG5ldyBLZXlQYWlyKHNvdXJjZSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKCksIC9JbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIGFkZHJlc3MgY291bnRlci8pO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKCksIC93cm9uZyBudW1iZXIgb2Ygb3duZXJzIC0tIHJlcXVpcmVkOiAzLCBmb3VuZDogMC8pO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKHNvdXJjZUtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKSwgL3dyb25nIG51bWJlciBvZiBvd25lcnMgLS0gcmVxdWlyZWQ6IDMsIGZvdW5kOiAxLyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIobmV3IEtleVBhaXIoeyBwdWI6IHB1YjEgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKSwgL3dyb25nIG51bWJlciBvZiBvd25lcnMgLS0gcmVxdWlyZWQ6IDMsIGZvdW5kOiAyLyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIobmV3IEtleVBhaXIoeyBwdWI6IHB1YjIgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzZXQgb3duZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBiZSB3YWxsZXQgaW5pdGlhbGl6YWlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gZ2V0QnVpbGRlcignZXRoJyk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBjb25zdCBzb3VyY2VLZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IHNvdXJjZVBydiB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHR4QnVpbGRlci5vd25lcihzb3VyY2VLZXlQYWlyLmdldEFkZHJlc3MoKSksXG4gICAgICAgIG5ldyBSZWdFeHAoJ011bHRpc2lnIHdhbGxldCBvd25lciBjYW4gb25seSBiZSBzZXQgZm9yIGluaXRpYWxpemF0aW9uIHRyYW5zYWN0aW9ucycpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBiZSBvbmx5IDMgb3duZXJzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBnZXRCdWlsZGVyKCdldGgnKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZmVlOiAnMTAnLFxuICAgICAgICBnYXNMaW1pdDogJzEwMDAnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBzb3VyY2VLZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IHNvdXJjZVBydiB9KTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKDEpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKHNvdXJjZUtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcignMHg3MzI1QTNGN2Q0ZjlFODZBRTYyQ2Y3NDI0MjYwNzhDMzc1NTczMGQ1Jyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoJzB4NjAzZTA3N2FjZDNGMDFlODFiOTVmQjkyY2U0MkZGNjBkRmYzRDRDNycpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gdHhCdWlsZGVyLm93bmVyKCcweDFBODhFZTRCYzgwQkUwODBmQzkxQUM0NzJBZjJGNTkyNjA2OTUwNjAnKSxcbiAgICAgICAgbmV3IFJlZ0V4cCgnQSBtYXhpbXVtIG9mIDMgb3duZXJzIGNhbiBiZSBzZXQgZm9yIGEgbXVsdGlzaWcgd2FsbGV0JylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJlIGEgdmFsaWQgYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gZ2V0QnVpbGRlcignZXRoJyk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICAgIGZlZTogJzEwJyxcbiAgICAgICAgZ2FzTGltaXQ6ICcxMDAwJyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5vd25lcignMHg3MzI1QTNGN2Q0ZjlFODZBRTYyQycpLCAvSW52YWxpZCBhZGRyZXNzLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdTaG91bGQgZ2V0dGluZyBzYW1lIHR4IGhhc2ggZnJvbSByYXcgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBnZXRCdWlsZGVyKCdldGgnKTtcbiAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgIGZlZTogJzI4MDAwMDAwMDAwMCcsXG4gICAgICBnYXNMaW1pdDogJzcwMDAwMDAnLFxuICAgIH0pO1xuICAgIHR4QnVpbGRlci5jb3VudGVyKDEpO1xuICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgdHhCdWlsZGVyLm93bmVyKG5ldyBLZXlQYWlyKHsgcHViOiBwdWIxIH0pLmdldEFkZHJlc3MoKSk7XG4gICAgdHhCdWlsZGVyLm93bmVyKG5ldyBLZXlQYWlyKHsgcHViOiBwdWIyIH0pLmdldEFkZHJlc3MoKSk7XG4gICAgdHhCdWlsZGVyLm93bmVyKG5ldyBLZXlQYWlyKHsgcHJ2OiBzb3VyY2VQcnYgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogZGVmYXVsdEtleVBhaXIuZ2V0S2V5cygpLnBydiB9KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4QnVpZGVyRnJvbVJhdzogYW55ID0gZ2V0QnVpbGRlcignZXRoJyk7XG4gICAgdHhCdWlkZXJGcm9tUmF3LmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgY29uc3QgdHhGcm9tUmF3ID0gYXdhaXQgdHhCdWlkZXJGcm9tUmF3LmJ1aWxkKCk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5pZCwgdHhGcm9tUmF3LmlkKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1JlY292ZXJ5IFdhbGxldCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuZCBzaWduIHVzaW5nIHR4SGV4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZ2V0QnVpbGRlcignZ3RldGgnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICBjb25zdCB0eEhleCA9IHRlc3REYXRhLlJFQ09WRVJZX1dBTExFVF9ERVBMT1lNRU5UX1RYSEVYO1xuICAgICAgdHhCdWlsZGVyLmZyb20odHhIZXgpO1xuICAgICAgY29uc3QgeHByaXYgPVxuICAgICAgICAneHBydjlzMjFaclFIMTQzSzJZS1N6WmEyZnY3UVR6WjVVaTQ1WlV6eWdEd2hmZUhvZHdIYld0VVVTS3Fpa01LWlI5Wjc1MU5NZWtyalhLQnlrYjhtaHZvVHJLTVJvZEtCdk5ESDRYS1BrY2NGMUs0JztcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB4cHJpdiB9KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXhpc3RzKHNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3N1Y2NlZWQgd2hlbiBidWlsZCB2aWEgY29udHJhY3QgY2FsbCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ2h0ZXRoJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZWlwMTU1OToge1xuICAgICAgICAgIG1heEZlZVBlckdhczogJzEwMCcsXG4gICAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6ICcxMCcsXG4gICAgICAgIH0sXG4gICAgICAgIGZlZTogJzEwMCcsXG4gICAgICAgIGdhc0xpbWl0OiAnMTAwMDAnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSB0ZXN0RGF0YS5TRU5EX0ZVTkRTX01FVEhPRF9DQUxMO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICB0eEJ1aWxkZXIuZGF0YShkYXRhKTtcbiAgICAgIHR4QnVpbGRlci5jb250cmFjdCgnMHhkNTM2ZjRiOWY5MTI3YTM5ZjE5ODIwY2ExOGJhYWM3Y2QxNTc0NzFmJyk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhoZXggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgYnVpbGRlckZyb20gPSBnZXRCdWlsZGVyKCdodGV0aCcpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgIGJ1aWxkZXJGcm9tLmZyb20odHhoZXgpO1xuICAgICAgY29uc3QgdHhGcm9tID0gYXdhaXQgYnVpbGRlckZyb20uYnVpbGQoKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguaWQsIHR4RnJvbS5pZCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnRvSnNvbigpLCB0eEZyb20udG9Kc29uKCkpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transferBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transferBuilder.d.ts","sourceRoot":"","sources":["../../../test/unit/transferBuilder.ts"],"names":[],"mappings":""}