@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,281 @@
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 tonweb_1 = __importDefault(require("tonweb"));
41
+ const sdk_core_1 = require("@bitgo/sdk-core");
42
+ const statics_1 = require("@bitgo/statics");
43
+ const src_1 = require("../../src");
44
+ const constants_1 = require("../../src/lib/constants");
45
+ const testData = __importStar(require("../resources/ton"));
46
+ const utils = __importStar(require("../../src/lib/utils"));
47
+ describe('Ton Transfer Builder', () => {
48
+ const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tton'));
49
+ it('should build a unsigned transfer tx', async function () {
50
+ const txId = 'jQhv4EPr4l-nZ8AfzSdVUSftfX2B8Qo0TwMBstsdpcs='.replace(/\//g, '_').replace(/\+/g, '-');
51
+ const txBuilder = factory.getTransferBuilder();
52
+ txBuilder.sender(testData.sender.address);
53
+ txBuilder.sequenceNumber(0);
54
+ txBuilder.publicKey(testData.sender.publicKey);
55
+ txBuilder.expireTime(1234567890);
56
+ txBuilder.send(testData.recipients[0]);
57
+ txBuilder.setMessage('test');
58
+ const tx = await txBuilder.build();
59
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
60
+ should_1.default.equal(tx.toJson().bounceable, false);
61
+ tx.inputs.length.should.equal(1);
62
+ tx.inputs[0].should.deepEqual({
63
+ address: testData.sender.address,
64
+ value: testData.recipients[0].amount,
65
+ coin: 'tton',
66
+ });
67
+ tx.outputs.length.should.equal(1);
68
+ tx.outputs[0].should.deepEqual({
69
+ address: testData.recipients[0].address,
70
+ value: testData.recipients[0].amount,
71
+ coin: 'tton',
72
+ });
73
+ tx.id.should.equal(txId);
74
+ const rawTx = tx.toBroadcastFormat();
75
+ console.log(rawTx);
76
+ rawTx.should.equal('te6cckECGAEAA7cAAuGIADZN0H0n1tz6xkYgWqJSRmkURKYajjEgXeawBo9cifPIGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmpoxdJlgLSAAAAAAADgEXAgE0AhYBFP8A9KQT9LzyyAsDAgEgBBECAUgFCALm0AHQ0wMhcbCSXwTgItdJwSCSXwTgAtMfIYIQcGx1Z70ighBkc3RyvbCSXwXgA/pAMCD6RAHIygfL/8nQ7UTQgQFA1yH0BDBcgQEI9ApvoTGzkl8H4AXTP8glghBwbHVnupI4MOMNA4IQZHN0crqSXwbjDQYHAHgB+gD0BDD4J28iMFAKoSG+8uBQghBwbHVngx6xcIAYUATLBSbPFlj6Ahn0AMtpF8sfUmDLPyDJgED7AAYAilAEgQEI9Fkw7UTQgQFA1yDIAc8W9ADJ7VQBcrCOI4IQZHN0coMesXCAGFAFywVQA88WI/oCE8tqyx/LP8mAQPsAkl8D4gIBIAkQAgEgCg8CAVgLDAA9sp37UTQgQFA1yH0BDACyMoHy//J0AGBAQj0Cm+hMYAIBIA0OABmtznaiaEAga5Drhf/AABmvHfaiaEAQa5DrhY/AABG4yX7UTQ1wsfgAWb0kK29qJoQICga5D6AhhHDUCAhHpJN9KZEM5pA+n/mDeBKAG3gQFImHFZ8xhAT48oMI1xgg0x/TH9MfAvgju/Jk7UTQ0x/TH9P/9ATRUUO68qFRUbryogX5AVQQZPkQ8qP4ACSkyMsfUkDLH1Iwy/9SEPQAye1U+A8B0wchwACfbFGTINdKltMH1AL7AOgw4CHAAeMAIcAC4wABwAORMOMNA6TIyx8Syx/L/xITFBUAbtIH+gDU1CL5AAXIygcVy//J0Hd0gBjIywXLAiLPFlAF+gIUy2sSzMzJc/sAyEAUgQEI9FHypwIAcIEBCNcY+gDTP8hUIEeBAQj0UfKnghBub3RlcHSAGMjLBcsCUAbPFlAE+gIUy2oSyx/LP8lz+wACAGyBAQjXGPoA0z8wUiSBAQj0WfKnghBkc3RycHSAGMjLBcsCUAXPFlAD+gITy2rLHxLLP8lz+wAACvQAye1UAFEAAAAAKamjF8DDudwJkyEh7jUbJEjFCjriVxsSlRJFyF872V1eegb4QAB4QgAaRefBOjTi/hwqDjv+7I6nGj9WEAe3ls/rFuBEQvggr6A613oAAAAAAAAAAAAAAAAAAAAAAAB0ZXN0VouPug==');
77
+ });
78
+ it('should build a unsigned transfer tx with bounceable flag', async function () {
79
+ const txId = 'gMLc2d3RLcR-oLQLx_16Z1a2oyepCd4EJ10E33VunZw='.replace(/\//g, '_').replace(/\+/g, '-');
80
+ const txBuilder = factory.getTransferBuilder();
81
+ txBuilder.sender(testData.sender.address);
82
+ txBuilder.sequenceNumber(0);
83
+ txBuilder.publicKey(testData.sender.publicKey);
84
+ txBuilder.expireTime(1234567890);
85
+ txBuilder.send(testData.recipients[0]);
86
+ txBuilder.setMessage('test');
87
+ txBuilder.bounceable(true);
88
+ const tx = await txBuilder.build();
89
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
90
+ should_1.default.equal(tx.toJson().bounceable, true);
91
+ tx.inputs.length.should.equal(1);
92
+ tx.inputs[0].should.deepEqual({
93
+ address: testData.sender.address,
94
+ value: testData.recipients[0].amount,
95
+ coin: 'tton',
96
+ });
97
+ tx.outputs.length.should.equal(1);
98
+ tx.outputs[0].should.deepEqual({
99
+ address: testData.recipients[0].address,
100
+ value: testData.recipients[0].amount,
101
+ coin: 'tton',
102
+ });
103
+ tx.id.should.equal(txId);
104
+ const rawTx = tx.toBroadcastFormat();
105
+ console.log(rawTx);
106
+ rawTx.should.equal('te6cckECGAEAA7cAAuGIADZN0H0n1tz6xkYgWqJSRmkURKYajjEgXeawBo9cifPIGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmpoxdJlgLSAAAAAAADgEXAgE0AhYBFP8A9KQT9LzyyAsDAgEgBBECAUgFCALm0AHQ0wMhcbCSXwTgItdJwSCSXwTgAtMfIYIQcGx1Z70ighBkc3RyvbCSXwXgA/pAMCD6RAHIygfL/8nQ7UTQgQFA1yH0BDBcgQEI9ApvoTGzkl8H4AXTP8glghBwbHVnupI4MOMNA4IQZHN0crqSXwbjDQYHAHgB+gD0BDD4J28iMFAKoSG+8uBQghBwbHVngx6xcIAYUATLBSbPFlj6Ahn0AMtpF8sfUmDLPyDJgED7AAYAilAEgQEI9Fkw7UTQgQFA1yDIAc8W9ADJ7VQBcrCOI4IQZHN0coMesXCAGFAFywVQA88WI/oCE8tqyx/LP8mAQPsAkl8D4gIBIAkQAgEgCg8CAVgLDAA9sp37UTQgQFA1yH0BDACyMoHy//J0AGBAQj0Cm+hMYAIBIA0OABmtznaiaEAga5Drhf/AABmvHfaiaEAQa5DrhY/AABG4yX7UTQ1wsfgAWb0kK29qJoQICga5D6AhhHDUCAhHpJN9KZEM5pA+n/mDeBKAG3gQFImHFZ8xhAT48oMI1xgg0x/TH9MfAvgju/Jk7UTQ0x/TH9P/9ATRUUO68qFRUbryogX5AVQQZPkQ8qP4ACSkyMsfUkDLH1Iwy/9SEPQAye1U+A8B0wchwACfbFGTINdKltMH1AL7AOgw4CHAAeMAIcAC4wABwAORMOMNA6TIyx8Syx/L/xITFBUAbtIH+gDU1CL5AAXIygcVy//J0Hd0gBjIywXLAiLPFlAF+gIUy2sSzMzJc/sAyEAUgQEI9FHypwIAcIEBCNcY+gDTP8hUIEeBAQj0UfKnghBub3RlcHSAGMjLBcsCUAbPFlAE+gIUy2oSyx/LP8lz+wACAGyBAQjXGPoA0z8wUiSBAQj0WfKnghBkc3RycHSAGMjLBcsCUAXPFlAD+gITy2rLHxLLP8lz+wAACvQAye1UAFEAAAAAKamjF8DDudwJkyEh7jUbJEjFCjriVxsSlRJFyF872V1eegb4QAB4YgAaRefBOjTi/hwqDjv+7I6nGj9WEAe3ls/rFuBEQvggr6A613oAAAAAAAAAAAAAAAAAAAAAAAB0ZXN0mIHxPg==');
107
+ });
108
+ it('should build a send from rawTx', async function () {
109
+ const txBuilder = factory.from(testData.signedSendTransaction.tx);
110
+ const builtTx = await txBuilder.build();
111
+ const jsonTx = builtTx.toJson();
112
+ should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.Send);
113
+ should_1.default.equal(builtTx.signablePayload.toString('base64'), testData.signedSendTransaction.signable);
114
+ should_1.default.equal(builtTx.id, testData.signedSendTransaction.txId);
115
+ const builder2 = factory.from(builtTx.toBroadcastFormat());
116
+ const builtTx2 = await builder2.build();
117
+ should_1.default.equal(builtTx2.type, sdk_core_1.TransactionType.Send);
118
+ should_1.default.equal(builtTx.toBroadcastFormat(), testData.signedSendTransaction.tx);
119
+ builtTx.inputs.length.should.equal(1);
120
+ builtTx.outputs.length.should.equal(1);
121
+ jsonTx.sender.should.equal('EQCSBjR3fUOL98WTw2F_IT4BrcqjZJWVLWUSz5WQDpaL9Jpl');
122
+ jsonTx.destination.should.equal('EQA0i8-CdGnF_DhUHHf92R1ONH6sIA9vLZ_WLcCIhfBBXwtG');
123
+ jsonTx.amount.should.equal('10000000');
124
+ jsonTx.seqno.should.equal(6);
125
+ jsonTx.expirationTime.should.equal(1695997582);
126
+ const builtTx3 = await txBuilder.bounceable(false).fromAddressBounceable(false).toAddressBounceable(false).build();
127
+ txBuilder.from(testData.signedSendTransaction.tx);
128
+ const jsonTx3 = builtTx3.toJson();
129
+ should_1.default.equal(jsonTx3.bounceable, false);
130
+ should_1.default.equal(builtTx3.signablePayload.toString('base64'), testData.signedSendTransaction.bounceableSignable);
131
+ should_1.default.equal(builtTx3.id, testData.signedSendTransaction.txIdBounceable);
132
+ should_1.default.equal(builtTx3.toBroadcastFormat(), testData.signedSendTransaction.tx);
133
+ jsonTx3.sender.should.equal('UQCSBjR3fUOL98WTw2F_IT4BrcqjZJWVLWUSz5WQDpaL9Meg');
134
+ jsonTx3.destination.should.equal('UQA0i8-CdGnF_DhUHHf92R1ONH6sIA9vLZ_WLcCIhfBBX1aD');
135
+ jsonTx3.amount.should.equal('10000000');
136
+ jsonTx3.seqno.should.equal(6);
137
+ jsonTx3.expirationTime.should.equal(1695997582);
138
+ });
139
+ it('should parse a raw transaction and set flags', async function () {
140
+ const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tton'));
141
+ const txBuilder = factory.from(testData.signedSendTransaction.tx);
142
+ const txBuilderBounceable = factory.from(testData.signedSendTransaction.txBounceable);
143
+ const tx = await txBuilder.build();
144
+ const txBounceable = await txBuilderBounceable.build();
145
+ tx.toJson().bounceable.should.equal(false);
146
+ txBounceable.toJson().bounceable.should.equal(true);
147
+ });
148
+ xit('should build a signed transfer tx and submit onchain', async function () {
149
+ const tonweb = new tonweb_1.default(new tonweb_1.default.HttpProvider('https://testnet.toncenter.com/api/v2/jsonRPC'));
150
+ const keyPair = new src_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
151
+ const publicKey = keyPair.getKeys().pub;
152
+ const address = await utils.default.getAddressFromPublicKey(publicKey);
153
+ const txBuilder = factory.getTransferBuilder();
154
+ txBuilder.sender(address);
155
+ const WalletClass = tonweb.wallet.all['v4R2'];
156
+ const wallet = new WalletClass(tonweb.provider, {
157
+ publicKey: tonweb.utils.hexToBytes(publicKey),
158
+ wc: 0,
159
+ });
160
+ const seqno = await wallet.methods.seqno().call();
161
+ txBuilder.sequenceNumber(seqno);
162
+ txBuilder.publicKey(publicKey);
163
+ const expireAt = Math.floor(Date.now() / 1e3) + 60 * 60 * 24 * 7; // 7 days
164
+ txBuilder.expireTime(expireAt);
165
+ txBuilder.send({
166
+ address: 'EQD6Tm5rybJHqMflQkjpCRB7Lm5QpGqFoYwiLqMjPtaqPSdZ',
167
+ amount: '10000000',
168
+ });
169
+ txBuilder.setMessage('test');
170
+ const tx = await txBuilder.build();
171
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
172
+ const signable = tx.signablePayload;
173
+ const signature = keyPair.signMessageinUint8Array(signable);
174
+ const signedTx = await txBuilder.build();
175
+ const builder2 = factory.from(signedTx.toBroadcastFormat());
176
+ builder2.addSignature(keyPair.getKeys(), Buffer.from(signature));
177
+ const tx2 = await builder2.build();
178
+ const signature2 = keyPair.signMessageinUint8Array(tx2.signablePayload);
179
+ should_1.default.equal(Buffer.from(signature).toString('hex'), Buffer.from(signature2).toString('hex'));
180
+ await new Promise((resolve) => setTimeout(resolve, 2000));
181
+ const result = await tonweb.provider.sendBoc(tx2.toBroadcastFormat());
182
+ console.log(JSON.stringify(result));
183
+ });
184
+ it('should build a signed transfer tx using add signature', async function () {
185
+ const keyPair = new src_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
186
+ const publicKey = keyPair.getKeys().pub;
187
+ const address = await utils.default.getAddressFromPublicKey(publicKey);
188
+ const txBuilder = factory.getTransferBuilder();
189
+ txBuilder.sender(address);
190
+ txBuilder.sequenceNumber(0);
191
+ txBuilder.publicKey(publicKey);
192
+ const expireAt = Math.floor(Date.now() / 1e3) + 60 * 60 * 24 * 7;
193
+ txBuilder.expireTime(expireAt);
194
+ txBuilder.send(testData.recipients[0]);
195
+ txBuilder.setMessage('test');
196
+ const tx = await txBuilder.build();
197
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
198
+ const signable = tx.signablePayload;
199
+ const signature = keyPair.signMessageinUint8Array(signable);
200
+ txBuilder.addSignature(keyPair.getKeys(), Buffer.from(signature));
201
+ const signedTx = await txBuilder.build();
202
+ const builder2 = factory.from(signedTx.toBroadcastFormat());
203
+ const tx2 = await builder2.build();
204
+ const signature2 = keyPair.signMessageinUint8Array(tx2.signablePayload);
205
+ should_1.default.equal(Buffer.from(signature).toString('hex'), Buffer.from(signature2).toString('hex'));
206
+ should_1.default.equal(tx.toBroadcastFormat(), tx2.toBroadcastFormat());
207
+ });
208
+ it('should build transfer tx for non-bounceable address', async function () {
209
+ const txBuilder = factory.getTransferBuilder();
210
+ txBuilder.sender(testData.sender.address);
211
+ txBuilder.sequenceNumber(0);
212
+ txBuilder.publicKey(testData.sender.publicKey);
213
+ txBuilder.expireTime(1234567890);
214
+ const address = 'EQAWzEKcdnykvXfUNouqdS62tvrp32bCxuKS6eQrS6ISgcLo';
215
+ const otherFormat = 'UQAWzEKcdnykvXfUNouqdS62tvrp32bCxuKS6eQrS6ISgZ8t';
216
+ const amount = '10000000';
217
+ txBuilder.send({ address, amount });
218
+ txBuilder.setMessage('test');
219
+ const tx = await txBuilder.build();
220
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
221
+ tx.inputs.length.should.equal(1);
222
+ tx.inputs[0].should.deepEqual({
223
+ address: testData.sender.address,
224
+ value: amount,
225
+ coin: 'tton',
226
+ });
227
+ tx.outputs.length.should.equal(1);
228
+ tx.outputs[0].should.deepEqual({
229
+ address,
230
+ value: amount,
231
+ coin: 'tton',
232
+ });
233
+ const txJson = tx.toJson();
234
+ txJson.destination.should.equal(address);
235
+ const builder2 = factory.from(tx.toBroadcastFormat());
236
+ const tx2 = await builder2.build();
237
+ const txJson2 = tx2.toJson();
238
+ txJson2.destinationAlias.should.equal(otherFormat);
239
+ });
240
+ it('should build a transfer tx compatible with v3 wallet contract', async function () {
241
+ const txBuilder = factory.getTransferBuilder();
242
+ txBuilder.sender(testData.vestingContract.address);
243
+ txBuilder.sequenceNumber(3);
244
+ txBuilder.expireTime(1761215512);
245
+ txBuilder.send(testData.v3CompatibleSignedSendTransaction.recipient);
246
+ txBuilder.isV3ContractMessage(true);
247
+ txBuilder.bounceable(true);
248
+ txBuilder.addSignature({ pub: testData.vestingContract.publicKey }, Buffer.from(testData.vestingContract.signature, 'base64'));
249
+ const tx = await txBuilder.build();
250
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
251
+ tx.inputs.length.should.equal(1);
252
+ tx.inputs[0].should.deepEqual({
253
+ address: testData.vestingContract.address,
254
+ value: testData.v3CompatibleSignedSendTransaction.recipient.amount,
255
+ coin: 'tton',
256
+ });
257
+ tx.outputs.length.should.equal(1);
258
+ tx.outputs[0].should.deepEqual({
259
+ address: testData.v3CompatibleSignedSendTransaction.recipient.address,
260
+ value: testData.v3CompatibleSignedSendTransaction.recipient.amount,
261
+ coin: 'tton',
262
+ });
263
+ });
264
+ it('should build a v3 compatible send transaction using raw transaction hex', async function () {
265
+ const txBuilder = factory.from(testData.v3CompatibleSignedSendTransaction.txBounceable);
266
+ const builtTx = await txBuilder.build();
267
+ const jsonTx = builtTx.toJson();
268
+ should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.Send);
269
+ should_1.default.equal(builtTx.signablePayload.toString('base64'), testData.v3CompatibleSignedSendTransaction.bounceableSignable);
270
+ should_1.default.equal(builtTx.id, testData.v3CompatibleSignedSendTransaction.txIdBounceable);
271
+ jsonTx.sender.should.equal(testData.vestingContract.addressBounceable);
272
+ jsonTx.destination.should.equal(testData.v3CompatibleSignedSendTransaction.recipient.address);
273
+ jsonTx.destinationAlias.should.equal(testData.v3CompatibleSignedSendTransaction.recipientNonBounceable.address);
274
+ jsonTx.amount.should.equal(testData.v3CompatibleSignedSendTransaction.recipient.amount);
275
+ jsonTx.seqno.should.equal(3);
276
+ jsonTx.expirationTime.should.equal(1761215512);
277
+ jsonTx.bounceable.should.equal(true);
278
+ jsonTx.sub_wallet_id.should.equal(constants_1.WALLET_ID);
279
+ });
280
+ });
281
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zZmVyQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixvREFBNEI7QUFDNUIsOENBQWtEO0FBQ2xELDRDQUF1QztBQUN2QyxtQ0FBK0Q7QUFDL0QsdURBQW9EO0FBQ3BELDJEQUE2QztBQUM3QywyREFBNkM7QUFFN0MsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtJQUNwQyxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNqRSxFQUFFLENBQUMscUNBQXFDLEVBQUUsS0FBSztRQUM3QyxNQUFNLElBQUksR0FBRyw4Q0FBOEMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEcsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDL0MsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixNQUFNLEVB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UUFDRixnQkFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwRixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsaUNBQWlDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoSCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGlDQUFpQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4RixNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQVMsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgVG9uV2ViIGZyb20gJ3RvbndlYic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBLZXlQYWlyIH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7IFdBTExFVF9JRCB9IGZyb20gJy4uLy4uL3NyYy9saWIvY29uc3RhbnRzJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uL3Jlc291cmNlcy90b24nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5cbmRlc2NyaWJlKCdUb24gVHJhbnNmZXIgQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndHRvbicpKTtcbiAgaXQoJ3Nob3VsZCBidWlsZCBhIHVuc2lnbmVkIHRyYW5zZmVyIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4SWQgPSAnalFodjRFUHI0bC1uWjhBZnpTZFZVU2Z0ZlgyQjhRbzBUd01Cc3RzZHBjcz0nLnJlcGxhY2UoL1xcLy9nLCAnXycpLnJlcGxhY2UoL1xcKy9nLCAnLScpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDApO1xuICAgIHR4QnVpbGRlci5wdWJsaWNLZXkodGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSk7XG4gICAgdHhCdWlsZGVyLmV4cGlyZVRpbWUoMTIzNDU2Nzg5MCk7XG4gICAgdHhCdWlsZGVyLnNlbmQodGVzdERhdGEucmVjaXBpZW50c1swXSk7XG4gICAgdHhCdWlsZGVyLnNldE1lc3NhZ2UoJ3Rlc3QnKTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnRvSnNvbigpLmJvdW5jZWFibGUsIGZhbHNlKTtcbiAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyxcbiAgICAgIHZhbHVlOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgIGNvaW46ICd0dG9uJyxcbiAgICB9KTtcbiAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgIHZhbHVlOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgIGNvaW46ICd0dG9uJyxcbiAgICB9KTtcbiAgICB0eC5pZC5zaG91bGQuZXF1YWwodHhJZCk7XG4gICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIGNvbnNvbGUubG9nKHJhd1R4KTtcbiAgICByYXdUeC5zaG91bGQuZXF1YWwoXG4gICAgICAndGU2Y2NrRUNHQUVBQTdjQUF1R0lBRFpOMEgwbjF0ejZ4a1lnV3FKU1Jta1VSS1lhampFZ1hlYXdCbzljaWZQSUdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ21wb3hkSmxnTFNBQUFBQUFBRGdFWEFnRTBBaFlCRlA4QTlLUVQ5THp5eUFzREFnRWdCQkVDQVVnRkNBTG0wQUhRMHdNaGNiQ1NYd1RnSXRkSndTQ1NYd1RnQXRNZklZSVFjR3gxWjcwaWdoQmtjM1J5dmJDU1h3WGdBL3BBTUNENlJBSEl5Z2ZMLzhuUTdVVFFnUUZBMXlIMEJEQmNnUUVJOUFwdm9UR3prbDhINEFYVFA4Z2xnaEJ3YkhWbnVwSTRNT01OQTRJUVpITjBjcnFTWHdiakRRWUhBSGdCK2dEMEJERDRKMjhpTUZBS29TRys4dUJRZ2hCd2JIVm5neDZ4Y0lBWVVBVExCU2JQRmxqNkFobjBBTXRwRjhzZlVtRExQeURKZ0VEN0FBWUFpbEFFZ1FFSTlGa3c3VVRRZ1FGQTF5RElBYzhXOUFESjdWUUJjckNPSTRJUVpITjBjb01lc1hDQUdGQUZ5d1ZRQTg4V0kvb0NFOHRxeXgvTFA4bUFRUHNBa2w4RDRnSUJJQWtRQWdFZ0NnOENBVmdMREFBOXNwMzdVVFFnUUZBMXlIMEJEQUN5TW9IeS8vSjBBR0JBUWowQ20raE1ZQUlCSUEwT0FCbXR6bmFpYUVBZ2E1RHJoZi9BQUJtdkhmYWlhRUFRYTVEcmhZL0FBQkc0eVg3VVRRMXdzZmdBV2Iwa0syOXFKb1FJQ2dhNUQ2QWhoSERVQ0FoSHBKTjlLWkVNNXBBK24vbURlQktBRzNnUUZJbUhGWjh4aEFUNDhvTUkxeGdnMHgvVEg5TWZBdmdqdS9KazdVVFEweC9USDlQLzlBVFJVVU82OHFGUlVicnlvZ1g1QVZRUVpQa1E4cVA0QUNTa3lNc2ZVa0RMSDFJd3kvOVNFUFFBeWUxVStBOEIwd2Nod0FDZmJGR1RJTmRLbHRNSDFBTDdBT2d3NENIQUFlTUFJY0FDNHdBQndBT1JNT01OQTZUSXl4OFN5eC9ML3hJVEZCVUFidElIK2dEVTFDTDVBQVhJeWdjVnkvL0owSGQwZ0JqSXl3WExBaUxQRmxBRitnSVV5MnNTek16SmMvc0F5RUFVZ1FFSTlGSHlwd0lBY0lFQkNOY1krZ0RUUDhoVUlFZUJBUWowVWZLbmdoQnViM1JsY0hTQUdNakxCY3NDVUFiUEZsQUUrZ0lVeTJvU3l4L0xQOGx6K3dBQ0FHeUJBUWpYR1BvQTB6OHdVaVNCQVFqMFdmS25naEJrYzNSeWNIU0FHTWpMQmNzQ1VBWFBGbEFEK2dJVHkyckxIeExMUDhseit3QUFDdlFBeWUxVUFGRUFBQUFBS2FtakY4RER1ZHdKa3lFaDdqVWJKRWpGQ2pyaVZ4c1NsUkpGeUY4NzJWMWVlZ2I0UUFCNFFnQWFSZWZCT2pUaS9od3FEanYrN0k2bkdqOVdFQWUzbHMvckZ1QkVRdmdncjZBNjEzb0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQjBaWE4wVm91UHVnPT0nXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBhIHVuc2lnbmVkIHRyYW5zZmVyIHR4IHdpdGggYm91bmNlYWJsZSBmbGFnJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4SWQgPSAnZ01MYzJkM1JMY1Itb0xRTHhfMTZaMWEyb3llcENkNEVKMTBFMzNWdW5adz0nLnJlcGxhY2UoL1xcLy9nLCAnXycpLnJlcGxhY2UoL1xcKy9nLCAnLScpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDApO1xuICAgIHR4QnVpbGRlci5wdWJsaWNLZXkodGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSk7XG4gICAgdHhCdWlsZGVyLmV4cGlyZVRpbWUoMTIzNDU2Nzg5MCk7XG4gICAgdHhCdWlsZGVyLnNlbmQodGVzdERhdGEucmVjaXBpZW50c1swXSk7XG4gICAgdHhCdWlsZGVyLnNldE1lc3NhZ2UoJ3Rlc3QnKTtcbiAgICB0eEJ1aWxkZXIuYm91bmNlYWJsZSh0cnVlKTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnRvSnNvbigpLmJvdW5jZWFibGUsIHRydWUpO1xuICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLFxuICAgICAgdmFsdWU6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgY29pbjogJ3R0b24nLFxuICAgIH0pO1xuICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgdmFsdWU6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgY29pbjogJ3R0b24nLFxuICAgIH0pO1xuICAgIHR4LmlkLnNob3VsZC5lcXVhbCh0eElkKTtcbiAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgY29uc29sZS5sb2cocmF3VHgpO1xuICAgIHJhd1R4LnNob3VsZC5lcXVhbChcbiAgICAgICd0ZTZjY2tFQ0dBRUFBN2NBQXVHSUFEWk4wSDBuMXR6NnhrWWdXcUpTUm1rVVJLWWFqakVnWGVhd0JvOWNpZlBJR0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDbXBveGRKbGdMU0FBQUFBQUFEZ0VYQWdFMEFoWUJGUDhBOUtRVDlMenl5QXNEQWdFZ0JCRUNBVWdGQ0FMbTBBSFEwd01oY2JDU1h3VGdJdGRKd1NDU1h3VGdBdE1mSVlJUWNHeDFaNzBpZ2hCa2MzUnl2YkNTWHdYZ0EvcEFNQ0Q2UkFISXlnZkwvOG5RN1VUUWdRRkExeUgwQkRCY2dRRUk5QXB2b1RHemtsOEg0QVhUUDhnbGdoQndiSFZudXBJNE1PTU5BNElRWkhOMGNycVNYd2JqRFFZSEFIZ0IrZ0QwQkRENEoyOGlNRkFLb1NHKzh1QlFnaEJ3YkhWbmd4NnhjSUFZVUFUTEJTYlBGbGo2QWhuMEFNdHBGOHNmVW1ETFB5REpnRUQ3QUFZQWlsQUVnUUVJOUZrdzdVVFFnUUZBMXlESUFjOFc5QURKN1ZRQmNyQ09JNElRWkhOMGNvTWVzWENBR0ZBRnl3VlFBODhXSS9vQ0U4dHF5eC9MUDhtQVFQc0FrbDhENGdJQklBa1FBZ0VnQ2c4Q0FWZ0xEQUE5c3AzN1VUUWdRRkExeUgwQkRBQ3lNb0h5Ly9KMEFHQkFRajBDbStoTVlBSUJJQTBPQUJtdHpuYWlhRUFnYTVEcmhmL0FBQm12SGZhaWFFQVFhNURyaFkvQUFCRzR5WDdVVFExd3NmZ0FXYjBrSzI5cUpvUUlDZ2E1RDZBaGhIRFVDQWhIcEpOOUtaRU01cEErbi9tRGVCS0FHM2dRRkltSEZaOHhoQVQ0OG9NSTF4Z2cweC9USDlNZkF2Z2p1L0prN1VUUTB4L1RIOVAvOUFUUlVVTzY4cUZSVWJyeW9nWDVBVlFRWlBrUThxUDRBQ1NreU1zZlVrRExIMUl3eS85U0VQUUF5ZTFVK0E4QjB3Y2h3QUNmYkZHVElOZEtsdE1IMUFMN0FPZ3c0Q0hBQWVNQUljQUM0d0FCd0FPUk1PTU5BNlRJeXg4U3l4L0wveElURkJVQWJ0SUgrZ0RVMUNMNUFBWEl5Z2NWeS8vSjBIZDBnQmpJeXdYTEFpTFBGbEFGK2dJVXkyc1N6TXpKYy9zQXlFQVVnUUVJOUZIeXB3SUFjSUVCQ05jWStnRFRQOGhVSUVlQkFRajBVZktuZ2hCdWIzUmxjSFNBR01qTEJjc0NVQWJQRmxBRStnSVV5Mm9TeXgvTFA4bHord0FDQUd5QkFRalhHUG9BMHo4d1VpU0JBUWowV2ZLbmdoQmtjM1J5Y0hTQUdNakxCY3NDVUFYUEZsQUQrZ0lUeTJyTEh4TExQOGx6K3dBQUN2UUF5ZTFVQUZFQUFBQUFLYW1qRjhERHVkd0preUVoN2pVYkpFakZDanJpVnhzU2xSSkZ5Rjg3MlYxZWVnYjRRQUI0WWdBYVJlZkJPalRpL2h3cURqdis3STZuR2o5V0VBZTNscy9yRnVCRVF2Z2dyNkE2MTNvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCMFpYTjBtSUh4UGc9PSdcbiAgICApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIGEgc2VuZCBmcm9tIHJhd1R4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5zaWduZWRTZW5kVHJhbnNhY3Rpb24udHgpO1xuICAgIGNvbnN0IGJ1aWx0VHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBqc29uVHggPSBidWlsdFR4LnRvSnNvbigpO1xuICAgIHNob3VsZC5lcXVhbChidWlsdFR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2Jhc2U2NCcpLCB0ZXN0RGF0YS5zaWduZWRTZW5kVHJhbnNhY3Rpb24uc2lnbmFibGUpO1xuICAgIHNob3VsZC5lcXVhbChidWlsdFR4LmlkLCB0ZXN0RGF0YS5zaWduZWRTZW5kVHJhbnNhY3Rpb24udHhJZCk7XG4gICAgY29uc3QgYnVpbGRlcjIgPSBmYWN0b3J5LmZyb20oYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICBjb25zdCBidWlsdFR4MiA9IGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmVxdWFsKGJ1aWx0VHgyLnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5zaWduZWRTZW5kVHJhbnNhY3Rpb24udHgpO1xuICAgIGJ1aWx0VHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgYnVpbHRUeC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAganNvblR4LnNlbmRlci5zaG91bGQuZXF1YWwoJ0VRQ1NCalIzZlVPTDk4V1R3MkZfSVQ0QnJjcWpaSldWTFdVU3o1V1FEcGFMOUpwbCcpO1xuICAgIGpzb25UeC5kZXN0aW5hdGlvbi5zaG91bGQuZXF1YWwoJ0VRQTBpOC1DZEduRl9EaFVISGY5MlIxT05INnNJQTl2TFpfV0xjQ0loZkJCWHd0RycpO1xuICAgIGpzb25UeC5hbW91bnQuc2hvdWxkLmVxdWFsKCcxMDAwMDAwMCcpO1xuICAgIGpzb25UeC5zZXFuby5zaG91bGQuZXF1YWwoNik7XG4gICAganNvblR4LmV4cGlyYXRpb25UaW1lLnNob3VsZC5lcXVhbCgxNjk1OTk3NTgyKTtcblxuICAgIGNvbnN0IGJ1aWx0VHgzID0gYXdhaXQgdHhCdWlsZGVyLmJvdW5jZWFibGUoZmFsc2UpLmZyb21BZGRyZXNzQm91bmNlYWJsZShmYWxzZSkudG9BZGRyZXNzQm91bmNlYWJsZShmYWxzZSkuYnVpbGQoKTtcbiAgICB0eEJ1aWxkZXIuZnJvbSh0ZXN0RGF0YS5zaWduZWRTZW5kVHJhbnNhY3Rpb24udHgpO1xuICAgIGNvbnN0IGpzb25UeDMgPSBidWlsdFR4My50b0pzb24oKTtcbiAgICBzaG91bGQuZXF1YWwoanNvblR4My5ib3VuY2VhYmxlLCBmYWxzZSk7XG4gICAgc2hvdWxkLmVxdWFsKGJ1aWx0VHgzLnNpZ25hYmxlUGF5bG9hZC50b1N0cmluZygnYmFzZTY0JyksIHRlc3REYXRhLnNpZ25lZFNlbmRUcmFuc2FjdGlvbi5ib3VuY2VhYmxlU2lnbmFibGUpO1xuICAgIHNob3VsZC5lcXVhbChidWlsdFR4My5pZCwgdGVzdERhdGEuc2lnbmVkU2VuZFRyYW5zYWN0aW9uLnR4SWRCb3VuY2VhYmxlKTtcbiAgICBzaG91bGQuZXF1YWwoYnVpbHRUeDMudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuc2lnbmVkU2VuZFRyYW5zYWN0aW9uLnR4KTtcbiAgICBqc29uVHgzLnNlbmRlci5zaG91bGQuZXF1YWwoJ1VRQ1NCalIzZlVPTDk4V1R3MkZfSVQ0QnJjcWpaSldWTFdVU3o1V1FEcGFMOU1lZycpO1xuICAgIGpzb25UeDMuZGVzdGluYXRpb24uc2hvdWxkLmVxdWFsKCdVUUEwaTgtQ2RHbkZfRGhVSEhmOTJSMU9OSDZzSUE5dkxaX1dMY0NJaGZCQlgxYUQnKTtcbiAgICBqc29uVHgzLmFtb3VudC5zaG91bGQuZXF1YWwoJzEwMDAwMDAwJyk7XG4gICAganNvblR4My5zZXFuby5zaG91bGQuZXF1YWwoNik7XG4gICAganNvblR4My5leHBpcmF0aW9uVGltZS5zaG91bGQuZXF1YWwoMTY5NTk5NzU4Mik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcGFyc2UgYSByYXcgdHJhbnNhY3Rpb24gYW5kIHNldCBmbGFncycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0dG9uJykpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5zaWduZWRTZW5kVHJhbnNhY3Rpb24udHgpO1xuICAgIGNvbnN0IHR4QnVpbGRlckJvdW5jZWFibGUgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuc2lnbmVkU2VuZFRyYW5zYWN0aW9uLnR4Qm91bmNlYWJsZSk7XG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4Qm91bmNlYWJsZSA9IGF3YWl0IHR4QnVpbGRlckJvdW5jZWFibGUuYnVpbGQoKTtcbiAgICB0eC50b0pzb24oKS5ib3VuY2VhYmxlLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgdHhCb3VuY2VhYmxlLnRvSnNvbigpLmJvdW5jZWFibGUuc2hvdWxkLmVxdWFsKHRydWUpO1xuICB9KTtcblxuICB4aXQoJ3Nob3VsZCBidWlsZCBhIHNpZ25lZCB0cmFuc2ZlciB0eCBhbmQgc3VibWl0IG9uY2hhaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdG9ud2ViID0gbmV3IFRvbldlYihuZXcgVG9uV2ViLkh0dHBQcm92aWRlcignaHR0cHM6Ly90ZXN0bmV0LnRvbmNlbnRlci5jb20vYXBpL3YyL2pzb25SUEMnKSk7XG4gICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcml2YXRlS2V5cy5wcnZLZXkxIH0pO1xuICAgIGNvbnN0IHB1YmxpY0tleSA9IGtleVBhaXIuZ2V0S2V5cygpLnB1YjtcbiAgICBjb25zdCBhZGRyZXNzID0gYXdhaXQgdXRpbHMuZGVmYXVsdC5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXkpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnNlbmRlcihhZGRyZXNzKTtcblxuICAgIGNvbnN0IFdhbGxldENsYXNzID0gdG9ud2ViLndhbGxldC5hbGxbJ3Y0UjInXTtcbiAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0Q2xhc3ModG9ud2ViLnByb3ZpZGVyLCB7XG4gICAgICBwdWJsaWNLZXk6IHRvbndlYi51dGlscy5oZXhUb0J5dGVzKHB1YmxpY0tleSksXG4gICAgICB3YzogMCxcbiAgICB9KTtcbiAgICBjb25zdCBzZXFubyA9IGF3YWl0IHdhbGxldC5tZXRob2RzLnNlcW5vKCkuY2FsbCgpO1xuICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcihzZXFubyBhcyBudW1iZXIpO1xuICAgIHR4QnVpbGRlci5wdWJsaWNLZXkocHVibGljS2V5KTtcbiAgICBjb25zdCBleHBpcmVBdCA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDFlMykgKyA2MCAqIDYwICogMjQgKiA3OyAvLyA3IGRheXNcbiAgICB0eEJ1aWxkZXIuZXhwaXJlVGltZShleHBpcmVBdCk7XG4gICAgdHhCdWlsZGVyLnNlbmQoe1xuICAgICAgYWRkcmVzczogJ0VRRDZUbTVyeWJKSHFNZmxRa2pwQ1JCN0xtNVFwR3FGb1l3aUxxTWpQdGFxUFNkWicsXG4gICAgICBhbW91bnQ6ICcxMDAwMDAwMCcsXG4gICAgfSk7XG4gICAgdHhCdWlsZGVyLnNldE1lc3NhZ2UoJ3Rlc3QnKTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgY29uc3Qgc2lnbmFibGUgPSB0eC5zaWduYWJsZVBheWxvYWQ7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0ga2V5UGFpci5zaWduTWVzc2FnZWluVWludDhBcnJheShzaWduYWJsZSk7XG4gICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZnJvbShzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICBidWlsZGVyMi5hZGRTaWduYXR1cmUoa2V5UGFpci5nZXRLZXlzKCksIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSkpO1xuICAgIGNvbnN0IHR4MiA9IGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgY29uc3Qgc2lnbmF0dXJlMiA9IGtleVBhaXIuc2lnbk1lc3NhZ2VpblVpbnQ4QXJyYXkodHgyLnNpZ25hYmxlUGF5bG9hZCk7XG4gICAgc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSkudG9TdHJpbmcoJ2hleCcpLCBCdWZmZXIuZnJvbShzaWduYXR1cmUyKS50b1N0cmluZygnaGV4JykpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDIwMDApKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b253ZWIucHJvdmlkZXIuc2VuZEJvYyh0eDIudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYnVpbGQgYSBzaWduZWQgdHJhbnNmZXIgdHggdXNpbmcgYWRkIHNpZ25hdHVyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLnByaXZhdGVLZXlzLnBydktleTEgfSk7XG4gICAgY29uc3QgcHVibGljS2V5ID0ga2V5UGFpci5nZXRLZXlzKCkucHViO1xuICAgIGNvbnN0IGFkZHJlc3MgPSBhd2FpdCB1dGlscy5kZWZhdWx0LmdldEFkZHJlc3NGcm9tUHVibGljS2V5KHB1YmxpY0tleSk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuc2VuZGVyKGFkZHJlc3MpO1xuICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigwKTtcbiAgICB0eEJ1aWxkZXIucHVibGljS2V5KHB1YmxpY0tleSk7XG4gICAgY29uc3QgZXhwaXJlQXQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxZTMpICsgNjAgKiA2MCAqIDI0ICogNztcbiAgICB0eEJ1aWxkZXIuZXhwaXJlVGltZShleHBpcmVBdCk7XG4gICAgdHhCdWlsZGVyLnNlbmQodGVzdERhdGEucmVjaXBpZW50c1swXSk7XG4gICAgdHhCdWlsZGVyLnNldE1lc3NhZ2UoJ3Rlc3QnKTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgY29uc3Qgc2lnbmFibGUgPSB0eC5zaWduYWJsZVBheWxvYWQ7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0ga2V5UGFpci5zaWduTWVzc2FnZWluVWludDhBcnJheShzaWduYWJsZSk7XG4gICAgdHhCdWlsZGVyLmFkZFNpZ25hdHVyZShrZXlQYWlyLmdldEtleXMoKSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlKSk7XG4gICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZnJvbShzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICBjb25zdCB0eDIgPSBhd2FpdCBidWlsZGVyMi5idWlsZCgpO1xuICAgIGNvbnN0IHNpZ25hdHVyZTIgPSBrZXlQYWlyLnNpZ25NZXNzYWdlaW5VaW50OEFycmF5KHR4Mi5zaWduYWJsZVBheWxvYWQpO1xuICAgIHNob3VsZC5lcXVhbChCdWZmZXIuZnJvbShzaWduYXR1cmUpLnRvU3RyaW5nKCdoZXgnKSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlMikudG9TdHJpbmcoJ2hleCcpKTtcbiAgICBzaG91bGQuZXF1YWwodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdHgyLnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIHRyYW5zZmVyIHR4IGZvciBub24tYm91bmNlYWJsZSBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDApO1xuICAgIHR4QnVpbGRlci5wdWJsaWNLZXkodGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSk7XG4gICAgdHhCdWlsZGVyLmV4cGlyZVRpbWUoMTIzNDU2Nzg5MCk7XG4gICAgY29uc3QgYWRkcmVzcyA9ICdFUUFXekVLY2RueWt2WGZVTm91cWRTNjJ0dnJwMzJiQ3h1S1M2ZVFyUzZJU2djTG8nO1xuICAgIGNvbnN0IG90aGVyRm9ybWF0ID0gJ1VRQVd6RUtjZG55a3ZYZlVOb3VxZFM2MnR2cnAzMmJDeHVLUzZlUXJTNklTZ1o4dCc7XG4gICAgY29uc3QgYW1vdW50ID0gJzEwMDAwMDAwJztcbiAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3MsIGFtb3VudCB9KTtcbiAgICB0eEJ1aWxkZXIuc2V0TWVzc2FnZSgndGVzdCcpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyxcbiAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICBjb2luOiAndHRvbicsXG4gICAgfSk7XG4gICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICBhZGRyZXNzLFxuICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgIGNvaW46ICd0dG9uJyxcbiAgICB9KTtcbiAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICB0eEpzb24uZGVzdGluYXRpb24uc2hvdWxkLmVxdWFsKGFkZHJlc3MpO1xuICAgIGNvbnN0IGJ1aWxkZXIyID0gZmFjdG9yeS5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgIGNvbnN0IHR4MiA9IGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgY29uc3QgdHhKc29uMiA9IHR4Mi50b0pzb24oKTtcbiAgICB0eEpzb24yLmRlc3RpbmF0aW9uQWxpYXMuc2hvdWxkLmVxdWFsKG90aGVyRm9ybWF0KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIHR4IGNvbXBhdGlibGUgd2l0aCB2MyB3YWxsZXQgY29udHJhY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnZlc3RpbmdDb250cmFjdC5hZGRyZXNzKTtcbiAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMyk7XG4gICAgdHhCdWlsZGVyLmV4cGlyZVRpbWUoMTc2MTIxNTUxMik7XG4gICAgdHhCdWlsZGVyLnNlbmQodGVzdERhdGEudjNDb21wYXRpYmxlU2lnbmVkU2VuZFRyYW5zYWN0aW9uLnJlY2lwaWVudCk7XG4gICAgdHhCdWlsZGVyLmlzVjNDb250cmFjdE1lc3NhZ2UodHJ1ZSk7XG4gICAgdHhCdWlsZGVyLmJvdW5jZWFibGUodHJ1ZSk7XG4gICAgdHhCdWlsZGVyLmFkZFNpZ25hdHVyZShcbiAgICAgIHsgcHViOiB0ZXN0RGF0YS52ZXN0aW5nQ29udHJhY3QucHVibGljS2V5IH0sXG4gICAgICBCdWZmZXIuZnJvbSh0ZXN0RGF0YS52ZXN0aW5nQ29udHJhY3Quc2lnbmF0dXJlLCAnYmFzZTY0JylcbiAgICApO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICBhZGRyZXNzOiB0ZXN0RGF0YS52ZXN0aW5nQ29udHJhY3QuYWRkcmVzcyxcbiAgICAgIHZhbHVlOiB0ZXN0RGF0YS52M0NvbXBhdGlibGVTaWduZWRTZW5kVHJhbnNhY3Rpb24ucmVjaXBpZW50LmFtb3VudCxcbiAgICAgIGNvaW46ICd0dG9uJyxcbiAgICB9KTtcbiAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnYzQ29tcGF0aWJsZVNpZ25lZFNlbmRUcmFuc2FjdGlvbi5yZWNpcGllbnQuYWRkcmVzcyxcbiAgICAgIHZhbHVlOiB0ZXN0RGF0YS52M0NvbXBhdGlibGVTaWduZWRTZW5kVHJhbnNhY3Rpb24ucmVjaXBpZW50LmFtb3VudCxcbiAgICAgIGNvaW46ICd0dG9uJyxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBhIHYzIGNvbXBhdGlibGUgc2VuZCB0cmFuc2FjdGlvbiB1c2luZyByYXcgdHJhbnNhY3Rpb24gaGV4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS52M0NvbXBhdGlibGVTaWduZWRTZW5kVHJhbnNhY3Rpb24udHhCb3VuY2VhYmxlKTtcbiAgICBjb25zdCBidWlsdFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QganNvblR4ID0gYnVpbHRUeC50b0pzb24oKTtcbiAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgc2hvdWxkLmVxdWFsKFxuICAgICAgYnVpbHRUeC5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgdGVzdERhdGEudjNDb21wYXRpYmxlU2lnbmVkU2VuZFRyYW5zYWN0aW9uLmJvdW5jZWFibGVTaWduYWJsZVxuICAgICk7XG4gICAgc2hvdWxkLmVxdWFsKGJ1aWx0VHguaWQsIHRlc3REYXRhLnYzQ29tcGF0aWJsZVNpZ25lZFNlbmRUcmFuc2FjdGlvbi50eElkQm91bmNlYWJsZSk7XG4gICAganNvblR4LnNlbmRlci5zaG91bGQuZXF1YWwodGVzdERhdGEudmVzdGluZ0NvbnRyYWN0LmFkZHJlc3NCb3VuY2VhYmxlKTtcbiAgICBqc29uVHguZGVzdGluYXRpb24uc2hvdWxkLmVxdWFsKHRlc3REYXRhLnYzQ29tcGF0aWJsZVNpZ25lZFNlbmRUcmFuc2FjdGlvbi5yZWNpcGllbnQuYWRkcmVzcyk7XG4gICAganNvblR4LmRlc3RpbmF0aW9uQWxpYXMuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnYzQ29tcGF0aWJsZVNpZ25lZFNlbmRUcmFuc2FjdGlvbi5yZWNpcGllbnROb25Cb3VuY2VhYmxlLmFkZHJlc3MpO1xuICAgIGpzb25UeC5hbW91bnQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnYzQ29tcGF0aWJsZVNpZ25lZFNlbmRUcmFuc2FjdGlvbi5yZWNpcGllbnQuYW1vdW50KTtcbiAgICBqc29uVHguc2Vxbm8uc2hvdWxkLmVxdWFsKDMpO1xuICAgIGpzb25UeC5leHBpcmF0aW9uVGltZS5zaG91bGQuZXF1YWwoMTc2MTIxNTUxMik7XG4gICAganNvblR4LmJvdW5jZWFibGUuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIGpzb25UeC5zdWJfd2FsbGV0X2lkLnNob3VsZC5lcXVhbChXQUxMRVRfSUQpO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasmCrossCompatibility.d.ts","sourceRoot":"","sources":["../../../../test/unit/wasmCrossCompatibility.ts"],"names":[],"mappings":""}
@@ -0,0 +1,176 @@
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 statics_1 = require("@bitgo/statics");
41
+ const sdk_core_1 = require("@bitgo/sdk-core");
42
+ const wasm_ton_1 = require("@bitgo/wasm-ton");
43
+ const transactionBuilderFactory_1 = require("../../src/lib/transactionBuilderFactory");
44
+ const testData = __importStar(require("../resources/ton"));
45
+ /**
46
+ * Cross-compatibility tests between WASM (@bitgo/wasm-ton) and legacy
47
+ * (tonweb-based) transaction building/parsing for TON.
48
+ *
49
+ * Direction 1: WASM parses legacy-built transactions (covered by explainTransactionWasm.ts)
50
+ * Direction 2: Legacy parses WASM-built transactions (this file)
51
+ */
52
+ describe('TON WASM Cross-Compatibility', function () {
53
+ const coin = statics_1.coins.get('tton');
54
+ const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coin);
55
+ // Use sender from test fixtures
56
+ const senderAddress = testData.sender.address;
57
+ const senderPublicKey = testData.sender.publicKey;
58
+ const recipientAddress = testData.addresses.validAddresses[0];
59
+ function createWasmContext(overrides = {}) {
60
+ return {
61
+ sender: senderAddress,
62
+ seqno: 6,
63
+ expireTime: 1695997582n,
64
+ publicKey: senderPublicKey,
65
+ ...overrides,
66
+ };
67
+ }
68
+ // =========================================================================
69
+ // WASM -> Legacy: Legacy can parse WASM-built transactions
70
+ // =========================================================================
71
+ describe('Legacy parses WASM-built transactions', function () {
72
+ it('should parse a WASM-built payment transaction via legacy factory.from()', async function () {
73
+ const amount = 10000000n; // 0.01 TON
74
+ const memo = 'test';
75
+ // Build with WASM
76
+ const wasmTx = (0, wasm_ton_1.buildTransaction)({
77
+ type: 'payment',
78
+ to: recipientAddress,
79
+ amount,
80
+ bounceable: false,
81
+ memo,
82
+ }, createWasmContext());
83
+ // Convert to base64 (the format legacy expects)
84
+ const bocBytes = wasmTx.toBroadcastFormat();
85
+ const base64Tx = Buffer.from(bocBytes).toString('base64');
86
+ // Parse with legacy
87
+ const legacyBuilder = factory.from(base64Tx);
88
+ const legacyTx = await legacyBuilder.build();
89
+ const json = legacyTx.toJson();
90
+ // Verify the legacy builder can extract the correct fields
91
+ legacyTx.type.should.equal(sdk_core_1.TransactionType.Send);
92
+ json.seqno.should.equal(6);
93
+ json.expirationTime.should.equal(1695997582);
94
+ json.amount.should.equal(amount.toString());
95
+ should_1.default.exist(json.sender);
96
+ should_1.default.exist(json.destination);
97
+ });
98
+ it('should parse a WASM-built payment without memo via legacy', async function () {
99
+ const amount = 50000000n; // 0.05 TON
100
+ const wasmTx = (0, wasm_ton_1.buildTransaction)({
101
+ type: 'payment',
102
+ to: recipientAddress,
103
+ amount,
104
+ bounceable: false,
105
+ }, createWasmContext({ seqno: 10, expireTime: 1700000000n }));
106
+ const base64Tx = Buffer.from(wasmTx.toBroadcastFormat()).toString('base64');
107
+ const legacyBuilder = factory.from(base64Tx);
108
+ const legacyTx = await legacyBuilder.build();
109
+ const json = legacyTx.toJson();
110
+ legacyTx.type.should.equal(sdk_core_1.TransactionType.Send);
111
+ json.seqno.should.equal(10);
112
+ json.expirationTime.should.equal(1700000000);
113
+ json.amount.should.equal(amount.toString());
114
+ });
115
+ it('should round-trip: WASM build -> legacy parse -> legacy build -> WASM parse', async function () {
116
+ const amount = 123400000n;
117
+ const memo = 'hello';
118
+ const wasmTx = (0, wasm_ton_1.buildTransaction)({
119
+ type: 'payment',
120
+ to: recipientAddress,
121
+ amount,
122
+ bounceable: false,
123
+ memo,
124
+ }, createWasmContext({ seqno: 3, expireTime: 1234567890n }));
125
+ const base64Tx = Buffer.from(wasmTx.toBroadcastFormat()).toString('base64');
126
+ // Parse with legacy
127
+ const legacyBuilder = factory.from(base64Tx);
128
+ const legacyTx = await legacyBuilder.build();
129
+ // Rebuild with legacy should produce valid base64
130
+ const rebuiltBase64 = legacyTx.toBroadcastFormat();
131
+ // Parse the rebuilt transaction with WASM to confirm fields match
132
+ const wasmParsed = (0, wasm_ton_1.parseTransaction)(wasm_ton_1.Transaction.fromBytes(Buffer.from(rebuiltBase64, 'base64')));
133
+ wasmParsed.transactionType.should.equal('Transfer');
134
+ wasmParsed.seqno.should.equal(3);
135
+ wasmParsed.sendActions.length.should.be.greaterThan(0);
136
+ String(wasmParsed.sendActions[0].amount).should.equal(amount.toString());
137
+ });
138
+ it('should parse a WASM-built bounceable payment via legacy', async function () {
139
+ const amount = 10000000n;
140
+ const wasmTx = (0, wasm_ton_1.buildTransaction)({
141
+ type: 'payment',
142
+ to: recipientAddress,
143
+ amount,
144
+ bounceable: true,
145
+ }, createWasmContext());
146
+ const base64Tx = Buffer.from(wasmTx.toBroadcastFormat()).toString('base64');
147
+ const legacyBuilder = factory.from(base64Tx);
148
+ const legacyTx = await legacyBuilder.build();
149
+ const json = legacyTx.toJson();
150
+ legacyTx.type.should.equal(sdk_core_1.TransactionType.Send);
151
+ json.amount.should.equal(amount.toString());
152
+ });
153
+ });
154
+ // =========================================================================
155
+ // Both WASM and legacy agree on signed fixture data
156
+ // =========================================================================
157
+ describe('Both WASM and legacy agree on signed fixture data', function () {
158
+ it('should produce matching fields for signedSendTransaction', async function () {
159
+ const txBase64 = testData.signedSendTransaction.tx;
160
+ // Parse with WASM
161
+ const wasmTx = wasm_ton_1.Transaction.fromBytes(Buffer.from(txBase64, 'base64'));
162
+ const wasmParsed = (0, wasm_ton_1.parseTransaction)(wasmTx);
163
+ // Parse with legacy
164
+ const legacyBuilder = factory.from(txBase64);
165
+ const legacyTx = await legacyBuilder.build();
166
+ const json = legacyTx.toJson();
167
+ // Both should agree on core fields
168
+ wasmParsed.transactionType.should.equal('Transfer');
169
+ legacyTx.type.should.equal(sdk_core_1.TransactionType.Send);
170
+ wasmParsed.seqno.should.equal(json.seqno);
171
+ wasmParsed.sendActions.length.should.be.greaterThan(0);
172
+ String(wasmParsed.sendActions[0].amount).should.equal(json.amount);
173
+ });
174
+ });
175
+ });
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FzbUNyb3NzQ29tcGF0aWJpbGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC93YXNtQ3Jvc3NDb21wYXRpYmlsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDRDQUF1QztBQUN2Qyw4Q0FBa0Q7QUFDbEQsOENBT3lCO0FBQ3pCLHVGQUFvRjtBQUNwRiwyREFBNkM7QUFFN0M7Ozs7OztHQU1HO0FBQ0gsUUFBUSxDQUFDLDhCQUE4QixFQUFFO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxxREFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwRCxnQ0FBZ0M7SUFDaEMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDOUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU5RCxTQUFTLGlCQUFpQixDQUFDLFlBQW1DLEVBQUU7UUFDOUQsT0FBTztZQUNMLE1BQU0sRUFBRSxhQUFhO1lBQ3JCLEtBQUssRUFBRSxDQUFDO1lBQ1IsVUFBVSxFQUFFLFdBQVc7WUFDdkIsU0FBUyxFQUFFLGVBQWU7WUFDMUIsR0FBRyxTQUFTO1NBQ2IsQ0FBQztJQUNKLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsMkRBQTJEO0lBQzNELDRFQUE0RTtJQUM1RSxRQUFRLENBQUMsdUNBQXVDLEVBQUU7UUFDaEQsRUFBRSxDQUFDLHlFQUF5RSxFQUFFLEtBQUs7WUFDakYsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsV0FB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LGtCQUFrQjtZQUNsQixNQUFNLE1BQU0sR0FBRyxzQkFBa0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM3RSxNQUFNLFVBQVUsR0FBc0IsSUFBQSwyQkFBZ0IsRUFBQyxNQUFNLENBQUMsQ0FBQztZQUUvRCxvQkFBb0I7WUFDcEIsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QyxNQUFNLFFBQVEsR0FBRyxNQUFNLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM3QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFFL0IsbUNBQW1DO1lBQ25DLFVBQVUsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwRCxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7XG4gIGJ1aWxkVHJhbnNhY3Rpb24sXG4gIHBhcnNlVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uIGFzIFdhc21Ub25UcmFuc2FjdGlvbixcbiAgdHlwZSBCdWlsZENvbnRleHQsXG4gIHR5cGUgUGF5bWVudEludGVudCxcbiAgdHlwZSBQYXJzZWRUcmFuc2FjdGlvbixcbn0gZnJvbSAnQGJpdGdvL3dhc20tdG9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnknO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3Rvbic7XG5cbi8qKlxuICogQ3Jvc3MtY29tcGF0aWJpbGl0eSB0ZXN0cyBiZXR3ZWVuIFdBU00gKEBiaXRnby93YXNtLXRvbikgYW5kIGxlZ2FjeVxuICogKHRvbndlYi1iYXNlZCkgdHJhbnNhY3Rpb24gYnVpbGRpbmcvcGFyc2luZyBmb3IgVE9OLlxuICpcbiAqIERpcmVjdGlvbiAxOiBXQVNNIHBhcnNlcyBsZWdhY3ktYnVpbHQgdHJhbnNhY3Rpb25zIChjb3ZlcmVkIGJ5IGV4cGxhaW5UcmFuc2FjdGlvbldhc20udHMpXG4gKiBEaXJlY3Rpb24gMjogTGVnYWN5IHBhcnNlcyBXQVNNLWJ1aWx0IHRyYW5zYWN0aW9ucyAodGhpcyBmaWxlKVxuICovXG5kZXNjcmliZSgnVE9OIFdBU00gQ3Jvc3MtQ29tcGF0aWJpbGl0eScsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29pbiA9IGNvaW5zLmdldCgndHRvbicpO1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbik7XG5cbiAgLy8gVXNlIHNlbmRlciBmcm9tIHRlc3QgZml4dHVyZXNcbiAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzO1xuICBjb25zdCBzZW5kZXJQdWJsaWNLZXkgPSB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5O1xuICBjb25zdCByZWNpcGllbnRBZGRyZXNzID0gdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzBdO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZVdhc21Db250ZXh0KG92ZXJyaWRlczogUGFydGlhbDxCdWlsZENvbnRleHQ+ID0ge30pOiBCdWlsZENvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBzZW5kZXI6IHNlbmRlckFkZHJlc3MsXG4gICAgICBzZXFubzogNixcbiAgICAgIGV4cGlyZVRpbWU6IDE2OTU5OTc1ODJuLFxuICAgICAgcHVibGljS2V5OiBzZW5kZXJQdWJsaWNLZXksXG4gICAgICAuLi5vdmVycmlkZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gV0FTTSAtPiBMZWdhY3k6IExlZ2FjeSBjYW4gcGFyc2UgV0FTTS1idWlsdCB0cmFuc2FjdGlvbnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBkZXNjcmliZSgnTGVnYWN5IHBhcnNlcyBXQVNNLWJ1aWx0IHRyYW5zYWN0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHBhcnNlIGEgV0FTTS1idWlsdCBwYXltZW50IHRyYW5zYWN0aW9uIHZpYSBsZWdhY3kgZmFjdG9yeS5mcm9tKCknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhbW91bnQgPSAxMDAwMDAwMG47IC8vIDAuMDEgVE9OXG4gICAgICBjb25zdCBtZW1vID0gJ3Rlc3QnO1xuXG4gICAgICAvLyBCdWlsZCB3aXRoIFdBU01cbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncGF5bWVudCcsXG4gICAgICAgICAgdG86IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50LFxuICAgICAgICAgIGJvdW5jZWFibGU6IGZhbHNlLFxuICAgICAgICAgIG1lbW8sXG4gICAgICAgIH0gYXMgUGF5bWVudEludGVudCxcbiAgICAgICAgY3JlYXRlV2FzbUNvbnRleHQoKVxuICAgICAgKTtcblxuICAgICAgLy8gQ29udmVydCB0byBiYXNlNjQgKHRoZSBmb3JtYXQgbGVnYWN5IGV4cGVjdHMpXG4gICAgICBjb25zdCBib2NCeXRlcyA9IHdhc21UeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgYmFzZTY0VHggPSBCdWZmZXIuZnJvbShib2NCeXRlcykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gICAgICAvLyBQYXJzZSB3aXRoIGxlZ2FjeVxuICAgICAgY29uc3QgbGVnYWN5QnVpbGRlciA9IGZhY3RvcnkuZnJvbShiYXNlNjRUeCk7XG4gICAgICBjb25zdCBsZWdhY3lUeCA9IGF3YWl0IGxlZ2FjeUJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGpzb24gPSBsZWdhY3lUeC50b0pzb24oKTtcblxuICAgICAgLy8gVmVyaWZ5IHRoZSBsZWdhY3kgYnVpbGRlciBjYW4gZXh0cmFjdCB0aGUgY29ycmVjdCBmaWVsZHNcbiAgICAgIGxlZ2FjeVR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIGpzb24uc2Vxbm8uc2hvdWxkLmVxdWFsKDYpO1xuICAgICAganNvbi5leHBpcmF0aW9uVGltZS5zaG91bGQuZXF1YWwoMTY5NTk5NzU4Mik7XG4gICAgICBqc29uLmFtb3VudC5zaG91bGQuZXF1YWwoYW1vdW50LnRvU3RyaW5nKCkpO1xuICAgICAgc2hvdWxkLmV4aXN0KGpzb24uc2VuZGVyKTtcbiAgICAgIHNob3VsZC5leGlzdChqc29uLmRlc3RpbmF0aW9uKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgYSBXQVNNLWJ1aWx0IHBheW1lbnQgd2l0aG91dCBtZW1vIHZpYSBsZWdhY3knLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhbW91bnQgPSA1MDAwMDAwMG47IC8vIDAuMDUgVE9OXG5cbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncGF5bWVudCcsXG4gICAgICAgICAgdG86IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50LFxuICAgICAgICAgIGJvdW5jZWFibGU6IGZhbHNlLFxuICAgICAgICB9IGFzIFBheW1lbnRJbnRlbnQsXG4gICAgICAgIGNyZWF0ZVdhc21Db250ZXh0KHsgc2Vxbm86IDEwLCBleHBpcmVUaW1lOiAxNzAwMDAwMDAwbiB9KVxuICAgICAgKTtcblxuICAgICAgY29uc3QgYmFzZTY0VHggPSBCdWZmZXIuZnJvbSh3YXNtVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gICAgICBjb25zdCBsZWdhY3lCdWlsZGVyID0gZmFjdG9yeS5mcm9tKGJhc2U2NFR4KTtcbiAgICAgIGNvbnN0IGxlZ2FjeVR4ID0gYXdhaXQgbGVnYWN5QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QganNvbiA9IGxlZ2FjeVR4LnRvSnNvbigpO1xuXG4gICAgICBsZWdhY3lUeC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBqc29uLnNlcW5vLnNob3VsZC5lcXVhbCgxMCk7XG4gICAgICBqc29uLmV4cGlyYXRpb25UaW1lLnNob3VsZC5lcXVhbCgxNzAwMDAwMDAwKTtcbiAgICAgIGpzb24uYW1vdW50LnNob3VsZC5lcXVhbChhbW91bnQudG9TdHJpbmcoKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJvdW5kLXRyaXA6IFdBU00gYnVpbGQgLT4gbGVnYWN5IHBhcnNlIC0+IGxlZ2FjeSBidWlsZCAtPiBXQVNNIHBhcnNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYW1vdW50ID0gMTIzNDAwMDAwbjtcbiAgICAgIGNvbnN0IG1lbW8gPSAnaGVsbG8nO1xuXG4gICAgICBjb25zdCB3YXNtVHggPSBidWlsZFRyYW5zYWN0aW9uKFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3BheW1lbnQnLFxuICAgICAgICAgIHRvOiByZWNpcGllbnRBZGRyZXNzLFxuICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICBib3VuY2VhYmxlOiBmYWxzZSxcbiAgICAgICAgICBtZW1vLFxuICAgICAgICB9IGFzIFBheW1lbnRJbnRlbnQsXG4gICAgICAgIGNyZWF0ZVdhc21Db250ZXh0KHsgc2Vxbm86IDMsIGV4cGlyZVRpbWU6IDEyMzQ1Njc4OTBuIH0pXG4gICAgICApO1xuXG4gICAgICBjb25zdCBiYXNlNjRUeCA9IEJ1ZmZlci5mcm9tKHdhc21UeC50b0Jyb2FkY2FzdEZvcm1hdCgpKS50b1N0cmluZygnYmFzZTY0Jyk7XG5cbiAgICAgIC8vIFBhcnNlIHdpdGggbGVnYWN5XG4gICAgICBjb25zdCBsZWdhY3lCdWlsZGVyID0gZmFjdG9yeS5mcm9tKGJhc2U2NFR4KTtcbiAgICAgIGNvbnN0IGxlZ2FjeVR4ID0gYXdhaXQgbGVnYWN5QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAvLyBSZWJ1aWxkIHdpdGggbGVnYWN5IHNob3VsZCBwcm9kdWNlIHZhbGlkIGJhc2U2NFxuICAgICAgY29uc3QgcmVidWlsdEJhc2U2NCA9IGxlZ2FjeVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIC8vIFBhcnNlIHRoZSByZWJ1aWx0IHRyYW5zYWN0aW9uIHdpdGggV0FTTSB0byBjb25maXJtIGZpZWxkcyBtYXRjaFxuICAgICAgY29uc3Qgd2FzbVBhcnNlZDogUGFyc2VkVHJhbnNhY3Rpb24gPSBwYXJzZVRyYW5zYWN0aW9uKFxuICAgICAgICBXYXNtVG9uVHJhbnNhY3Rpb24uZnJvbUJ5dGVzKEJ1ZmZlci5mcm9tKHJlYnVpbHRCYXNlNjQsICdiYXNlNjQnKSlcbiAgICAgICk7XG5cbiAgICAgIHdhc21QYXJzZWQudHJhbnNhY3Rpb25UeXBlLnNob3VsZC5lcXVhbCgnVHJhbnNmZXInKTtcbiAgICAgIHdhc21QYXJzZWQuc2Vxbm8uc2hvdWxkLmVxdWFsKDMpO1xuICAgICAgd2FzbVBhcnNlZC5zZW5kQWN0aW9ucy5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuICAgICAgU3RyaW5nKHdhc21QYXJzZWQuc2VuZEFjdGlvbnNbMF0uYW1vdW50KS5zaG91bGQuZXF1YWwoYW1vdW50LnRvU3RyaW5nKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBhIFdBU00tYnVpbHQgYm91bmNlYWJsZSBwYXltZW50IHZpYSBsZWdhY3knLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhbW91bnQgPSAxMDAwMDAwMG47XG5cbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncGF5bWVudCcsXG4gICAgICAgICAgdG86IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50LFxuICAgICAgICAgIGJvdW5jZWFibGU6IHRydWUsXG4gICAgICAgIH0gYXMgUGF5bWVudEludGVudCxcbiAgICAgICAgY3JlYXRlV2FzbUNvbnRleHQoKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgYmFzZTY0VHggPSBCdWZmZXIuZnJvbSh3YXNtVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gICAgICBjb25zdCBsZWdhY3lCdWlsZGVyID0gZmFjdG9yeS5mcm9tKGJhc2U2NFR4KTtcbiAgICAgIGNvbnN0IGxlZ2FjeVR4ID0gYXdhaXQgbGVnYWN5QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QganNvbiA9IGxlZ2FjeVR4LnRvSnNvbigpO1xuXG4gICAgICBsZWdhY3lUeC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBqc29uLmFtb3VudC5zaG91bGQuZXF1YWwoYW1vdW50LnRvU3RyaW5nKCkpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEJvdGggV0FTTSBhbmQgbGVnYWN5IGFncmVlIG9uIHNpZ25lZCBmaXh0dXJlIGRhdGFcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBkZXNjcmliZSgnQm90aCBXQVNNIGFuZCBsZWdhY3kgYWdyZWUgb24gc2lnbmVkIGZpeHR1cmUgZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgbWF0Y2hpbmcgZmllbGRzIGZvciBzaWduZWRTZW5kVHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJhc2U2NCA9IHRlc3REYXRhLnNpZ25lZFNlbmRUcmFuc2FjdGlvbi50eDtcblxuICAgICAgLy8gUGFyc2Ugd2l0aCBXQVNNXG4gICAgICBjb25zdCB3YXNtVHggPSBXYXNtVG9uVHJhbnNhY3Rpb24uZnJvbUJ5dGVzKEJ1ZmZlci5mcm9tKHR4QmFzZTY0LCAnYmFzZTY0JykpO1xuICAgICAgY29uc3Qgd2FzbVBhcnNlZDogUGFyc2VkVHJhbnNhY3Rpb24gPSBwYXJzZVRyYW5zYWN0aW9uKHdhc21UeCk7XG5cbiAgICAgIC8vIFBhcnNlIHdpdGggbGVnYWN5XG4gICAgICBjb25zdCBsZWdhY3lCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4QmFzZTY0KTtcbiAgICAgIGNvbnN0IGxlZ2FjeVR4ID0gYXdhaXQgbGVnYWN5QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QganNvbiA9IGxlZ2FjeVR4LnRvSnNvbigpO1xuXG4gICAgICAvLyBCb3RoIHNob3VsZCBhZ3JlZSBvbiBjb3JlIGZpZWxkc1xuICAgICAgd2FzbVBhcnNlZC50cmFuc2FjdGlvblR5cGUuc2hvdWxkLmVxdWFsKCdUcmFuc2ZlcicpO1xuICAgICAgbGVnYWN5VHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgd2FzbVBhcnNlZC5zZXFuby5zaG91bGQuZXF1YWwoanNvbi5zZXFubyk7XG4gICAgICB3YXNtUGFyc2VkLnNlbmRBY3Rpb25zLmxlbmd0aC5zaG91bGQuYmUuZ3JlYXRlclRoYW4oMCk7XG4gICAgICBTdHJpbmcod2FzbVBhcnNlZC5zZW5kQWN0aW9uc1swXS5hbW91bnQpLnNob3VsZC5lcXVhbChqc29uLmFtb3VudCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=