@bitgo/sdk-coin-ton 4.0.4 → 4.0.6

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 (224) hide show
  1. package/dist/cjs/src/index.d.ts.map +1 -0
  2. package/dist/{src → cjs/src}/index.js +1 -1
  3. package/dist/cjs/src/jettonToken.d.ts.map +1 -0
  4. package/dist/cjs/src/jettonToken.js +52 -0
  5. package/dist/cjs/src/lib/constants.d.ts.map +1 -0
  6. package/dist/cjs/src/lib/constants.js +12 -0
  7. package/dist/{src → cjs/src}/lib/explainTransactionWasm.d.ts +15 -1
  8. package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
  9. package/dist/cjs/src/lib/explainTransactionWasm.js +104 -0
  10. package/dist/cjs/src/lib/iface.d.ts.map +1 -0
  11. package/dist/cjs/src/lib/iface.js +3 -0
  12. package/dist/cjs/src/lib/index.d.ts.map +1 -0
  13. package/dist/{src → cjs/src}/lib/index.js +1 -1
  14. package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
  15. package/dist/cjs/src/lib/keyPair.js +103 -0
  16. package/dist/cjs/src/lib/singleNominatorWithdrawBuilder.d.ts.map +1 -0
  17. package/dist/cjs/src/lib/singleNominatorWithdrawBuilder.js +38 -0
  18. package/dist/cjs/src/lib/tokenTransaction.d.ts.map +1 -0
  19. package/dist/cjs/src/lib/tokenTransaction.js +97 -0
  20. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  21. package/dist/cjs/src/lib/tokenTransferBuilder.js +57 -0
  22. package/dist/cjs/src/lib/tonWhalesDepositBuilder.d.ts.map +1 -0
  23. package/dist/cjs/src/lib/tonWhalesDepositBuilder.js +42 -0
  24. package/dist/cjs/src/lib/tonWhalesVestingDepositBuilder.d.ts.map +1 -0
  25. package/dist/cjs/src/lib/tonWhalesVestingDepositBuilder.js +37 -0
  26. package/dist/cjs/src/lib/tonWhalesVestingWithdrawBuilder.d.ts.map +1 -0
  27. package/dist/cjs/src/lib/tonWhalesVestingWithdrawBuilder.js +37 -0
  28. package/dist/cjs/src/lib/tonWhalesWithdrawalBuilder.d.ts.map +1 -0
  29. package/dist/cjs/src/lib/tonWhalesWithdrawalBuilder.js +60 -0
  30. package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
  31. package/dist/cjs/src/lib/transaction.js +415 -0
  32. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
  33. package/dist/cjs/src/lib/transactionBuilder.js +152 -0
  34. package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  35. package/dist/cjs/src/lib/transactionBuilderFactory.js +100 -0
  36. package/dist/cjs/src/lib/transactionExplanation.d.ts.map +1 -0
  37. package/dist/cjs/src/lib/transactionExplanation.js +3 -0
  38. package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
  39. package/dist/cjs/src/lib/transferBuilder.js +21 -0
  40. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  41. package/dist/cjs/src/lib/utils.js +159 -0
  42. package/dist/cjs/src/register.d.ts.map +1 -0
  43. package/dist/cjs/src/register.js +15 -0
  44. package/dist/cjs/src/ton.d.ts.map +1 -0
  45. package/dist/cjs/src/ton.js +520 -0
  46. package/dist/cjs/src/tton.d.ts.map +1 -0
  47. package/dist/cjs/src/tton.js +30 -0
  48. package/dist/cjs/test/resources/ton.d.ts.map +1 -0
  49. package/dist/cjs/test/resources/ton.js +208 -0
  50. package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
  51. package/dist/cjs/test/unit/explainTransactionWasm.js +147 -0
  52. package/dist/cjs/test/unit/jettonToken.d.ts.map +1 -0
  53. package/dist/cjs/test/unit/jettonToken.js +341 -0
  54. package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
  55. package/dist/cjs/test/unit/keyPair.js +55 -0
  56. package/dist/cjs/test/unit/singleNominatorWithdrawBuilder.d.ts.map +1 -0
  57. package/dist/cjs/test/unit/singleNominatorWithdrawBuilder.js +314 -0
  58. package/dist/cjs/test/unit/tokenTransferBuilder.d.ts.map +1 -0
  59. package/dist/cjs/test/unit/tokenTransferBuilder.js +262 -0
  60. package/dist/{test → cjs/test}/unit/ton.d.ts.map +1 -1
  61. package/dist/cjs/test/unit/ton.js +752 -0
  62. package/dist/cjs/test/unit/tonWhalesDepositBuilder.d.ts.map +1 -0
  63. package/dist/cjs/test/unit/tonWhalesDepositBuilder.js +114 -0
  64. package/dist/cjs/test/unit/tonWhalesVestingDepositBuilder.d.ts.map +1 -0
  65. package/dist/cjs/test/unit/tonWhalesVestingDepositBuilder.js +136 -0
  66. package/dist/cjs/test/unit/tonWhalesVestingWithdrawBuilder.d.ts.map +1 -0
  67. package/dist/cjs/test/unit/tonWhalesVestingWithdrawBuilder.js +136 -0
  68. package/dist/cjs/test/unit/tonWhalesWithdrawalBuilder.d.ts.map +1 -0
  69. package/dist/cjs/test/unit/tonWhalesWithdrawalBuilder.js +130 -0
  70. package/dist/cjs/test/unit/transferBuilder.d.ts.map +1 -0
  71. package/dist/cjs/test/unit/transferBuilder.js +281 -0
  72. package/dist/cjs/test/unit/wasmCrossCompatibility.d.ts.map +1 -0
  73. package/dist/cjs/test/unit/wasmCrossCompatibility.js +176 -0
  74. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  75. package/dist/esm/index.d.ts +6 -0
  76. package/dist/esm/index.js +6 -0
  77. package/dist/esm/jettonToken.d.ts +19 -0
  78. package/dist/esm/jettonToken.js +48 -0
  79. package/dist/esm/lib/constants.d.ts +9 -0
  80. package/dist/esm/lib/constants.js +9 -0
  81. package/dist/esm/lib/explainTransactionWasm.d.ts +36 -0
  82. package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
  83. package/dist/esm/lib/explainTransactionWasm.js +99 -0
  84. package/dist/esm/lib/iface.d.ts +32 -0
  85. package/dist/{src → esm}/lib/iface.js +1 -2
  86. package/dist/esm/lib/index.d.ts +14 -0
  87. package/dist/esm/lib/index.js +14 -0
  88. package/dist/esm/lib/keyPair.d.ts +25 -0
  89. package/dist/esm/lib/keyPair.js +63 -0
  90. package/dist/esm/lib/singleNominatorWithdrawBuilder.d.ts +17 -0
  91. package/dist/esm/lib/singleNominatorWithdrawBuilder.js +34 -0
  92. package/dist/esm/lib/tokenTransaction.d.ts +16 -0
  93. package/dist/esm/lib/tokenTransaction.js +90 -0
  94. package/dist/esm/lib/tokenTransferBuilder.d.ts +20 -0
  95. package/dist/esm/lib/tokenTransferBuilder.js +53 -0
  96. package/dist/esm/lib/tonWhalesDepositBuilder.d.ts +12 -0
  97. package/dist/esm/lib/tonWhalesDepositBuilder.js +38 -0
  98. package/dist/esm/lib/tonWhalesVestingDepositBuilder.d.ts +12 -0
  99. package/dist/esm/lib/tonWhalesVestingDepositBuilder.js +33 -0
  100. package/dist/esm/lib/tonWhalesVestingWithdrawBuilder.d.ts +12 -0
  101. package/dist/esm/lib/tonWhalesVestingWithdrawBuilder.js +33 -0
  102. package/dist/esm/lib/tonWhalesWithdrawalBuilder.d.ts +30 -0
  103. package/dist/esm/lib/tonWhalesWithdrawalBuilder.js +56 -0
  104. package/dist/esm/lib/transaction.d.ts +42 -0
  105. package/dist/esm/lib/transaction.js +408 -0
  106. package/dist/esm/lib/transactionBuilder.d.ts +74 -0
  107. package/dist/esm/lib/transactionBuilder.js +145 -0
  108. package/dist/esm/lib/transactionBuilderFactory.d.ts +32 -0
  109. package/dist/esm/lib/transactionBuilderFactory.js +96 -0
  110. package/dist/esm/lib/transactionExplanation.d.ts +14 -0
  111. package/dist/{src → esm}/lib/transactionExplanation.js +1 -2
  112. package/dist/esm/lib/transferBuilder.d.ts +9 -0
  113. package/dist/esm/lib/transferBuilder.js +17 -0
  114. package/dist/esm/lib/utils.d.ts +41 -0
  115. package/dist/esm/lib/utils.js +151 -0
  116. package/dist/esm/register.d.ts +3 -0
  117. package/dist/esm/register.js +11 -0
  118. package/dist/esm/ton.d.ts +59 -0
  119. package/dist/{src → esm}/ton.d.ts.map +1 -1
  120. package/dist/esm/ton.js +480 -0
  121. package/dist/esm/tton.d.ts +22 -0
  122. package/dist/esm/tton.js +26 -0
  123. package/package.json +27 -10
  124. package/dist/src/jettonToken.js +0 -52
  125. package/dist/src/lib/constants.js +0 -12
  126. package/dist/src/lib/explainTransactionWasm.d.ts.map +0 -1
  127. package/dist/src/lib/explainTransactionWasm.js +0 -61
  128. package/dist/src/lib/keyPair.js +0 -103
  129. package/dist/src/lib/singleNominatorWithdrawBuilder.js +0 -38
  130. package/dist/src/lib/tokenTransaction.js +0 -97
  131. package/dist/src/lib/tokenTransferBuilder.js +0 -57
  132. package/dist/src/lib/tonWhalesDepositBuilder.js +0 -42
  133. package/dist/src/lib/tonWhalesVestingDepositBuilder.js +0 -37
  134. package/dist/src/lib/tonWhalesVestingWithdrawBuilder.js +0 -37
  135. package/dist/src/lib/tonWhalesWithdrawalBuilder.js +0 -60
  136. package/dist/src/lib/transaction.js +0 -415
  137. package/dist/src/lib/transactionBuilder.js +0 -152
  138. package/dist/src/lib/transactionBuilderFactory.js +0 -100
  139. package/dist/src/lib/transferBuilder.js +0 -21
  140. package/dist/src/lib/utils.js +0 -159
  141. package/dist/src/register.js +0 -15
  142. package/dist/src/ton.js +0 -525
  143. package/dist/src/tton.js +0 -30
  144. package/dist/test/resources/ton.d.ts.map +0 -1
  145. package/dist/test/resources/ton.js +0 -208
  146. package/dist/test/unit/explainTransactionWasm.d.ts.map +0 -1
  147. package/dist/test/unit/explainTransactionWasm.js +0 -147
  148. package/dist/test/unit/jettonToken.d.ts.map +0 -1
  149. package/dist/test/unit/jettonToken.js +0 -341
  150. package/dist/test/unit/keyPair.js +0 -55
  151. package/dist/test/unit/singleNominatorWithdrawBuilder.d.ts.map +0 -1
  152. package/dist/test/unit/singleNominatorWithdrawBuilder.js +0 -314
  153. package/dist/test/unit/tokenTransferBuilder.d.ts.map +0 -1
  154. package/dist/test/unit/tokenTransferBuilder.js +0 -262
  155. package/dist/test/unit/ton.js +0 -752
  156. package/dist/test/unit/tonWhalesDepositBuilder.d.ts.map +0 -1
  157. package/dist/test/unit/tonWhalesDepositBuilder.js +0 -114
  158. package/dist/test/unit/tonWhalesVestingDepositBuilder.d.ts.map +0 -1
  159. package/dist/test/unit/tonWhalesVestingDepositBuilder.js +0 -136
  160. package/dist/test/unit/tonWhalesVestingWithdrawBuilder.d.ts.map +0 -1
  161. package/dist/test/unit/tonWhalesVestingWithdrawBuilder.js +0 -136
  162. package/dist/test/unit/tonWhalesWithdrawalBuilder.d.ts.map +0 -1
  163. package/dist/test/unit/tonWhalesWithdrawalBuilder.js +0 -130
  164. package/dist/test/unit/transferBuilder.d.ts.map +0 -1
  165. package/dist/test/unit/transferBuilder.js +0 -281
  166. package/dist/test/unit/wasmCrossCompatibility.d.ts.map +0 -1
  167. package/dist/test/unit/wasmCrossCompatibility.js +0 -176
  168. package/dist/tsconfig.tsbuildinfo +0 -1
  169. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  170. /package/dist/{src → cjs/src}/jettonToken.d.ts +0 -0
  171. /package/dist/{src → cjs/src}/lib/constants.d.ts +0 -0
  172. /package/dist/{src → cjs/src}/lib/iface.d.ts +0 -0
  173. /package/dist/{src → cjs/src}/lib/index.d.ts +0 -0
  174. /package/dist/{src → cjs/src}/lib/keyPair.d.ts +0 -0
  175. /package/dist/{src → cjs/src}/lib/singleNominatorWithdrawBuilder.d.ts +0 -0
  176. /package/dist/{src → cjs/src}/lib/tokenTransaction.d.ts +0 -0
  177. /package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +0 -0
  178. /package/dist/{src → cjs/src}/lib/tonWhalesDepositBuilder.d.ts +0 -0
  179. /package/dist/{src → cjs/src}/lib/tonWhalesVestingDepositBuilder.d.ts +0 -0
  180. /package/dist/{src → cjs/src}/lib/tonWhalesVestingWithdrawBuilder.d.ts +0 -0
  181. /package/dist/{src → cjs/src}/lib/tonWhalesWithdrawalBuilder.d.ts +0 -0
  182. /package/dist/{src → cjs/src}/lib/transaction.d.ts +0 -0
  183. /package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +0 -0
  184. /package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +0 -0
  185. /package/dist/{src → cjs/src}/lib/transactionExplanation.d.ts +0 -0
  186. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  187. /package/dist/{src → cjs/src}/lib/utils.d.ts +0 -0
  188. /package/dist/{src → cjs/src}/register.d.ts +0 -0
  189. /package/dist/{src → cjs/src}/ton.d.ts +0 -0
  190. /package/dist/{src → cjs/src}/tton.d.ts +0 -0
  191. /package/dist/{test → cjs/test}/resources/ton.d.ts +0 -0
  192. /package/dist/{test → cjs/test}/unit/explainTransactionWasm.d.ts +0 -0
  193. /package/dist/{test → cjs/test}/unit/jettonToken.d.ts +0 -0
  194. /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
  195. /package/dist/{test → cjs/test}/unit/singleNominatorWithdrawBuilder.d.ts +0 -0
  196. /package/dist/{test → cjs/test}/unit/tokenTransferBuilder.d.ts +0 -0
  197. /package/dist/{test → cjs/test}/unit/ton.d.ts +0 -0
  198. /package/dist/{test → cjs/test}/unit/tonWhalesDepositBuilder.d.ts +0 -0
  199. /package/dist/{test → cjs/test}/unit/tonWhalesVestingDepositBuilder.d.ts +0 -0
  200. /package/dist/{test → cjs/test}/unit/tonWhalesVestingWithdrawBuilder.d.ts +0 -0
  201. /package/dist/{test → cjs/test}/unit/tonWhalesWithdrawalBuilder.d.ts +0 -0
  202. /package/dist/{test → cjs/test}/unit/transferBuilder.d.ts +0 -0
  203. /package/dist/{test → cjs/test}/unit/wasmCrossCompatibility.d.ts +0 -0
  204. /package/dist/{src → esm}/index.d.ts.map +0 -0
  205. /package/dist/{src → esm}/jettonToken.d.ts.map +0 -0
  206. /package/dist/{src → esm}/lib/constants.d.ts.map +0 -0
  207. /package/dist/{src → esm}/lib/iface.d.ts.map +0 -0
  208. /package/dist/{src → esm}/lib/index.d.ts.map +0 -0
  209. /package/dist/{src → esm}/lib/keyPair.d.ts.map +0 -0
  210. /package/dist/{src → esm}/lib/singleNominatorWithdrawBuilder.d.ts.map +0 -0
  211. /package/dist/{src → esm}/lib/tokenTransaction.d.ts.map +0 -0
  212. /package/dist/{src → esm}/lib/tokenTransferBuilder.d.ts.map +0 -0
  213. /package/dist/{src → esm}/lib/tonWhalesDepositBuilder.d.ts.map +0 -0
  214. /package/dist/{src → esm}/lib/tonWhalesVestingDepositBuilder.d.ts.map +0 -0
  215. /package/dist/{src → esm}/lib/tonWhalesVestingWithdrawBuilder.d.ts.map +0 -0
  216. /package/dist/{src → esm}/lib/tonWhalesWithdrawalBuilder.d.ts.map +0 -0
  217. /package/dist/{src → esm}/lib/transaction.d.ts.map +0 -0
  218. /package/dist/{src → esm}/lib/transactionBuilder.d.ts.map +0 -0
  219. /package/dist/{src → esm}/lib/transactionBuilderFactory.d.ts.map +0 -0
  220. /package/dist/{src → esm}/lib/transactionExplanation.d.ts.map +0 -0
  221. /package/dist/{src → esm}/lib/transferBuilder.d.ts.map +0 -0
  222. /package/dist/{src → esm}/lib/utils.d.ts.map +0 -0
  223. /package/dist/{src → esm}/register.d.ts.map +0 -0
  224. /package/dist/{src → esm}/tton.d.ts.map +0 -0
