@bitgo/sdk-coin-bld 3.5.2 → 3.5.3

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 (41) hide show
  1. package/dist/test/integration/index.d.ts +2 -0
  2. package/dist/test/integration/index.d.ts.map +1 -0
  3. package/dist/test/integration/index.js +16 -0
  4. package/dist/test/resources/bld.d.ts +256 -0
  5. package/dist/test/resources/bld.d.ts.map +1 -0
  6. package/dist/test/resources/bld.js +399 -0
  7. package/dist/test/unit/bld.d.ts +2 -0
  8. package/dist/test/unit/bld.d.ts.map +1 -0
  9. package/dist/test/unit/bld.js +454 -0
  10. package/dist/test/unit/keyPair.d.ts +2 -0
  11. package/dist/test/unit/keyPair.d.ts.map +1 -0
  12. package/dist/test/unit/keyPair.js +92 -0
  13. package/dist/test/unit/transaction.d.ts +2 -0
  14. package/dist/test/unit/transaction.d.ts.map +1 -0
  15. package/dist/test/unit/transaction.js +219 -0
  16. package/dist/test/unit/transactionBuilder/StakingActivateBuilder.d.ts +2 -0
  17. package/dist/test/unit/transactionBuilder/StakingActivateBuilder.d.ts.map +1 -0
  18. package/dist/test/unit/transactionBuilder/StakingActivateBuilder.js +154 -0
  19. package/dist/test/unit/transactionBuilder/StakingDeactivateBuilder.d.ts +2 -0
  20. package/dist/test/unit/transactionBuilder/StakingDeactivateBuilder.d.ts.map +1 -0
  21. package/dist/test/unit/transactionBuilder/StakingDeactivateBuilder.js +153 -0
  22. package/dist/test/unit/transactionBuilder/StakingRedelegateBuilder.d.ts +2 -0
  23. package/dist/test/unit/transactionBuilder/StakingRedelegateBuilder.d.ts.map +1 -0
  24. package/dist/test/unit/transactionBuilder/StakingRedelegateBuilder.js +93 -0
  25. package/dist/test/unit/transactionBuilder/StakingWithdrawRewardsBuilder.d.ts +2 -0
  26. package/dist/test/unit/transactionBuilder/StakingWithdrawRewardsBuilder.d.ts.map +1 -0
  27. package/dist/test/unit/transactionBuilder/StakingWithdrawRewardsBuilder.js +154 -0
  28. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  29. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  30. package/dist/test/unit/transactionBuilder/transactionBuilder.js +112 -0
  31. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  32. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  33. package/dist/test/unit/transactionBuilder/transferBuilder.js +189 -0
  34. package/dist/test/unit/utils.d.ts +2 -0
  35. package/dist/test/unit/utils.d.ts.map +1 -0
  36. package/dist/test/unit/utils.js +76 -0
  37. package/dist/tsconfig.tsbuildinfo +1 -0
  38. package/package.json +11 -8
  39. package/.eslintignore +0 -5
  40. package/.mocharc.yml +0 -8
  41. package/CHANGELOG.md +0 -805
