@bitgo-beta/abstract-eth 1.0.2-beta.234 → 1.0.2-beta.2341

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 (187) hide show
  1. package/dist/src/abstractEthLikeCoin.d.ts +20 -9
  2. package/dist/src/abstractEthLikeCoin.d.ts.map +1 -1
  3. package/dist/src/abstractEthLikeCoin.js +46 -15
  4. package/dist/src/abstractEthLikeNewCoins.d.ts +938 -0
  5. package/dist/src/abstractEthLikeNewCoins.d.ts.map +1 -0
  6. package/dist/src/abstractEthLikeNewCoins.js +2891 -0
  7. package/dist/src/ethLikeToken.d.ts +38 -6
  8. package/dist/src/ethLikeToken.d.ts.map +1 -1
  9. package/dist/src/ethLikeToken.js +292 -10
  10. package/dist/src/index.d.ts +2 -0
  11. package/dist/src/index.d.ts.map +1 -1
  12. package/dist/src/index.js +8 -2
  13. package/dist/src/lib/constants.d.ts +4 -0
  14. package/dist/src/lib/constants.d.ts.map +1 -0
  15. package/dist/src/lib/constants.js +11 -0
  16. package/dist/src/lib/contractCall.d.ts +8 -0
  17. package/dist/src/lib/contractCall.d.ts.map +1 -0
  18. package/dist/src/lib/contractCall.js +17 -0
  19. package/dist/src/lib/decryptionDelegationBuilder.d.ts +90 -0
  20. package/dist/src/lib/decryptionDelegationBuilder.d.ts.map +1 -0
  21. package/dist/src/lib/decryptionDelegationBuilder.js +59 -0
  22. package/dist/src/lib/iface.d.ts +173 -0
  23. package/dist/src/lib/iface.d.ts.map +1 -0
  24. package/dist/src/lib/iface.js +8 -0
  25. package/dist/src/lib/index.d.ts +19 -0
  26. package/dist/src/lib/index.d.ts.map +1 -0
  27. package/dist/src/lib/index.js +60 -0
  28. package/dist/src/lib/keyPair.d.ts +26 -0
  29. package/dist/src/lib/keyPair.d.ts.map +1 -0
  30. package/dist/src/lib/keyPair.js +65 -0
  31. package/dist/src/lib/messages/eip191/eip191Message.d.ts +12 -0
  32. package/dist/src/lib/messages/eip191/eip191Message.d.ts.map +1 -0
  33. package/dist/src/lib/messages/eip191/eip191Message.js +25 -0
  34. package/dist/src/lib/messages/eip191/eip191MessageBuilder.d.ts +19 -0
  35. package/dist/src/lib/messages/eip191/eip191MessageBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/messages/eip191/eip191MessageBuilder.js +27 -0
  37. package/dist/src/lib/messages/eip191/index.d.ts +3 -0
  38. package/dist/src/lib/messages/eip191/index.d.ts.map +1 -0
  39. package/dist/src/lib/messages/eip191/index.js +19 -0
  40. package/dist/src/lib/messages/eip712/eip712Message.d.ts +6 -0
  41. package/dist/src/lib/messages/eip712/eip712Message.d.ts.map +1 -0
  42. package/dist/src/lib/messages/eip712/eip712Message.js +27 -0
  43. package/dist/src/lib/messages/eip712/eip712MessageBuilder.d.ts +7 -0
  44. package/dist/src/lib/messages/eip712/eip712MessageBuilder.d.ts.map +1 -0
  45. package/dist/src/lib/messages/eip712/eip712MessageBuilder.js +15 -0
  46. package/dist/src/lib/messages/eip712/index.d.ts +3 -0
  47. package/dist/src/lib/messages/eip712/index.d.ts.map +1 -0
  48. package/dist/src/lib/messages/eip712/index.js +19 -0
  49. package/dist/src/lib/messages/index.d.ts +4 -0
  50. package/dist/src/lib/messages/index.d.ts.map +1 -0
  51. package/dist/src/lib/messages/index.js +20 -0
  52. package/dist/src/lib/messages/messageBuilderFactory.d.ts +7 -0
  53. package/dist/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  54. package/dist/src/lib/messages/messageBuilderFactory.js +23 -0
  55. package/dist/src/lib/transaction.d.ts +69 -0
  56. package/dist/src/lib/transaction.d.ts.map +1 -0
  57. package/dist/src/lib/transaction.js +149 -0
  58. package/dist/src/lib/transactionBuilder.d.ts +388 -0
  59. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  60. package/dist/src/lib/transactionBuilder.js +1120 -0
  61. package/dist/src/lib/transferBuilder.d.ts +76 -0
  62. package/dist/src/lib/transferBuilder.d.ts.map +1 -0
  63. package/dist/src/lib/transferBuilder.js +307 -0
  64. package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.d.ts +54 -0
  65. package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.d.ts.map +1 -0
  66. package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.js +120 -0
  67. package/dist/src/lib/transferBuilders/index.d.ts +5 -0
  68. package/dist/src/lib/transferBuilders/index.d.ts.map +1 -0
  69. package/dist/src/lib/transferBuilders/index.js +21 -0
  70. package/dist/src/lib/transferBuilders/transferBuilderERC1155.d.ts +17 -0
  71. package/dist/src/lib/transferBuilders/transferBuilderERC1155.d.ts.map +1 -0
  72. package/dist/src/lib/transferBuilders/transferBuilderERC1155.js +96 -0
  73. package/dist/src/lib/transferBuilders/transferBuilderERC721.d.ts +21 -0
  74. package/dist/src/lib/transferBuilders/transferBuilderERC721.d.ts.map +1 -0
  75. package/dist/src/lib/transferBuilders/transferBuilderERC721.js +91 -0
  76. package/dist/src/lib/transferBuilders/transferBuilderERC7984.d.ts +35 -0
  77. package/dist/src/lib/transferBuilders/transferBuilderERC7984.d.ts.map +1 -0
  78. package/dist/src/lib/transferBuilders/transferBuilderERC7984.js +113 -0
  79. package/dist/src/lib/types.d.ts +40 -0
  80. package/dist/src/lib/types.d.ts.map +1 -0
  81. package/dist/src/lib/types.js +140 -0
  82. package/dist/src/lib/utils.d.ts +386 -0
  83. package/dist/src/lib/utils.d.ts.map +1 -0
  84. package/dist/src/lib/utils.js +1026 -0
  85. package/dist/src/lib/walletUtil.d.ts +46 -0
  86. package/dist/src/lib/walletUtil.d.ts.map +1 -0
  87. package/dist/src/lib/walletUtil.js +53 -0
  88. package/dist/src/lib/zamaUtils.d.ts +257 -0
  89. package/dist/src/lib/zamaUtils.d.ts.map +1 -0
  90. package/dist/src/lib/zamaUtils.js +527 -0
  91. package/dist/src/types.d.ts +9 -0
  92. package/dist/src/types.d.ts.map +1 -0
  93. package/dist/src/types.js +3 -0
  94. package/dist/test/index.d.ts +2 -0
  95. package/dist/test/index.d.ts.map +1 -0
  96. package/dist/test/index.js +18 -0
  97. package/dist/test/unit/coin.d.ts +8 -0
  98. package/dist/test/unit/coin.d.ts.map +1 -0
  99. package/dist/test/unit/coin.js +577 -0
  100. package/dist/test/unit/decryptionDelegationBuilder.d.ts +2 -0
  101. package/dist/test/unit/decryptionDelegationBuilder.d.ts.map +1 -0
  102. package/dist/test/unit/decryptionDelegationBuilder.js +265 -0
  103. package/dist/test/unit/index.d.ts +8 -0
  104. package/dist/test/unit/index.d.ts.map +1 -0
  105. package/dist/test/unit/index.js +24 -0
  106. package/dist/test/unit/messages/abstractEthMessageBuilderTests.d.ts +3 -0
  107. package/dist/test/unit/messages/abstractEthMessageBuilderTests.d.ts.map +1 -0
  108. package/dist/test/unit/messages/abstractEthMessageBuilderTests.js +110 -0
  109. package/dist/test/unit/messages/abstractEthMessageTestTypes.d.ts +43 -0
  110. package/dist/test/unit/messages/abstractEthMessageTestTypes.d.ts.map +1 -0
  111. package/dist/test/unit/messages/abstractEthMessageTestTypes.js +3 -0
  112. package/dist/test/unit/messages/abstractEthMessagesTests.d.ts +3 -0
  113. package/dist/test/unit/messages/abstractEthMessagesTests.d.ts.map +1 -0
  114. package/dist/test/unit/messages/abstractEthMessagesTests.js +129 -0
  115. package/dist/test/unit/messages/eip191/eip191Message.d.ts +2 -0
  116. package/dist/test/unit/messages/eip191/eip191Message.d.ts.map +1 -0
  117. package/dist/test/unit/messages/eip191/eip191Message.js +15 -0
  118. package/dist/test/unit/messages/eip191/eip191MessageBuilder.d.ts +2 -0
  119. package/dist/test/unit/messages/eip191/eip191MessageBuilder.d.ts.map +1 -0
  120. package/dist/test/unit/messages/eip191/eip191MessageBuilder.js +16 -0
  121. package/dist/test/unit/messages/eip191/fixtures.d.ts +109 -0
  122. package/dist/test/unit/messages/eip191/fixtures.d.ts.map +1 -0
  123. package/dist/test/unit/messages/eip191/fixtures.js +63 -0
  124. package/dist/test/unit/messages/eip712/eip712Message.d.ts +2 -0
  125. package/dist/test/unit/messages/eip712/eip712Message.d.ts.map +1 -0
  126. package/dist/test/unit/messages/eip712/eip712Message.js +15 -0
  127. package/dist/test/unit/messages/eip712/eip712MessageBuilder.d.ts +2 -0
  128. package/dist/test/unit/messages/eip712/eip712MessageBuilder.d.ts.map +1 -0
  129. package/dist/test/unit/messages/eip712/eip712MessageBuilder.js +16 -0
  130. package/dist/test/unit/messages/eip712/fixtures.d.ts +76 -0
  131. package/dist/test/unit/messages/eip712/fixtures.d.ts.map +1 -0
  132. package/dist/test/unit/messages/eip712/fixtures.js +120 -0
  133. package/dist/test/unit/messages/index.d.ts +4 -0
  134. package/dist/test/unit/messages/index.d.ts.map +1 -0
  135. package/dist/test/unit/messages/index.js +20 -0
  136. package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
  137. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  138. package/dist/test/unit/messages/messageBuilderFactory.js +52 -0
  139. package/dist/test/unit/token.d.ts +2 -0
  140. package/dist/test/unit/token.d.ts.map +1 -0
  141. package/dist/test/unit/token.js +37 -0
  142. package/dist/test/unit/transaction.d.ts +3 -0
  143. package/dist/test/unit/transaction.d.ts.map +1 -0
  144. package/dist/test/unit/transaction.js +73 -0
  145. package/dist/test/unit/transactionBuilder/addressInitialization.d.ts +8 -0
  146. package/dist/test/unit/transactionBuilder/addressInitialization.d.ts.map +1 -0
  147. package/dist/test/unit/transactionBuilder/addressInitialization.js +95 -0
  148. package/dist/test/unit/transactionBuilder/decryptionDelegation.d.ts +3 -0
  149. package/dist/test/unit/transactionBuilder/decryptionDelegation.d.ts.map +1 -0
  150. package/dist/test/unit/transactionBuilder/decryptionDelegation.js +161 -0
  151. package/dist/test/unit/transactionBuilder/finalizeUnwrapERC7984.d.ts +3 -0
  152. package/dist/test/unit/transactionBuilder/finalizeUnwrapERC7984.d.ts.map +1 -0
  153. package/dist/test/unit/transactionBuilder/finalizeUnwrapERC7984.js +127 -0
  154. package/dist/test/unit/transactionBuilder/flushERC7984.d.ts +3 -0
  155. package/dist/test/unit/transactionBuilder/flushERC7984.d.ts.map +1 -0
  156. package/dist/test/unit/transactionBuilder/flushERC7984.js +292 -0
  157. package/dist/test/unit/transactionBuilder/flushNft.d.ts +2 -0
  158. package/dist/test/unit/transactionBuilder/flushNft.d.ts.map +1 -0
  159. package/dist/test/unit/transactionBuilder/flushNft.js +381 -0
  160. package/dist/test/unit/transactionBuilder/index.d.ts +10 -0
  161. package/dist/test/unit/transactionBuilder/index.d.ts.map +1 -0
  162. package/dist/test/unit/transactionBuilder/index.js +26 -0
  163. package/dist/test/unit/transactionBuilder/send.d.ts +3 -0
  164. package/dist/test/unit/transactionBuilder/send.d.ts.map +1 -0
  165. package/dist/test/unit/transactionBuilder/send.js +197 -0
  166. package/dist/test/unit/transactionBuilder/unwrapERC7984.d.ts +3 -0
  167. package/dist/test/unit/transactionBuilder/unwrapERC7984.d.ts.map +1 -0
  168. package/dist/test/unit/transactionBuilder/unwrapERC7984.js +134 -0
  169. package/dist/test/unit/transactionBuilder/walletInitialization.d.ts +11 -0
  170. package/dist/test/unit/transactionBuilder/walletInitialization.d.ts.map +1 -0
  171. package/dist/test/unit/transactionBuilder/walletInitialization.js +137 -0
  172. package/dist/test/unit/transactionBuilder/wrapERC7984.d.ts +3 -0
  173. package/dist/test/unit/transactionBuilder/wrapERC7984.d.ts.map +1 -0
  174. package/dist/test/unit/transactionBuilder/wrapERC7984.js +140 -0
  175. package/dist/test/unit/transferBuilder.d.ts +2 -0
  176. package/dist/test/unit/transferBuilder.d.ts.map +1 -0
  177. package/dist/test/unit/transferBuilder.js +76 -0
  178. package/dist/test/unit/utils.d.ts +2 -0
  179. package/dist/test/unit/utils.d.ts.map +1 -0
  180. package/dist/test/unit/utils.js +214 -0
  181. package/dist/test/unit/zamaUtils.d.ts +2 -0
  182. package/dist/test/unit/zamaUtils.d.ts.map +1 -0
  183. package/dist/test/unit/zamaUtils.js +616 -0
  184. package/dist/tsconfig.tsbuildinfo +1 -8442
  185. package/package.json +34 -10
  186. package/.eslintignore +0 -5
  187. package/CHANGELOG.md +0 -178
