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