@bitgo-beta/sdk-coin-ton 1.0.1-beta.162 → 1.0.1-beta.1621

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 (108) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +2 -1
  4. package/dist/src/jettonToken.d.ts +19 -0
  5. package/dist/src/jettonToken.d.ts.map +1 -0
  6. package/dist/src/jettonToken.js +52 -0
  7. package/dist/src/lib/constants.d.ts +9 -0
  8. package/dist/src/lib/constants.d.ts.map +1 -0
  9. package/dist/src/lib/constants.js +12 -0
  10. package/dist/src/lib/explainTransactionWasm.d.ts +22 -0
  11. package/dist/src/lib/explainTransactionWasm.d.ts.map +1 -0
  12. package/dist/src/lib/explainTransactionWasm.js +61 -0
  13. package/dist/src/lib/iface.d.ts +17 -0
  14. package/dist/src/lib/iface.d.ts.map +1 -1
  15. package/dist/src/lib/iface.js +1 -1
  16. package/dist/src/lib/index.d.ts +5 -0
  17. package/dist/src/lib/index.d.ts.map +1 -1
  18. package/dist/src/lib/index.js +29 -9
  19. package/dist/src/lib/keyPair.js +18 -8
  20. package/dist/src/lib/singleNominatorWithdrawBuilder.d.ts +17 -0
  21. package/dist/src/lib/singleNominatorWithdrawBuilder.d.ts.map +1 -0
  22. package/dist/src/lib/singleNominatorWithdrawBuilder.js +38 -0
  23. package/dist/src/lib/tokenTransaction.d.ts +16 -0
  24. package/dist/src/lib/tokenTransaction.d.ts.map +1 -0
  25. package/dist/src/lib/tokenTransaction.js +97 -0
  26. package/dist/src/lib/tokenTransferBuilder.d.ts +20 -0
  27. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  28. package/dist/src/lib/tokenTransferBuilder.js +57 -0
  29. package/dist/src/lib/tonWhalesDepositBuilder.d.ts +12 -0
  30. package/dist/src/lib/tonWhalesDepositBuilder.d.ts.map +1 -0
  31. package/dist/src/lib/tonWhalesDepositBuilder.js +42 -0
  32. package/dist/src/lib/tonWhalesVestingDepositBuilder.d.ts +12 -0
  33. package/dist/src/lib/tonWhalesVestingDepositBuilder.d.ts.map +1 -0
  34. package/dist/src/lib/tonWhalesVestingDepositBuilder.js +37 -0
  35. package/dist/src/lib/tonWhalesVestingWithdrawBuilder.d.ts +12 -0
  36. package/dist/src/lib/tonWhalesVestingWithdrawBuilder.d.ts.map +1 -0
  37. package/dist/src/lib/tonWhalesVestingWithdrawBuilder.js +37 -0
  38. package/dist/src/lib/tonWhalesWithdrawalBuilder.d.ts +30 -0
  39. package/dist/src/lib/tonWhalesWithdrawalBuilder.d.ts.map +1 -0
  40. package/dist/src/lib/tonWhalesWithdrawalBuilder.js +60 -0
  41. package/dist/src/lib/transaction.d.ts +20 -10
  42. package/dist/src/lib/transaction.d.ts.map +1 -1
  43. package/dist/src/lib/transaction.js +176 -45
  44. package/dist/src/lib/transactionBuilder.d.ts +27 -3
  45. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  46. package/dist/src/lib/transactionBuilder.js +52 -5
  47. package/dist/src/lib/transactionBuilderFactory.d.ts +19 -1
  48. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  49. package/dist/src/lib/transactionBuilderFactory.js +78 -4
  50. package/dist/src/lib/transactionExplanation.d.ts +14 -0
  51. package/dist/src/lib/transactionExplanation.d.ts.map +1 -0
  52. package/dist/src/lib/transactionExplanation.js +3 -0
  53. package/dist/src/lib/transferBuilder.d.ts +1 -1
  54. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  55. package/dist/src/lib/transferBuilder.js +4 -2
  56. package/dist/src/lib/utils.d.ts +22 -1
  57. package/dist/src/lib/utils.d.ts.map +1 -1
  58. package/dist/src/lib/utils.js +89 -4
  59. package/dist/src/register.d.ts.map +1 -1
  60. package/dist/src/register.js +5 -1
  61. package/dist/src/ton.d.ts +27 -2
  62. package/dist/src/ton.d.ts.map +1 -1
  63. package/dist/src/ton.js +360 -32
  64. package/dist/src/tton.js +1 -1
  65. package/dist/test/resources/ton.d.ts +184 -0
  66. package/dist/test/resources/ton.d.ts.map +1 -0
  67. package/dist/test/resources/ton.js +208 -0
  68. package/dist/test/unit/explainTransactionWasm.d.ts +2 -0
  69. package/dist/test/unit/explainTransactionWasm.d.ts.map +1 -0
  70. package/dist/test/unit/explainTransactionWasm.js +147 -0
  71. package/dist/test/unit/jettonToken.d.ts +2 -0
  72. package/dist/test/unit/jettonToken.d.ts.map +1 -0
  73. package/dist/test/unit/jettonToken.js +341 -0
  74. package/dist/test/unit/keyPair.d.ts +2 -0
  75. package/dist/test/unit/keyPair.d.ts.map +1 -0
  76. package/dist/test/unit/keyPair.js +55 -0
  77. package/dist/test/unit/singleNominatorWithdrawBuilder.d.ts +2 -0
  78. package/dist/test/unit/singleNominatorWithdrawBuilder.d.ts.map +1 -0
  79. package/dist/test/unit/singleNominatorWithdrawBuilder.js +314 -0
  80. package/dist/test/unit/tokenTransferBuilder.d.ts +2 -0
  81. package/dist/test/unit/tokenTransferBuilder.d.ts.map +1 -0
  82. package/dist/test/unit/tokenTransferBuilder.js +262 -0
  83. package/dist/test/unit/ton.d.ts +2 -0
  84. package/dist/test/unit/ton.d.ts.map +1 -0
  85. package/dist/test/unit/ton.js +752 -0
  86. package/dist/test/unit/tonWhalesDepositBuilder.d.ts +2 -0
  87. package/dist/test/unit/tonWhalesDepositBuilder.d.ts.map +1 -0
  88. package/dist/test/unit/tonWhalesDepositBuilder.js +114 -0
  89. package/dist/test/unit/tonWhalesVestingDepositBuilder.d.ts +2 -0
  90. package/dist/test/unit/tonWhalesVestingDepositBuilder.d.ts.map +1 -0
  91. package/dist/test/unit/tonWhalesVestingDepositBuilder.js +136 -0
  92. package/dist/test/unit/tonWhalesVestingWithdrawBuilder.d.ts +2 -0
  93. package/dist/test/unit/tonWhalesVestingWithdrawBuilder.d.ts.map +1 -0
  94. package/dist/test/unit/tonWhalesVestingWithdrawBuilder.js +136 -0
  95. package/dist/test/unit/tonWhalesWithdrawalBuilder.d.ts +2 -0
  96. package/dist/test/unit/tonWhalesWithdrawalBuilder.d.ts.map +1 -0
  97. package/dist/test/unit/tonWhalesWithdrawalBuilder.js +130 -0
  98. package/dist/test/unit/transferBuilder.d.ts +2 -0
  99. package/dist/test/unit/transferBuilder.d.ts.map +1 -0
  100. package/dist/test/unit/transferBuilder.js +281 -0
  101. package/dist/test/unit/wasmCrossCompatibility.d.ts +2 -0
  102. package/dist/test/unit/wasmCrossCompatibility.d.ts.map +1 -0
  103. package/dist/test/unit/wasmCrossCompatibility.js +176 -0
  104. package/dist/tsconfig.tsbuildinfo +1 -0
  105. package/package.json +14 -10
  106. package/.eslintignore +0 -5
  107. package/.mocharc.yml +0 -8
  108. package/CHANGELOG.md +0 -399
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const should_1 = __importDefault(require("should"));
40
+ const wasm_ton_1 = require("@bitgo/wasm-ton");
41
+ const explainTransactionWasm_1 = require("../../src/lib/explainTransactionWasm");
42
+ const testData = __importStar(require("../resources/ton"));
43
+ describe('TON WASM explainTransaction', function () {
44
+ describe('explainTonTransaction', function () {
45
+ it('should explain a signed send transaction', function () {
46
+ const txBase64 = testData.signedSendTransaction.tx;
47
+ const explained = (0, explainTransactionWasm_1.explainTonTransaction)({ txBase64 });
48
+ explained.outputs.length.should.be.greaterThan(0);
49
+ explained.outputs[0].amount.should.equal(testData.signedSendTransaction.recipient.amount);
50
+ explained.outputs[0].address.should.equal(testData.signedSendTransaction.recipient.address);
51
+ explained.changeOutputs.should.be.an.Array();
52
+ explained.changeAmount.should.equal('0');
53
+ should_1.default.exist(explained.id);
54
+ });
55
+ it('should explain a signed token send transaction', function () {
56
+ const txBase64 = testData.signedTokenSendTransaction.tx;
57
+ const explained = (0, explainTransactionWasm_1.explainTonTransaction)({ txBase64 });
58
+ explained.outputs.length.should.be.greaterThan(0);
59
+ should_1.default.exist(explained.id);
60
+ });
61
+ it('should explain a single nominator withdraw transaction', function () {
62
+ const txBase64 = testData.signedSingleNominatorWithdrawTransaction.tx;
63
+ const explained = (0, explainTransactionWasm_1.explainTonTransaction)({ txBase64 });
64
+ should_1.default.exist(explained.id);
65
+ explained.id.should.equal(testData.signedSingleNominatorWithdrawTransaction.txId);
66
+ should_1.default.exist(explained.withdrawAmount);
67
+ explained.withdrawAmount.should.equal('932178112330000');
68
+ });
69
+ it('should explain a Ton Whales withdrawal transaction', function () {
70
+ const txBase64 = testData.signedTonWhalesWithdrawalTransaction.tx;
71
+ const explained = (0, explainTransactionWasm_1.explainTonTransaction)({ txBase64 });
72
+ should_1.default.exist(explained.id);
73
+ should_1.default.exist(explained.withdrawAmount);
74
+ });
75
+ it('should explain a Ton Whales full withdrawal transaction', function () {
76
+ const txBase64 = testData.signedTonWhalesFullWithdrawalTransaction.tx;
77
+ const explained = (0, explainTransactionWasm_1.explainTonTransaction)({ txBase64 });
78
+ should_1.default.exist(explained.id);
79
+ });
80
+ it('should respect toAddressBounceable=false', function () {
81
+ const txBase64 = testData.signedSendTransaction.tx;
82
+ const bounceable = (0, explainTransactionWasm_1.explainTonTransaction)({ txBase64, toAddressBounceable: true });
83
+ const nonBounceable = (0, explainTransactionWasm_1.explainTonTransaction)({ txBase64, toAddressBounceable: false });
84
+ bounceable.outputs[0].address.should.equal(testData.signedSendTransaction.recipient.address);
85
+ nonBounceable.outputs[0].address.should.equal(testData.signedSendTransaction.recipientBounceable.address);
86
+ });
87
+ });
88
+ describe('WASM Transaction signing flow', function () {
89
+ it('should produce correct signable payload from WASM Transaction', function () {
90
+ const txBase64 = testData.signedSendTransaction.tx;
91
+ const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(txBase64, 'base64'));
92
+ const signablePayload = tx.signablePayload();
93
+ signablePayload.should.be.instanceOf(Uint8Array);
94
+ signablePayload.length.should.equal(32);
95
+ const expectedSignable = Buffer.from(testData.signedSendTransaction.signable, 'base64');
96
+ Buffer.from(signablePayload).toString('base64').should.equal(expectedSignable.toString('base64'));
97
+ });
98
+ it('should parse transaction and preserve bigint amounts', function () {
99
+ const txBase64 = testData.signedSendTransaction.tx;
100
+ const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(txBase64, 'base64'));
101
+ const parsed = (0, wasm_ton_1.parseTransaction)(tx);
102
+ parsed.transactionType.should.equal('Transfer');
103
+ parsed.sendActions.length.should.be.greaterThan(0);
104
+ (typeof parsed.sendActions[0].amount).should.equal('bigint');
105
+ parsed.seqno.should.be.a.Number();
106
+ (typeof parsed.expireAt).should.equal('bigint');
107
+ });
108
+ it('should get transaction id', function () {
109
+ const txBase64 = testData.signedSendTransaction.tx;
110
+ const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(txBase64, 'base64'));
111
+ tx.id.should.equal(testData.signedSendTransaction.txId);
112
+ });
113
+ it('should detect signed transaction via non-zero signature', function () {
114
+ const txBase64 = testData.signedSendTransaction.tx;
115
+ const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(txBase64, 'base64'));
116
+ const parsed = (0, wasm_ton_1.parseTransaction)(tx);
117
+ parsed.signature.should.be.a.String();
118
+ parsed.signature.length.should.be.greaterThan(0);
119
+ parsed.signature.should.not.equal('0'.repeat(128));
120
+ });
121
+ });
122
+ describe('WASM parseTransaction types', function () {
123
+ it('should parse Transfer type', function () {
124
+ const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(testData.signedSendTransaction.tx, 'base64'));
125
+ (0, wasm_ton_1.parseTransaction)(tx).transactionType.should.equal('Transfer');
126
+ });
127
+ it('should parse TokenTransfer type', function () {
128
+ const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(testData.signedTokenSendTransaction.tx, 'base64'));
129
+ (0, wasm_ton_1.parseTransaction)(tx).transactionType.should.equal('TokenTransfer');
130
+ });
131
+ it('should parse SingleNominatorWithdraw type with correct withdrawAmount', function () {
132
+ const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(testData.signedSingleNominatorWithdrawTransaction.tx, 'base64'));
133
+ const parsed = (0, wasm_ton_1.parseTransaction)(tx);
134
+ parsed.transactionType.should.equal('SingleNominatorWithdraw');
135
+ String(parsed.sendActions[0].withdrawAmount).should.equal('932178112330000');
136
+ });
137
+ it('should parse WhalesDeposit type', function () {
138
+ const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(testData.signedTonWhalesDepositTransaction.tx, 'base64'));
139
+ (0, wasm_ton_1.parseTransaction)(tx).transactionType.should.equal('WhalesDeposit');
140
+ });
141
+ it('should parse WhalesWithdraw type', function () {
142
+ const tx = wasm_ton_1.Transaction.fromBytes(Buffer.from(testData.signedTonWhalesWithdrawalTransaction.tx, 'base64'));
143
+ (0, wasm_ton_1.parseTransaction)(tx).transactionType.should.equal('WhalesWithdraw');
144
+ });
145
+ });
146
+ });
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbGFpblRyYW5zYWN0aW9uV2FzbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9leHBsYWluVHJhbnNhY3Rpb25XYXNtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDhDQUFzRjtBQUN0RixpRkFBNkU7QUFDN0UsMkRBQTZDO0FBRTdDLFFBQVEsQ0FBQyw2QkFBNkIsRUFBRTtJQUN0QyxRQUFRLENBQUMsdUJBQXVCLEVBQUU7UUFDaEMsRUFBRSxDQUFDLDBDQUEwQyxFQUFFO1lBQzdDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7WUFDbkQsTUFBTSxTQUFTLEdBQUcsSUFBQSw4Q0FBcUIsRUFBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFFdEQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFGLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1RixTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzdDLFNBQVMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QyxnQkFBTSxDQUFD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WUFDdEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyw2QkFBNkIsRUFBRTtRQUN0QyxFQUFFLENBQUMsNEJBQTRCLEVBQUU7WUFDL0IsTUFBTSxFQUFFLEdBQUcsc0JBQWtCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2xHLElBQUEsMkJBQWdCLEVBQUMsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaUNBQWlDLEVBQUU7WUFDcEMsTUFBTSxFQUFFLEdBQUcsc0JBQWtCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3ZHLElBQUEsMkJBQWdCLEVBQUMsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUVBQXVFLEVBQUU7WUFDMUUsTUFBTSxFQUFFLEdBQUcsc0JBQWtCLENBQUMsU0FBUyxDQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyx3Q0FBd0MsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQzVFLENBQUM7WUFDRixNQUFNLE1BQU0sR0FBRyxJQUFBLDJCQUFnQixFQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMvRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRTtZQUNwQyxNQUFNLEVBQUUsR0FBRyxzQkFBa0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUNBQWlDLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDOUcsSUFBQSwyQkFBZ0IsRUFBQyxFQUFFLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRTtZQUNyQyxNQUFNLEVBQUUsR0FBRyxzQkFBa0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsb0NBQW9DLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDakgsSUFBQSwyQkFBZ0IsRUFBQyxFQUFFLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIGFzIFdhc21Ub25UcmFuc2FjdGlvbiwgcGFyc2VUcmFuc2FjdGlvbiB9IGZyb20gJ0BiaXRnby93YXNtLXRvbic7XG5pbXBvcnQgeyBleHBsYWluVG9uVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9zcmMvbGliL2V4cGxhaW5UcmFuc2FjdGlvbldhc20nO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3Rvbic7XG5cbmRlc2NyaWJlKCdUT04gV0FTTSBleHBsYWluVHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdleHBsYWluVG9uVHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGEgc2lnbmVkIHNlbmQgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJhc2U2NCA9IHRlc3REYXRhLnNpZ25lZFNlbmRUcmFuc2FjdGlvbi50eDtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZCA9IGV4cGxhaW5Ub25UcmFuc2FjdGlvbih7IHR4QmFzZTY0IH0pO1xuXG4gICAgICBleHBsYWluZWQub3V0cHV0cy5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuICAgICAgZXhwbGFpbmVkLm91dHB1dHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zaWduZWRTZW5kVHJhbnNhY3Rpb24ucmVjaXBpZW50LmFtb3VudCk7XG4gICAgICBleHBsYWluZWQub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zaWduZWRTZW5kVHJhbnNhY3Rpb24ucmVjaXBpZW50LmFkZHJlc3MpO1xuICAgICAgZXhwbGFpbmVkLmNoYW5nZU91dHB1dHMuc2hvdWxkLmJlLmFuLkFycmF5KCk7XG4gICAgICBleHBsYWluZWQuY2hhbmdlQW1vdW50LnNob3VsZC5lcXVhbCgnMCcpO1xuICAgICAgc2hvdWxkLmV4aXN0KGV4cGxhaW5lZC5pZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSBzaWduZWQgdG9rZW4gc2VuZCB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QmFzZTY0ID0gdGVzdERhdGEuc2lnbmVkVG9rZW5TZW5kVHJhbnNhY3Rpb24udHg7XG4gICAgICBjb25zdCBleHBsYWluZWQgPSBleHBsYWluVG9uVHJhbnNhY3Rpb24oeyB0eEJhc2U2NCB9KTtcblxuICAgICAgZXhwbGFpbmVkLm91dHB1dHMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcbiAgICAgIHNob3VsZC5leGlzdChleHBsYWluZWQuaWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGEgc2luZ2xlIG5vbWluYXRvciB3aXRoZHJhdyB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QmFzZTY0ID0gdGVzdERhdGEuc2lnbmVkU2luZ2xlTm9taW5hdG9yV2l0aGRyYXdUcmFuc2FjdGlvbi50eDtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZCA9IGV4cGxhaW5Ub25UcmFuc2FjdGlvbih7IHR4QmFzZTY0IH0pO1xuXG4gICAgICBzaG91bGQuZXhpc3QoZXhwbGFpbmVkLmlkKTtcbiAgICAgIGV4cGxhaW5lZC5pZC5zaG91bGQuZXF1YWwodGVzdERhdGEuc2lnbmVkU2luZ2xlTm9taW5hdG9yV2l0aGRyYXdUcmFuc2FjdGlvbi50eElkKTtcbiAgICAgIHNob3VsZC5leGlzdChleHBsYWluZWQud2l0aGRyYXdBbW91bnQpO1xuICAgICAgZXhwbGFpbmVkLndpdGhkcmF3QW1vdW50IS5zaG91bGQuZXF1YWwoJzkzMjE3ODExMjMzMDAwMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGEgVG9uIFdoYWxlcyB3aXRoZHJhd2FsIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCYXNlNjQgPSB0ZXN0RGF0YS5zaWduZWRUb25XaGFsZXNXaXRoZHJhd2FsVHJhbnNhY3Rpb24udHg7XG4gICAgICBjb25zdCBleHBsYWluZWQgPSBleHBsYWluVG9uVHJhbnNhY3Rpb24oeyB0eEJhc2U2NCB9KTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGV4cGxhaW5lZC5pZCk7XG4gICAgICBzaG91bGQuZXhpc3QoZXhwbGFpbmVkLndpdGhkcmF3QW1vdW50KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBhIFRvbiBXaGFsZXMgZnVsbCB3aXRoZHJhd2FsIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCYXNlNjQgPSB0ZXN0RGF0YS5zaWduZWRUb25XaGFsZXNGdWxsV2l0aGRyYXdhbFRyYW5zYWN0aW9uLnR4O1xuICAgICAgY29uc3QgZXhwbGFpbmVkID0gZXhwbGFpblRvblRyYW5zYWN0aW9uKHsgdHhCYXNlNjQgfSk7XG5cbiAgICAgIHNob3VsZC5leGlzdChleHBsYWluZWQuaWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXNwZWN0IHRvQWRkcmVzc0JvdW5jZWFibGU9ZmFsc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJhc2U2NCA9IHRlc3REYXRhLnNpZ25lZFNlbmRUcmFuc2FjdGlvbi50eDtcbiAgICAgIGNvbnN0IGJvdW5jZWFibGUgPSBleHBsYWluVG9uVHJhbnNhY3Rpb24oeyB0eEJhc2U2NCwgdG9BZGRyZXNzQm91bmNlYWJsZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IG5vbkJvdW5jZWFibGUgPSBleHBsYWluVG9uVHJhbnNhY3Rpb24oeyB0eEJhc2U2NCwgdG9BZGRyZXNzQm91bmNlYWJsZTogZmFsc2UgfSk7XG5cbiAgICAgIGJvdW5jZWFibGUub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zaWduZWRTZW5kVHJhbnNhY3Rpb24ucmVjaXBpZW50LmFkZHJlc3MpO1xuICAgICAgbm9uQm91bmNlYWJsZS5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnNpZ25lZFNlbmRUcmFuc2FjdGlvbi5yZWNpcGllbnRCb3VuY2VhYmxlLmFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnV0FTTSBUcmFuc2FjdGlvbiBzaWduaW5nIGZsb3cnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGNvcnJlY3Qgc2lnbmFibGUgcGF5bG9hZCBmcm9tIFdBU00gVHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJhc2U2NCA9IHRlc3REYXRhLnNpZ25lZFNlbmRUcmFuc2FjdGlvbi50eDtcbiAgICAgIGNvbnN0IHR4ID0gV2FzbVRvblRyYW5zYWN0aW9uLmZyb21CeXRlcyhCdWZmZXIuZnJvbSh0eEJhc2U2NCwgJ2Jhc2U2NCcpKTtcbiAgICAgIGNvbnN0IHNpZ25hYmxlUGF5bG9hZCA9IHR4LnNpZ25hYmxlUGF5bG9hZCgpO1xuXG4gICAgICBzaWduYWJsZVBheWxvYWQuc2hvdWxkLmJlLmluc3RhbmNlT2YoVWludDhBcnJheSk7XG4gICAgICBzaWduYWJsZVBheWxvYWQubGVuZ3RoLnNob3VsZC5lcXVhbCgzMik7XG5cbiAgICAgIGNvbnN0IGV4cGVjdGVkU2lnbmFibGUgPSBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zaWduZWRTZW5kVHJhbnNhY3Rpb24uc2lnbmFibGUsICdiYXNlNjQnKTtcbiAgICAgIEJ1ZmZlci5mcm9tKHNpZ25hYmxlUGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpLnNob3VsZC5lcXVhbChleHBlY3RlZFNpZ25hYmxlLnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIHRyYW5zYWN0aW9uIGFuZCBwcmVzZXJ2ZSBiaWdpbnQgYW1vdW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QmFzZTY0ID0gdGVzdERhdGEuc2lnbmVkU2VuZFRyYW5zYWN0aW9uLnR4O1xuICAgICAgY29uc3QgdHggPSBXYXNtVG9uVHJhbnNhY3Rpb24uZnJvbUJ5dGVzKEJ1ZmZlci5mcm9tKHR4QmFzZTY0LCAnYmFzZTY0JykpO1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VUcmFuc2FjdGlvbih0eCk7XG5cbiAgICAgIHBhcnNlZC50cmFuc2FjdGlvblR5cGUuc2hvdWxkLmVxdWFsKCdUcmFuc2ZlcicpO1xuICAgICAgcGFyc2VkLnNlbmRBY3Rpb25zLmxlbmd0aC5zaG91bGQuYmUuZ3JlYXRlclRoYW4oMCk7XG4gICAgICAodHlwZW9mIHBhcnNlZC5zZW5kQWN0aW9uc1swXS5hbW91bnQpLnNob3VsZC5lcXVhbCgnYmlnaW50Jyk7XG4gICAgICBwYXJzZWQuc2Vxbm8uc2hvdWxkLmJlLmEuTnVtYmVyKCk7XG4gICAgICAodHlwZW9mIHBhcnNlZC5leHBpcmVBdCkuc2hvdWxkLmVxdWFsKCdiaWdpbnQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IHRyYW5zYWN0aW9uIGlkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCYXNlNjQgPSB0ZXN0RGF0YS5zaWduZWRTZW5kVHJhbnNhY3Rpb24udHg7XG4gICAgICBjb25zdCB0eCA9IFdhc21Ub25UcmFuc2FjdGlvbi5mcm9tQnl0ZXMoQnVmZmVyLmZyb20odHhCYXNlNjQsICdiYXNlNjQnKSk7XG4gICAgICB0eC5pZC5zaG91bGQuZXF1YWwodGVzdERhdGEuc2lnbmVkU2VuZFRyYW5zYWN0aW9uLnR4SWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZXRlY3Qgc2lnbmVkIHRyYW5zYWN0aW9uIHZpYSBub24temVybyBzaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJhc2U2NCA9IHRlc3REYXRhLnNpZ25lZFNlbmRUcmFuc2FjdGlvbi50eDtcbiAgICAgIGNvbnN0IHR4ID0gV2FzbVRvblRyYW5zYWN0aW9uLmZyb21CeXRlcyhCdWZmZXIuZnJvbSh0eEJhc2U2NCwgJ2Jhc2U2NCcpKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlVHJhbnNhY3Rpb24odHgpO1xuXG4gICAgICBwYXJzZWQuc2lnbmF0dXJlLnNob3VsZC5iZS5hLlN0cmluZygpO1xuICAgICAgcGFyc2VkLnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuICAgICAgcGFyc2VkLnNpZ25hdHVyZS5zaG91bGQubm90LmVxdWFsKCcwJy5yZXBlYXQoMTI4KSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdXQVNNIHBhcnNlVHJhbnNhY3Rpb24gdHlwZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBUcmFuc2ZlciB0eXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBXYXNtVG9uVHJhbnNhY3Rpb24uZnJvbUJ5dGVzKEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFNlbmRUcmFuc2FjdGlvbi50eCwgJ2Jhc2U2NCcpKTtcbiAgICAgIHBhcnNlVHJhbnNhY3Rpb24odHgpLnRyYW5zYWN0aW9uVHlwZS5zaG91bGQuZXF1YWwoJ1RyYW5zZmVyJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIFRva2VuVHJhbnNmZXIgdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gV2FzbVRvblRyYW5zYWN0aW9uLmZyb21CeXRlcyhCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zaWduZWRUb2tlblNlbmRUcmFuc2FjdGlvbi50eCwgJ2Jhc2U2NCcpKTtcbiAgICAgIHBhcnNlVHJhbnNhY3Rpb24odHgpLnRyYW5zYWN0aW9uVHlwZS5zaG91bGQuZXF1YWwoJ1Rva2VuVHJhbnNmZXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgU2luZ2xlTm9taW5hdG9yV2l0aGRyYXcgdHlwZSB3aXRoIGNvcnJlY3Qgd2l0aGRyYXdBbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IFdhc21Ub25UcmFuc2FjdGlvbi5mcm9tQnl0ZXMoXG4gICAgICAgIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFNpbmdsZU5vbWluYXRvcldpdGhkcmF3VHJhbnNhY3Rpb24udHgsICdiYXNlNjQnKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlVHJhbnNhY3Rpb24odHgpO1xuICAgICAgcGFyc2VkLnRyYW5zYWN0aW9uVHlwZS5zaG91bGQuZXF1YWwoJ1NpbmdsZU5vbWluYXRvcldpdGhkcmF3Jyk7XG4gICAgICBTdHJpbmcocGFyc2VkLnNlbmRBY3Rpb25zWzBdLndpdGhkcmF3QW1vdW50KS5zaG91bGQuZXF1YWwoJzkzMjE3ODExMjMzMDAwMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBXaGFsZXNEZXBvc2l0IHR5cGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IFdhc21Ub25UcmFuc2FjdGlvbi5mcm9tQnl0ZXMoQnVmZmVyLmZyb20odGVzdERhdGEuc2lnbmVkVG9uV2hhbGVzRGVwb3NpdFRyYW5zYWN0aW9uLnR4LCAnYmFzZTY0JykpO1xuICAgICAgcGFyc2VUcmFuc2FjdGlvbih0eCkudHJhbnNhY3Rpb25UeXBlLnNob3VsZC5lcXVhbCgnV2hhbGVzRGVwb3NpdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBXaGFsZXNXaXRoZHJhdyB0eXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBXYXNtVG9uVHJhbnNhY3Rpb24uZnJvbUJ5dGVzKEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFRvbldoYWxlc1dpdGhkcmF3YWxUcmFuc2FjdGlvbi50eCwgJ2Jhc2U2NCcpKTtcbiAgICAgIHBhcnNlVHJhbnNhY3Rpb24odHgpLnRyYW5zYWN0aW9uVHlwZS5zaG91bGQuZXF1YWwoJ1doYWxlc1dpdGhkcmF3Jyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=jettonToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jettonToken.d.ts","sourceRoot":"","sources":["../../../test/unit/jettonToken.ts"],"names":[],"mappings":""}
@@ -0,0 +1,341 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const tonweb_1 = __importDefault(require("tonweb"));
40
+ const should_1 = __importDefault(require("should"));
41
+ const sinon = __importStar(require("sinon"));
42
+ const sdk_test_1 = require("@bitgo-beta/sdk-test");
43
+ const sdk_api_1 = require("@bitgo-beta/sdk-api");
44
+ const src_1 = require("../../src");
45
+ const testData = __importStar(require("../resources/ton"));
46
+ describe('Jetton Tokens', function () {
47
+ let bitgo;
48
+ let testnetJettonToken;
49
+ let mainnetJettonToken;
50
+ const testnetTokenName = 'tton:ukwny-us';
51
+ const mainnetTokenName = 'ton:usdt';
52
+ const txPrebuildList = [
53
+ {
54
+ txHex: Buffer.from(testData.signedTokenSendTransaction.tx, 'base64').toString('hex'),
55
+ txInfo: {},
56
+ },
57
+ ];
58
+ const txPrebuildBounceableList = [
59
+ {
60
+ txHex: Buffer.from(testData.signedTokenSendTransaction.txBounceable, 'base64').toString('hex'),
61
+ txInfo: {},
62
+ },
63
+ ];
64
+ const txParamsList = [
65
+ {
66
+ recipients: [testData.signedTokenSendTransaction.recipient],
67
+ },
68
+ ];
69
+ const txParamsBounceableList = [
70
+ {
71
+ recipients: [testData.signedTokenSendTransaction.recipientBounceable],
72
+ },
73
+ ];
74
+ before(function () {
75
+ bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
76
+ src_1.JettonToken.createTokenConstructors().forEach(({ name, coinConstructor }) => {
77
+ bitgo.safeRegister(name, coinConstructor);
78
+ });
79
+ bitgo.initializeTestVars();
80
+ testnetJettonToken = bitgo.coin(testnetTokenName);
81
+ mainnetJettonToken = bitgo.coin(mainnetTokenName);
82
+ });
83
+ it('should return constants for Testnet Ton token', function () {
84
+ testnetJettonToken.getChain().should.equal(testnetTokenName);
85
+ testnetJettonToken.getBaseChain().should.equal('tton');
86
+ testnetJettonToken.getFullName().should.equal('Ton Token');
87
+ testnetJettonToken.getBaseFactor().should.equal(1e9);
88
+ testnetJettonToken.type.should.equal(testnetTokenName);
89
+ testnetJettonToken.name.should.equal('Test Unknown TokenY-US');
90
+ testnetJettonToken.coin.should.equal('tton');
91
+ testnetJettonToken.network.should.equal('Testnet');
92
+ testnetJettonToken.contractAddress.should.equal('kQD8EQMavE1w6gvgMXUhN8hi7pSk4bKYM-W2dgkNqV54Y16Y');
93
+ testnetJettonToken.decimalPlaces.should.equal(9);
94
+ });
95
+ it('should return constants for Mainnet Ton token', function () {
96
+ mainnetJettonToken.getChain().should.equal(mainnetTokenName);
97
+ mainnetJettonToken.getBaseChain().should.equal('ton');
98
+ mainnetJettonToken.getFullName().should.equal('Ton Token');
99
+ mainnetJettonToken.getBaseFactor().should.equal(1e6);
100
+ mainnetJettonToken.type.should.equal(mainnetTokenName);
101
+ mainnetJettonToken.name.should.equal('Tether USD');
102
+ mainnetJettonToken.coin.should.equal('ton');
103
+ mainnetJettonToken.network.should.equal('Mainnet');
104
+ mainnetJettonToken.contractAddress.should.equal('EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs');
105
+ mainnetJettonToken.decimalPlaces.should.equal(6);
106
+ });
107
+ describe('Verify Jetton transaction: ', () => {
108
+ txParamsList.forEach((_, index) => {
109
+ const txParams = txParamsList[index];
110
+ const txPrebuild = txPrebuildList[index];
111
+ const txParamsBounceable = txParamsBounceableList[index];
112
+ const txPrebuildBounceable = txPrebuildBounceableList[index];
113
+ it('should succeed to verify transaction', async function () {
114
+ const verification = {};
115
+ const isTransactionVerified = await testnetJettonToken.verifyTransaction({
116
+ txParams,
117
+ txPrebuild,
118
+ verification,
119
+ });
120
+ isTransactionVerified.should.equal(true);
121
+ const isBounceableTransactionVerified = await testnetJettonToken.verifyTransaction({
122
+ txParams: txParamsBounceable,
123
+ txPrebuild: txPrebuildBounceable,
124
+ verification: {},
125
+ });
126
+ isBounceableTransactionVerified.should.equal(true);
127
+ });
128
+ it('should succeed to verify transaction when recipients amount are numbers', async function () {
129
+ const txParamsWithNumberAmounts = JSON.parse(JSON.stringify(txParams));
130
+ txParamsWithNumberAmounts.recipients[0].amount = 20000000;
131
+ const verification = {};
132
+ await testnetJettonToken
133
+ .verifyTransaction({
134
+ txParams: txParamsWithNumberAmounts,
135
+ txPrebuild,
136
+ verification,
137
+ })
138
+ .should.rejectedWith('Tx outputs does not match with expected txParams recipients');
139
+ });
140
+ it('should succeed to verify transaction when recipients amount are strings', async function () {
141
+ const txParamsWithNumberAmounts = JSON.parse(JSON.stringify(txParams));
142
+ txParamsWithNumberAmounts.recipients[0].amount = '20000000';
143
+ const verification = {};
144
+ await testnetJettonToken
145
+ .verifyTransaction({
146
+ txParams: txParamsWithNumberAmounts,
147
+ txPrebuild,
148
+ verification,
149
+ })
150
+ .should.rejectedWith('Tx outputs does not match with expected txParams recipients');
151
+ });
152
+ it('should succeed to verify transaction when recipients amounts are number and amount is same', async function () {
153
+ const verification = {};
154
+ await testnetJettonToken
155
+ .verifyTransaction({
156
+ txParams,
157
+ txPrebuild,
158
+ verification,
159
+ })
160
+ .should.resolvedWith(true);
161
+ });
162
+ it('should succeed to verify transaction when recipients amounts are string and amount is same', async function () {
163
+ const verification = {};
164
+ await testnetJettonToken
165
+ .verifyTransaction({
166
+ txParams,
167
+ txPrebuild,
168
+ verification,
169
+ })
170
+ .should.resolvedWith(true);
171
+ });
172
+ it('should succeed to verify transaction when recipient address are non bounceable', async function () {
173
+ const txParamsWithNumberAmounts = JSON.parse(JSON.stringify(txParams));
174
+ txParamsWithNumberAmounts.recipients[0].address = new tonweb_1.default.Address(txParamsWithNumberAmounts.recipients[0].address).toString(true, true, false);
175
+ const verification = {};
176
+ const isVerified = await testnetJettonToken.verifyTransaction({
177
+ txParams: txParamsWithNumberAmounts,
178
+ txPrebuild,
179
+ verification,
180
+ });
181
+ isVerified.should.equal(true);
182
+ });
183
+ it('should fail to verify transaction with invalid param', async function () {
184
+ const txPrebuild = {};
185
+ await testnetJettonToken
186
+ .verifyTransaction({
187
+ txParams,
188
+ txPrebuild,
189
+ })
190
+ .should.rejectedWith('missing required tx prebuild property txHex');
191
+ });
192
+ });
193
+ it('should succeed to verify transaction with recipient having memo', async function () {
194
+ const txParams = {
195
+ recipients: [testData.signedTokenSendTransactionForMemoId.recipient],
196
+ };
197
+ const txPrebuild = {
198
+ txHex: Buffer.from(testData.signedTokenSendTransactionForMemoId.tx, 'base64').toString('hex'),
199
+ txInfo: {},
200
+ };
201
+ const verification = {};
202
+ const isTransactionVerified = await testnetJettonToken.verifyTransaction({
203
+ txParams,
204
+ txPrebuild,
205
+ verification,
206
+ });
207
+ isTransactionVerified.should.equal(true);
208
+ });
209
+ });
210
+ describe('Explain Jetton Transaction: ', () => {
211
+ it('should explain a jetton transfer transaction', async function () {
212
+ const explainedTransaction = (await testnetJettonToken.explainTransaction({
213
+ txHex: Buffer.from(testData.signedTokenSendTransaction.tx, 'base64').toString('hex'),
214
+ }));
215
+ explainedTransaction.should.deepEqual({
216
+ displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'withdrawAmount'],
217
+ id: testData.signedTokenSendTransaction.txId,
218
+ outputs: [
219
+ {
220
+ address: testData.signedTokenSendTransaction.recipient.address,
221
+ amount: testData.signedTokenSendTransaction.recipient.amount,
222
+ },
223
+ ],
224
+ outputAmount: testData.signedTokenSendTransaction.recipient.amount,
225
+ changeOutputs: [],
226
+ changeAmount: '0',
227
+ fee: { fee: 'UNKNOWN' },
228
+ withdrawAmount: undefined,
229
+ });
230
+ });
231
+ it('should explain a non-bounceable jetton transfer transaction', async function () {
232
+ const explainedTransaction = (await testnetJettonToken.explainTransaction({
233
+ txHex: Buffer.from(testData.signedTokenSendTransaction.txBounceable, 'base64').toString('hex'),
234
+ toAddressBounceable: false,
235
+ fromAddressBounceable: false,
236
+ }));
237
+ explainedTransaction.should.deepEqual({
238
+ displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'withdrawAmount'],
239
+ id: testData.signedTokenSendTransaction.txIdBounceable,
240
+ outputs: [
241
+ {
242
+ address: testData.signedTokenSendTransaction.recipientBounceable.address,
243
+ amount: testData.signedTokenSendTransaction.recipientBounceable.amount,
244
+ },
245
+ ],
246
+ outputAmount: testData.signedTokenSendTransaction.recipientBounceable.amount,
247
+ changeOutputs: [],
248
+ changeAmount: '0',
249
+ fee: { fee: 'UNKNOWN' },
250
+ withdrawAmount: undefined,
251
+ });
252
+ });
253
+ it('should fail to explain transaction with missing params', async function () {
254
+ try {
255
+ await testnetJettonToken.explainTransaction({});
256
+ }
257
+ catch (error) {
258
+ should_1.default.equal(error.message, 'Invalid transaction');
259
+ }
260
+ });
261
+ it('should fail to explain transaction with invalid params', async function () {
262
+ try {
263
+ await testnetJettonToken.explainTransaction({ txHex: 'randomString' });
264
+ }
265
+ catch (error) {
266
+ should_1.default.equal(error.message, 'Invalid transaction');
267
+ }
268
+ });
269
+ });
270
+ describe('Parse Jetton Transactions: ', () => {
271
+ const transactionsList = [testData.signedTokenSendTransaction.tx];
272
+ const transactionInputsResponseList = [
273
+ [
274
+ {
275
+ address: 'EQCqQzfyg0cZ-8t9v2YoHmFFxG5jgjvQRTZ2yeDjO5z5ZRy9',
276
+ amount: testData.tokenRecipients[0].amount,
277
+ },
278
+ ],
279
+ ];
280
+ const transactionInputsResponseBounceableList = [
281
+ [
282
+ {
283
+ address: testData.tokenSender.address,
284
+ amount: testData.tokenRecipients[0].amount,
285
+ },
286
+ ],
287
+ ];
288
+ const transactionOutputsResponseList = [
289
+ [
290
+ {
291
+ address: 'EQB-CM6DF-jpq9XVdiSdefAMU5KC1gpZuYBFp-Q65aUhnx5K',
292
+ amount: testData.tokenRecipients[0].amount,
293
+ },
294
+ ],
295
+ ];
296
+ const transactionOutputsResponseBounceableList = [
297
+ [
298
+ {
299
+ address: testData.tokenRecipients[0].address,
300
+ amount: testData.tokenRecipients[0].amount,
301
+ },
302
+ ],
303
+ ];
304
+ transactionsList.forEach((_, index) => {
305
+ const transaction = transactionsList[index];
306
+ const transactionInputsResponse = transactionInputsResponseList[index];
307
+ const transactionInputsResponseBounceable = transactionInputsResponseBounceableList[index];
308
+ const transactionOutputsResponse = transactionOutputsResponseList[index];
309
+ const transactionOutputsResponseBounceable = transactionOutputsResponseBounceableList[index];
310
+ it('should parse a TON transaction', async function () {
311
+ const parsedTransaction = await testnetJettonToken.parseTransaction({
312
+ txHex: Buffer.from(transaction, 'base64').toString('hex'),
313
+ });
314
+ parsedTransaction.should.deepEqual({
315
+ inputs: transactionInputsResponse,
316
+ outputs: transactionOutputsResponse,
317
+ });
318
+ });
319
+ it('should parse a non-bounceable TON transaction', async function () {
320
+ const parsedTransaction = await testnetJettonToken.parseTransaction({
321
+ txHex: Buffer.from(transaction, 'base64').toString('hex'),
322
+ toAddressBounceable: false,
323
+ fromAddressBounceable: false,
324
+ });
325
+ parsedTransaction.should.deepEqual({
326
+ inputs: transactionInputsResponseBounceable,
327
+ outputs: transactionOutputsResponseBounceable,
328
+ });
329
+ });
330
+ it('should fail to parse a TON transaction when explainTransaction response is undefined', async function () {
331
+ const stub = sinon.stub(src_1.Ton.prototype, 'explainTransaction');
332
+ stub.resolves(undefined);
333
+ await testnetJettonToken
334
+ .parseTransaction({ txHex: transaction })
335
+ .should.be.rejectedWith('invalid raw transaction');
336
+ stub.restore();
337
+ });
338
+ });
339
+ });
340
+ });
341
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamV0dG9uVG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvamV0dG9uVG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLDZDQUErQjtBQUUvQixtREFBK0Q7QUFDL0QsaURBQStDO0FBQy9DLG1DQUF5RTtBQUN6RSwyREFBNkM7QUFFN0MsUUFBUSxDQUFDLGVBQWUsRUFBRTtJQUN4QixJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxrQkFBa0IsQ0FBQztJQUN2QixJQUFJLGtCQUFrQixDQUFDO0lBQ3ZCLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxDQUFDO0lBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO0lBRXBDLE1BQU0sY0FBYyxHQUFHO1FBQ3JCO1lBQ0UsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3BGLE1BQU0sRUFBRSxFQUFFO1NBQ1g7S0FDRixDQUFDO0lBQ0YsTUFBTSx3QkFBd0IsR0FBRztRQUMvQjtZQUNFLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUM5RixNQUFNLEVBQUUsRUFBRTtTQUNYO0tBQ0YsQ0FBQztJQUVGLE1BQU0sWUFBWSxHQUFHO1FBQ25CO1lBQ0UsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsQ0FBQztTQUM1RDtLQUNGLENBQUM7SUFFRixNQUFNLHNCQUFzQixHQUFHO1FBQzdCO1lBQ0UsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLDBCQUEw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akIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVG9ud2ViIGZyb20gJ3RvbndlYic7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1hcGknO1xuaW1wb3J0IHsgSmV0dG9uVG9rZW4sIFRvbiwgVG9uUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3Rvbic7XG5cbmRlc2NyaWJlKCdKZXR0b24gVG9rZW5zJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IHRlc3RuZXRKZXR0b25Ub2tlbjtcbiAgbGV0IG1haW5uZXRKZXR0b25Ub2tlbjtcbiAgY29uc3QgdGVzdG5ldFRva2VuTmFtZSA9ICd0dG9uOnVrd255LXVzJztcbiAgY29uc3QgbWFpbm5ldFRva2VuTmFtZSA9ICd0b246dXNkdCc7XG5cbiAgY29uc3QgdHhQcmVidWlsZExpc3QgPSBbXG4gICAge1xuICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnR4LCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdHhJbmZvOiB7fSxcbiAgICB9LFxuICBdO1xuICBjb25zdCB0eFByZWJ1aWxkQm91bmNlYWJsZUxpc3QgPSBbXG4gICAge1xuICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnR4Qm91bmNlYWJsZSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHR4SW5mbzoge30sXG4gICAgfSxcbiAgXTtcblxuICBjb25zdCB0eFBhcmFtc0xpc3QgPSBbXG4gICAge1xuICAgICAgcmVjaXBpZW50czogW3Rlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnJlY2lwaWVudF0sXG4gICAgfSxcbiAgXTtcblxuICBjb25zdCB0eFBhcmFtc0JvdW5jZWFibGVMaXN0ID0gW1xuICAgIHtcbiAgICAgIHJlY2lwaWVudHM6IFt0ZXN0RGF0YS5zaWduZWRUb2tlblNlbmRUcmFuc2FjdGlvbi5yZWNpcGllbnRCb3VuY2VhYmxlXSxcbiAgICB9LFxuICBdO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAndGVzdCcgfSk7XG4gICAgSmV0dG9uVG9rZW4uY3JlYXRlVG9rZW5Db25zdHJ1Y3RvcnMoKS5mb3JFYWNoKCh7IG5hbWUsIGNvaW5Db25zdHJ1Y3RvciB9KSA9PiB7XG4gICAgICBiaXRnby5zYWZlUmVnaXN0ZXIobmFtZSwgY29pbkNvbnN0cnVjdG9yKTtcbiAgICB9KTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICB0ZXN0bmV0SmV0dG9uVG9rZW4gPSBiaXRnby5jb2luKHRlc3RuZXRUb2tlbk5hbWUpO1xuICAgIG1haW5uZXRKZXR0b25Ub2tlbiA9IGJpdGdvLmNvaW4obWFpbm5ldFRva2VuTmFtZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIGNvbnN0YW50cyBmb3IgVGVzdG5ldCBUb24gdG9rZW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgdGVzdG5ldEpldHRvblRva2VuLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKHRlc3RuZXRUb2tlbk5hbWUpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5nZXRCYXNlQ2hhaW4oKS5zaG91bGQuZXF1YWwoJ3R0b24nKTtcbiAgICB0ZXN0bmV0SmV0dG9uVG9rZW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1RvbiBUb2tlbicpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKDFlOSk7XG4gICAgdGVzdG5ldEpldHRvblRva2VuLnR5cGUuc2hvdWxkLmVxdWFsKHRlc3RuZXRUb2tlbk5hbWUpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5uYW1lLnNob3VsZC5lcXVhbCgnVGVzdCBVbmtub3duIFRva2VuWS1VUycpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5jb2luLnNob3VsZC5lcXVhbCgndHRvbicpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5uZXR3b3JrLnNob3VsZC5lcXVhbCgnVGVzdG5ldCcpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5jb250cmFjdEFkZHJlc3Muc2hvdWxkLmVxdWFsKCdrUUQ4RVFNYXZFMXc2Z3ZnTVhVaE44aGk3cFNrNGJLWU0tVzJkZ2tOcVY1NFkxNlknKTtcbiAgICB0ZXN0bmV0SmV0dG9uVG9rZW4uZGVjaW1hbFBsYWNlcy5zaG91bGQuZXF1YWwoOSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIGNvbnN0YW50cyBmb3IgTWFpbm5ldCBUb24gdG9rZW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgbWFpbm5ldEpldHRvblRva2VuLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKG1haW5uZXRUb2tlbk5hbWUpO1xuICAgIG1haW5uZXRKZXR0b25Ub2tlbi5nZXRCYXNlQ2hhaW4oKS5zaG91bGQuZXF1YWwoJ3RvbicpO1xuICAgIG1haW5uZXRKZXR0b25Ub2tlbi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnVG9uIFRva2VuJyk7XG4gICAgbWFpbm5ldEpldHRvblRva2VuLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoMWU2KTtcbiAgICBtYWlubmV0SmV0dG9uVG9rZW4udHlwZS5zaG91bGQuZXF1YWwobWFpbm5ldFRva2VuTmFtZSk7XG4gICAgbWFpbm5ldEpldHRvblRva2VuLm5hbWUuc2hvdWxkLmVxdWFsKCdUZXRoZXIgVVNEJyk7XG4gICAgbWFpbm5ldEpldHRvblRva2VuLmNvaW4uc2hvdWxkLmVxdWFsKCd0b24nKTtcbiAgICBtYWlubmV0SmV0dG9uVG9rZW4ubmV0d29yay5zaG91bGQuZXF1YWwoJ01haW5uZXQnKTtcbiAgICBtYWlubmV0SmV0dG9uVG9rZW4uY29udHJhY3RBZGRyZXNzLnNob3VsZC5lcXVhbCgnRVFDeEU2bVV0UUpLRm5HZmFST1RLT3QxbFpiRGlpWDFrQ2l4UnY3TncySWRfc0RzJyk7XG4gICAgbWFpbm5ldEpldHRvblRva2VuLmRlY2ltYWxQbGFjZXMuc2hvdWxkLmVxdWFsKDYpO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5IEpldHRvbiB0cmFuc2FjdGlvbjogJywgKCkgPT4ge1xuICAgIHR4UGFyYW1zTGlzdC5mb3JFYWNoKChfLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB0eFBhcmFtc0xpc3RbaW5kZXhdO1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHR4UHJlYnVpbGRMaXN0W2luZGV4XTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zQm91bmNlYWJsZSA9IHR4UGFyYW1zQm91bmNlYWJsZUxpc3RbaW5kZXhdO1xuICAgICAgY29uc3QgdHhQcmVidWlsZEJvdW5jZWFibGUgPSB0eFByZWJ1aWxkQm91bmNlYWJsZUxpc3RbaW5kZXhdO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSB7fTtcbiAgICAgICAgY29uc3QgaXNUcmFuc2FjdGlvblZlcmlmaWVkID0gYXdhaXQgdGVzdG5ldEpldHRvblRva2VuLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IGlzQm91bmNlYWJsZVRyYW5zYWN0aW9uVmVyaWZpZWQgPSBhd2FpdCB0ZXN0bmV0SmV0dG9uVG9rZW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB0eFBhcmFtc0JvdW5jZWFibGUsXG4gICAgICAgICAgdHhQcmVidWlsZDogdHhQcmVidWlsZEJvdW5jZWFibGUsXG4gICAgICAgICAgdmVyaWZpY2F0aW9uOiB7fSxcbiAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICBpc0JvdW5jZWFibGVUcmFuc2FjdGlvblZlcmlmaWVkLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uIHdoZW4gcmVjaXBpZW50cyBhbW91bnQgYXJlIG51bWJlcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4UGFyYW1zV2l0aE51bWJlckFtb3VudHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHR4UGFyYW1zKSk7XG4gICAgICAgIHR4UGFyYW1zV2l0aE51bWJlckFtb3VudHMucmVjaXBpZW50c1swXS5hbW91bnQgPSAyMDAwMDAwMDtcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlblxuICAgICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICB0eFBhcmFtczogdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cyxcbiAgICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoJ1R4IG91dHB1dHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbiB3aGVuIHJlY2lwaWVudHMgYW1vdW50IGFyZSBzdHJpbmdzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eFBhcmFtc1dpdGhOdW1iZXJBbW91bnRzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0eFBhcmFtcykpO1xuICAgICAgICB0eFBhcmFtc1dpdGhOdW1iZXJBbW91bnRzLnJlY2lwaWVudHNbMF0uYW1vdW50ID0gJzIwMDAwMDAwJztcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlblxuICAgICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICB0eFBhcmFtczogdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cyxcbiAgICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoJ1R4IG91dHB1dHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbiB3aGVuIHJlY2lwaWVudHMgYW1vdW50cyBhcmUgbnVtYmVyIGFuZCBhbW91bnQgaXMgc2FtZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlblxuICAgICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgICAgLnNob3VsZC5yZXNvbHZlZFdpdGgodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbiB3aGVuIHJlY2lwaWVudHMgYW1vdW50cyBhcmUgc3RyaW5nIGFuZCBhbW91bnQgaXMgc2FtZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlblxuICAgICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgICAgLnNob3VsZC5yZXNvbHZlZFdpdGgodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbiB3aGVuIHJlY2lwaWVudCBhZGRyZXNzIGFyZSBub24gYm91bmNlYWJsZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodHhQYXJhbXMpKTtcbiAgICAgICAgdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cy5yZWNpcGllbnRzWzBdLmFkZHJlc3MgPSBuZXcgVG9ud2ViLkFkZHJlc3MoXG4gICAgICAgICAgdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cy5yZWNpcGllbnRzWzBdLmFkZHJlc3NcbiAgICAgICAgKS50b1N0cmluZyh0cnVlLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuICAgICAgICBjb25zdCBpc1ZlcmlmaWVkID0gYXdhaXQgdGVzdG5ldEpldHRvblRva2VuLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtczogdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICBpc1ZlcmlmaWVkLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCBwYXJhbScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHt9O1xuICAgICAgICBhd2FpdCB0ZXN0bmV0SmV0dG9uVG9rZW5cbiAgICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIH0gYXMgYW55KVxuICAgICAgICAgIC5zaG91bGQucmVqZWN0ZWRXaXRoKCdtaXNzaW5nIHJlcXVpcmVkIHR4IHByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2ZXJpZnkgdHJhbnNhY3Rpb24gd2l0aCByZWNpcGllbnQgaGF2aW5nIG1lbW8nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3Rlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uRm9yTWVtb0lkLnJlY2lwaWVudF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uRm9yTWVtb0lkLnR4LCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB0eEluZm86IHt9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuICAgICAgY29uc3QgaXNUcmFuc2FjdGlvblZlcmlmaWVkID0gYXdhaXQgdGVzdG5ldEpldHRvblRva2VuLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgIH0gYXMgYW55KTtcbiAgICAgIGlzVHJhbnNhY3Rpb25WZXJpZmllZC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFeHBsYWluIEpldHRvbiBUcmFuc2FjdGlvbjogJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBhIGpldHRvbiB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gKGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEhleDogQnVmZmVyLmZyb20odGVzdERhdGEuc2lnbmVkVG9rZW5TZW5kVHJhbnNhY3Rpb24udHgsICdiYXNlNjQnKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9KSkgYXMgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbjtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFsnaWQnLCAnb3V0cHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlT3V0cHV0cycsICdjaGFuZ2VBbW91bnQnLCAnZmVlJywgJ3dpdGhkcmF3QW1vdW50J10sXG4gICAgICAgIGlkOiB0ZXN0RGF0YS5zaWduZWRUb2tlblNlbmRUcmFuc2FjdGlvbi50eElkLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2lnbmVkVG9rZW5TZW5kVHJhbnNhY3Rpb24ucmVjaXBpZW50LmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnJlY2lwaWVudC5hbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiB0ZXN0RGF0YS5zaWduZWRUb2tlblNlbmRUcmFuc2FjdGlvbi5yZWNpcGllbnQuYW1vdW50LFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIGZlZTogeyBmZWU6ICdVTktOT1dOJyB9LFxuICAgICAgICB3aXRoZHJhd0Ftb3VudDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSBub24tYm91bmNlYWJsZSBqZXR0b24gdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IChhd2FpdCB0ZXN0bmV0SmV0dG9uVG9rZW4uZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnR4Qm91bmNlYWJsZSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgdG9BZGRyZXNzQm91bmNlYWJsZTogZmFsc2UsXG4gICAgICAgIGZyb21BZGRyZXNzQm91bmNlYWJsZTogZmFsc2UsXG4gICAgICB9KSkgYXMgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbjtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFsnaWQnLCAnb3V0cHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlT3V0cHV0cycsICdjaGFuZ2VBbW91bnQnLCAnZmVlJywgJ3dpdGhkcmF3QW1vdW50J10sXG4gICAgICAgIGlkOiB0ZXN0RGF0YS5zaWduZWRUb2tlblNlbmRUcmFuc2FjdGlvbi50eElkQm91bmNlYWJsZSxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnJlY2lwaWVudEJvdW5jZWFibGUuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogdGVzdERhdGEuc2lnbmVkVG9rZW5TZW5kVHJhbnNhY3Rpb24ucmVjaXBpZW50Qm91bmNlYWJsZS5hbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiB0ZXN0RGF0YS5zaWduZWRUb2tlblNlbmRUcmFuc2FjdGlvbi5yZWNpcGllbnRCb3VuY2VhYmxlLmFtb3VudCxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBmZWU6IHsgZmVlOiAnVU5LTk9XTicgfSxcbiAgICAgICAgd2l0aGRyYXdBbW91bnQ6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGV4cGxhaW4gdHJhbnNhY3Rpb24gd2l0aCBtaXNzaW5nIHBhcmFtcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlbi5leHBsYWluVHJhbnNhY3Rpb24oe30pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGVycm9yLm1lc3NhZ2UsICdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gZXhwbGFpbiB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgcGFyYW1zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGVzdG5ldEpldHRvblRva2VuLmV4cGxhaW5UcmFuc2FjdGlvbih7IHR4SGV4OiAncmFuZG9tU3RyaW5nJyB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNob3VsZC5lcXVhbChlcnJvci5tZXNzYWdlLCAnSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGFyc2UgSmV0dG9uIFRyYW5zYWN0aW9uczogJywgKCkgPT4ge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uc0xpc3QgPSBbdGVzdERhdGEuc2lnbmVkVG9rZW5TZW5kVHJhbnNhY3Rpb24udHhdO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uSW5wdXRzUmVzcG9uc2VMaXN0ID0gW1xuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogJ0VRQ3FRemZ5ZzBjWi04dDl2MllvSG1GRnhHNWpnanZRUlRaMnllRGpPNXo1WlJ5OScsXG4gICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS50b2tlblJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICBdO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25JbnB1dHNSZXNwb25zZUJvdW5jZWFibGVMaXN0ID0gW1xuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEudG9rZW5TZW5kZXIuYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLnRva2VuUmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIF07XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbk91dHB1dHNSZXNwb25zZUxpc3QgPSBbXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiAnRVFCLUNNNkRGLWpwcTlYVmRpU2RlZkFNVTVLQzFncFp1WUJGcC1RNjVhVWhueDVLJyxcbiAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLnRva2VuUmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIF07XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbk91dHB1dHNSZXNwb25zZUJvdW5jZWFibGVMaXN0ID0gW1xuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEudG9rZW5SZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS50b2tlblJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICBdO1xuXG4gICAgdHJhbnNhY3Rpb25zTGlzdC5mb3JFYWNoKChfLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbnNMaXN0W2luZGV4XTtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uSW5wdXRzUmVzcG9uc2UgPSB0cmFuc2FjdGlvbklucHV0c1Jlc3BvbnNlTGlzdFtpbmRleF07XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbklucHV0c1Jlc3BvbnNlQm91bmNlYWJsZSA9IHRyYW5zYWN0aW9uSW5wdXRzUmVzcG9uc2VCb3VuY2VhYmxlTGlzdFtpbmRleF07XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbk91dHB1dHNSZXNwb25zZSA9IHRyYW5zYWN0aW9uT3V0cHV0c1Jlc3BvbnNlTGlzdFtpbmRleF07XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbk91dHB1dHNSZXNwb25zZUJvdW5jZWFibGUgPSB0cmFuc2FjdGlvbk91dHB1dHNSZXNwb25zZUJvdW5jZWFibGVMaXN0W2luZGV4XTtcblxuICAgICAgaXQoJ3Nob3VsZCBwYXJzZSBhIFRPTiB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHJhbnNhY3Rpb24gPSBhd2FpdCB0ZXN0bmV0SmV0dG9uVG9rZW4ucGFyc2VUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRyYW5zYWN0aW9uLCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9KTtcblxuICAgICAgICBwYXJzZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgICBpbnB1dHM6IHRyYW5zYWN0aW9uSW5wdXRzUmVzcG9uc2UsXG4gICAgICAgICAgb3V0cHV0czogdHJhbnNhY3Rpb25PdXRwdXRzUmVzcG9uc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcGFyc2UgYSBub24tYm91bmNlYWJsZSBUT04gdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFRyYW5zYWN0aW9uID0gYXdhaXQgdGVzdG5ldEpldHRvblRva2VuLnBhcnNlVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4SGV4OiBCdWZmZXIuZnJvbSh0cmFuc2FjdGlvbiwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0b0FkZHJlc3NCb3VuY2VhYmxlOiBmYWxzZSxcbiAgICAgICAgICBmcm9tQWRkcmVzc0JvdW5jZWFibGU6IGZhbHNlLFxuICAgICAgICB9IGFzIFRvblBhcnNlVHJhbnNhY3Rpb25PcHRpb25zKTtcblxuICAgICAgICBwYXJzZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgICBpbnB1dHM6IHRyYW5zYWN0aW9uSW5wdXRzUmVzcG9uc2VCb3VuY2VhYmxlLFxuICAgICAgICAgIG91dHB1dHM6IHRyYW5zYWN0aW9uT3V0cHV0c1Jlc3BvbnNlQm91bmNlYWJsZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHBhcnNlIGEgVE9OIHRyYW5zYWN0aW9uIHdoZW4gZXhwbGFpblRyYW5zYWN0aW9uIHJlc3BvbnNlIGlzIHVuZGVmaW5lZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc3R1YiA9IHNpbm9uLnN0dWIoVG9uLnByb3RvdHlwZSwgJ2V4cGxhaW5UcmFuc2FjdGlvbicpO1xuICAgICAgICBzdHViLnJlc29sdmVzKHVuZGVmaW5lZCk7XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlblxuICAgICAgICAgIC5wYXJzZVRyYW5zYWN0aW9uKHsgdHhIZXg6IHRyYW5zYWN0aW9uIH0pXG4gICAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2ludmFsaWQgcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgICAgIHN0dWIucmVzdG9yZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -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":""}