@@ -0,0 +1,140 @@
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
+ exports.runWrapERC7984Tests = runWrapERC7984Tests;
7
+ /**
8
+ * TransactionBuilder tests for WrapERC7984 transaction type.
9
+ *
10
+ * Verifies:
11
+ * - Building a WrapERC7984 tx from scratch (legacy and EIP-1559 fees)
12
+ * - Signing and serialization round-trip
13
+ * - classifyTransaction correctly identifies wrap(address,uint256)
14
+ * - Error cases for missing fields / invalid amount
15
+ */
16
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
17
+ const should_1 = __importDefault(require("should"));
18
+ const src_1 = require("../../../src");
19
+ const zamaUtils_1 = require("../../../src/lib/zamaUtils");
20
+ const utils_1 = require("../../../src/lib/utils");
21
+ const WRAPPER_ADDRESS = '0x2debbe0487ef921df4457f9e36ed05be2df1ac75'; // hteth:cusdt
22
+ const RECIPIENT = '0x1111111111111111111111111111111111111111';
23
+ const AMOUNT = '1000000';
24
+ const RATE = '1';
25
+ const TEST_PRV_KEY = 'FAC4D04AA0025ECF200D74BC9B5E4616E4B8338B69B61362AAAD49F76E68EF28';
26
+ function runWrapERC7984Tests(coinName, getBuilder) {
27
+ describe(`${coinName} transaction builder — WrapERC7984`, () => {
28
+ let txBuilder;
29
+ beforeEach(() => {
30
+ txBuilder = getBuilder(coinName);
31
+ txBuilder.fee({ fee: '1000000000', gasLimit: '200000' });
32
+ txBuilder.counter(1);
33
+ });
34
+ describe('classifyTransaction', () => {
35
+ it('should classify wrap(address,uint256) as WrapERC7984', () => {
36
+ const calldata = (0, zamaUtils_1.buildWrapCalldata)(RECIPIENT, AMOUNT, RATE);
37
+ should_1.default.equal((0, utils_1.classifyTransaction)(calldata), sdk_core_1.TransactionType.WrapERC7984);
38
+ });
39
+ it('should NOT classify approve as WrapERC7984', () => {
40
+ should_1.default.equal((0, utils_1.classifyTransaction)('0x095ea7b3' + '00'.repeat(64)), sdk_core_1.TransactionType.ContractCall);
41
+ });
42
+ });
43
+ describe('build from scratch', () => {
44
+ it('should build a WrapERC7984 transaction', async () => {
45
+ txBuilder.type(sdk_core_1.TransactionType.WrapERC7984);
46
+ txBuilder.contract(WRAPPER_ADDRESS);
47
+ txBuilder.wrapRecipient(RECIPIENT);
48
+ txBuilder.wrapAmount(AMOUNT);
49
+ txBuilder.wrapRate(RATE);
50
+ const tx = await txBuilder.build();
51
+ const json = tx.toJson();
52
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.WrapERC7984);
53
+ json.to.toLowerCase().should.equal(WRAPPER_ADDRESS.toLowerCase());
54
+ json.data.should.startWith(zamaUtils_1.wrapMethodId);
55
+ json.value.should.equal('0');
56
+ const decoded = (0, zamaUtils_1.decodeWrapCalldata)(json.data);
57
+ decoded.to.toLowerCase().should.equal(RECIPIENT.toLowerCase());
58
+ decoded.amount.should.equal(AMOUNT);
59
+ });
60
+ it('should build with EIP-1559 fee model', async () => {
61
+ const builder = getBuilder(coinName);
62
+ builder.fee({
63
+ fee: '30000000000',
64
+ eip1559: {
65
+ maxFeePerGas: '30000000000',
66
+ maxPriorityFeePerGas: '1000000000',
67
+ },
68
+ gasLimit: '200000',
69
+ });
70
+ builder.counter(1);
71
+ builder.type(sdk_core_1.TransactionType.WrapERC7984);
72
+ builder.contract(WRAPPER_ADDRESS);
73
+ builder.wrapRecipient(RECIPIENT);
74
+ builder.wrapAmount(AMOUNT);
75
+ builder.wrapRate(RATE);
76
+ const tx = await builder.build();
77
+ const json = tx.toJson();
78
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.WrapERC7984);
79
+ json._type.should.equal(src_1.ETHTransactionType.EIP1559);
80
+ json.data.should.startWith(zamaUtils_1.wrapMethodId);
81
+ });
82
+ });
83
+ describe('signing and round-trip', () => {
84
+ it('should produce a signed transaction with v, r, s and from fields', async () => {
85
+ txBuilder.type(sdk_core_1.TransactionType.WrapERC7984);
86
+ txBuilder.contract(WRAPPER_ADDRESS);
87
+ txBuilder.wrapRecipient(RECIPIENT);
88
+ txBuilder.wrapAmount(AMOUNT);
89
+ txBuilder.wrapRate(RATE);
90
+ txBuilder.sign({ key: TEST_PRV_KEY });
91
+ const tx = await txBuilder.build();
92
+ const json = tx.toJson();
93
+ should_1.default.exist(json.v);
94
+ should_1.default.exist(json.r);
95
+ should_1.default.exist(json.s);
96
+ should_1.default.exist(json.from);
97
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.WrapERC7984);
98
+ });
99
+ it('should serialize and deserialize to the same transaction', async () => {
100
+ txBuilder.type(sdk_core_1.TransactionType.WrapERC7984);
101
+ txBuilder.contract(WRAPPER_ADDRESS);
102
+ txBuilder.wrapRecipient(RECIPIENT);
103
+ txBuilder.wrapAmount(AMOUNT);
104
+ txBuilder.wrapRate(RATE);
105
+ const originalTx = await txBuilder.build();
106
+ const rawHex = originalTx.toBroadcastFormat();
107
+ const rebuiltBuilder = getBuilder(coinName);
108
+ rebuiltBuilder.from(rawHex);
109
+ const rebuiltTx = await rebuiltBuilder.build();
110
+ rebuiltTx.toBroadcastFormat().should.equal(rawHex);
111
+ should_1.default.equal(rebuiltTx.type, sdk_core_1.TransactionType.WrapERC7984);
112
+ });
113
+ });
114
+ describe('validation', () => {
115
+ it('should reject missing wrapRecipient', async () => {
116
+ txBuilder.type(sdk_core_1.TransactionType.WrapERC7984);
117
+ txBuilder.contract(WRAPPER_ADDRESS);
118
+ txBuilder.wrapAmount(AMOUNT);
119
+ txBuilder.wrapRate(RATE);
120
+ await txBuilder.build().should.be.rejectedWith(/missing wrapRecipient/);
121
+ });
122
+ it('should reject missing wrapAmount', async () => {
123
+ txBuilder.type(sdk_core_1.TransactionType.WrapERC7984);
124
+ txBuilder.contract(WRAPPER_ADDRESS);
125
+ txBuilder.wrapRecipient(RECIPIENT);
126
+ txBuilder.wrapRate(RATE);
127
+ await txBuilder.build().should.be.rejectedWith(/missing wrapAmount/);
128
+ });
129
+ it('should reject amount 0 via buildWrapCalldata', async () => {
130
+ txBuilder.type(sdk_core_1.TransactionType.WrapERC7984);
131
+ txBuilder.contract(WRAPPER_ADDRESS);
132
+ txBuilder.wrapRecipient(RECIPIENT);
133
+ txBuilder.wrapAmount('0');
134
+ txBuilder.wrapRate(RATE);
135
+ await txBuilder.build().should.be.rejectedWith(/amount must be > 0/);
136
+ });
137
+ });
138
+ });
139
+ }
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JhcEVSQzc5ODQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3dyYXBFUkM3OTg0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBcUJBLGtEQXFJQztBQTFKRDs7Ozs7Ozs7R0FRRztBQUNILG1EQUF1RDtBQUN2RCxvREFBNEI7QUFDNUIsc0NBQXNFO0FBQ3RFLDBEQUFpRztBQUNqRyxrREFBNkQ7QUFFN0QsTUFBTSxlQUFlLEdBQUcsNENBQTRDLENBQUMsQ0FBQyxjQUFjO0FBQ3BGLE1BQU0sU0FBUyxHQUFHLDRDQUE0QyxDQUFDO0FBQy9ELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQztBQUN6QixNQUFNLElBQUksR0FBRyxHQUFHLENBQUM7QUFDakIsTUFBTSxZQUFZLEdBQUcsa0VBQWtFLENBQUM7QUFFeEYsU0FBZ0IsbUJBQW1CLENBQUMsUUFBZ0IsRUFBRSxVQUFnRDtJQUNwRyxRQUFRLENBQUMsR0FBRyxRQUFRLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtRQUM3RCxJQUFJLFNBQTZCLENBQUM7UUFFbEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLFNBQVMsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDekQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7WUFDbkMsRUFBRSxDQUFDLHNEQUFzRCxFQUFFLEdBQUcsRUFBRTtnQkFDOUQsTUFBTSxRQUFRLEdBQUcsSUFBQSw2QkFBaUIsRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM1RCxnQkFBTSxD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U0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHJhbnNhY3Rpb25CdWlsZGVyIHRlc3RzIGZvciBXcmFwRVJDNzk4NCB0cmFuc2FjdGlvbiB0eXBlLlxuICpcbiAqIFZlcmlmaWVzOlxuICogICAtIEJ1aWxkaW5nIGEgV3JhcEVSQzc5ODQgdHggZnJvbSBzY3JhdGNoIChsZWdhY3kgYW5kIEVJUC0xNTU5IGZlZXMpXG4gKiAgIC0gU2lnbmluZyBhbmQgc2VyaWFsaXphdGlvbiByb3VuZC10cmlwXG4gKiAgIC0gY2xhc3NpZnlUcmFuc2FjdGlvbiBjb3JyZWN0bHkgaWRlbnRpZmllcyB3cmFwKGFkZHJlc3MsdWludDI1NilcbiAqICAgLSBFcnJvciBjYXNlcyBmb3IgbWlzc2luZyBmaWVsZHMgLyBpbnZhbGlkIGFtb3VudFxuICovXG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBFVEhUcmFuc2FjdGlvblR5cGUsIFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBidWlsZFdyYXBDYWxsZGF0YSwgZGVjb2RlV3JhcENhbGxkYXRhLCB3cmFwTWV0aG9kSWQgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3phbWFVdGlscyc7XG5pbXBvcnQgeyBjbGFzc2lmeVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi91dGlscyc7XG5cbmNvbnN0IFdSQVBQRVJfQUREUkVTUyA9ICcweDJkZWJiZTA0ODdlZjkyMWRmNDQ1N2Y5ZTM2ZWQwNWJlMmRmMWFjNzUnOyAvLyBodGV0aDpjdXNkdFxuY29uc3QgUkVDSVBJRU5UID0gJzB4MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSc7XG5jb25zdCBBTU9VTlQgPSAnMTAwMDAwMCc7XG5jb25zdCBSQVRFID0gJzEnO1xuY29uc3QgVEVTVF9QUlZfS0VZID0gJ0ZBQzREMDRBQTAwMjVFQ0YyMDBENzRCQzlCNUU0NjE2RTRCODMzOEI2OUI2MTM2MkFBQUQ0OUY3NkU2OEVGMjgnO1xuXG5leHBvcnQgZnVuY3Rpb24gcnVuV3JhcEVSQzc5ODRUZXN0cyhjb2luTmFtZTogc3RyaW5nLCBnZXRCdWlsZGVyOiAoY29pbjogc3RyaW5nKSA9PiBUcmFuc2FjdGlvbkJ1aWxkZXIpOiB2b2lkIHtcbiAgZGVzY3JpYmUoYCR7Y29pbk5hbWV9IHRyYW5zYWN0aW9uIGJ1aWxkZXIg4oCUIFdyYXBFUkM3OTg0YCwgKCkgPT4ge1xuICAgIGxldCB0eEJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlcjtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgdHhCdWlsZGVyID0gZ2V0QnVpbGRlcihjb2luTmFtZSk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHsgZmVlOiAnMTAwMDAwMDAwMCcsIGdhc0xpbWl0OiAnMjAwMDAwJyB9KTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKDEpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NsYXNzaWZ5VHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGNsYXNzaWZ5IHdyYXAoYWRkcmVzcyx1aW50MjU2KSBhcyBXcmFwRVJDNzk4NCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgY2FsbGRhdGEgPSBidWlsZFdyYXBDYWxsZGF0YShSRUNJUElFTlQsIEFNT1VOVCwgUkFURSk7XG4gICAgICAgIHNob3VsZC5lcXVhbChjbGFzc2lmeVRyYW5zYWN0aW9uKGNhbGxkYXRhKSwgVHJhbnNhY3Rpb25UeXBlLldyYXBFUkM3OTg0KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIE5PVCBjbGFzc2lmeSBhcHByb3ZlIGFzIFdyYXBFUkM3OTg0JywgKCkgPT4ge1xuICAgICAgICBzaG91bGQuZXF1YWwoY2xhc3NpZnlUcmFuc2FjdGlvbignMHgwOTVlYTdiMycgKyAnMDAnLnJlcGVhdCg2NCkpLCBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2J1aWxkIGZyb20gc2NyYXRjaCcsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSBXcmFwRVJDNzk4NCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldyYXBFUkM3OTg0KTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KFdSQVBQRVJfQUREUkVTUyk7XG4gICAgICAgIHR4QnVpbGRlci53cmFwUmVjaXBpZW50KFJFQ0lQSUVOVCk7XG4gICAgICAgIHR4QnVpbGRlci53cmFwQW1vdW50KEFNT1VOVCk7XG4gICAgICAgIHR4QnVpbGRlci53cmFwUmF0ZShSQVRFKTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5XcmFwRVJDNzk4NCk7XG4gICAgICAgIGpzb24udG8udG9Mb3dlckNhc2UoKS5zaG91bGQuZXF1YWwoV1JBUFBFUl9BRERSRVNTLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBqc29uLmRhdGEuc2hvdWxkLnN0YXJ0V2l0aCh3cmFwTWV0aG9kSWQpO1xuICAgICAgICBqc29uLnZhbHVlLnNob3VsZC5lcXVhbCgnMCcpO1xuXG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVXcmFwQ2FsbGRhdGEoanNvbi5kYXRhKTtcbiAgICAgICAgZGVjb2RlZC50by50b0xvd2VyQ2FzZSgpLnNob3VsZC5lcXVhbChSRUNJUElFTlQudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGRlY29kZWQuYW1vdW50LnNob3VsZC5lcXVhbChBTU9VTlQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgd2l0aCBFSVAtMTU1OSBmZWUgbW9kZWwnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBnZXRCdWlsZGVyKGNvaW5OYW1lKTtcbiAgICAgICAgYnVpbGRlci5mZWUoe1xuICAgICAgICAgIGZlZTogJzMwMDAwMDAwMDAwJyxcbiAgICAgICAgICBlaXAxNTU5OiB7XG4gICAgICAgICAgICBtYXhGZWVQZXJHYXM6ICczMDAwMDAwMDAwMCcsXG4gICAgICAgICAgICBtYXhQcmlvcml0eUZlZVBlckdhczogJzEwMDAwMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2FzTGltaXQ6ICcyMDAwMDAnLFxuICAgICAgICB9KTtcbiAgICAgICAgYnVpbGRlci5jb3VudGVyKDEpO1xuICAgICAgICBidWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldyYXBFUkM3OTg0KTtcbiAgICAgICAgYnVpbGRlci5jb250cmFjdChXUkFQUEVSX0FERFJFU1MpO1xuICAgICAgICBidWlsZGVyLndyYXBSZWNpcGllbnQoUkVDSVBJRU5UKTtcbiAgICAgICAgYnVpbGRlci53cmFwQW1vdW50KEFNT1VOVCk7XG4gICAgICAgIGJ1aWxkZXIud3JhcFJhdGUoUkFURSk7XG5cbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLldyYXBFUkM3OTg0KTtcbiAgICAgICAganNvbi5fdHlwZS5zaG91bGQuZXF1YWwoRVRIVHJhbnNhY3Rpb25UeXBlLkVJUDE1NTkpO1xuICAgICAgICBqc29uLmRhdGEuc2hvdWxkLnN0YXJ0V2l0aCh3cmFwTWV0aG9kSWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2lnbmluZyBhbmQgcm91bmQtdHJpcCcsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgcHJvZHVjZSBhIHNpZ25lZCB0cmFuc2FjdGlvbiB3aXRoIHYsIHIsIHMgYW5kIGZyb20gZmllbGRzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV3JhcEVSQzc5ODQpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoV1JBUFBFUl9BRERSRVNTKTtcbiAgICAgICAgdHhCdWlsZGVyLndyYXBSZWNpcGllbnQoUkVDSVBJRU5UKTtcbiAgICAgICAgdHhCdWlsZGVyLndyYXBBbW91bnQoQU1PVU5UKTtcbiAgICAgICAgdHhCdWlsZGVyLndyYXBSYXRlKFJBVEUpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogVEVTVF9QUlZfS0VZIH0pO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXhpc3QoanNvbi52KTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KGpzb24ucik7XG4gICAgICAgIHNob3VsZC5leGlzdChqc29uLnMpO1xuICAgICAgICBzaG91bGQuZXhpc3QoanNvbi5mcm9tKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5XcmFwRVJDNzk4NCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIHRvIHRoZSBzYW1lIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV3JhcEVSQzc5ODQpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoV1JBUFBFUl9BRERSRVNTKTtcbiAgICAgICAgdHhCdWlsZGVyLndyYXBSZWNpcGllbnQoUkVDSVBJRU5UKTtcbiAgICAgICAgdHhCdWlsZGVyLndyYXBBbW91bnQoQU1PVU5UKTtcbiAgICAgICAgdHhCdWlsZGVyLndyYXBSYXRlKFJBVEUpO1xuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgcmF3SGV4ID0gb3JpZ2luYWxUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIGNvbnN0IHJlYnVpbHRCdWlsZGVyID0gZ2V0QnVpbGRlcihjb2luTmFtZSk7XG4gICAgICAgIHJlYnVpbHRCdWlsZGVyLmZyb20ocmF3SGV4KTtcbiAgICAgICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgcmVidWlsdEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgICByZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3SGV4KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJlYnVpbHRUeC50eXBlLCBUcmFuc2FjdGlvblR5cGUuV3JhcEVSQzc5ODQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgndmFsaWRhdGlvbicsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgcmVqZWN0IG1pc3Npbmcgd3JhcFJlY2lwaWVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLldyYXBFUkM3OTg0KTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KFdSQVBQRVJfQUREUkVTUyk7XG4gICAgICAgIHR4QnVpbGRlci53cmFwQW1vdW50KEFNT1VOVCk7XG4gICAgICAgIHR4QnVpbGRlci53cmFwUmF0ZShSQVRFKTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbWlzc2luZyB3cmFwUmVjaXBpZW50Lyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZWplY3QgbWlzc2luZyB3cmFwQW1vdW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV3JhcEVSQzc5ODQpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoV1JBUFBFUl9BRERSRVNTKTtcbiAgICAgICAgdHhCdWlsZGVyLndyYXBSZWNpcGllbnQoUkVDSVBJRU5UKTtcbiAgICAgICAgdHhCdWlsZGVyLndyYXBSYXRlKFJBVEUpO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9taXNzaW5nIHdyYXBBbW91bnQvKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJlamVjdCBhbW91bnQgMCB2aWEgYnVpbGRXcmFwQ2FsbGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5XcmFwRVJDNzk4NCk7XG4gICAgICAgIHR4QnVpbGRlci5jb250cmFjdChXUkFQUEVSX0FERFJFU1MpO1xuICAgICAgICB0eEJ1aWxkZXIud3JhcFJlY2lwaWVudChSRUNJUElFTlQpO1xuICAgICAgICB0eEJ1aWxkZXIud3JhcEFtb3VudCgnMCcpO1xuICAgICAgICB0eEJ1aWxkZXIud3JhcFJhdGUoUkFURSk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2Ftb3VudCBtdXN0IGJlID4gMC8pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transferBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transferBuilder.d.ts","sourceRoot":"","sources":["../../../test/unit/transferBuilder.ts"],"names":[],"mappings":""}
@@ -0,0 +1,76 @@
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 should_1 = __importDefault(require("should"));
8
+ const statics_1 = require("@bitgo-beta/statics");
9
+ const src_1 = require("../../src");
10
+ describe('Eth send multi sig builder', function () {
11
+ const toAddress = '0x7325A3F7d4f9E86AE62Cf742426078C3755730d5';
12
+ const xprv = 'xprv9s21ZrQH143K3D8TXfvAJgHVfTEeQNW5Ys9wZtnUZkqPzFzSjbEJrWC1vZ4GnXCvR7rQL2UFX3RSuYeU9MrERm1XBvACow7c36vnz5iYyj2';
13
+ const key = new src_1.KeyPair({ prv: xprv }).getKeys().prv;
14
+ const amount = '100000000000000000'; // equivalent to 0.1 ether
15
+ const ethLikeCoins = ['hteth', 'tarbeth', 'topeth', 'zketh'];
16
+ describe('should fail', () => {
17
+ it('should fail if a coin does not exists in @bitgo-beta/statics', () => {
18
+ (0, should_1.default)(() => {
19
+ new src_1.TransferBuilder().coin('inexistentcoin');
20
+ }).throw();
21
+ });
22
+ ethLikeCoins.forEach((coin) => {
23
+ it('should fail with an invalid key', () => {
24
+ const staticsCoin = statics_1.coins.get(coin);
25
+ const builder = new src_1.TransferBuilder()
26
+ .coin(coin)
27
+ .expirationTime(1590078260)
28
+ .amount(amount)
29
+ .to(toAddress)
30
+ .contractSequenceId(2)
31
+ .key('invalidkey');
32
+ (0, should_1.default)(() => {
33
+ builder.signAndBuild(`${staticsCoin.chainId}`);
34
+ }).throw('private key length is invalid');
35
+ });
36
+ });
37
+ it('should fail with an invalid sequence id', () => {
38
+ (0, should_1.default)(() => {
39
+ new src_1.TransferBuilder().contractSequenceId(-1);
40
+ }).throw('Invalid contract sequence id');
41
+ });
42
+ it('should fail with an invalid destination address', () => {
43
+ (0, should_1.default)(() => {
44
+ new src_1.TransferBuilder().to('invalidaddress');
45
+ }).throw('Invalid address');
46
+ });
47
+ it('should fail with an invalid amount: text value', () => {
48
+ (0, should_1.default)(() => {
49
+ new src_1.TransferBuilder().amount('invalidamount');
50
+ }).throw('Invalid amount');
51
+ });
52
+ it('should fail with an invalid amount: negative value', () => {
53
+ (0, should_1.default)(() => {
54
+ new src_1.TransferBuilder().amount('-10');
55
+ }).throw('Invalid amount');
56
+ });
57
+ it('should fail with an invalid expiration time', () => {
58
+ (0, should_1.default)(() => {
59
+ new src_1.TransferBuilder().expirationTime(-1);
60
+ }).throw('Invalid expiration time');
61
+ });
62
+ it('should fail if a sequenceId param is missing', () => {
63
+ const builder = new src_1.TransferBuilder().amount(amount).to(toAddress).key(key);
64
+ assert_1.default.throws(() => builder.signAndBuild(''));
65
+ });
66
+ it('should fail if a destination param is missing', () => {
67
+ const builder = new src_1.TransferBuilder().amount(amount).contractSequenceId(2).key(key);
68
+ assert_1.default.throws(() => builder.signAndBuild(''));
69
+ });
70
+ it('should fail if a amount param is missing', () => {
71
+ const builder = new src_1.TransferBuilder().to(toAddress).contractSequenceId(2).key(key);
72
+ assert_1.default.throws(() => builder.signAndBuild(''));
73
+ });
74
+ });
75
+ });
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zZmVyQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixvREFBNEI7QUFDNUIsaURBQStFO0FBQy9FLG1DQUFxRDtBQUVyRCxRQUFRLENBQUMsNEJBQTRCLEVBQUU7SUFDckMsTUFBTSxTQUFTLEdBQUcsNENBQTRDLENBQUM7SUFDL0QsTUFBTSxJQUFJLEdBQ1IsaUhBQWlILENBQUM7SUFDcEgsTUFBTSxHQUFHLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFhLENBQUM7SUFDL0QsTUFBTSxNQUFNLEdBQUcsb0JBQW9CLENBQUMsQ0FBQywwQkFBMEI7SUFDL0QsTUFBTSxZQUFZLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU3RCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtRQUMzQixFQUFFLENBQUMsOERBQThELEVBQUUsR0FBRyxFQUFFO1lBQ3RFLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxxQkFBZSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDL0MsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixDQUFDLENBQUMsQ0FBQztRQUVILFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM1QixFQUFFLENBQUMsaUNBQWlDLEVBQUUsR0FBRyxFQUFFO2dCQUN6QyxNQUFNLFdBQVcsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBOEIsQ0FBQztnQkFDakUsTUFBTSxPQUFPLEdBQUcsSUFBSSxxQkFBZSxFQUFFO3FCQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDO3FCQUNWLGNBQWMsQ0FBQyxVQUFVLENBQUM7cUJBQzFCLE1BQU0sQ0FBQyxNQUFNLENBQUM7cUJBQ2QsRUFBRSxDQUFDLFNBQVMsQ0FBQztxQkFDYixrQkFBa0IsQ0FBQyxDQUFDLENBQUM7cUJBQ3JCLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDckIsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRTtvQkFDVixPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ2pELENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBQzVDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseUNBQXlDLEVBQUUsR0FBRyxFQUFFO1lBQ2pELElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxxQkFBZSxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxHQUFHLEVBQUU7WUFDekQsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRTtnQkFDVixJQUFJLHFCQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM3QyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnREFBZ0QsRUFBRSxHQUFHLEVBQUU7WUFDeEQsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRTtnQkFDVixJQUFJLHFCQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0RBQW9ELEVBQUUsR0FBRyxFQUFFO1lBQzVELElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxxQkFBZSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLEdBQUcsRUFBRTtZQUNyRCxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFO2dCQUNWLElBQUkscUJBQWUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtZQUN0RCxNQUFNLE9BQU8sR0FBRyxJQUFJLHFCQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1RSxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0NBQStDLEVBQUUsR0FBRyxFQUFFO1lBQ3ZELE1BQU0sT0FBTyxHQUFHLElBQUkscUJBQWUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEYsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLEdBQUcsRUFBRTtZQUNsRCxNQUFNLE9BQU8sR0FBRyxJQUFJLHFCQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25GLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBjb2lucywgRXRoZXJldW1OZXR3b3JrIGFzIEV0aExpa2VOZXR3b3JrIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBLZXlQYWlyLCBUcmFuc2ZlckJ1aWxkZXIgfSBmcm9tICcuLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnRXRoIHNlbmQgbXVsdGkgc2lnIGJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHRvQWRkcmVzcyA9ICcweDczMjVBM0Y3ZDRmOUU4NkFFNjJDZjc0MjQyNjA3OEMzNzU1NzMwZDUnO1xuICBjb25zdCB4cHJ2ID1cbiAgICAneHBydjlzMjFaclFIMTQzSzNEOFRYZnZBSmdIVmZURWVRTlc1WXM5d1p0blVaa3FQekZ6U2piRUpyV0Mxdlo0R25YQ3ZSN3JRTDJVRlgzUlN1WWVVOU1yRVJtMVhCdkFDb3c3YzM2dm56NWlZeWoyJztcbiAgY29uc3Qga2V5ID0gbmV3IEtleVBhaXIoeyBwcnY6IHhwcnYgfSkuZ2V0S2V5cygpLnBydiBhcyBzdHJpbmc7XG4gIGNvbnN0IGFtb3VudCA9ICcxMDAwMDAwMDAwMDAwMDAwMDAnOyAvLyBlcXVpdmFsZW50IHRvIDAuMSBldGhlclxuICBjb25zdCBldGhMaWtlQ29pbnMgPSBbJ2h0ZXRoJywgJ3RhcmJldGgnLCAndG9wZXRoJywgJ3prZXRoJ107XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmFpbCBpZiBhIGNvaW4gZG9lcyBub3QgZXhpc3RzIGluIEBiaXRnby1iZXRhL3N0YXRpY3MnLCAoKSA9PiB7XG4gICAgICBzaG91bGQoKCkgPT4ge1xuICAgICAgICBuZXcgVHJhbnNmZXJCdWlsZGVyKCkuY29pbignaW5leGlzdGVudGNvaW4nKTtcbiAgICAgIH0pLnRocm93KCk7XG4gICAgfSk7XG5cbiAgICBldGhMaWtlQ29pbnMuZm9yRWFjaCgoY29pbikgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHdpdGggYW4gaW52YWxpZCBrZXknLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXRpY3NDb2luID0gY29pbnMuZ2V0KGNvaW4pIGFzIHVua25vd24gYXMgRXRoTGlrZU5ldHdvcms7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgICAuY29pbihjb2luKVxuICAgICAgICAgIC5leHBpcmF0aW9uVGltZSgxNTkwMDc4MjYwKVxuICAgICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAgIC50byh0b0FkZHJlc3MpXG4gICAgICAgICAgLmNvbnRyYWN0U2VxdWVuY2VJZCgyKVxuICAgICAgICAgIC5rZXkoJ2ludmFsaWRrZXknKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLnNpZ25BbmRCdWlsZChgJHtzdGF0aWNzQ29pbi5jaGFpbklkfWApO1xuICAgICAgICB9KS50aHJvdygncHJpdmF0ZSBrZXkgbGVuZ3RoIGlzIGludmFsaWQnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdpdGggYW4gaW52YWxpZCBzZXF1ZW5jZSBpZCcsICgpID0+IHtcbiAgICAgIHNob3VsZCgoKSA9PiB7XG4gICAgICAgIG5ldyBUcmFuc2ZlckJ1aWxkZXIoKS5jb250cmFjdFNlcXVlbmNlSWQoLTEpO1xuICAgICAgfSkudGhyb3coJ0ludmFsaWQgY29udHJhY3Qgc2VxdWVuY2UgaWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIGFuIGludmFsaWQgZGVzdGluYXRpb24gYWRkcmVzcycsICgpID0+IHtcbiAgICAgIHNob3VsZCgoKSA9PiB7XG4gICAgICAgIG5ldyBUcmFuc2ZlckJ1aWxkZXIoKS50bygnaW52YWxpZGFkZHJlc3MnKTtcbiAgICAgIH0pLnRocm93KCdJbnZhbGlkIGFkZHJlc3MnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIGFuIGludmFsaWQgYW1vdW50OiB0ZXh0IHZhbHVlJywgKCkgPT4ge1xuICAgICAgc2hvdWxkKCgpID0+IHtcbiAgICAgICAgbmV3IFRyYW5zZmVyQnVpbGRlcigpLmFtb3VudCgnaW52YWxpZGFtb3VudCcpO1xuICAgICAgfSkudGhyb3coJ0ludmFsaWQgYW1vdW50Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBhbiBpbnZhbGlkIGFtb3VudDogbmVnYXRpdmUgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBzaG91bGQoKCkgPT4ge1xuICAgICAgICBuZXcgVHJhbnNmZXJCdWlsZGVyKCkuYW1vdW50KCctMTAnKTtcbiAgICAgIH0pLnRocm93KCdJbnZhbGlkIGFtb3VudCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdpdGggYW4gaW52YWxpZCBleHBpcmF0aW9uIHRpbWUnLCAoKSA9PiB7XG4gICAgICBzaG91bGQoKCkgPT4ge1xuICAgICAgICBuZXcgVHJhbnNmZXJCdWlsZGVyKCkuZXhwaXJhdGlvblRpbWUoLTEpO1xuICAgICAgfSkudGhyb3coJ0ludmFsaWQgZXhwaXJhdGlvbiB0aW1lJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgYSBzZXF1ZW5jZUlkIHBhcmFtIGlzIG1pc3NpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlcigpLmFtb3VudChhbW91bnQpLnRvKHRvQWRkcmVzcykua2V5KGtleSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuc2lnbkFuZEJ1aWxkKCcnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgYSBkZXN0aW5hdGlvbiBwYXJhbSBpcyBtaXNzaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2ZlckJ1aWxkZXIoKS5hbW91bnQoYW1vdW50KS5jb250cmFjdFNlcXVlbmNlSWQoMikua2V5KGtleSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuc2lnbkFuZEJ1aWxkKCcnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgYSBhbW91bnQgcGFyYW0gaXMgbWlzc2luZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKCkudG8odG9BZGRyZXNzKS5jb250cmFjdFNlcXVlbmNlSWQoMikua2V5KGtleSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuc2lnbkFuZEJ1aWxkKCcnKSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../test/unit/utils.ts"],"names":[],"mappings":""}
@@ -0,0 +1,214 @@
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 should_1 = __importDefault(require("should"));
7
+ const utils_1 = require("../../src/lib/utils");
8
+ const transferBuilderERC721_1 = require("../../src/lib/transferBuilders/transferBuilderERC721");
9
+ const walletUtil_1 = require("../../src/lib/walletUtil");
10
+ describe('Abstract ETH Utils', () => {
11
+ describe('ERC721 Flush Functions', () => {
12
+ it('should encode flush ERC721 data correctly for v0-v3', () => {
13
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
14
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
15
+ const tokenId = '12345';
16
+ const forwarderVersion = 0;
17
+ const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
18
+ should_1.default.exist(encoded);
19
+ encoded.should.startWith('0x5a953d0a'); // flushERC721ForwarderTokens method ID
20
+ encoded.should.be.a.String();
21
+ encoded.length.should.be.greaterThan(10); // method ID + parameters
22
+ });
23
+ it('should encode flush ERC721 data correctly for v4+', () => {
24
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
25
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
26
+ const tokenId = '12345';
27
+ const forwarderVersion = 4;
28
+ const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
29
+ should_1.default.exist(encoded);
30
+ encoded.should.startWith('0x159e44d7'); // flushERC721Token method ID (v5)
31
+ encoded.should.be.a.String();
32
+ });
33
+ it('should decode flush ERC721 data correctly for v0-v3', () => {
34
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
35
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
36
+ const tokenId = '12345';
37
+ const forwarderVersion = 2;
38
+ const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
39
+ const decoded = (0, utils_1.decodeFlushERC721TokensData)(encoded);
40
+ should_1.default.exist(decoded);
41
+ decoded.forwarderAddress.toLowerCase().should.equal(forwarderAddress.toLowerCase());
42
+ decoded.tokenAddress.toLowerCase().should.equal(tokenAddress.toLowerCase());
43
+ decoded.tokenId.should.equal(tokenId);
44
+ should_1.default.not.exist(decoded.forwarderVersion);
45
+ });
46
+ it('should decode flush ERC721 data correctly for v4+', () => {
47
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
48
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
49
+ const tokenId = '12345';
50
+ const forwarderVersion = 4;
51
+ const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
52
+ const decoded = (0, utils_1.decodeFlushERC721TokensData)(encoded, forwarderAddress);
53
+ should_1.default.exist(decoded);
54
+ decoded.forwarderAddress.toLowerCase().should.equal(forwarderAddress.toLowerCase());
55
+ decoded.tokenAddress.toLowerCase().should.equal(tokenAddress.toLowerCase());
56
+ decoded.tokenId.should.equal(tokenId);
57
+ should_1.default.exist(decoded.forwarderVersion);
58
+ should_1.default.equal(decoded.forwarderVersion, 4);
59
+ });
60
+ it('should handle large token IDs for ERC721', () => {
61
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
62
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
63
+ const tokenId = '115792089237316195423570985008687907853269984665640564039457584007913129639935'; // max uint256
64
+ const forwarderVersion = 0;
65
+ const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
66
+ const decoded = (0, utils_1.decodeFlushERC721TokensData)(encoded);
67
+ decoded.tokenId.should.equal(tokenId);
68
+ });
69
+ it('should throw error for invalid flush ERC721 data', () => {
70
+ const invalidData = '0x12345678'; // Wrong method ID
71
+ should_1.default.throws(() => {
72
+ (0, utils_1.decodeFlushERC721TokensData)(invalidData);
73
+ }, /Invalid flush ERC721 bytecode/);
74
+ });
75
+ it('should throw error for missing to address in v4+ decode', () => {
76
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
77
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
78
+ const tokenId = '12345';
79
+ const forwarderVersion = 4;
80
+ const encoded = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
81
+ should_1.default.throws(() => {
82
+ (0, utils_1.decodeFlushERC721TokensData)(encoded); // Missing 'to' parameter
83
+ }, /Missing to address/);
84
+ });
85
+ });
86
+ describe('ERC1155 Flush Functions', () => {
87
+ it('should encode flush ERC1155 data correctly for v0-v3', () => {
88
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
89
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
90
+ const tokenId = '99999';
91
+ const forwarderVersion = 0;
92
+ const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
93
+ should_1.default.exist(encoded);
94
+ encoded.should.startWith('0xe6bd0aa4'); // flushERC1155ForwarderTokens method ID
95
+ encoded.should.be.a.String();
96
+ encoded.length.should.be.greaterThan(10); // method ID + parameters
97
+ });
98
+ it('should encode flush ERC1155 data correctly for v4+', () => {
99
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
100
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
101
+ const tokenId = '99999';
102
+ const forwarderVersion = 4;
103
+ const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
104
+ should_1.default.exist(encoded);
105
+ encoded.should.startWith('0x8972c17c'); // flushERC1155Tokens method ID (v5)
106
+ encoded.should.be.a.String();
107
+ });
108
+ it('should decode flush ERC1155 data correctly for v0-v3', () => {
109
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
110
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
111
+ const tokenId = '99999';
112
+ const forwarderVersion = 2;
113
+ const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
114
+ const decoded = (0, utils_1.decodeFlushERC1155TokensData)(encoded);
115
+ should_1.default.exist(decoded);
116
+ decoded.forwarderAddress.toLowerCase().should.equal(forwarderAddress.toLowerCase());
117
+ decoded.tokenAddress.toLowerCase().should.equal(tokenAddress.toLowerCase());
118
+ decoded.tokenId.should.equal(tokenId);
119
+ should_1.default.not.exist(decoded.forwarderVersion);
120
+ });
121
+ it('should decode flush ERC1155 data correctly for v4+', () => {
122
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
123
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
124
+ const tokenId = '99999';
125
+ const forwarderVersion = 4;
126
+ const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
127
+ const decoded = (0, utils_1.decodeFlushERC1155TokensData)(encoded, forwarderAddress);
128
+ should_1.default.exist(decoded);
129
+ decoded.forwarderAddress.toLowerCase().should.equal(forwarderAddress.toLowerCase());
130
+ decoded.tokenAddress.toLowerCase().should.equal(tokenAddress.toLowerCase());
131
+ decoded.tokenId.should.equal(tokenId);
132
+ should_1.default.exist(decoded.forwarderVersion);
133
+ should_1.default.equal(decoded.forwarderVersion, 4);
134
+ });
135
+ it('should handle token ID 0 for ERC1155', () => {
136
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
137
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
138
+ const tokenId = '0';
139
+ const forwarderVersion = 0;
140
+ const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
141
+ const decoded = (0, utils_1.decodeFlushERC1155TokensData)(encoded);
142
+ decoded.tokenId.should.equal(tokenId);
143
+ });
144
+ it('should handle large token IDs for ERC1155', () => {
145
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
146
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
147
+ const tokenId = '115792089237316195423570985008687907853269984665640564039457584007913129639935'; // max uint256
148
+ const forwarderVersion = 0;
149
+ const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
150
+ const decoded = (0, utils_1.decodeFlushERC1155TokensData)(encoded);
151
+ decoded.tokenId.should.equal(tokenId);
152
+ });
153
+ it('should throw error for invalid flush ERC1155 data', () => {
154
+ const invalidData = '0x87654321'; // Wrong method ID
155
+ should_1.default.throws(() => {
156
+ (0, utils_1.decodeFlushERC1155TokensData)(invalidData);
157
+ }, /Invalid flush ERC1155 bytecode/);
158
+ });
159
+ it('should throw error for missing to address in v4+ decode', () => {
160
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
161
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
162
+ const tokenId = '99999';
163
+ const forwarderVersion = 4;
164
+ const encoded = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddress, tokenId, forwarderVersion);
165
+ should_1.default.throws(() => {
166
+ (0, utils_1.decodeFlushERC1155TokensData)(encoded); // Missing 'to' parameter
167
+ }, /Missing to address/);
168
+ });
169
+ });
170
+ describe('ERC721TransferBuilder.buildTransferFrom', () => {
171
+ const owner = '0x19645032c7f1533395d44a629462e751084d3e4d';
172
+ const recipient = '0x19645032c7f1533395d44a629462e751084d3e4c';
173
+ const htsNftAddress = '0x00000000000000000000000000000000007ac203';
174
+ it('should encode transferFrom with selector 0x23b872dd', () => {
175
+ const builder = new transferBuilderERC721_1.ERC721TransferBuilder();
176
+ builder.tokenContractAddress(htsNftAddress).to(recipient).from(owner).tokenId('12');
177
+ const data = builder.buildTransferFrom();
178
+ should_1.default.exist(data);
179
+ data.should.startWith(walletUtil_1.ERC721TransferFromMethodId); // 0x23b872dd
180
+ });
181
+ it('should encode safeTransferFrom with selector 0xb88d4fde via build()', () => {
182
+ const builder = new transferBuilderERC721_1.ERC721TransferBuilder();
183
+ builder.tokenContractAddress(htsNftAddress).to(recipient).from(owner).tokenId('12');
184
+ const data = builder.build();
185
+ should_1.default.exist(data);
186
+ data.should.startWith(walletUtil_1.ERC721SafeTransferTypeMethodId); // 0xb88d4fde
187
+ });
188
+ it('should produce different encodings for build() vs buildTransferFrom()', () => {
189
+ const builder = new transferBuilderERC721_1.ERC721TransferBuilder();
190
+ builder.tokenContractAddress(htsNftAddress).to(recipient).from(owner).tokenId('12');
191
+ const safeTransferData = builder.build();
192
+ const transferFromData = builder.buildTransferFrom();
193
+ safeTransferData.should.not.equal(transferFromData);
194
+ // transferFrom encoding should be shorter (no bytes param)
195
+ transferFromData.length.should.be.lessThan(safeTransferData.length);
196
+ });
197
+ });
198
+ describe('Token Address Validation', () => {
199
+ it('should preserve address format in encoding/decoding', () => {
200
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
201
+ const tokenAddressChecksum = '0xDf7DECb1bAa8F529F0C8982cBB4Be50357195299'; // With checksum
202
+ const tokenId = '12345';
203
+ const forwarderVersion = 0;
204
+ const encoded721 = (0, utils_1.flushERC721TokensData)(forwarderAddress, tokenAddressChecksum, tokenId, forwarderVersion);
205
+ const decoded721 = (0, utils_1.decodeFlushERC721TokensData)(encoded721);
206
+ // Should preserve the address (though may lowercase it)
207
+ decoded721.tokenAddress.toLowerCase().should.equal(tokenAddressChecksum.toLowerCase());
208
+ const encoded1155 = (0, utils_1.flushERC1155TokensData)(forwarderAddress, tokenAddressChecksum, tokenId, forwarderVersion);
209
+ const decoded1155 = (0, utils_1.decodeFlushERC1155TokensData)(encoded1155);
210
+ decoded1155.tokenAddress.toLowerCase().should.equal(tokenAddressChecksum.toLowerCase());
211
+ });
212
+ });
213
+ });
214
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsK0NBSzZCO0FBQzdCLGdHQUE2RjtBQUM3Rix5REFBc0c7QUFFdEcsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtJQUNsQyxRQUFRLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFO1FBQ3RDLEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxHQUFHLEVBQUU7WUFDN0QsTUFBTSxnQkFBZ0IsR0FBRyw0Q0FBNEMsQ0FBQztZQUN0RSxNQUFNLFlBQVksR0FBRyw0Q0FBNEMsQ0FBQztZQUNsRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDeEIsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFFM0IsTUFBTSxPQUFPLEdBQUcsSUFBQSw2QkFBcUIsRUFBQyxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFFakcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyx1Q0FBdUM7WUFDL0UsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyx5QkFBeUI7UUFDckUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbURBQW1ELEVBQUUsR0FBRyxFQUFFO1lBQzNELE1BQU0sZ0JBQWdCLEdBQUcsNENBQTRDLENBQUM7WUFDdEUsTUFBTSxZQUFZLEdBQUcsNENBQTRDLENBQUM7WUFDbEUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3hCLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1lBRTNCLE1BQU0sT0FBTyxHQUFHLElBQUEsNkJBQXFCLEVBQUMsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBRWpHLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsa0NBQWtDO1lBQzFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxHQUFHLEVBQUU7WUFDN0QsTUFBTSxnQkFBZ0IsR0FBRyw0Q0FBNEMsQ0FBQztZQUN0RSxNQUFNLFlBQVksR0FBRyw0Q0FBNEMsQ0FBQztZQUNsRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDeEIsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFFM0IsTUFBTSxPQUFPLEdBQUcsSUFBQSw2QkFBcUIsRUFBQyxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDakcsTUFBTSxPQUFPLEdBQUcsSUFBQSxtQ0FBMkIsRUFBQyxPQUFPLENBQUMsQ0FBQztZQUVyRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QixPQUFPLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ3BGLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUM1RSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEMsZ0JBQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEdBQUcsRUFBRTtZQUMzRCxNQUFNLGdCQUFnQixHQUFHLDRDQUE0QyxDQUFDO1lBQ3RFLE1BQU0sWUFBWSxHQUFHLDRDQUE0QyxDQUFDO1lBQ2xFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUN4QixNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztZQUUzQixNQUFNLE9BQU8sR0FBRyxJQUFBLDZCQUFxQixFQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUNqRyxNQUFNLE9BQU8sR0FBRyxJQUFBLG1DQUEyQixFQUFDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBRXZFLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDcEYsT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQzVFLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN2QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUUsR0FBRyxFQUFFO1lBQ2xELE1BQU0sZ0JBQWdCLEdBQUcsNENBQTRDLENBQUM7WUFDdEUsTUFBTSxZQUFZLEdBQUcsNENBQTRDLENBQUM7WUFDbEUsTUFBTSxPQUFPLEdBQUcsZ0ZBQWdGLENBQUMsQ0FBQyxjQUFjO1lBQ2hILE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1lBRTNCLE1BQU0sT0FBTyxHQUFHLElBQUEsNkJBQXFCLEVBQUMsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2pHLE1BQU0sT0FBTyxHQUFHLElBQUEsbUNBQTJCLEVBQUMsT0FBTyxDQUFDLENBQUM7WUFFckQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEdBQUcsRUFBRTtZQUMxRCxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsQ0FBQyxrQkFBa0I7WUFFcEQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNqQixJQUFBLG1DQUEyQixFQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzNDLENBQUMsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHlEQUF5RCxFQUFFLEdBQUcsRUFBRTtZQUNqRSxNQUFNLGdCQUFnQixHQUFHLDRDQUE0QyxDQUFDO1lBQ3RFLE1BQU0sWUFBWSxHQUFHLDRDQUE0QyxDQUFDO1lBQ2xFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUN4QixNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztZQUUzQixNQUFNLE9BQU8sR0FBRyxJQUFBLDZCQUFxQixFQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUVqRyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLElBQUEsbUNBQTJCLEVBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyx5QkFBeUI7WUFDakUsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7UUFDdkMsRUFBRSxDQUFDLHNEQUFzRCxFQUFFLEdBQUcsRUFBRTtZQUM5RCxNQUFNLGdCQUFnQixHQUFHLDRDQUE0QyxDQUFDO1lBQ3RFLE1BQU0sWUFBWSxHQUFHLDRDQUE0QyxDQUFDO1lBQ2xFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUN4QixNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztZQUUzQixNQUFNLE9BQU8sR0FBRyxJQUFBLDhCQUFzQixFQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUVsRyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QixPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLHdDQUF3QztZQUNoRixPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLHlCQUF5QjtRQUNyRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxHQUFHLEVBQUU7WUFDNUQsTUFBTSxnQkFBZ0IsR0FBRyw0Q0FBNEMsQ0FBQztZQUN0RSxNQUFNLFlBQVksR0FBRyw0Q0FBNEMsQ0FBQztZQUNsRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDeEIsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFFM0IsTUFBTSxPQUFPLEdBQUcsSUFBQSw4QkFBc0IsRUFBQyxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFFbEcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxvQ0FBb0M7WUFDNUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHNEQUFzRCxFQUFFLEdBQUcsRUFBRTtZQUM5RCxNQUFNLGdCQUFnQixHQUFHLDRDQUE0QyxDQUFDO1lBQ3RFLE1BQU0sWUFBWSxHQUFHLDRDQUE0QyxDQUFDO1lBQ2xFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUN4QixNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztZQUUzQixNQUFNLE9BQU8sR0FBRyxJQUFBLDhCQUFzQixFQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUNsRyxNQUFNLE9BQU8sR0FBRyxJQUFBLG9DQUE0QixFQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXRELGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDcEYsT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQzVFLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QyxnQkFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0RBQW9ELEVBQUUsR0FBRyxFQUFFO1lBQzVELE1BQU0sZ0JBQWdCLEdBQUcsNENBQTRDLENBQUM7WUFDdEUsTUFBTSxZQUFZLEdBQUcsNENBQTRDLENBQUM7WUFDbEUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3hCLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1lBRTNCLE1BQU0sT0FBTyxHQUFHLElBQUEsOEJBQXNCLEVBQUMsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2xHLE1BQU0sT0FBTyxHQUFHLElBQUEsb0NBQTRCLEVBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFFeEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEIsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNwRixPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDNUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3ZDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLEVBQUU7WUFDOUMsTUFBTSxnQkFBZ0IsR0FBRyw0Q0FBNEMsQ0FBQztZQUN0RSxNQUFNLFlBQVksR0FBRyw0Q0FBNEMsQ0FBQztZQUNsRSxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUM7WUFDcEIsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFFM0IsTUFBTSxPQUFPLEdBQUcsSUFBQSw4QkFBc0IsRUFBQyxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDbEcsTUFBTSxPQUFPLEdBQUcsSUFBQSxvQ0FBNEIsRUFBQyxPQUFPLENBQUMsQ0FBQztZQUV0RCxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUUsR0FBRyxFQUFFO1lBQ25ELE1BQU0sZ0JBQWdCLEdBQUcsNENBQTRDLENBQUM7WUFDdEUsTUFBTSxZQUFZLEdBQUcsNENBQTRDLENBQUM7WUFDbEUsTUFBTSxPQUFPLEdBQUcsZ0ZBQWdGLENBQUMsQ0FBQyxjQUFjO1lBQ2hILE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1lBRTNCLE1BQU0sT0FBTyxHQUFHLElBQUEsOEJBQXNCLEVBQUMsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2xHLE1BQU0sT0FBTyxHQUFHLElBQUEsb0NBQTRCLEVBQUMsT0FBTyxDQUFDLENBQUM7WUFFdEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEdBQUcsRUFBRTtZQUMzRCxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsQ0FBQyxrQkFBa0I7WUFFcEQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNqQixJQUFBLG9DQUE0QixFQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVDLENBQUMsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHlEQUF5RCxFQUFFLEdBQUcsRUFBRTtZQUNqRSxNQUFNLGdCQUFnQixHQUFHLDRDQUE0QyxDQUFDO1lBQ3RFLE1BQU0sWUFBWSxHQUFHLDRDQUE0QyxDQUFDO1lBQ2xFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUN4QixNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztZQUUzQixNQUFNLE9BQU8sR0FBRyxJQUFBLDhCQUFzQixFQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUVsRyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLElBQUEsb0NBQTRCLEVBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyx5QkFBeUI7WUFDbEUsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyx5Q0FBeUMsRUFBRSxHQUFHLEVBQUU7UUFDdkQsTUFBTSxLQUFLLEdBQUcsNENBQTRDLENBQUM7UUFDM0QsTUFBTSxTQUFTLEdBQUcsNENBQTRDLENBQUM7UUFDL0QsTUFBTSxhQUFhLEdBQUcsNENBQTRDLENBQUM7UUFFbkUsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLEdBQUcsRUFBRTtZQUM3RCxNQUFNLE9BQU8sR0FBRyxJQUFJLDZDQUFxQixFQUFFLENBQUM7WUFDNUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXBGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRXpDLGdCQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLHVDQUEwQixDQUFDLENBQUMsQ0FBQyxhQUFhO1FBQ2xFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHFFQUFxRSxFQUFFLEdBQUcsRUFBRTtZQUM3RSxNQUFNLE9BQU8sR0FBRyxJQUFJLDZDQUFxQixFQUFFLENBQUM7WUFDNUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXBGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUU3QixnQkFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQywyQ0FBOEIsQ0FBQyxDQUFDLENBQUMsYUFBYTtRQUN0RSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1RUFBdUUsRUFBRSxHQUFHLEVBQUU7WUFDL0UsTUFBTSxPQUFPLEdBQUcsSUFBSSw2Q0FBcUIsRUFBRSxDQUFDO1lBQzVDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVwRixNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRXJELGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDcEQsMkRBQTJEO1lBQzNELGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtRQUN4QyxFQUFFLENBQUMscURBQXFELEVBQUUsR0FBRyxFQUFFO1lBQzdELE1BQU0sZ0JBQWdCLEdBQUcsNENBQTRDLENBQUM7WUFDdEUsTUFBTSxvQkFBb0IsR0FBRyw0Q0FBNEMsQ0FBQyxDQUFDLGdCQUFnQjtZQUMzRixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDeEIsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFFM0IsTUFBTSxVQUFVLEdBQUcsSUFBQSw2QkFBcUIsRUFBQyxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUM1RyxNQUFNLFVBQVUsR0FBRyxJQUFBLG1DQUEyQixFQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTNELHdEQUF3RDtZQUN4RCxVQUFVLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUV2RixNQUFNLFdBQVcsR0FBRyxJQUFBLDhCQUFzQixFQUFDLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzlHLE1BQU0sV0FBVyxHQUFHLElBQUEsb0NBQTRCLEVBQUMsV0FBVyxDQUFDLENBQUM7WUFFOUQsV0FBVyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDMUYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHtcbiAgZmx1c2hFUkM3MjFUb2tlbnNEYXRhLFxuICBmbHVzaEVSQzExNTVUb2tlbnNEYXRhLFxuICBkZWNvZGVGbHVzaEVSQzcyMVRva2Vuc0RhdGEsXG4gIGRlY29kZUZsdXNoRVJDMTE1NVRva2Vuc0RhdGEsXG59IGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgRVJDNzIxVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi90cmFuc2ZlckJ1aWxkZXJzL3RyYW5zZmVyQnVpbGRlckVSQzcyMSc7XG5pbXBvcnQgeyBFUkM3MjFUcmFuc2ZlckZyb21NZXRob2RJZCwgRVJDNzIxU2FmZVRyYW5zZmVyVHlwZU1ldGhvZElkIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi93YWxsZXRVdGlsJztcblxuZGVzY3JpYmUoJ0Fic3RyYWN0IEVUSCBVdGlscycsICgpID0+IHtcbiAgZGVzY3JpYmUoJ0VSQzcyMSBGbHVzaCBGdW5jdGlvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBlbmNvZGUgZmx1c2ggRVJDNzIxIGRhdGEgY29ycmVjdGx5IGZvciB2MC12MycsICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMjM0NSc7XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gMDtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDNzIxVG9rZW5zRGF0YShmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3MsIHRva2VuSWQsIGZvcndhcmRlclZlcnNpb24pO1xuXG4gICAgICBzaG91bGQuZXhpc3QoZW5jb2RlZCk7XG4gICAgICBlbmNvZGVkLnNob3VsZC5zdGFydFdpdGgoJzB4NWE5NTNkMGEnKTsgLy8gZmx1c2hFUkM3MjFGb3J3YXJkZXJUb2tlbnMgbWV0aG9kIElEXG4gICAgICBlbmNvZGVkLnNob3VsZC5iZS5hLlN0cmluZygpO1xuICAgICAgZW5jb2RlZC5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDEwKTsgLy8gbWV0aG9kIElEICsgcGFyYW1ldGVyc1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBlbmNvZGUgZmx1c2ggRVJDNzIxIGRhdGEgY29ycmVjdGx5IGZvciB2NCsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgIGNvbnN0IHRva2VuSWQgPSAnMTIzNDUnO1xuICAgICAgY29uc3QgZm9yd2FyZGVyVmVyc2lvbiA9IDQ7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBmbHVzaEVSQzcyMVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzLCB0b2tlbklkLCBmb3J3YXJkZXJWZXJzaW9uKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGVuY29kZWQpO1xuICAgICAgZW5jb2RlZC5zaG91bGQuc3RhcnRXaXRoKCcweDE1OWU0NGQ3Jyk7IC8vIGZsdXNoRVJDNzIxVG9rZW4gbWV0aG9kIElEICh2NSlcbiAgICAgIGVuY29kZWQuc2hvdWxkLmJlLmEuU3RyaW5nKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlY29kZSBmbHVzaCBFUkM3MjEgZGF0YSBjb3JyZWN0bHkgZm9yIHYwLXYzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICBjb25zdCB0b2tlbklkID0gJzEyMzQ1JztcbiAgICAgIGNvbnN0IGZvcndhcmRlclZlcnNpb24gPSAyO1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZmx1c2hFUkM3MjFUb2tlbnNEYXRhKGZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZCwgZm9yd2FyZGVyVmVyc2lvbik7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRmx1c2hFUkM3MjFUb2tlbnNEYXRhKGVuY29kZWQpO1xuXG4gICAgICBzaG91bGQuZXhpc3QoZGVjb2RlZCk7XG4gICAgICBkZWNvZGVkLmZvcndhcmRlckFkZHJlc3MudG9Mb3dlckNhc2UoKS5zaG91bGQuZXF1YWwoZm9yd2FyZGVyQWRkcmVzcy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGRlY29kZWQudG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGRlY29kZWQudG9rZW5JZC5zaG91bGQuZXF1YWwodG9rZW5JZCk7XG4gICAgICBzaG91bGQubm90LmV4aXN0KGRlY29kZWQuZm9yd2FyZGVyVmVyc2lvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlY29kZSBmbHVzaCBFUkM3MjEgZGF0YSBjb3JyZWN0bHkgZm9yIHY0KycsICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMjM0NSc7XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gNDtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDNzIxVG9rZW5zRGF0YShmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3MsIHRva2VuSWQsIGZvcndhcmRlclZlcnNpb24pO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUZsdXNoRVJDNzIxVG9rZW5zRGF0YShlbmNvZGVkLCBmb3J3YXJkZXJBZGRyZXNzKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGRlY29kZWQpO1xuICAgICAgZGVjb2RlZC5mb3J3YXJkZXJBZGRyZXNzLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFsKGZvcndhcmRlckFkZHJlc3MudG9Mb3dlckNhc2UoKSk7XG4gICAgICBkZWNvZGVkLnRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpLnNob3VsZC5lcXVhbCh0b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKSk7XG4gICAgICBkZWNvZGVkLnRva2VuSWQuc2hvdWxkLmVxdWFsKHRva2VuSWQpO1xuICAgICAgc2hvdWxkLmV4aXN0KGRlY29kZWQuZm9yd2FyZGVyVmVyc2lvbik7XG4gICAgICBzaG91bGQuZXF1YWwoZGVjb2RlZC5mb3J3YXJkZXJWZXJzaW9uLCA0KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGxhcmdlIHRva2VuIElEcyBmb3IgRVJDNzIxJywgKCkgPT4ge1xuICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICBjb25zdCB0b2tlbklkID0gJzExNTc5MjA4OTIzNzMxNjE5NTQyMzU3MDk4NTAwODY4NzkwNzg1MzI2OTk4NDY2NTY0MDU2NDAzOTQ1NzU4NDAwNzkxMzEyOTYzOTkzNSc7IC8vIG1heCB1aW50MjU2XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gMDtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDNzIxVG9rZW5zRGF0YShmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3MsIHRva2VuSWQsIGZvcndhcmRlclZlcnNpb24pO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUZsdXNoRVJDNzIxVG9rZW5zRGF0YShlbmNvZGVkKTtcblxuICAgICAgZGVjb2RlZC50b2tlbklkLnNob3VsZC5lcXVhbCh0b2tlbklkKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgZmx1c2ggRVJDNzIxIGRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnZhbGlkRGF0YSA9ICcweDEyMzQ1Njc4JzsgLy8gV3JvbmcgbWV0aG9kIElEXG5cbiAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBkZWNvZGVGbHVzaEVSQzcyMVRva2Vuc0RhdGEoaW52YWxpZERhdGEpO1xuICAgICAgfSwgL0ludmFsaWQgZmx1c2ggRVJDNzIxIGJ5dGVjb2RlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBtaXNzaW5nIHRvIGFkZHJlc3MgaW4gdjQrIGRlY29kZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMjM0NSc7XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gNDtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDNzIxVG9rZW5zRGF0YShmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3MsIHRva2VuSWQsIGZvcndhcmRlclZlcnNpb24pO1xuXG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgZGVjb2RlRmx1c2hFUkM3MjFUb2tlbnNEYXRhKGVuY29kZWQpOyAvLyBNaXNzaW5nICd0bycgcGFyYW1ldGVyXG4gICAgICB9LCAvTWlzc2luZyB0byBhZGRyZXNzLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFUkMxMTU1IEZsdXNoIEZ1bmN0aW9ucycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGVuY29kZSBmbHVzaCBFUkMxMTU1IGRhdGEgY29ycmVjdGx5IGZvciB2MC12MycsICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgY29uc3QgdG9rZW5JZCA9ICc5OTk5OSc7XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gMDtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDMTE1NVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzLCB0b2tlbklkLCBmb3J3YXJkZXJWZXJzaW9uKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGVuY29kZWQpO1xuICAgICAgZW5jb2RlZC5zaG91bGQuc3RhcnRXaXRoKCcweGU2YmQwYWE0Jyk7IC8vIGZsdXNoRVJDMTE1NUZvcndhcmRlclRva2VucyBtZXRob2QgSURcbiAgICAgIGVuY29kZWQuc2hvdWxkLmJlLmEuU3RyaW5nKCk7XG4gICAgICBlbmNvZGVkLmxlbmd0aC5zaG91bGQuYmUuZ3JlYXRlclRoYW4oMTApOyAvLyBtZXRob2QgSUQgKyBwYXJhbWV0ZXJzXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGVuY29kZSBmbHVzaCBFUkMxMTU1IGRhdGEgY29ycmVjdGx5IGZvciB2NCsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgIGNvbnN0IHRva2VuSWQgPSAnOTk5OTknO1xuICAgICAgY29uc3QgZm9yd2FyZGVyVmVyc2lvbiA9IDQ7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBmbHVzaEVSQzExNTVUb2tlbnNEYXRhKGZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZCwgZm9yd2FyZGVyVmVyc2lvbik7XG5cbiAgICAgIHNob3VsZC5leGlzdChlbmNvZGVkKTtcbiAgICAgIGVuY29kZWQuc2hvdWxkLnN0YXJ0V2l0aCgnMHg4OTcyYzE3YycpOyAvLyBmbHVzaEVSQzExNTVUb2tlbnMgbWV0aG9kIElEICh2NSlcbiAgICAgIGVuY29kZWQuc2hvdWxkLmJlLmEuU3RyaW5nKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlY29kZSBmbHVzaCBFUkMxMTU1IGRhdGEgY29ycmVjdGx5IGZvciB2MC12MycsICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgY29uc3QgdG9rZW5JZCA9ICc5OTk5OSc7XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gMjtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDMTE1NVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzLCB0b2tlbklkLCBmb3J3YXJkZXJWZXJzaW9uKTtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVGbHVzaEVSQzExNTVUb2tlbnNEYXRhKGVuY29kZWQpO1xuXG4gICAgICBzaG91bGQuZXhpc3QoZGVjb2RlZCk7XG4gICAgICBkZWNvZGVkLmZvcndhcmRlckFkZHJlc3MudG9Mb3dlckNhc2UoKS5zaG91bGQuZXF1YWwoZm9yd2FyZGVyQWRkcmVzcy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGRlY29kZWQudG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGRlY29kZWQudG9rZW5JZC5zaG91bGQuZXF1YWwodG9rZW5JZCk7XG4gICAgICBzaG91bGQubm90LmV4aXN0KGRlY29kZWQuZm9yd2FyZGVyVmVyc2lvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlY29kZSBmbHVzaCBFUkMxMTU1IGRhdGEgY29ycmVjdGx5IGZvciB2NCsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgIGNvbnN0IHRva2VuSWQgPSAnOTk5OTknO1xuICAgICAgY29uc3QgZm9yd2FyZGVyVmVyc2lvbiA9IDQ7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBmbHVzaEVSQzExNTVUb2tlbnNEYXRhKGZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZCwgZm9yd2FyZGVyVmVyc2lvbik7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRmx1c2hFUkMxMTU1VG9rZW5zRGF0YShlbmNvZGVkLCBmb3J3YXJkZXJBZGRyZXNzKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGRlY29kZWQpO1xuICAgICAgZGVjb2RlZC5mb3J3YXJkZXJBZGRyZXNzLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFsKGZvcndhcmRlckFkZHJlc3MudG9Mb3dlckNhc2UoKSk7XG4gICAgICBkZWNvZGVkLnRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpLnNob3VsZC5lcXVhbCh0b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKSk7XG4gICAgICBkZWNvZGVkLnRva2VuSWQuc2hvdWxkLmVxdWFsKHRva2VuSWQpO1xuICAgICAgc2hvdWxkLmV4aXN0KGRlY29kZWQuZm9yd2FyZGVyVmVyc2lvbik7XG4gICAgICBzaG91bGQuZXF1YWwoZGVjb2RlZC5mb3J3YXJkZXJWZXJzaW9uLCA0KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHRva2VuIElEIDAgZm9yIEVSQzExNTUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgIGNvbnN0IHRva2VuSWQgPSAnMCc7XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gMDtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDMTE1NVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzLCB0b2tlbklkLCBmb3J3YXJkZXJWZXJzaW9uKTtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVGbHVzaEVSQzExNTVUb2tlbnNEYXRhKGVuY29kZWQpO1xuXG4gICAgICBkZWNvZGVkLnRva2VuSWQuc2hvdWxkLmVxdWFsKHRva2VuSWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbGFyZ2UgdG9rZW4gSURzIGZvciBFUkMxMTU1JywgKCkgPT4ge1xuICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICBjb25zdCB0b2tlbklkID0gJzExNTc5MjA4OTIzNzMxNjE5NTQyMzU3MDk4NTAwODY4NzkwNzg1MzI2OTk4NDY2NTY0MDU2NDAzOTQ1NzU4NDAwNzkxMzEyOTYzOTkzNSc7IC8vIG1heCB1aW50MjU2XG4gICAgICBjb25zdCBmb3J3YXJkZXJWZXJzaW9uID0gMDtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGZsdXNoRVJDMTE1NVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzLCB0b2tlbklkLCBmb3J3YXJkZXJWZXJzaW9uKTtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVGbHVzaEVSQzExNTVUb2tlbnNEYXRhKGVuY29kZWQpO1xuXG4gICAgICBkZWNvZGVkLnRva2VuSWQuc2hvdWxkLmVxdWFsKHRva2VuSWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCBmbHVzaCBFUkMxMTU1IGRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnZhbGlkRGF0YSA9ICcweDg3NjU0MzIxJzsgLy8gV3JvbmcgbWV0aG9kIElEXG5cbiAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBkZWNvZGVGbHVzaEVSQzExNTVUb2tlbnNEYXRhKGludmFsaWREYXRhKTtcbiAgICAgIH0sIC9JbnZhbGlkIGZsdXNoIEVSQzExNTUgYnl0ZWNvZGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIG1pc3NpbmcgdG8gYWRkcmVzcyBpbiB2NCsgZGVjb2RlJywgKCkgPT4ge1xuICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICBjb25zdCB0b2tlbklkID0gJzk5OTk5JztcbiAgICAgIGNvbnN0IGZvcndhcmRlclZlcnNpb24gPSA0O1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZmx1c2hFUkMxMTU1VG9rZW5zRGF0YShmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3MsIHRva2VuSWQsIGZvcndhcmRlclZlcnNpb24pO1xuXG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgZGVjb2RlRmx1c2hFUkMxMTU1VG9rZW5zRGF0YShlbmNvZGVkKTsgLy8gTWlzc2luZyAndG8nIHBhcmFtZXRlclxuICAgICAgfSwgL01pc3NpbmcgdG8gYWRkcmVzcy8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRVJDNzIxVHJhbnNmZXJCdWlsZGVyLmJ1aWxkVHJhbnNmZXJGcm9tJywgKCkgPT4ge1xuICAgIGNvbnN0IG93bmVyID0gJzB4MTk2NDUwMzJjN2YxNTMzMzk1ZDQ0YTYyOTQ2MmU3NTEwODRkM2U0ZCc7XG4gICAgY29uc3QgcmVjaXBpZW50ID0gJzB4MTk2NDUwMzJjN2YxNTMzMzk1ZDQ0YTYyOTQ2MmU3NTEwODRkM2U0Yyc7XG4gICAgY29uc3QgaHRzTmZ0QWRkcmVzcyA9ICcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3YWMyMDMnO1xuXG4gICAgaXQoJ3Nob3VsZCBlbmNvZGUgdHJhbnNmZXJGcm9tIHdpdGggc2VsZWN0b3IgMHgyM2I4NzJkZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgRVJDNzIxVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnRva2VuQ29udHJhY3RBZGRyZXNzKGh0c05mdEFkZHJlc3MpLnRvKHJlY2lwaWVudCkuZnJvbShvd25lcikudG9rZW5JZCgnMTInKTtcblxuICAgICAgY29uc3QgZGF0YSA9IGJ1aWxkZXIuYnVpbGRUcmFuc2ZlckZyb20oKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGRhdGEpO1xuICAgICAgZGF0YS5zaG91bGQuc3RhcnRXaXRoKEVSQzcyMVRyYW5zZmVyRnJvbU1ldGhvZElkKTsgLy8gMHgyM2I4NzJkZFxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBlbmNvZGUgc2FmZVRyYW5zZmVyRnJvbSB3aXRoIHNlbGVjdG9yIDB4Yjg4ZDRmZGUgdmlhIGJ1aWxkKCknLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IEVSQzcyMVRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgYnVpbGRlci50b2tlbkNvbnRyYWN0QWRkcmVzcyhodHNOZnRBZGRyZXNzKS50byhyZWNpcGllbnQpLmZyb20ob3duZXIpLnRva2VuSWQoJzEyJyk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChkYXRhKTtcbiAgICAgIGRhdGEuc2hvdWxkLnN0YXJ0V2l0aChFUkM3MjFTYWZlVHJhbnNmZXJUeXBlTWV0aG9kSWQpOyAvLyAweGI4OGQ0ZmRlXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgZGlmZmVyZW50IGVuY29kaW5ncyBmb3IgYnVpbGQoKSB2cyBidWlsZFRyYW5zZmVyRnJvbSgpJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBFUkM3MjFUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIudG9rZW5Db250cmFjdEFkZHJlc3MoaHRzTmZ0QWRkcmVzcykudG8ocmVjaXBpZW50KS5mcm9tKG93bmVyKS50b2tlbklkKCcxMicpO1xuXG4gICAgICBjb25zdCBzYWZlVHJhbnNmZXJEYXRhID0gYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHJhbnNmZXJGcm9tRGF0YSA9IGJ1aWxkZXIuYnVpbGRUcmFuc2ZlckZyb20oKTtcblxuICAgICAgc2FmZVRyYW5zZmVyRGF0YS5zaG91bGQubm90LmVxdWFsKHRyYW5zZmVyRnJvbURhdGEpO1xuICAgICAgLy8gdHJhbnNmZXJGcm9tIGVuY29kaW5nIHNob3VsZCBiZSBzaG9ydGVyIChubyBieXRlcyBwYXJhbSlcbiAgICAgIHRyYW5zZmVyRnJvbURhdGEubGVuZ3RoLnNob3VsZC5iZS5sZXNzVGhhbihzYWZlVHJhbnNmZXJEYXRhLmxlbmd0aCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUb2tlbiBBZGRyZXNzIFZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBwcmVzZXJ2ZSBhZGRyZXNzIGZvcm1hdCBpbiBlbmNvZGluZy9kZWNvZGluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgIGNvbnN0IHRva2VuQWRkcmVzc0NoZWNrc3VtID0gJzB4RGY3REVDYjFiQWE4RjUyOUYwQzg5ODJjQkI0QmU1MDM1NzE5NTI5OSc7IC8vIFdpdGggY2hlY2tzdW1cbiAgICAgIGNvbnN0IHRva2VuSWQgPSAnMTIzNDUnO1xuICAgICAgY29uc3QgZm9yd2FyZGVyVmVyc2lvbiA9IDA7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQ3MjEgPSBmbHVzaEVSQzcyMVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzQ2hlY2tzdW0sIHRva2VuSWQsIGZvcndhcmRlclZlcnNpb24pO1xuICAgICAgY29uc3QgZGVjb2RlZDcyMSA9IGRlY29kZUZsdXNoRVJDNzIxVG9rZW5zRGF0YShlbmNvZGVkNzIxKTtcblxuICAgICAgLy8gU2hvdWxkIHByZXNlcnZlIHRoZSBhZGRyZXNzICh0aG91Z2ggbWF5IGxvd2VyY2FzZSBpdClcbiAgICAgIGRlY29kZWQ3MjEudG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzc0NoZWNrc3VtLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICBjb25zdCBlbmNvZGVkMTE1NSA9IGZsdXNoRVJDMTE1NVRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzQ2hlY2tzdW0sIHRva2VuSWQsIGZvcndhcmRlclZlcnNpb24pO1xuICAgICAgY29uc3QgZGVjb2RlZDExNTUgPSBkZWNvZGVGbHVzaEVSQzExNTVUb2tlbnNEYXRhKGVuY29kZWQxMTU1KTtcblxuICAgICAgZGVjb2RlZDExNTUudG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzc0NoZWNrc3VtLnRvTG93ZXJDYXNlKCkpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=zamaUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zamaUtils.d.ts","sourceRoot":"","sources":["../../../test/unit/zamaUtils.ts"],"names":[],"mappings":""}