@@ -0,0 +1,454 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const abstract_cosmos_1 = require("@bitgo/abstract-cosmos");
7
+ const sdk_api_1 = require("@bitgo/sdk-api");
8
+ const sdk_lib_mpc_1 = require("@bitgo/sdk-lib-mpc");
9
+ const sdk_test_1 = require("@bitgo/sdk-test");
10
+ const statics_1 = require("@bitgo/statics");
11
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
12
+ const mocha_1 = require("mocha");
13
+ const sinon_1 = __importDefault(require("sinon"));
14
+ const src_1 = require("../../src");
15
+ const utils_1 = __importDefault(require("../../src/lib/utils"));
16
+ const bld_1 = require("../resources/bld");
17
+ const should = require("should");
18
+ describe('BLD', function () {
19
+ let bitgo;
20
+ let basecoin;
21
+ before(function () {
22
+ bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'mock' });
23
+ bitgo.safeRegister('bld', src_1.Bld.createInstance);
24
+ bitgo.safeRegister('tbld', src_1.Tbld.createInstance);
25
+ bitgo.initializeTestVars();
26
+ basecoin = bitgo.coin('tbld');
27
+ });
28
+ it('should return the right info', function () {
29
+ const bld = bitgo.coin('bld');
30
+ const tbld = bitgo.coin('tbld');
31
+ bld.getChain().should.equal('bld');
32
+ bld.getFamily().should.equal('bld');
33
+ bld.getFullName().should.equal('Agoric');
34
+ bld.getBaseFactor().should.equal(1e6);
35
+ tbld.getChain().should.equal('tbld');
36
+ tbld.getFamily().should.equal('bld');
37
+ tbld.getFullName().should.equal('Testnet Agoric');
38
+ tbld.getBaseFactor().should.equal(1e6);
39
+ });
40
+ describe('Address Validation', () => {
41
+ it('should get address details without memoId', function () {
42
+ const addressDetails = basecoin.getAddressDetails(bld_1.address.noMemoIdAddress);
43
+ addressDetails.address.should.equal(bld_1.address.noMemoIdAddress);
44
+ should.not.exist(addressDetails.memoId);
45
+ });
46
+ it('should get address details with memoId', function () {
47
+ const addressDetails = basecoin.getAddressDetails(bld_1.address.validMemoIdAddress);
48
+ addressDetails.address.should.equal(bld_1.address.validMemoIdAddress.split('?')[0]);
49
+ addressDetails.memoId.should.equal('2');
50
+ });
51
+ it('should throw on multiple memo id address', () => {
52
+ (() => {
53
+ basecoin.getAddressDetails(bld_1.address.multipleMemoIdAddress);
54
+ }).should.throw();
55
+ });
56
+ it('should validate wallet receive address', async function () {
57
+ const receiveAddress = {
58
+ address: 'agoric1tkfnp4khzd0f7mgtznwrvr0lv2at3p8c8sz89p?memoId=7',
59
+ coinSpecific: {
60
+ rootAddress: 'agoric1tkfnp4khzd0f7mgtznwrvr0lv2at3p8c8sz89p',
61
+ memoID: '7',
62
+ },
63
+ };
64
+ const isValid = await basecoin.isWalletAddress(receiveAddress);
65
+ isValid.should.equal(true);
66
+ });
67
+ it('should validate account addresses correctly', () => {
68
+ should.equal(utils_1.default.isValidAddress(bld_1.address.address1), true);
69
+ should.equal(utils_1.default.isValidAddress(bld_1.address.address2), true);
70
+ should.equal(utils_1.default.isValidAddress(bld_1.address.address3), false);
71
+ should.equal(utils_1.default.isValidAddress(bld_1.address.address4), false);
72
+ should.equal(utils_1.default.isValidAddress('dfjk35y'), false);
73
+ should.equal(utils_1.default.isValidAddress(undefined), false);
74
+ should.equal(utils_1.default.isValidAddress(''), false);
75
+ should.equal(utils_1.default.isValidAddress(bld_1.address.validMemoIdAddress), true);
76
+ should.equal(utils_1.default.isValidAddress(bld_1.address.multipleMemoIdAddress), false);
77
+ });
78
+ it('should validate validator addresses correctly', () => {
79
+ should.equal(utils_1.default.isValidValidatorAddress(bld_1.address.validatorAddress1), true);
80
+ should.equal(utils_1.default.isValidValidatorAddress(bld_1.address.validatorAddress2), true);
81
+ should.equal(utils_1.default.isValidValidatorAddress(bld_1.address.validatorAddress3), false);
82
+ should.equal(utils_1.default.isValidValidatorAddress(bld_1.address.validatorAddress4), false);
83
+ should.equal(utils_1.default.isValidValidatorAddress('dfjk35y'), false);
84
+ should.equal(utils_1.default.isValidValidatorAddress(undefined), false);
85
+ should.equal(utils_1.default.isValidValidatorAddress(''), false);
86
+ });
87
+ });
88
+ describe('Verify transaction: ', () => {
89
+ it('should succeed to verify transaction', async function () {
90
+ const txPrebuild = {
91
+ txHex: bld_1.TEST_SEND_TX.signedTxBase64,
92
+ txInfo: {},
93
+ };
94
+ const txParams = {
95
+ recipients: [
96
+ {
97
+ address: bld_1.TEST_SEND_TX.recipient,
98
+ amount: bld_1.TEST_SEND_TX.sendAmount,
99
+ },
100
+ ],
101
+ };
102
+ const verification = {};
103
+ const isTransactionVerified = await basecoin.verifyTransaction({ txParams, txPrebuild, verification });
104
+ isTransactionVerified.should.equal(true);
105
+ });
106
+ it('should succeed to verify delegate transaction', async function () {
107
+ const txPrebuild = {
108
+ txHex: bld_1.TEST_DELEGATE_TX.signedTxBase64,
109
+ txInfo: {},
110
+ };
111
+ const txParams = {
112
+ recipients: [
113
+ {
114
+ address: bld_1.TEST_DELEGATE_TX.validator,
115
+ amount: bld_1.TEST_DELEGATE_TX.sendAmount,
116
+ },
117
+ ],
118
+ };
119
+ const verification = {};
120
+ const isTransactionVerified = await basecoin.verifyTransaction({ txParams, txPrebuild, verification });
121
+ isTransactionVerified.should.equal(true);
122
+ });
123
+ it('should succeed to verify undelegate transaction', async function () {
124
+ const txPrebuild = {
125
+ txHex: bld_1.TEST_UNDELEGATE_TX.signedTxBase64,
126
+ txInfo: {},
127
+ };
128
+ const txParams = {
129
+ recipients: [
130
+ {
131
+ address: bld_1.TEST_UNDELEGATE_TX.validator,
132
+ amount: bld_1.TEST_UNDELEGATE_TX.sendAmount,
133
+ },
134
+ ],
135
+ };
136
+ const verification = {};
137
+ const isTransactionVerified = await basecoin.verifyTransaction({ txParams, txPrebuild, verification });
138
+ isTransactionVerified.should.equal(true);
139
+ });
140
+ it('should succeed to verify withdraw rewards transaction', async function () {
141
+ const txPrebuild = {
142
+ txHex: bld_1.TEST_WITHDRAW_REWARDS_TX.signedTxBase64,
143
+ txInfo: {},
144
+ };
145
+ const txParams = {
146
+ recipients: [
147
+ {
148
+ address: bld_1.TEST_WITHDRAW_REWARDS_TX.validator,
149
+ amount: 'UNAVAILABLE',
150
+ },
151
+ ],
152
+ };
153
+ const verification = {};
154
+ const isTransactionVerified = await basecoin.verifyTransaction({ txParams, txPrebuild, verification });
155
+ isTransactionVerified.should.equal(true);
156
+ });
157
+ it('should fail to verify transaction with invalid param', async function () {
158
+ const txPrebuild = {};
159
+ const txParams = { recipients: undefined };
160
+ await basecoin
161
+ .verifyTransaction({
162
+ txParams,
163
+ txPrebuild,
164
+ })
165
+ .should.rejectedWith('missing required tx prebuild property txHex');
166
+ });
167
+ });
168
+ describe('Explain Transaction: ', () => {
169
+ it('should explain a transfer transaction', async function () {
170
+ const explainedTransaction = await basecoin.explainTransaction({
171
+ txHex: bld_1.TEST_SEND_TX.signedTxBase64,
172
+ });
173
+ explainedTransaction.should.deepEqual({
174
+ displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
175
+ id: bld_1.TEST_SEND_TX.hash,
176
+ outputs: [
177
+ {
178
+ address: bld_1.TEST_SEND_TX.recipient,
179
+ amount: bld_1.TEST_SEND_TX.sendAmount,
180
+ },
181
+ ],
182
+ outputAmount: bld_1.TEST_SEND_TX.sendAmount,
183
+ changeOutputs: [],
184
+ changeAmount: '0',
185
+ fee: { fee: bld_1.TEST_SEND_TX.gasBudget.amount[0].amount },
186
+ type: 0,
187
+ });
188
+ });
189
+ it('should explain a delegate transaction', async function () {
190
+ const explainedTransaction = await basecoin.explainTransaction({
191
+ txHex: bld_1.TEST_DELEGATE_TX.signedTxBase64,
192
+ });
193
+ explainedTransaction.should.deepEqual({
194
+ displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
195
+ id: bld_1.TEST_DELEGATE_TX.hash,
196
+ outputs: [
197
+ {
198
+ address: bld_1.TEST_DELEGATE_TX.validator,
199
+ amount: bld_1.TEST_DELEGATE_TX.sendAmount,
200
+ },
201
+ ],
202
+ outputAmount: bld_1.TEST_DELEGATE_TX.sendAmount,
203
+ changeOutputs: [],
204
+ changeAmount: '0',
205
+ fee: { fee: bld_1.TEST_DELEGATE_TX.gasBudget.amount[0].amount },
206
+ type: 13,
207
+ });
208
+ });
209
+ it('should explain a undelegate transaction', async function () {
210
+ const explainedTransaction = await basecoin.explainTransaction({
211
+ txHex: bld_1.TEST_UNDELEGATE_TX.signedTxBase64,
212
+ });
213
+ explainedTransaction.should.deepEqual({
214
+ displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
215
+ id: bld_1.TEST_UNDELEGATE_TX.hash,
216
+ outputs: [
217
+ {
218
+ address: bld_1.TEST_UNDELEGATE_TX.validator,
219
+ amount: bld_1.TEST_UNDELEGATE_TX.sendAmount,
220
+ },
221
+ ],
222
+ outputAmount: bld_1.TEST_UNDELEGATE_TX.sendAmount,
223
+ changeOutputs: [],
224
+ changeAmount: '0',
225
+ fee: { fee: bld_1.TEST_UNDELEGATE_TX.gasBudget.amount[0].amount },
226
+ type: 17,
227
+ });
228
+ });
229
+ it('should explain a withdraw transaction', async function () {
230
+ const explainedTransaction = await basecoin.explainTransaction({
231
+ txHex: bld_1.TEST_WITHDRAW_REWARDS_TX.signedTxBase64,
232
+ });
233
+ explainedTransaction.should.deepEqual({
234
+ displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
235
+ id: bld_1.TEST_WITHDRAW_REWARDS_TX.hash,
236
+ outputs: [
237
+ {
238
+ address: bld_1.TEST_WITHDRAW_REWARDS_TX.validator,
239
+ amount: 'UNAVAILABLE',
240
+ },
241
+ ],
242
+ outputAmount: undefined,
243
+ changeOutputs: [],
244
+ changeAmount: '0',
245
+ fee: { fee: bld_1.TEST_WITHDRAW_REWARDS_TX.gasBudget.amount[0].amount },
246
+ type: 15,
247
+ });
248
+ });
249
+ it('should explain a transfer transaction with memo', async function () {
250
+ const explainedTransaction = await basecoin.explainTransaction({
251
+ txHex: bld_1.TEST_TX_WITH_MEMO.signedTxBase64,
252
+ });
253
+ explainedTransaction.should.deepEqual({
254
+ displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
255
+ id: bld_1.TEST_TX_WITH_MEMO.hash,
256
+ outputs: [
257
+ {
258
+ address: bld_1.TEST_TX_WITH_MEMO.to,
259
+ amount: bld_1.TEST_TX_WITH_MEMO.sendAmount,
260
+ memo: bld_1.TEST_TX_WITH_MEMO.memo,
261
+ },
262
+ ],
263
+ outputAmount: bld_1.TEST_TX_WITH_MEMO.sendAmount,
264
+ changeOutputs: [],
265
+ changeAmount: '0',
266
+ fee: { fee: bld_1.TEST_TX_WITH_MEMO.gasBudget.amount[0].amount },
267
+ type: 0,
268
+ });
269
+ });
270
+ it('should fail to explain transaction with missing params', async function () {
271
+ try {
272
+ await basecoin.explainTransaction({});
273
+ }
274
+ catch (error) {
275
+ should.equal(error.message, 'missing required txHex parameter');
276
+ }
277
+ });
278
+ it('should fail to explain transaction with invalid params', async function () {
279
+ try {
280
+ await basecoin.explainTransaction({ txHex: 'randomString' });
281
+ }
282
+ catch (error) {
283
+ should.equal(error.message.startsWith('Invalid transaction:'), true);
284
+ }
285
+ });
286
+ });
287
+ describe('Parse Transactions: ', () => {
288
+ it('should parse a transfer transaction', async function () {
289
+ const transferInputsResponse = {
290
+ address: bld_1.TEST_SEND_TX.recipient,
291
+ amount: new bignumber_js_1.default(bld_1.TEST_SEND_TX.sendAmount).plus(bld_1.TEST_SEND_TX.gasBudget.amount[0].amount).toFixed(),
292
+ };
293
+ const transferOutputsResponse = {
294
+ address: bld_1.TEST_SEND_TX.recipient,
295
+ amount: bld_1.TEST_SEND_TX.sendAmount,
296
+ };
297
+ const parsedTransaction = await basecoin.parseTransaction({ txHex: bld_1.TEST_SEND_TX.signedTxBase64 });
298
+ parsedTransaction.should.deepEqual({
299
+ inputs: [transferInputsResponse],
300
+ outputs: [transferOutputsResponse],
301
+ });
302
+ });
303
+ it('should fail to parse a transfer transaction when explainTransaction response is undefined', async function () {
304
+ const stub = sinon_1.default.stub(src_1.Bld.prototype, 'explainTransaction');
305
+ stub.resolves(undefined);
306
+ await basecoin
307
+ .parseTransaction({ txHex: bld_1.TEST_SEND_TX.signedTxBase64 })
308
+ .should.be.rejectedWith('Invalid transaction');
309
+ stub.restore();
310
+ });
311
+ });
312
+ describe('Recover transaction: success path', () => {
313
+ const sandBox = sinon_1.default.createSandbox();
314
+ const destinationAddress = bld_1.wrwUser.destinationAddress;
315
+ const coin = statics_1.coins.get('tbld');
316
+ const testBalance = [
317
+ {
318
+ denom: 'ubld',
319
+ amount: '150000',
320
+ },
321
+ ];
322
+ const testAccountNumber = '123';
323
+ const testSequenceNumber = '0';
324
+ const testChainId = 'test-chain';
325
+ (0, mocha_1.beforeEach)(() => {
326
+ const accountBalance = sandBox.stub(src_1.Bld.prototype, 'getAccountBalance');
327
+ accountBalance.withArgs(bld_1.wrwUser.senderAddress).resolves(testBalance);
328
+ const accountDetails = sandBox.stub(src_1.Bld.prototype, 'getAccountDetails');
329
+ accountDetails.withArgs(bld_1.wrwUser.senderAddress).resolves([testAccountNumber, testSequenceNumber]);
330
+ const chainId = sandBox.stub(src_1.Bld.prototype, 'getChainId');
331
+ chainId.withArgs().resolves(testChainId);
332
+ const deserializedEntChallenge = sdk_lib_mpc_1.EcdsaTypes.deserializeNtildeWithProofs(sdk_test_1.mockSerializedChallengeWithProofs);
333
+ sinon_1.default.stub(sdk_lib_mpc_1.EcdsaRangeProof, 'generateNtilde').resolves(deserializedEntChallenge);
334
+ });
335
+ afterEach(() => {
336
+ sandBox.restore();
337
+ sinon_1.default.restore();
338
+ });
339
+ it('should recover funds for non-bitgo recoveries', async function () {
340
+ const res = await basecoin.recover({
341
+ userKey: bld_1.wrwUser.userPrivateKey,
342
+ backupKey: bld_1.wrwUser.backupPrivateKey,
343
+ bitgoKey: bld_1.wrwUser.bitgoPublicKey,
344
+ walletPassphrase: bld_1.wrwUser.walletPassphrase,
345
+ recoveryDestination: destinationAddress,
346
+ });
347
+ res.should.not.be.empty();
348
+ res.should.hasOwnProperty('serializedTx');
349
+ sandBox.assert.calledOnce(basecoin.getAccountBalance);
350
+ sandBox.assert.calledOnce(basecoin.getAccountDetails);
351
+ sandBox.assert.calledOnce(basecoin.getChainId);
352
+ const txn = new abstract_cosmos_1.CosmosTransaction(coin, utils_1.default);
353
+ txn.enrichTransactionDetailsFromRawTransaction(res.serializedTx);
354
+ const txnJson = txn.toJson();
355
+ const sendMessage = txnJson.sendMessages[0].value;
356
+ const balance = new bignumber_js_1.default(testBalance[0].amount);
357
+ const gasAmount = new bignumber_js_1.default(7000);
358
+ const actualBalance = balance.minus(gasAmount);
359
+ should.equal(sendMessage.toAddress, destinationAddress);
360
+ should.equal(sendMessage.amount[0].amount, actualBalance.toFixed());
361
+ should.equal(sendMessage.amount[0].denom, testBalance[0].denom);
362
+ });
363
+ it('should redelegate funds to new validator', async function () {
364
+ const res = await basecoin.redelegate({
365
+ userKey: bld_1.wrwUser.userPrivateKey,
366
+ backupKey: bld_1.wrwUser.backupPrivateKey,
367
+ bitgoKey: bld_1.wrwUser.bitgoPublicKey,
368
+ walletPassphrase: bld_1.wrwUser.walletPassphrase,
369
+ amountToRedelegate: '10000000000000000',
370
+ validatorSrcAddress: 'agoricvaloper1wy3h3gne94xpmnjwfwd3eyaytv9g4nj6yykkkj',
371
+ validatorDstAddress: 'agoricvaloper1qd0h2hj7uljjhktw9l3fjnz5u22g0xu74aw38w',
372
+ });
373
+ res.should.not.be.empty();
374
+ res.should.hasOwnProperty('serializedTx');
375
+ sandBox.assert.calledOnce(basecoin.getChainId);
376
+ const txn = new abstract_cosmos_1.CosmosTransaction(coin, utils_1.default);
377
+ txn.enrichTransactionDetailsFromRawTransaction(res.serializedTx);
378
+ const txnJson = txn.toJson();
379
+ const redelegateMessage = txnJson.sendMessages[0].value;
380
+ should.equal(redelegateMessage.validatorSrcAddress, 'agoricvaloper1wy3h3gne94xpmnjwfwd3eyaytv9g4nj6yykkkj');
381
+ should.equal(redelegateMessage.validatorDstAddress, 'agoricvaloper1qd0h2hj7uljjhktw9l3fjnz5u22g0xu74aw38w');
382
+ should.equal(redelegateMessage.amount.amount, '10000000000000000');
383
+ });
384
+ });
385
+ describe('Recover transaction: failure path', () => {
386
+ const sandBox = sinon_1.default.createSandbox();
387
+ const destinationAddress = bld_1.wrwUser.destinationAddress;
388
+ const testZeroBalance = [
389
+ {
390
+ denom: 'ubld',
391
+ amount: '0',
392
+ },
393
+ ];
394
+ const testAccountNumber = '123';
395
+ const testSequenceNumber = '0';
396
+ const testChainId = 'test-chain';
397
+ (0, mocha_1.beforeEach)(() => {
398
+ const accountBalance = sandBox.stub(src_1.Bld.prototype, 'getAccountBalance');
399
+ accountBalance.withArgs(bld_1.wrwUser.senderAddress).resolves(testZeroBalance);
400
+ const accountDetails = sandBox.stub(src_1.Bld.prototype, 'getAccountDetails');
401
+ accountDetails.withArgs(bld_1.wrwUser.senderAddress).resolves([testAccountNumber, testSequenceNumber]);
402
+ const chainId = sandBox.stub(src_1.Bld.prototype, 'getChainId');
403
+ chainId.withArgs().resolves(testChainId);
404
+ const deserializedEntChallenge = sdk_lib_mpc_1.EcdsaTypes.deserializeNtildeWithProofs(sdk_test_1.mockSerializedChallengeWithProofs);
405
+ sinon_1.default.stub(sdk_lib_mpc_1.EcdsaRangeProof, 'generateNtilde').resolves(deserializedEntChallenge);
406
+ });
407
+ afterEach(() => {
408
+ sandBox.restore();
409
+ sinon_1.default.restore();
410
+ });
411
+ it('should throw error if backupkey is not present', async function () {
412
+ await basecoin
413
+ .recover({
414
+ userKey: bld_1.wrwUser.userPrivateKey,
415
+ bitgoKey: bld_1.wrwUser.bitgoPublicKey,
416
+ walletPassphrase: bld_1.wrwUser.walletPassphrase,
417
+ recoveryDestination: destinationAddress,
418
+ })
419
+ .should.rejectedWith('missing backupKey');
420
+ });
421
+ it('should throw error if userkey is not present', async function () {
422
+ await basecoin
423
+ .recover({
424
+ backupKey: bld_1.wrwUser.backupPrivateKey,
425
+ bitgoKey: bld_1.wrwUser.bitgoPublicKey,
426
+ walletPassphrase: bld_1.wrwUser.walletPassphrase,
427
+ recoveryDestination: destinationAddress,
428
+ })
429
+ .should.rejectedWith('missing userKey');
430
+ });
431
+ it('should throw error if wallet passphrase is not present', async function () {
432
+ await basecoin
433
+ .recover({
434
+ userKey: bld_1.wrwUser.userPrivateKey,
435
+ backupKey: bld_1.wrwUser.backupPrivateKey,
436
+ bitgoKey: bld_1.wrwUser.bitgoPublicKey,
437
+ recoveryDestination: destinationAddress,
438
+ })
439
+ .should.rejectedWith('missing wallet passphrase');
440
+ });
441
+ it('should throw error if there is no balance', async function () {
442
+ await basecoin
443
+ .recover({
444
+ userKey: bld_1.wrwUser.userPrivateKey,
445
+ backupKey: bld_1.wrwUser.backupPrivateKey,
446
+ bitgoKey: bld_1.wrwUser.bitgoPublicKey,
447
+ walletPassphrase: bld_1.wrwUser.walletPassphrase,
448
+ recoveryDestination: destinationAddress,
449
+ })
450
+ .should.rejectedWith('Did not have enough funds to recover');
451
+ });
452
+ });
453
+ });
454
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L2JsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDREQUEyRjtBQUMzRiw0Q0FBMEM7QUFDMUMsb0RBQWlFO0FBQ2pFLDhDQUE2RjtBQUM3Riw0Q0FBdUM7QUFDdkMsZ0VBQXFDO0FBQ3JDLGlDQUFtQztBQUNuQyxrREFBMEI7QUFDMUIsbUNBQXNDO0FBQ3RDLGdFQUF3QztBQUN4QywwQ0FRMEI7QUFDMUIsaUNBQWtDO0FBRWxDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7SUFDZCxJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxRQUFRLENBQUM7SUFDYixNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxVQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUU7UUFDakMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWhDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFN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UmVkZWxlZ2F0ZU1lc3NhZ2UsIFNlbmRNZXNzYWdlIH0gZnJvbSAnQGJpdGdvL2Fic3RyYWN0LWNvc21vcyc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcbmltcG9ydCB7IEVjZHNhUmFuZ2VQcm9vZiwgRWNkc2FUeXBlcyB9IGZyb20gJ0BiaXRnby9zZGstbGliLW1wYyc7XG5pbXBvcnQgeyBtb2NrU2VyaWFsaXplZENoYWxsZW5nZVdpdGhQcm9vZnMsIFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgYmVmb3JlRWFjaCB9IGZyb20gJ21vY2hhJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgeyBCbGQsIFRibGQgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHtcbiAgYWRkcmVzcyxcbiAgVEVTVF9ERUxFR0FURV9UWCxcbiAgVEVTVF9TRU5EX1RYLFxuICBURVNUX1RYX1dJVEhfTUVNTyxcbiAgVEVTVF9VTkRFTEVHQVRFX1RYLFxuICBURVNUX1dJVEhEUkFXX1JFV0FSRFNfVFgsXG4gIHdyd1VzZXIsXG59IGZyb20gJy4uL3Jlc291cmNlcy9ibGQnO1xuaW1wb3J0IHNob3VsZCA9IHJlcXVpcmUoJ3Nob3VsZCcpO1xuXG5kZXNjcmliZSgnQkxEJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IGJhc2Vjb2luO1xuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ21vY2snIH0pO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcignYmxkJywgQmxkLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RibGQnLCBUYmxkLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3RibGQnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHJpZ2h0IGluZm8nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYmxkID0gYml0Z28uY29pbignYmxkJyk7XG4gICAgY29uc3QgdGJsZCA9IGJpdGdvLmNvaW4oJ3RibGQnKTtcblxuICAgIGJsZC5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCgnYmxkJyk7XG4gICAgYmxkLmdldEZhbWlseSgpLnNob3VsZC5lcXVhbCgnYmxkJyk7XG4gICAgYmxkLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdBZ29yaWMnKTtcbiAgICBibGQuZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTYpO1xuXG4gICAgdGJsZC5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCgndGJsZCcpO1xuICAgIHRibGQuZ2V0RmFtaWx5KCkuc2hvdWxkLmVxdWFsKCdibGQnKTtcbiAgICB0YmxkLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdUZXN0bmV0IEFnb3JpYycpO1xuICAgIHRibGQuZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTYpO1xuICB9KTtcblxuICBkZXNjcmliZSgnQWRkcmVzcyBWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZ2V0IGFkZHJlc3MgZGV0YWlscyB3aXRob3V0IG1lbW9JZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3NEZXRhaWxzID0gYmFzZWNvaW4uZ2V0QWRkcmVzc0RldGFpbHMoYWRkcmVzcy5ub01lbW9JZEFkZHJlc3MpO1xuICAgICAgYWRkcmVzc0RldGFpbHMuYWRkcmVzcy5zaG91bGQuZXF1YWwoYWRkcmVzcy5ub01lbW9JZEFkZHJlc3MpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdChhZGRyZXNzRGV0YWlscy5tZW1vSWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgYWRkcmVzcyBkZXRhaWxzIHdpdGggbWVtb0lkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzc0RldGFpbHMgPSBiYXNlY29pbi5nZXRBZGRyZXNzRGV0YWlscyhhZGRyZXNzLnZhbGlkTWVtb0lkQWRkcmVzcyk7XG4gICAgICBhZGRyZXNzRGV0YWlscy5hZGRyZXNzLnNob3VsZC5lcXVhbChhZGRyZXNzLnZhbGlkTWVtb0lkQWRkcmVzcy5zcGxpdCgnPycpWzBdKTtcbiAgICAgIGFkZHJlc3NEZXRhaWxzLm1lbW9JZC5zaG91bGQuZXF1YWwoJzInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgb24gbXVsdGlwbGUgbWVtbyBpZCBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgKCgpID0+IHtcbiAgICAgICAgYmFzZWNvaW4uZ2V0QWRkcmVzc0RldGFpbHMoYWRkcmVzcy5tdWx0aXBsZU1lbW9JZEFkZHJlc3MpO1xuICAgICAgfSkuc2hvdWxkLnRocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHdhbGxldCByZWNlaXZlIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZWNlaXZlQWRkcmVzcyA9IHtcbiAgICAgICAgYWRkcmVzczogJ2Fnb3JpYzF0a2ZucDRraHpkMGY3bWd0em53cnZyMGx2MmF0M3A4Yzhzejg5cD9tZW1vSWQ9NycsXG4gICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgIHJvb3RBZGRyZXNzOiAnYWdvcmljMXRrZm5wNGtoemQwZjdtZ3R6bndydnIwbHYyYXQzcDhjOHN6ODlwJyxcbiAgICAgICAgICBtZW1vSUQ6ICc3JyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBpc1ZhbGlkID0gYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHJlY2VpdmVBZGRyZXNzKTtcbiAgICAgIGlzVmFsaWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhY2NvdW50IGFkZHJlc3NlcyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcy5hZGRyZXNzMSksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MuYWRkcmVzczIpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzLmFkZHJlc3MzKSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MuYWRkcmVzczQpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoJ2RmamszNXknKSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIHN0cmluZyksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcygnJyksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzLnZhbGlkTWVtb0lkQWRkcmVzcyksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MubXVsdGlwbGVNZW1vSWRBZGRyZXNzKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB2YWxpZGF0b3IgYWRkcmVzc2VzIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkVmFsaWRhdG9yQWRkcmVzcyhhZGRyZXNzLnZhbGlkYXRvckFkZHJlc3MxKSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFZhbGlkYXRvckFkZHJlc3MoYWRkcmVzcy52YWxpZGF0b3JBZGRyZXNzMiksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRWYWxpZGF0b3JBZGRyZXNzKGFkZHJlc3MudmFsaWRhdG9yQWRkcmVzczMpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFZhbGlkYXRvckFkZHJlc3MoYWRkcmVzcy52YWxpZGF0b3JBZGRyZXNzNCksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkVmFsaWRhdG9yQWRkcmVzcygnZGZqazM1eScpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFZhbGlkYXRvckFkZHJlc3ModW5kZWZpbmVkIGFzIHVua25vd24gYXMgc3RyaW5nKSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRWYWxpZGF0b3JBZGRyZXNzKCcnKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5IHRyYW5zYWN0aW9uOiAnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiBURVNUX1NFTkRfVFguc2lnbmVkVHhCYXNlNjQsXG4gICAgICAgIHR4SW5mbzoge30sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiBURVNUX1NFTkRfVFgucmVjaXBpZW50LFxuICAgICAgICAgICAgYW1vdW50OiBURVNUX1NFTkRfVFguc2VuZEFtb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuICAgICAgY29uc3QgaXNUcmFuc2FjdGlvblZlcmlmaWVkID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgdmVyaWZpY2F0aW9uIH0pO1xuICAgICAgaXNUcmFuc2FjdGlvblZlcmlmaWVkLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2ZXJpZnkgZGVsZWdhdGUgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICB0eEhleDogVEVTVF9ERUxFR0FURV9UWC5zaWduZWRUeEJhc2U2NCxcbiAgICAgICAgdHhJbmZvOiB7fSxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IFRFU1RfREVMRUdBVEVfVFgudmFsaWRhdG9yLFxuICAgICAgICAgICAgYW1vdW50OiBURVNUX0RFTEVHQVRFX1RYLnNlbmRBbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSB7fTtcbiAgICAgIGNvbnN0IGlzVHJhbnNhY3Rpb25WZXJpZmllZCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHZlcmlmaWNhdGlvbiB9KTtcbiAgICAgIGlzVHJhbnNhY3Rpb25WZXJpZmllZC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmVyaWZ5IHVuZGVsZWdhdGUgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICB0eEhleDogVEVTVF9VTkRFTEVHQVRFX1RYLnNpZ25lZFR4QmFzZTY0LFxuICAgICAgICB0eEluZm86IHt9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogVEVTVF9VTkRFTEVHQVRFX1RYLnZhbGlkYXRvcixcbiAgICAgICAgICAgIGFtb3VudDogVEVTVF9VTkRFTEVHQVRFX1RYLnNlbmRBbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSB7fTtcbiAgICAgIGNvbnN0IGlzVHJhbnNhY3Rpb25WZXJpZmllZCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHZlcmlmaWNhdGlvbiB9KTtcbiAgICAgIGlzVHJhbnNhY3Rpb25WZXJpZmllZC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmVyaWZ5IHdpdGhkcmF3IHJld2FyZHMgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICB0eEhleDogVEVTVF9XSVRIRFJBV19SRVdBUkRTX1RYLnNpZ25lZFR4QmFzZTY0LFxuICAgICAgICB0eEluZm86IHt9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogVEVTVF9XSVRIRFJBV19SRVdBUkRTX1RYLnZhbGlkYXRvcixcbiAgICAgICAgICAgIGFtb3VudDogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuICAgICAgY29uc3QgaXNUcmFuc2FjdGlvblZlcmlmaWVkID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgdmVyaWZpY2F0aW9uIH0pO1xuICAgICAgaXNUcmFuc2FjdGlvblZlcmlmaWVkLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2ZXJpZnkgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIHBhcmFtJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHt9O1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7IHJlY2lwaWVudHM6IHVuZGVmaW5lZCB9O1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLnJlamVjdGVkV2l0aCgnbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEhleCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRXhwbGFpbiBUcmFuc2FjdGlvbjogJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEhleDogVEVTVF9TRU5EX1RYLnNpZ25lZFR4QmFzZTY0LFxuICAgICAgfSk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbJ2lkJywgJ291dHB1dHMnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZU91dHB1dHMnLCAnY2hhbmdlQW1vdW50JywgJ2ZlZScsICd0eXBlJ10sXG4gICAgICAgIGlkOiBURVNUX1NFTkRfVFguaGFzaCxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IFRFU1RfU0VORF9UWC5yZWNpcGllbnQsXG4gICAgICAgICAgICBhbW91bnQ6IFRFU1RfU0VORF9UWC5zZW5kQW1vdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG91dHB1dEFtb3VudDogVEVTVF9TRU5EX1RYLnNlbmRBbW91bnQsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgZmVlOiB7IGZlZTogVEVTVF9TRU5EX1RYLmdhc0J1ZGdldC5hbW91bnRbMF0uYW1vdW50IH0sXG4gICAgICAgIHR5cGU6IDAsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBhIGRlbGVnYXRlIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEhleDogVEVTVF9ERUxFR0FURV9UWC5zaWduZWRUeEJhc2U2NCxcbiAgICAgIH0pO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogWydpZCcsICdvdXRwdXRzJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VPdXRwdXRzJywgJ2NoYW5nZUFtb3VudCcsICdmZWUnLCAndHlwZSddLFxuICAgICAgICBpZDogVEVTVF9ERUxFR0FURV9UWC5oYXNoLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogVEVTVF9ERUxFR0FURV9UWC52YWxpZGF0b3IsXG4gICAgICAgICAgICBhbW91bnQ6IFRFU1RfREVMRUdBVEVfVFguc2VuZEFtb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBvdXRwdXRBbW91bnQ6IFRFU1RfREVMRUdBVEVfVFguc2VuZEFtb3VudCxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBmZWU6IHsgZmVlOiBURVNUX0RFTEVHQVRFX1RYLmdhc0J1ZGdldC5hbW91bnRbMF0uYW1vdW50IH0sXG4gICAgICAgIHR5cGU6IDEzLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSB1bmRlbGVnYXRlIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEhleDogVEVTVF9VTkRFTEVHQVRFX1RYLnNpZ25lZFR4QmFzZTY0LFxuICAgICAgfSk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbJ2lkJywgJ291dHB1dHMnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZU91dHB1dHMnLCAnY2hhbmdlQW1vdW50JywgJ2ZlZScsICd0eXBlJ10sXG4gICAgICAgIGlkOiBURVNUX1VOREVMRUdBVEVfVFguaGFzaCxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IFRFU1RfVU5ERUxFR0FURV9UWC52YWxpZGF0b3IsXG4gICAgICAgICAgICBhbW91bnQ6IFRFU1RfVU5ERUxFR0FURV9UWC5zZW5kQW1vdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG91dHB1dEFtb3VudDogVEVTVF9VTkRFTEVHQVRFX1RYLnNlbmRBbW91bnQsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgZmVlOiB7IGZlZTogVEVTVF9VTkRFTEVHQVRFX1RYLmdhc0J1ZGdldC5hbW91bnRbMF0uYW1vdW50IH0sXG4gICAgICAgIHR5cGU6IDE3LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSB3aXRoZHJhdyB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhIZXg6IFRFU1RfV0lUSERSQVdfUkVXQVJEU19UWC5zaWduZWRUeEJhc2U2NCxcbiAgICAgIH0pO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogWydpZCcsICdvdXRwdXRzJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VPdXRwdXRzJywgJ2NoYW5nZUFtb3VudCcsICdmZWUnLCAndHlwZSddLFxuICAgICAgICBpZDogVEVTVF9XSVRIRFJBV19SRVdBUkRTX1RYLmhhc2gsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiBURVNUX1dJVEhEUkFXX1JFV0FSRFNfVFgudmFsaWRhdG9yLFxuICAgICAgICAgICAgYW1vdW50OiAnVU5BVkFJTEFCTEUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG91dHB1dEFtb3VudDogdW5kZWZpbmVkLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIGZlZTogeyBmZWU6IFRFU1RfV0lUSERSQVdfUkVXQVJEU19UWC5nYXNCdWRnZXQuYW1vdW50WzBdLmFtb3VudCB9LFxuICAgICAgICB0eXBlOiAxNSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBtZW1vJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEhleDogVEVTVF9UWF9XSVRIX01FTU8uc2lnbmVkVHhCYXNlNjQsXG4gICAgICB9KTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFsnaWQnLCAnb3V0cHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlT3V0cHV0cycsICdjaGFuZ2VBbW91bnQnLCAnZmVlJywgJ3R5cGUnXSxcbiAgICAgICAgaWQ6IFRFU1RfVFhfV0lUSF9NRU1PLmhhc2gsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiBURVNUX1RYX1dJVEhfTUVNTy50byxcbiAgICAgICAgICAgIGFtb3VudDogVEVTVF9UWF9XSVRIX01FTU8uc2VuZEFtb3VudCxcbiAgICAgICAgICAgIG1lbW86IFRFU1RfVFhfV0lUSF9NRU1PLm1lbW8sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiBURVNUX1RYX1dJVEhfTUVNTy5zZW5kQW1vdW50LFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIGZlZTogeyBmZWU6IFRFU1RfVFhfV0lUSF9NRU1PLmdhc0J1ZGdldC5hbW91bnRbMF0uYW1vdW50IH0sXG4gICAgICAgIHR5cGU6IDAsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBleHBsYWluIHRyYW5zYWN0aW9uIHdpdGggbWlzc2luZyBwYXJhbXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe30pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGVycm9yLm1lc3NhZ2UsICdtaXNzaW5nIHJlcXVpcmVkIHR4SGV4IHBhcmFtZXRlcicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGV4cGxhaW4gdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIHBhcmFtcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7IHR4SGV4OiAncmFuZG9tU3RyaW5nJyB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNob3VsZC5lcXVhbChlcnJvci5tZXNzYWdlLnN0YXJ0c1dpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb246JyksIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGFyc2UgVHJhbnNhY3Rpb25zOiAnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNmZXJJbnB1dHNSZXNwb25zZSA9IHtcbiAgICAgICAgYWRkcmVzczogVEVTVF9TRU5EX1RYLnJlY2lwaWVudCxcbiAgICAgICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKFRFU1RfU0VORF9UWC5zZW5kQW1vdW50KS5wbHVzKFRFU1RfU0VORF9UWC5nYXNCdWRnZXQuYW1vdW50WzBdLmFtb3VudCkudG9GaXhlZCgpLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHJhbnNmZXJPdXRwdXRzUmVzcG9uc2UgPSB7XG4gICAgICAgIGFkZHJlc3M6IFRFU1RfU0VORF9UWC5yZWNpcGllbnQsXG4gICAgICAgIGFtb3VudDogVEVTVF9TRU5EX1RYLnNlbmRBbW91bnQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBwYXJzZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLnBhcnNlVHJhbnNhY3Rpb24oeyB0eEhleDogVEVTVF9TRU5EX1RYLnNpZ25lZFR4QmFzZTY0IH0pO1xuXG4gICAgICBwYXJzZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgaW5wdXRzOiBbdHJhbnNmZXJJbnB1dHNSZXNwb25zZV0sXG4gICAgICAgIG91dHB1dHM6IFt0cmFuc2Zlck91dHB1dHNSZXNwb25zZV0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBwYXJzZSBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdoZW4gZXhwbGFpblRyYW5zYWN0aW9uIHJlc3BvbnNlIGlzIHVuZGVmaW5lZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0dWIgPSBzaW5vbi5zdHViKEJsZC5wcm90b3R5cGUsICdleHBsYWluVHJhbnNhY3Rpb24nKTtcbiAgICAgIHN0dWIucmVzb2x2ZXModW5kZWZpbmVkKTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5wYXJzZVRyYW5zYWN0aW9uKHsgdHhIZXg6IFRFU1RfU0VORF9UWC5zaWduZWRUeEJhc2U2NCB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgICAgc3R1Yi5yZXN0b3JlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZWNvdmVyIHRyYW5zYWN0aW9uOiBzdWNjZXNzIHBhdGgnLCAoKSA9PiB7XG4gICAgY29uc3Qgc2FuZEJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcbiAgICBjb25zdCBkZXN0aW5hdGlvbkFkZHJlc3MgPSB3cndVc2VyLmRlc3RpbmF0aW9uQWRkcmVzcztcbiAgICBjb25zdCBjb2luID0gY29pbnMuZ2V0KCd0YmxkJyk7XG4gICAgY29uc3QgdGVzdEJhbGFuY2UgPSBbXG4gICAgICB7XG4gICAgICAgIGRlbm9tOiAndWJsZCcsXG4gICAgICAgIGFtb3VudDogJzE1MDAwMCcsXG4gICAgICB9LFxuICAgIF07XG4gICAgY29uc3QgdGVzdEFjY291bnROdW1iZXIgPSAnMTIzJztcbiAgICBjb25zdCB0ZXN0U2VxdWVuY2VOdW1iZXIgPSAnMCc7XG4gICAgY29uc3QgdGVzdENoYWluSWQgPSAndGVzdC1jaGFpbic7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGNvbnN0IGFjY291bnRCYWxhbmNlID0gc2FuZEJveC5zdHViKEJsZC5wcm90b3R5cGUsICdnZXRBY2NvdW50QmFsYW5jZScgYXMga2V5b2YgQmxkKTtcbiAgICAgIGFjY291bnRCYWxhbmNlLndpdGhBcmdzKHdyd1VzZXIuc2VuZGVyQWRkcmVzcykucmVzb2x2ZXModGVzdEJhbGFuY2UpO1xuXG4gICAgICBjb25zdCBhY2NvdW50RGV0YWlscyA9IHNhbmRCb3guc3R1YihCbGQucHJvdG90eXBlLCAnZ2V0QWNjb3VudERldGFpbHMnIGFzIGtleW9mIEJsZCk7XG4gICAgICBhY2NvdW50RGV0YWlscy53aXRoQXJncyh3cndVc2VyLnNlbmRlckFkZHJlc3MpLnJlc29sdmVzKFt0ZXN0QWNjb3VudE51bWJlciwgdGVzdFNlcXVlbmNlTnVtYmVyXSk7XG5cbiAgICAgIGNvbnN0IGNoYWluSWQgPSBzYW5kQm94LnN0dWIoQmxkLnByb3RvdHlwZSwgJ2dldENoYWluSWQnIGFzIGtleW9mIEJsZCk7XG4gICAgICBjaGFpbklkLndpdGhBcmdzKCkucmVzb2x2ZXModGVzdENoYWluSWQpO1xuXG4gICAgICBjb25zdCBkZXNlcmlhbGl6ZWRFbnRDaGFsbGVuZ2UgPSBFY2RzYVR5cGVzLmRlc2VyaWFsaXplTnRpbGRlV2l0aFByb29mcyhtb2NrU2VyaWFsaXplZENoYWxsZW5nZVdpdGhQcm9vZnMpO1xuICAgICAgc2lub24uc3R1YihFY2RzYVJhbmdlUHJvb2YsICdnZW5lcmF0ZU50aWxkZScpLnJlc29sdmVzKGRlc2VyaWFsaXplZEVudENoYWxsZW5nZSk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgICBzaW5vbi5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY292ZXIgZnVuZHMgZm9yIG5vbi1iaXRnbyByZWNvdmVyaWVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIHVzZXJLZXk6IHdyd1VzZXIudXNlclByaXZhdGVLZXksXG4gICAgICAgIGJhY2t1cEtleTogd3J3VXNlci5iYWNrdXBQcml2YXRlS2V5LFxuICAgICAgICBiaXRnb0tleTogd3J3VXNlci5iaXRnb1B1YmxpY0tleSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogd3J3VXNlci53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBkZXN0aW5hdGlvbkFkZHJlc3MsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgICByZXMuc2hvdWxkLmhhc093blByb3BlcnR5KCdzZXJpYWxpemVkVHgnKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxlZE9uY2UoYmFzZWNvaW4uZ2V0QWNjb3VudEJhbGFuY2UpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbGVkT25jZShiYXNlY29pbi5nZXRBY2NvdW50RGV0YWlscyk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsZWRPbmNlKGJhc2Vjb2luLmdldENoYWluSWQpO1xuXG4gICAgICBjb25zdCB0eG4gPSBuZXcgQ29zbW9zVHJhbnNhY3Rpb24oY29pbiwgdXRpbHMpO1xuICAgICAgdHhuLmVucmljaFRyYW5zYWN0aW9uRGV0YWlsc0Zyb21SYXdUcmFuc2FjdGlvbihyZXMuc2VyaWFsaXplZFR4KTtcbiAgICAgIGNvbnN0IHR4bkpzb24gPSB0eG4udG9Kc29uKCk7XG4gICAgICBjb25zdCBzZW5kTWVzc2FnZSA9IHR4bkpzb24uc2VuZE1lc3NhZ2VzWzBdLnZhbHVlIGFzIFNlbmRNZXNzYWdlO1xuICAgICAgY29uc3QgYmFsYW5jZSA9IG5ldyBCaWdOdW1iZXIodGVzdEJhbGFuY2VbMF0uYW1vdW50KTtcbiAgICAgIGNvbnN0IGdhc0Ftb3VudCA9IG5ldyBCaWdOdW1iZXIoNzAwMCk7XG4gICAgICBjb25zdCBhY3R1YWxCYWxhbmNlID0gYmFsYW5jZS5taW51cyhnYXNBbW91bnQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNlbmRNZXNzYWdlLnRvQWRkcmVzcywgZGVzdGluYXRpb25BZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbChzZW5kTWVzc2FnZS5hbW91bnRbMF0uYW1vdW50LCBhY3R1YWxCYWxhbmNlLnRvRml4ZWQoKSk7XG4gICAgICBzaG91bGQuZXF1YWwoc2VuZE1lc3NhZ2UuYW1vdW50WzBdLmRlbm9tLCB0ZXN0QmFsYW5jZVswXS5kZW5vbSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlZGVsZWdhdGUgZnVuZHMgdG8gbmV3IHZhbGlkYXRvcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlZGVsZWdhdGUoe1xuICAgICAgICB1c2VyS2V5OiB3cndVc2VyLnVzZXJQcml2YXRlS2V5LFxuICAgICAgICBiYWNrdXBLZXk6IHdyd1VzZXIuYmFja3VwUHJpdmF0ZUtleSxcbiAgICAgICAgYml0Z29LZXk6IHdyd1VzZXIuYml0Z29QdWJsaWNLZXksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHdyd1VzZXIud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgYW1vdW50VG9SZWRlbGVnYXRlOiAnMTAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICB2YWxpZGF0b3JTcmNBZGRyZXNzOiAnYWdvcmljdmFsb3BlcjF3eTNoM2duZTk0eHBtbmp3ZndkM2V5YXl0djlnNG5qNnl5a2traicsXG4gICAgICAgIHZhbGlkYXRvckRzdEFkZHJlc3M6ICdhZ29yaWN2YWxvcGVyMXFkMGgyaGo3dWxqamhrdHc5bDNmam56NXUyMmcweHU3NGF3Mzh3JyxcbiAgICAgIH0pO1xuXG4gICAgICByZXMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuICAgICAgcmVzLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgnc2VyaWFsaXplZFR4Jyk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsZWRPbmNlKGJhc2Vjb2luLmdldENoYWluSWQpO1xuXG4gICAgICBjb25zdCB0eG4gPSBuZXcgQ29zbW9zVHJhbnNhY3Rpb24oY29pbiwgdXRpbHMpO1xuICAgICAgdHhuLmVucmljaFRyYW5zYWN0aW9uRGV0YWlsc0Zyb21SYXdUcmFuc2FjdGlvbihyZXMuc2VyaWFsaXplZFR4KTtcbiAgICAgIGNvbnN0IHR4bkpzb24gPSB0eG4udG9Kc29uKCk7XG4gICAgICBjb25zdCByZWRlbGVnYXRlTWVzc2FnZSA9IHR4bkpzb24uc2VuZE1lc3NhZ2VzWzBdLnZhbHVlIGFzIFJlZGVsZWdhdGVNZXNzYWdlO1xuICAgICAgc2hvdWxkLmVxdWFsKHJlZGVsZWdhdGVNZXNzYWdlLnZhbGlkYXRvclNyY0FkZHJlc3MsICdhZ29yaWN2YWxvcGVyMXd5M2gzZ25lOTR4cG1uandmd2QzZXlheXR2OWc0bmo2eXlra2tqJyk7XG4gICAgICBzaG91bGQuZXF1YWwocmVkZWxlZ2F0ZU1lc3NhZ2UudmFsaWRhdG9yRHN0QWRkcmVzcywgJ2Fnb3JpY3ZhbG9wZXIxcWQwaDJoajd1bGpqaGt0dzlsM2Zqbno1dTIyZzB4dTc0YXczOHcnKTtcbiAgICAgIHNob3VsZC5lcXVhbChyZWRlbGVnYXRlTWVzc2FnZS5hbW91bnQuYW1vdW50LCAnMTAwMDAwMDAwMDAwMDAwMDAnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1JlY292ZXIgdHJhbnNhY3Rpb246IGZhaWx1cmUgcGF0aCcsICgpID0+IHtcbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uQWRkcmVzcyA9IHdyd1VzZXIuZGVzdGluYXRpb25BZGRyZXNzO1xuICAgIGNvbnN0IHRlc3RaZXJvQmFsYW5jZSA9IFtcbiAgICAgIHtcbiAgICAgICAgZGVub206ICd1YmxkJyxcbiAgICAgICAgYW1vdW50OiAnMCcsXG4gICAgICB9LFxuICAgIF07XG4gICAgY29uc3QgdGVzdEFjY291bnROdW1iZXIgPSAnMTIzJztcbiAgICBjb25zdCB0ZXN0U2VxdWVuY2VOdW1iZXIgPSAnMCc7XG4gICAgY29uc3QgdGVzdENoYWluSWQgPSAndGVzdC1jaGFpbic7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGNvbnN0IGFjY291bnRCYWxhbmNlID0gc2FuZEJveC5zdHViKEJsZC5wcm90b3R5cGUsICdnZXRBY2NvdW50QmFsYW5jZScgYXMga2V5b2YgQmxkKTtcbiAgICAgIGFjY291bnRCYWxhbmNlLndpdGhBcmdzKHdyd1VzZXIuc2VuZGVyQWRkcmVzcykucmVzb2x2ZXModGVzdFplcm9CYWxhbmNlKTtcblxuICAgICAgY29uc3QgYWNjb3VudERldGFpbHMgPSBzYW5kQm94LnN0dWIoQmxkLnByb3RvdHlwZSwgJ2dldEFjY291bnREZXRhaWxzJyBhcyBrZXlvZiBCbGQpO1xuICAgICAgYWNjb3VudERldGFpbHMud2l0aEFyZ3Mod3J3VXNlci5zZW5kZXJBZGRyZXNzKS5yZXNvbHZlcyhbdGVzdEFjY291bnROdW1iZXIsIHRlc3RTZXF1ZW5jZU51bWJlcl0pO1xuXG4gICAgICBjb25zdCBjaGFpbklkID0gc2FuZEJveC5zdHViKEJsZC5wcm90b3R5cGUsICdnZXRDaGFpbklkJyBhcyBrZXlvZiBCbGQpO1xuICAgICAgY2hhaW5JZC53aXRoQXJncygpLnJlc29sdmVzKHRlc3RDaGFpbklkKTtcblxuICAgICAgY29uc3QgZGVzZXJpYWxpemVkRW50Q2hhbGxlbmdlID0gRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZU50aWxkZVdpdGhQcm9vZnMobW9ja1NlcmlhbGl6ZWRDaGFsbGVuZ2VXaXRoUHJvb2ZzKTtcbiAgICAgIHNpbm9uLnN0dWIoRWNkc2FSYW5nZVByb29mLCAnZ2VuZXJhdGVOdGlsZGUnKS5yZXNvbHZlcyhkZXNlcmlhbGl6ZWRFbnRDaGFsbGVuZ2UpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgIHNhbmRCb3gucmVzdG9yZSgpO1xuICAgICAgc2lub24ucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBpZiBiYWNrdXBrZXkgaXMgbm90IHByZXNlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAucmVjb3Zlcih7XG4gICAgICAgICAgdXNlcktleTogd3J3VXNlci51c2VyUHJpdmF0ZUtleSxcbiAgICAgICAgICBiaXRnb0tleTogd3J3VXNlci5iaXRnb1B1YmxpY0tleSxcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiB3cndVc2VyLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogZGVzdGluYXRpb25BZGRyZXNzLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLnJlamVjdGVkV2l0aCgnbWlzc2luZyBiYWNrdXBLZXknKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgaWYgdXNlcmtleSBpcyBub3QgcHJlc2VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5yZWNvdmVyKHtcbiAgICAgICAgICBiYWNrdXBLZXk6IHdyd1VzZXIuYmFja3VwUHJpdmF0ZUtleSxcbiAgICAgICAgICBiaXRnb0tleTogd3J3VXNlci5iaXRnb1B1YmxpY0tleSxcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiB3cndVc2VyLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogZGVzdGluYXRpb25BZGRyZXNzLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLnJlamVjdGVkV2l0aCgnbWlzc2luZyB1c2VyS2V5Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGlmIHdhbGxldCBwYXNzcGhyYXNlIGlzIG5vdCBwcmVzZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnJlY292ZXIoe1xuICAgICAgICAgIHVzZXJLZXk6IHdyd1VzZXIudXNlclByaXZhdGVLZXksXG4gICAgICAgICAgYmFja3VwS2V5OiB3cndVc2VyLmJhY2t1cFByaXZhdGVLZXksXG4gICAgICAgICAgYml0Z29LZXk6IHdyd1VzZXIuYml0Z29QdWJsaWNLZXksXG4gICAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogZGVzdGluYXRpb25BZGRyZXNzLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLnJlamVjdGVkV2l0aCgnbWlzc2luZyB3YWxsZXQgcGFzc3BocmFzZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBpZiB0aGVyZSBpcyBubyBiYWxhbmNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnJlY292ZXIoe1xuICAgICAgICAgIHVzZXJLZXk6IHdyd1VzZXIudXNlclByaXZhdGVLZXksXG4gICAgICAgICAgYmFja3VwS2V5OiB3cndVc2VyLmJhY2t1cFByaXZhdGVLZXksXG4gICAgICAgICAgYml0Z29LZXk6IHdyd1VzZXIuYml0Z29QdWJsaWNLZXksXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogd3J3VXNlci53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IGRlc3RpbmF0aW9uQWRkcmVzcyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoJ0RpZCBub3QgaGF2ZSBlbm91Z2ggZnVuZHMgdG8gcmVjb3ZlcicpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=keyPair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyPair.d.ts","sourceRoot":"","sources":["../../../test/unit/keyPair.ts"],"names":[],"mappings":""}