@@ -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/sdk-test");
43
+ const sdk_api_1 = require("@bitgo/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamV0dG9uVG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvamV0dG9uVG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLDZDQUErQjtBQUUvQiw4Q0FBMEQ7QUFDMUQsNENBQTBDO0FBQzFDLG1DQUF5RTtBQUN6RSwyREFBNkM7QUFFN0MsUUFBUSxDQUFDLGVBQWUsRUFBRTtJQUN4QixJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxrQkFBa0IsQ0FBQztJQUN2QixJQUFJLGtCQUFrQixDQUFDO0lBQ3ZCLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxDQUFDO0lBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO0lBRXBDLE1BQU0sY0FBYyxHQUFHO1FBQ3JCO1lBQ0UsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3BGLE1BQU0sRUFBRSxFQUFFO1NBQ1g7S0FDRixDQUFDO0lBQ0YsTUFBTSx3QkFBd0IsR0FBRztRQUMvQjtZQUNFLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUM5RixNQUFNLEVBQUUsRUFBRTtTQUNYO0tBQ0YsQ0FBQztJQUVGLE1BQU0sWUFBWSxHQUFHO1FBQ25CO1lBQ0UsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsQ0FBQztTQUM1RDtLQUNGLENBQUM7SUFFRixNQUFNLHNCQUFzQixHQUFHO1FBQzdCO1lBQ0UsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLDBC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WUFDakIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVG9ud2ViIGZyb20gJ3RvbndlYic7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay1hcGknO1xuaW1wb3J0IHsgSmV0dG9uVG9rZW4sIFRvbiwgVG9uUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3Rvbic7XG5cbmRlc2NyaWJlKCdKZXR0b24gVG9rZW5zJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IHRlc3RuZXRKZXR0b25Ub2tlbjtcbiAgbGV0IG1haW5uZXRKZXR0b25Ub2tlbjtcbiAgY29uc3QgdGVzdG5ldFRva2VuTmFtZSA9ICd0dG9uOnVrd255LXVzJztcbiAgY29uc3QgbWFpbm5ldFRva2VuTmFtZSA9ICd0b246dXNkdCc7XG5cbiAgY29uc3QgdHhQcmVidWlsZExpc3QgPSBbXG4gICAge1xuICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnR4LCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdHhJbmZvOiB7fSxcbiAgICB9LFxuICBdO1xuICBjb25zdCB0eFByZWJ1aWxkQm91bmNlYWJsZUxpc3QgPSBbXG4gICAge1xuICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnR4Qm91bmNlYWJsZSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHR4SW5mbzoge30sXG4gICAgfSxcbiAgXTtcblxuICBjb25zdCB0eFBhcmFtc0xpc3QgPSBbXG4gICAge1xuICAgICAgcmVjaXBpZW50czogW3Rlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnJlY2lwaWVudF0sXG4gICAgfSxcbiAgXTtcblxuICBjb25zdCB0eFBhcmFtc0JvdW5jZWFibGVMaXN0ID0gW1xuICAgIHtcbiAgICAgIHJlY2lwaWVudHM6IFt0ZXN0RGF0YS5zaWduZWRUb2tlblNlbmRUcmFuc2FjdGlvbi5yZWNpcGllbnRCb3VuY2VhYmxlXSxcbiAgICB9LFxuICBdO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAndGVzdCcgfSk7XG4gICAgSmV0dG9uVG9rZW4uY3JlYXRlVG9rZW5Db25zdHJ1Y3RvcnMoKS5mb3JFYWNoKCh7IG5hbWUsIGNvaW5Db25zdHJ1Y3RvciB9KSA9PiB7XG4gICAgICBiaXRnby5zYWZlUmVnaXN0ZXIobmFtZSwgY29pbkNvbnN0cnVjdG9yKTtcbiAgICB9KTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICB0ZXN0bmV0SmV0dG9uVG9rZW4gPSBiaXRnby5jb2luKHRlc3RuZXRUb2tlbk5hbWUpO1xuICAgIG1haW5uZXRKZXR0b25Ub2tlbiA9IGJpdGdvLmNvaW4obWFpbm5ldFRva2VuTmFtZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIGNvbnN0YW50cyBmb3IgVGVzdG5ldCBUb24gdG9rZW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgdGVzdG5ldEpldHRvblRva2VuLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKHRlc3RuZXRUb2tlbk5hbWUpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5nZXRCYXNlQ2hhaW4oKS5zaG91bGQuZXF1YWwoJ3R0b24nKTtcbiAgICB0ZXN0bmV0SmV0dG9uVG9rZW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1RvbiBUb2tlbicpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKDFlOSk7XG4gICAgdGVzdG5ldEpldHRvblRva2VuLnR5cGUuc2hvdWxkLmVxdWFsKHRlc3RuZXRUb2tlbk5hbWUpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5uYW1lLnNob3VsZC5lcXVhbCgnVGVzdCBVbmtub3duIFRva2VuWS1VUycpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5jb2luLnNob3VsZC5lcXVhbCgndHRvbicpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5uZXR3b3JrLnNob3VsZC5lcXVhbCgnVGVzdG5ldCcpO1xuICAgIHRlc3RuZXRKZXR0b25Ub2tlbi5jb250cmFjdEFkZHJlc3Muc2hvdWxkLmVxdWFsKCdrUUQ4RVFNYXZFMXc2Z3ZnTVhVaE44aGk3cFNrNGJLWU0tVzJkZ2tOcVY1NFkxNlknKTtcbiAgICB0ZXN0bmV0SmV0dG9uVG9rZW4uZGVjaW1hbFBsYWNlcy5zaG91bGQuZXF1YWwoOSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIGNvbnN0YW50cyBmb3IgTWFpbm5ldCBUb24gdG9rZW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgbWFpbm5ldEpldHRvblRva2VuLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKG1haW5uZXRUb2tlbk5hbWUpO1xuICAgIG1haW5uZXRKZXR0b25Ub2tlbi5nZXRCYXNlQ2hhaW4oKS5zaG91bGQuZXF1YWwoJ3RvbicpO1xuICAgIG1haW5uZXRKZXR0b25Ub2tlbi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnVG9uIFRva2VuJyk7XG4gICAgbWFpbm5ldEpldHRvblRva2VuLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoMWU2KTtcbiAgICBtYWlubmV0SmV0dG9uVG9rZW4udHlwZS5zaG91bGQuZXF1YWwobWFpbm5ldFRva2VuTmFtZSk7XG4gICAgbWFpbm5ldEpldHRvblRva2VuLm5hbWUuc2hvdWxkLmVxdWFsKCdUZXRoZXIgVVNEJyk7XG4gICAgbWFpbm5ldEpldHRvblRva2VuLmNvaW4uc2hvdWxkLmVxdWFsKCd0b24nKTtcbiAgICBtYWlubmV0SmV0dG9uVG9rZW4ubmV0d29yay5zaG91bGQuZXF1YWwoJ01haW5uZXQnKTtcbiAgICBtYWlubmV0SmV0dG9uVG9rZW4uY29udHJhY3RBZGRyZXNzLnNob3VsZC5lcXVhbCgnRVFDeEU2bVV0UUpLRm5HZmFST1RLT3QxbFpiRGlpWDFrQ2l4UnY3TncySWRfc0RzJyk7XG4gICAgbWFpbm5ldEpldHRvblRva2VuLmRlY2ltYWxQbGFjZXMuc2hvdWxkLmVxdWFsKDYpO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5IEpldHRvbiB0cmFuc2FjdGlvbjogJywgKCkgPT4ge1xuICAgIHR4UGFyYW1zTGlzdC5mb3JFYWNoKChfLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB0eFBhcmFtc0xpc3RbaW5kZXhdO1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHR4UHJlYnVpbGRMaXN0W2luZGV4XTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zQm91bmNlYWJsZSA9IHR4UGFyYW1zQm91bmNlYWJsZUxpc3RbaW5kZXhdO1xuICAgICAgY29uc3QgdHhQcmVidWlsZEJvdW5jZWFibGUgPSB0eFByZWJ1aWxkQm91bmNlYWJsZUxpc3RbaW5kZXhdO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSB7fTtcbiAgICAgICAgY29uc3QgaXNUcmFuc2FjdGlvblZlcmlmaWVkID0gYXdhaXQgdGVzdG5ldEpldHRvblRva2VuLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuXG4gICAgICAgIGNvbnN0IGlzQm91bmNlYWJsZVRyYW5zYWN0aW9uVmVyaWZpZWQgPSBhd2FpdCB0ZXN0bmV0SmV0dG9uVG9rZW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB0eFBhcmFtc0JvdW5jZWFibGUsXG4gICAgICAgICAgdHhQcmVidWlsZDogdHhQcmVidWlsZEJvdW5jZWFibGUsXG4gICAgICAgICAgdmVyaWZpY2F0aW9uOiB7fSxcbiAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICBpc0JvdW5jZWFibGVUcmFuc2FjdGlvblZlcmlmaWVkLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uIHdoZW4gcmVjaXBpZW50cyBhbW91bnQgYXJlIG51bWJlcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4UGFyYW1zV2l0aE51bWJlckFtb3VudHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHR4UGFyYW1zKSk7XG4gICAgICAgIHR4UGFyYW1zV2l0aE51bWJlckFtb3VudHMucmVjaXBpZW50c1swXS5hbW91bnQgPSAyMDAwMDAwMDtcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlblxuICAgICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICB0eFBhcmFtczogdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cyxcbiAgICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoJ1R4IG91dHB1dHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbiB3aGVuIHJlY2lwaWVudHMgYW1vdW50IGFyZSBzdHJpbmdzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eFBhcmFtc1dpdGhOdW1iZXJBbW91bnRzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0eFBhcmFtcykpO1xuICAgICAgICB0eFBhcmFtc1dpdGhOdW1iZXJBbW91bnRzLnJlY2lwaWVudHNbMF0uYW1vdW50ID0gJzIwMDAwMDAwJztcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlblxuICAgICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICB0eFBhcmFtczogdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cyxcbiAgICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoJ1R4IG91dHB1dHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbiB3aGVuIHJlY2lwaWVudHMgYW1vdW50cyBhcmUgbnVtYmVyIGFuZCBhbW91bnQgaXMgc2FtZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlblxuICAgICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgICAgLnNob3VsZC5yZXNvbHZlZFdpdGgodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbiB3aGVuIHJlY2lwaWVudHMgYW1vdW50cyBhcmUgc3RyaW5nIGFuZCBhbW91bnQgaXMgc2FtZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlblxuICAgICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgICAgLnNob3VsZC5yZXNvbHZlZFdpdGgodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbiB3aGVuIHJlY2lwaWVudCBhZGRyZXNzIGFyZSBub24gYm91bmNlYWJsZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodHhQYXJhbXMpKTtcbiAgICAgICAgdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cy5yZWNpcGllbnRzWzBdLmFkZHJlc3MgPSBuZXcgVG9ud2ViLkFkZHJlc3MoXG4gICAgICAgICAgdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cy5yZWNpcGllbnRzWzBdLmFkZHJlc3NcbiAgICAgICAgKS50b1N0cmluZyh0cnVlLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuICAgICAgICBjb25zdCBpc1ZlcmlmaWVkID0gYXdhaXQgdGVzdG5ldEpldHRvblRva2VuLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtczogdHhQYXJhbXNXaXRoTnVtYmVyQW1vdW50cyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICBpc1ZlcmlmaWVkLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCBwYXJhbScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHt9O1xuICAgICAgICBhd2FpdCB0ZXN0bmV0SmV0dG9uVG9rZW5cbiAgICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIH0gYXMgYW55KVxuICAgICAgICAgIC5zaG91bGQucmVqZWN0ZWRXaXRoKCdtaXNzaW5nIHJlcXVpcmVkIHR4IHByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2ZXJpZnkgdHJhbnNhY3Rpb24gd2l0aCByZWNpcGllbnQgaGF2aW5nIG1lbW8nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3Rlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uRm9yTWVtb0lkLnJlY2lwaWVudF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uRm9yTWVtb0lkLnR4LCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB0eEluZm86IHt9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuICAgICAgY29uc3QgaXNUcmFuc2FjdGlvblZlcmlmaWVkID0gYXdhaXQgdGVzdG5ldEpldHRvblRva2VuLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgIH0gYXMgYW55KTtcbiAgICAgIGlzVHJhbnNhY3Rpb25WZXJpZmllZC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFeHBsYWluIEpldHRvbiBUcmFuc2FjdGlvbjogJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBhIGpldHRvbiB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gKGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEhleDogQnVmZmVyLmZyb20odGVzdERhdGEuc2lnbmVkVG9rZW5TZW5kVHJhbnNhY3Rpb24udHgsICdiYXNlNjQnKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9KSkgYXMgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbjtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFsnaWQnLCAnb3V0cHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlT3V0cHV0cycsICdjaGFuZ2VBbW91bnQnLCAnZmVlJywgJ3dpdGhkcmF3QW1vdW50J10sXG4gICAgICAgIGlkOiB0ZXN0RGF0YS5zaWduZWRUb2tlblNlbmRUcmFuc2FjdGlvbi50eElkLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2lnbmVkVG9rZW5TZW5kVHJhbnNhY3Rpb24ucmVjaXBpZW50LmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnJlY2lwaWVudC5hbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiB0ZXN0RGF0YS5zaWduZWRUb2tlblNlbmRUcmFuc2FjdGlvbi5yZWNpcGllbnQuYW1vdW50LFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIGZlZTogeyBmZWU6ICdVTktOT1dOJyB9LFxuICAgICAgICB3aXRoZHJhd0Ftb3VudDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSBub24tYm91bmNlYWJsZSBqZXR0b24gdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IChhd2FpdCB0ZXN0bmV0SmV0dG9uVG9rZW4uZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnR4Qm91bmNlYWJsZSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgdG9BZGRyZXNzQm91bmNlYWJsZTogZmFsc2UsXG4gICAgICAgIGZyb21BZGRyZXNzQm91bmNlYWJsZTogZmFsc2UsXG4gICAgICB9KSkgYXMgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbjtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFsnaWQnLCAnb3V0cHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlT3V0cHV0cycsICdjaGFuZ2VBbW91bnQnLCAnZmVlJywgJ3dpdGhkcmF3QW1vdW50J10sXG4gICAgICAgIGlkOiB0ZXN0RGF0YS5zaWduZWRUb2tlblNlbmRUcmFuc2FjdGlvbi50eElkQm91bmNlYWJsZSxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNpZ25lZFRva2VuU2VuZFRyYW5zYWN0aW9uLnJlY2lwaWVudEJvdW5jZWFibGUuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogdGVzdERhdGEuc2lnbmVkVG9rZW5TZW5kVHJhbnNhY3Rpb24ucmVjaXBpZW50Qm91bmNlYWJsZS5hbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiB0ZXN0RGF0YS5zaWduZWRUb2tlblNlbmRUcmFuc2FjdGlvbi5yZWNpcGllbnRCb3VuY2VhYmxlLmFtb3VudCxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBmZWU6IHsgZmVlOiAnVU5LTk9XTicgfSxcbiAgICAgICAgd2l0aGRyYXdBbW91bnQ6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGV4cGxhaW4gdHJhbnNhY3Rpb24gd2l0aCBtaXNzaW5nIHBhcmFtcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlbi5leHBsYWluVHJhbnNhY3Rpb24oe30pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGVycm9yLm1lc3NhZ2UsICdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gZXhwbGFpbiB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgcGFyYW1zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGVzdG5ldEpldHRvblRva2VuLmV4cGxhaW5UcmFuc2FjdGlvbih7IHR4SGV4OiAncmFuZG9tU3RyaW5nJyB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNob3VsZC5lcXVhbChlcnJvci5tZXNzYWdlLCAnSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGFyc2UgSmV0dG9uIFRyYW5zYWN0aW9uczogJywgKCkgPT4ge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uc0xpc3QgPSBbdGVzdERhdGEuc2lnbmVkVG9rZW5TZW5kVHJhbnNhY3Rpb24udHhdO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uSW5wdXRzUmVzcG9uc2VMaXN0ID0gW1xuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogJ0VRQ3FRemZ5ZzBjWi04dDl2MllvSG1GRnhHNWpnanZRUlRaMnllRGpPNXo1WlJ5OScsXG4gICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS50b2tlblJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICBdO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25JbnB1dHNSZXNwb25zZUJvdW5jZWFibGVMaXN0ID0gW1xuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEudG9rZW5TZW5kZXIuYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLnRva2VuUmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIF07XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbk91dHB1dHNSZXNwb25zZUxpc3QgPSBbXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiAnRVFCLUNNNkRGLWpwcTlYVmRpU2RlZkFNVTVLQzFncFp1WUJGcC1RNjVhVWhueDVLJyxcbiAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLnRva2VuUmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIF07XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbk91dHB1dHNSZXNwb25zZUJvdW5jZWFibGVMaXN0ID0gW1xuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEudG9rZW5SZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS50b2tlblJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICBdO1xuXG4gICAgdHJhbnNhY3Rpb25zTGlzdC5mb3JFYWNoKChfLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbnNMaXN0W2luZGV4XTtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uSW5wdXRzUmVzcG9uc2UgPSB0cmFuc2FjdGlvbklucHV0c1Jlc3BvbnNlTGlzdFtpbmRleF07XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbklucHV0c1Jlc3BvbnNlQm91bmNlYWJsZSA9IHRyYW5zYWN0aW9uSW5wdXRzUmVzcG9uc2VCb3VuY2VhYmxlTGlzdFtpbmRleF07XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbk91dHB1dHNSZXNwb25zZSA9IHRyYW5zYWN0aW9uT3V0cHV0c1Jlc3BvbnNlTGlzdFtpbmRleF07XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbk91dHB1dHNSZXNwb25zZUJvdW5jZWFibGUgPSB0cmFuc2FjdGlvbk91dHB1dHNSZXNwb25zZUJvdW5jZWFibGVMaXN0W2luZGV4XTtcblxuICAgICAgaXQoJ3Nob3VsZCBwYXJzZSBhIFRPTiB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHJhbnNhY3Rpb24gPSBhd2FpdCB0ZXN0bmV0SmV0dG9uVG9rZW4ucGFyc2VUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhIZXg6IEJ1ZmZlci5mcm9tKHRyYW5zYWN0aW9uLCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9KTtcblxuICAgICAgICBwYXJzZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgICBpbnB1dHM6IHRyYW5zYWN0aW9uSW5wdXRzUmVzcG9uc2UsXG4gICAgICAgICAgb3V0cHV0czogdHJhbnNhY3Rpb25PdXRwdXRzUmVzcG9uc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcGFyc2UgYSBub24tYm91bmNlYWJsZSBUT04gdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFRyYW5zYWN0aW9uID0gYXdhaXQgdGVzdG5ldEpldHRvblRva2VuLnBhcnNlVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4SGV4OiBCdWZmZXIuZnJvbSh0cmFuc2FjdGlvbiwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0b0FkZHJlc3NCb3VuY2VhYmxlOiBmYWxzZSxcbiAgICAgICAgICBmcm9tQWRkcmVzc0JvdW5jZWFibGU6IGZhbHNlLFxuICAgICAgICB9IGFzIFRvblBhcnNlVHJhbnNhY3Rpb25PcHRpb25zKTtcblxuICAgICAgICBwYXJzZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgICBpbnB1dHM6IHRyYW5zYWN0aW9uSW5wdXRzUmVzcG9uc2VCb3VuY2VhYmxlLFxuICAgICAgICAgIG91dHB1dHM6IHRyYW5zYWN0aW9uT3V0cHV0c1Jlc3BvbnNlQm91bmNlYWJsZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHBhcnNlIGEgVE9OIHRyYW5zYWN0aW9uIHdoZW4gZXhwbGFpblRyYW5zYWN0aW9uIHJlc3BvbnNlIGlzIHVuZGVmaW5lZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc3R1YiA9IHNpbm9uLnN0dWIoVG9uLnByb3RvdHlwZSwgJ2V4cGxhaW5UcmFuc2FjdGlvbicpO1xuICAgICAgICBzdHViLnJlc29sdmVzKHVuZGVmaW5lZCk7XG4gICAgICAgIGF3YWl0IHRlc3RuZXRKZXR0b25Ub2tlblxuICAgICAgICAgIC5wYXJzZVRyYW5zYWN0aW9uKHsgdHhIZXg6IHRyYW5zYWN0aW9uIH0pXG4gICAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2ludmFsaWQgcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgICAgIHN0dWIucmVzdG9yZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"keyPair.d.ts","sourceRoot":"","sources":["../../../test/unit/keyPair.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"keyPair.d.ts","sourceRoot":"","sources":["../../../../test/unit/keyPair.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
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 assert_1 = __importDefault(require("assert"));
7
+ const src_1 = require("../../src");
8
+ const utils_1 = __importDefault(require("../../src/lib/utils"));
9
+ const should_1 = __importDefault(require("should"));
10
+ const sdk_core_1 = require("@bitgo/sdk-core");
11
+ const sdk_lib_mpc_1 = require("@bitgo/sdk-lib-mpc");
12
+ describe('Ton KeyPair', function () {
13
+ let rootKeychain;
14
+ let rootPublicKey;
15
+ let MPC;
16
+ let hdTree;
17
+ before(async () => {
18
+ hdTree = await sdk_lib_mpc_1.Ed25519Bip32HdTree.initialize();
19
+ MPC = await sdk_core_1.Eddsa.initialize(hdTree);
20
+ const A = MPC.keyShare(1, 2, 3);
21
+ const B = MPC.keyShare(2, 2, 3);
22
+ const C = MPC.keyShare(3, 2, 3);
23
+ const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
24
+ const commonKeychain = A_combine.pShare.y + A_combine.pShare.chaincode;
25
+ rootKeychain = MPC.deriveUnhardened(commonKeychain, 'm/0');
26
+ rootPublicKey = Buffer.from(rootKeychain, 'hex').slice(0, 32).toString('hex');
27
+ });
28
+ describe('should create a valid KeyPair', () => {
29
+ it('from an empty value', async () => {
30
+ const keyPair = new src_1.KeyPair();
31
+ should_1.default.exists(keyPair.getKeys().prv);
32
+ should_1.default.exists(keyPair.getKeys().pub);
33
+ const address = await utils_1.default.getAddressFromPublicKey(keyPair.getKeys().pub);
34
+ should_1.default.exists(address);
35
+ });
36
+ });
37
+ describe('Keypair from derived Public Key', () => {
38
+ it('should create keypair with just derived public key', () => {
39
+ const keyPair = new src_1.KeyPair({ pub: rootPublicKey });
40
+ keyPair.getKeys().pub.should.equal(rootPublicKey);
41
+ });
42
+ it('should derived ed25519 public key should be valid', () => {
43
+ utils_1.default.isValidPublicKey(rootPublicKey).should.be.true();
44
+ });
45
+ });
46
+ describe('should fail to create a KeyPair', function () {
47
+ it('from an invalid public key', () => {
48
+ const source = {
49
+ pub: '01D63D',
50
+ };
51
+ assert_1.default.throws(() => new src_1.KeyPair(source));
52
+ });
53
+ });
54
+ });
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9rZXlQYWlyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG1DQUFvQztBQUNwQyxnRUFBd0M7QUFDeEMsb0RBQTRCO0FBQzVCLDhDQUF3QztBQUN4QyxvREFBZ0U7QUFFaEUsUUFBUSxDQUFDLGFBQWEsRUFBRTtJQUN0QixJQUFJLFlBQVksQ0FBQztJQUNqQixJQUFJLGFBQWEsQ0FBQztJQUNsQixJQUFJLEdBQVUsQ0FBQztJQUNmLElBQUksTUFBYyxDQUFDO0lBRW5CLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNoQixNQUFNLEdBQUcsTUFBTSxnQ0FBa0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQyxHQUFHLEdBQUcsTUFBTSxnQkFBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVoQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpFLE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ3ZFLFlBQVksR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNELGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRixDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQywrQkFBK0IsRUFBRSxHQUFHLEVBQUU7UUFDN0MsRUFBRSxDQUFDLHFCQUFxQixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksYUFBTyxFQUFFLENBQUM7WUFDOUIsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JDLGdCQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxNQUFNLE9BQU8sR0FBRyxNQUFNLGVBQUssQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0UsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLEVBQUU7UUFDL0MsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsRUFBRTtZQUM1RCxNQUFNLE9BQU8sR0FBRyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtREFBbUQsRUFBRSxHQUFHLEVBQUU7WUFDM0QsZUFBSyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxpQ0FBaUMsRUFBRTtRQUMxQyxFQUFFLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO1lBQ3BDLE1BQU0sTUFBTSxHQUFHO2dCQUNiLEdBQUcsRUFBRSxRQUFRO2FBQ2QsQ0FBQztZQUVGLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksYUFBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBFZGRzYSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBFZDI1NTE5QmlwMzJIZFRyZWUsIEhEVHJlZSB9IGZyb20gJ0BiaXRnby9zZGstbGliLW1wYyc7XG5cbmRlc2NyaWJlKCdUb24gS2V5UGFpcicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHJvb3RLZXljaGFpbjtcbiAgbGV0IHJvb3RQdWJsaWNLZXk7XG4gIGxldCBNUEM6IEVkZHNhO1xuICBsZXQgaGRUcmVlOiBIRFRyZWU7XG5cbiAgYmVmb3JlKGFzeW5jICgpID0+IHtcbiAgICBoZFRyZWUgPSBhd2FpdCBFZDI1NTE5QmlwMzJIZFRyZWUuaW5pdGlhbGl6ZSgpO1xuICAgIE1QQyA9IGF3YWl0IEVkZHNhLmluaXRpYWxpemUoaGRUcmVlKTtcbiAgICBjb25zdCBBID0gTVBDLmtleVNoYXJlKDEsIDIsIDMpO1xuICAgIGNvbnN0IEIgPSBNUEMua2V5U2hhcmUoMiwgMiwgMyk7XG4gICAgY29uc3QgQyA9IE1QQy5rZXlTaGFyZSgzLCAyLCAzKTtcblxuICAgIGNvbnN0IEFfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEEudVNoYXJlLCBbQi55U2hhcmVzWzFdLCBDLnlTaGFyZXNbMV1dKTtcblxuICAgIGNvbnN0IGNvbW1vbktleWNoYWluID0gQV9jb21iaW5lLnBTaGFyZS55ICsgQV9jb21iaW5lLnBTaGFyZS5jaGFpbmNvZGU7XG4gICAgcm9vdEtleWNoYWluID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW4sICdtLzAnKTtcbiAgICByb290UHVibGljS2V5ID0gQnVmZmVyLmZyb20ocm9vdEtleWNoYWluLCAnaGV4Jykuc2xpY2UoMCwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBjcmVhdGUgYSB2YWxpZCBLZXlQYWlyJywgKCkgPT4ge1xuICAgIGl0KCdmcm9tIGFuIGVtcHR5IHZhbHVlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKCk7XG4gICAgICBzaG91bGQuZXhpc3RzKGtleVBhaXIuZ2V0S2V5cygpLnBydik7XG4gICAgICBzaG91bGQuZXhpc3RzKGtleVBhaXIuZ2V0S2V5cygpLnB1Yik7XG4gICAgICBjb25zdCBhZGRyZXNzID0gYXdhaXQgdXRpbHMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoa2V5UGFpci5nZXRLZXlzKCkucHViKTtcbiAgICAgIHNob3VsZC5leGlzdHMoYWRkcmVzcyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdLZXlwYWlyIGZyb20gZGVyaXZlZCBQdWJsaWMgS2V5JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY3JlYXRlIGtleXBhaXIgd2l0aCBqdXN0IGRlcml2ZWQgcHVibGljIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHB1Yjogcm9vdFB1YmxpY0tleSB9KTtcbiAgICAgIGtleVBhaXIuZ2V0S2V5cygpLnB1Yi5zaG91bGQuZXF1YWwocm9vdFB1YmxpY0tleSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlcml2ZWQgZWQyNTUxOSBwdWJsaWMga2V5IHNob3VsZCBiZSB2YWxpZCcsICgpID0+IHtcbiAgICAgIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkocm9vdFB1YmxpY0tleSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsIHRvIGNyZWF0ZSBhIEtleVBhaXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2Zyb20gYW4gaW52YWxpZCBwdWJsaWMga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0ge1xuICAgICAgICBwdWI6ICcwMUQ2M0QnLFxuICAgICAgfTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBuZXcgS2V5UGFpcihzb3VyY2UpKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"singleNominatorWithdrawBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/singleNominatorWithdrawBuilder.ts"],"names":[],"mappings":""}