@bitgo-beta/abstract-eth 1.2.3-alpha.39 → 1.2.3-alpha.390

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 (154) hide show
  1. package/CHANGELOG.md +1760 -0
  2. package/dist/src/abstractEthLikeCoin.d.ts +18 -9
  3. package/dist/src/abstractEthLikeCoin.d.ts.map +1 -1
  4. package/dist/src/abstractEthLikeCoin.js +39 -15
  5. package/dist/src/abstractEthLikeNewCoins.d.ts +749 -0
  6. package/dist/src/abstractEthLikeNewCoins.d.ts.map +1 -0
  7. package/dist/src/abstractEthLikeNewCoins.js +2229 -0
  8. package/dist/src/ethLikeToken.d.ts +36 -6
  9. package/dist/src/ethLikeToken.d.ts.map +1 -1
  10. package/dist/src/ethLikeToken.js +286 -10
  11. package/dist/src/index.d.ts +2 -0
  12. package/dist/src/index.d.ts.map +1 -1
  13. package/dist/src/index.js +8 -2
  14. package/dist/src/lib/contractCall.d.ts +8 -0
  15. package/dist/src/lib/contractCall.d.ts.map +1 -0
  16. package/dist/src/lib/contractCall.js +17 -0
  17. package/dist/src/lib/iface.d.ts +133 -0
  18. package/dist/src/lib/iface.d.ts.map +1 -0
  19. package/dist/src/lib/iface.js +8 -0
  20. package/dist/src/lib/index.d.ts +16 -0
  21. package/dist/src/lib/index.d.ts.map +1 -0
  22. package/dist/src/lib/index.js +57 -0
  23. package/dist/src/lib/keyPair.d.ts +26 -0
  24. package/dist/src/lib/keyPair.d.ts.map +1 -0
  25. package/dist/src/lib/keyPair.js +65 -0
  26. package/dist/src/lib/messages/eip191/eip191Message.d.ts +12 -0
  27. package/dist/src/lib/messages/eip191/eip191Message.d.ts.map +1 -0
  28. package/dist/src/lib/messages/eip191/eip191Message.js +25 -0
  29. package/dist/src/lib/messages/eip191/eip191MessageBuilder.d.ts +19 -0
  30. package/dist/src/lib/messages/eip191/eip191MessageBuilder.d.ts.map +1 -0
  31. package/dist/src/lib/messages/eip191/eip191MessageBuilder.js +27 -0
  32. package/dist/src/lib/messages/eip191/index.d.ts +3 -0
  33. package/dist/src/lib/messages/eip191/index.d.ts.map +1 -0
  34. package/dist/src/lib/messages/eip191/index.js +19 -0
  35. package/dist/src/lib/messages/eip712/eip712Message.d.ts +6 -0
  36. package/dist/src/lib/messages/eip712/eip712Message.d.ts.map +1 -0
  37. package/dist/src/lib/messages/eip712/eip712Message.js +27 -0
  38. package/dist/src/lib/messages/eip712/eip712MessageBuilder.d.ts +7 -0
  39. package/dist/src/lib/messages/eip712/eip712MessageBuilder.d.ts.map +1 -0
  40. package/dist/src/lib/messages/eip712/eip712MessageBuilder.js +15 -0
  41. package/dist/src/lib/messages/eip712/index.d.ts +3 -0
  42. package/dist/src/lib/messages/eip712/index.d.ts.map +1 -0
  43. package/dist/src/lib/messages/eip712/index.js +19 -0
  44. package/dist/src/lib/messages/index.d.ts +4 -0
  45. package/dist/src/lib/messages/index.d.ts.map +1 -0
  46. package/dist/src/lib/messages/index.js +20 -0
  47. package/dist/src/lib/messages/messageBuilderFactory.d.ts +7 -0
  48. package/dist/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  49. package/dist/src/lib/messages/messageBuilderFactory.js +23 -0
  50. package/dist/src/lib/transaction.d.ts +67 -0
  51. package/dist/src/lib/transaction.d.ts.map +1 -0
  52. package/dist/src/lib/transaction.js +142 -0
  53. package/dist/src/lib/transactionBuilder.d.ts +270 -0
  54. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  55. package/dist/src/lib/transactionBuilder.js +821 -0
  56. package/dist/src/lib/transferBuilder.d.ts +76 -0
  57. package/dist/src/lib/transferBuilder.d.ts.map +1 -0
  58. package/dist/src/lib/transferBuilder.js +307 -0
  59. package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.d.ts +54 -0
  60. package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.d.ts.map +1 -0
  61. package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.js +120 -0
  62. package/dist/src/lib/transferBuilders/index.d.ts +4 -0
  63. package/dist/src/lib/transferBuilders/index.d.ts.map +1 -0
  64. package/dist/src/lib/transferBuilders/index.js +20 -0
  65. package/dist/src/lib/transferBuilders/transferBuilderERC1155.d.ts +17 -0
  66. package/dist/src/lib/transferBuilders/transferBuilderERC1155.d.ts.map +1 -0
  67. package/dist/src/lib/transferBuilders/transferBuilderERC1155.js +96 -0
  68. package/dist/src/lib/transferBuilders/transferBuilderERC721.d.ts +16 -0
  69. package/dist/src/lib/transferBuilders/transferBuilderERC721.d.ts.map +1 -0
  70. package/dist/src/lib/transferBuilders/transferBuilderERC721.js +81 -0
  71. package/dist/src/lib/types.d.ts +39 -0
  72. package/dist/src/lib/types.d.ts.map +1 -0
  73. package/dist/src/lib/types.js +137 -0
  74. package/dist/src/lib/utils.d.ts +310 -0
  75. package/dist/src/lib/utils.d.ts.map +1 -0
  76. package/dist/src/lib/utils.js +829 -0
  77. package/dist/src/lib/walletUtil.d.ts +40 -0
  78. package/dist/src/lib/walletUtil.d.ts.map +1 -0
  79. package/dist/src/lib/walletUtil.js +43 -0
  80. package/dist/src/types.d.ts +9 -0
  81. package/dist/src/types.d.ts.map +1 -0
  82. package/dist/src/types.js +3 -0
  83. package/dist/test/index.d.ts +2 -0
  84. package/dist/test/index.d.ts.map +1 -0
  85. package/dist/test/index.js +18 -0
  86. package/dist/test/unit/coin.d.ts +8 -0
  87. package/dist/test/unit/coin.d.ts.map +1 -0
  88. package/dist/test/unit/coin.js +577 -0
  89. package/dist/test/unit/index.d.ts +6 -0
  90. package/dist/test/unit/index.d.ts.map +1 -0
  91. package/dist/test/unit/index.js +22 -0
  92. package/dist/test/unit/messages/abstractEthMessageBuilderTests.d.ts +3 -0
  93. package/dist/test/unit/messages/abstractEthMessageBuilderTests.d.ts.map +1 -0
  94. package/dist/test/unit/messages/abstractEthMessageBuilderTests.js +110 -0
  95. package/dist/test/unit/messages/abstractEthMessageTestTypes.d.ts +43 -0
  96. package/dist/test/unit/messages/abstractEthMessageTestTypes.d.ts.map +1 -0
  97. package/dist/test/unit/messages/abstractEthMessageTestTypes.js +3 -0
  98. package/dist/test/unit/messages/abstractEthMessagesTests.d.ts +3 -0
  99. package/dist/test/unit/messages/abstractEthMessagesTests.d.ts.map +1 -0
  100. package/dist/test/unit/messages/abstractEthMessagesTests.js +129 -0
  101. package/dist/test/unit/messages/eip191/eip191Message.d.ts +2 -0
  102. package/dist/test/unit/messages/eip191/eip191Message.d.ts.map +1 -0
  103. package/dist/test/unit/messages/eip191/eip191Message.js +15 -0
  104. package/dist/test/unit/messages/eip191/eip191MessageBuilder.d.ts +2 -0
  105. package/dist/test/unit/messages/eip191/eip191MessageBuilder.d.ts.map +1 -0
  106. package/dist/test/unit/messages/eip191/eip191MessageBuilder.js +16 -0
  107. package/dist/test/unit/messages/eip191/fixtures.d.ts +109 -0
  108. package/dist/test/unit/messages/eip191/fixtures.d.ts.map +1 -0
  109. package/dist/test/unit/messages/eip191/fixtures.js +63 -0
  110. package/dist/test/unit/messages/eip712/eip712Message.d.ts +2 -0
  111. package/dist/test/unit/messages/eip712/eip712Message.d.ts.map +1 -0
  112. package/dist/test/unit/messages/eip712/eip712Message.js +15 -0
  113. package/dist/test/unit/messages/eip712/eip712MessageBuilder.d.ts +2 -0
  114. package/dist/test/unit/messages/eip712/eip712MessageBuilder.d.ts.map +1 -0
  115. package/dist/test/unit/messages/eip712/eip712MessageBuilder.js +16 -0
  116. package/dist/test/unit/messages/eip712/fixtures.d.ts +76 -0
  117. package/dist/test/unit/messages/eip712/fixtures.d.ts.map +1 -0
  118. package/dist/test/unit/messages/eip712/fixtures.js +120 -0
  119. package/dist/test/unit/messages/index.d.ts +4 -0
  120. package/dist/test/unit/messages/index.d.ts.map +1 -0
  121. package/dist/test/unit/messages/index.js +20 -0
  122. package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
  123. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  124. package/dist/test/unit/messages/messageBuilderFactory.js +52 -0
  125. package/dist/test/unit/token.d.ts +2 -0
  126. package/dist/test/unit/token.d.ts.map +1 -0
  127. package/dist/test/unit/token.js +37 -0
  128. package/dist/test/unit/transaction.d.ts +3 -0
  129. package/dist/test/unit/transaction.d.ts.map +1 -0
  130. package/dist/test/unit/transaction.js +60 -0
  131. package/dist/test/unit/transactionBuilder/addressInitialization.d.ts +8 -0
  132. package/dist/test/unit/transactionBuilder/addressInitialization.d.ts.map +1 -0
  133. package/dist/test/unit/transactionBuilder/addressInitialization.js +95 -0
  134. package/dist/test/unit/transactionBuilder/flushNft.d.ts +2 -0
  135. package/dist/test/unit/transactionBuilder/flushNft.d.ts.map +1 -0
  136. package/dist/test/unit/transactionBuilder/flushNft.js +381 -0
  137. package/dist/test/unit/transactionBuilder/index.d.ts +5 -0
  138. package/dist/test/unit/transactionBuilder/index.d.ts.map +1 -0
  139. package/dist/test/unit/transactionBuilder/index.js +21 -0
  140. package/dist/test/unit/transactionBuilder/send.d.ts +3 -0
  141. package/dist/test/unit/transactionBuilder/send.d.ts.map +1 -0
  142. package/dist/test/unit/transactionBuilder/send.js +197 -0
  143. package/dist/test/unit/transactionBuilder/walletInitialization.d.ts +10 -0
  144. package/dist/test/unit/transactionBuilder/walletInitialization.d.ts.map +1 -0
  145. package/dist/test/unit/transactionBuilder/walletInitialization.js +124 -0
  146. package/dist/test/unit/transferBuilder.d.ts +2 -0
  147. package/dist/test/unit/transferBuilder.d.ts.map +1 -0
  148. package/dist/test/unit/transferBuilder.js +76 -0
  149. package/dist/test/unit/utils.d.ts +2 -0
  150. package/dist/test/unit/utils.d.ts.map +1 -0
  151. package/dist/test/unit/utils.js +184 -0
  152. package/dist/tsconfig.tsbuildinfo +1 -8244
  153. package/index.ts +2 -0
  154. package/package.json +30 -9
@@ -0,0 +1,95 @@
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.testAddressInitializationWithoutContractAddress = testAddressInitializationWithoutContractAddress;
7
+ exports.testFailsWithInvalidForwarderVersion = testFailsWithInvalidForwarderVersion;
8
+ exports.testAddressInitializationBuildsCorrectlyAndReturnsAddress = testAddressInitializationBuildsCorrectlyAndReturnsAddress;
9
+ exports.testAddressInitializationBuildsFromSerializedData = testAddressInitializationBuildsFromSerializedData;
10
+ exports.testAddressInitializationBuildsFromSignedSerializedData = testAddressInitializationBuildsFromSignedSerializedData;
11
+ exports.testContractCallForCreateForwarder = testContractCallForCreateForwarder;
12
+ const should_1 = __importDefault(require("should"));
13
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
14
+ async function testAddressInitializationWithoutContractAddress(txBuilder) {
15
+ it('should fail if there is no contract address', async () => {
16
+ txBuilder.type(sdk_core_1.TransactionType.AddressInitialization);
17
+ txBuilder.fee({
18
+ fee: '10',
19
+ gasLimit: '1000',
20
+ });
21
+ txBuilder.counter(1);
22
+ await txBuilder.build().should.be.rejectedWith('Invalid transaction: missing contract address');
23
+ });
24
+ }
25
+ async function testFailsWithInvalidForwarderVersion(txBuilder, testData) {
26
+ it('should fail if forwarder version is invalid', async () => {
27
+ try {
28
+ txBuilder.type(sdk_core_1.TransactionType.AddressInitialization);
29
+ txBuilder.fee({
30
+ fee: '10',
31
+ gasLimit: '1000',
32
+ });
33
+ txBuilder.contract(testData.FORWARDER_FACTORY_ADDRESS);
34
+ txBuilder.forwarderVersion(3);
35
+ }
36
+ catch (e) {
37
+ should_1.default.equal(e.message, 'Invalid forwarder version: 3');
38
+ }
39
+ });
40
+ }
41
+ async function testAddressInitializationBuildsCorrectlyAndReturnsAddress(txBuilder, testData) {
42
+ it('should build properly and return a correct address', async () => {
43
+ txBuilder.type(sdk_core_1.TransactionType.AddressInitialization);
44
+ txBuilder.fee({
45
+ fee: '10',
46
+ gasLimit: '1000',
47
+ });
48
+ txBuilder.counter(1);
49
+ txBuilder.contract(testData.FORWARDER_FACTORY_ADDRESS);
50
+ txBuilder.baseAddress(testData.BASE_ADDRESS);
51
+ txBuilder.feeAddress(testData.FEE_ADDRESS);
52
+ txBuilder.forwarderVersion(4);
53
+ txBuilder.salt('0x1');
54
+ txBuilder.initCode(testData.FORWARDER_IMPLEMENTATION_ADDRESS);
55
+ txBuilder.sign({ key: testData.KEYPAIR_PRV.getKeys().prv });
56
+ const tx = await txBuilder.build();
57
+ const txJson = tx.toJson();
58
+ should_1.default.equal(txJson.deployedAddress, testData.DEPLOYED_ADDRESS);
59
+ should_1.default.equal(txJson.to, testData.FORWARDER_FACTORY_ADDRESS);
60
+ });
61
+ }
62
+ async function testAddressInitializationBuildsFromSerializedData(txBuilder, testData) {
63
+ it('should build properly from serialized', async () => {
64
+ txBuilder.type(sdk_core_1.TransactionType.AddressInitialization);
65
+ txBuilder.from(testData.UNSIGNED_ADDRESS_INIT);
66
+ const tx = await txBuilder.build();
67
+ const txJson = tx.toJson();
68
+ should_1.default.equal(txJson.to, testData.FORWARDER_FACTORY_ADDRESS);
69
+ });
70
+ }
71
+ async function testAddressInitializationBuildsFromSignedSerializedData(txBuilder, testData) {
72
+ it('should build properly from signed serialized', async () => {
73
+ txBuilder.type(sdk_core_1.TransactionType.AddressInitialization);
74
+ txBuilder.from(testData.SIGNED_ADDRESS_INIT);
75
+ const tx = await txBuilder.build();
76
+ const txJson = tx.toJson();
77
+ should_1.default.equal(txJson.to, testData.FORWARDER_FACTORY_ADDRESS);
78
+ should_1.default.equal(txJson.from, testData.ACCOUNT_1);
79
+ });
80
+ }
81
+ async function testContractCallForCreateForwarder(txBuilder, testData) {
82
+ it('should build properly createForwarder call for recovery', async () => {
83
+ txBuilder.type(sdk_core_1.TransactionType.ContractCall);
84
+ txBuilder.contract(testData.BASE_ADDRESS);
85
+ txBuilder.data(testData.CREATE_FORWARDER_METHOD);
86
+ txBuilder.fee({
87
+ fee: '10',
88
+ gasLimit: '1000',
89
+ });
90
+ const tx = await txBuilder.build();
91
+ const txJson = tx.toJson();
92
+ should_1.default.equal(txJson.to, testData.BASE_ADDRESS);
93
+ });
94
+ }
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzc0luaXRpYWxpemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9hZGRyZXNzSW5pdGlhbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFJQSwwR0FVQztBQUVELG9GQWNDO0FBRUQsOEhBd0JDO0FBRUQsOEdBUUM7QUFFRCwwSEFZQztBQUVELGdGQWFDO0FBL0ZELG9EQUE0QjtBQUM1QixtREFBdUQ7QUFHaEQsS0FBSyxVQUFVLCtDQUErQyxDQUFDLFNBQTZCO0lBQ2pHLEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMzRCxTQUFTLENBQUMsSUFBSSxDQUFDLDBCQUFlLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN0RCxTQUFTLENBQUMsR0FBRyxDQUFDO1lBQ1osR0FBRyxFQUFFLElBQUk7WUFDVCxRQUFRLEVBQUUsTUFBTTtTQUNqQixDQUFDLENBQUM7UUFDSCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLCtDQUErQyxDQUFDLENBQUM7SUFDbEcsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRU0sS0FBSyxVQUFVLG9DQUFvQyxDQUFDLFNBQTZCLEVBQUUsUUFBYTtJQUNyRyxFQUFFLENBQUMsNkNBQTZDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDM0QsSUFBSSxDQUFDO1lBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBZSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDdEQsU0FBUyxDQUFDLEdBQUcsQ0FBQztnQkFDWixHQUFHLEVBQUUsSUFBSTtnQkFDVCxRQUFRLEVBQUUsTUFBTTthQUNqQixDQUFDLENBQUM7WUFDSCxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEs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QUMsTUFBTSxFQUFFLENBQUM7UUFDM0IsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM1RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFTSxLQUFLLFVBQVUsa0NBQWtDLENBQUMsU0FBNkIsRUFBRSxRQUFhO0lBQ25HLEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RSxTQUFTLENBQUMsSUFBSSxDQUFDLDBCQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0MsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNqRCxTQUFTLENBQUMsR0FBRyxDQUFDO1lBQ1osR0FBRyxFQUFFLElBQUk7WUFDVCxRQUFRLEVBQUUsTUFBTTtTQUNqQixDQUFDLENBQUM7UUFDSCxNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0IsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDakQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RBZGRyZXNzSW5pdGlhbGl6YXRpb25XaXRob3V0Q29udHJhY3RBZGRyZXNzKHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyKSB7XG4gIGl0KCdzaG91bGQgZmFpbCBpZiB0aGVyZSBpcyBubyBjb250cmFjdCBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5BZGRyZXNzSW5pdGlhbGl6YXRpb24pO1xuICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgZmVlOiAnMTAnLFxuICAgICAgZ2FzTGltaXQ6ICcxMDAwJyxcbiAgICB9KTtcbiAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIGNvbnRyYWN0IGFkZHJlc3MnKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0RmFpbHNXaXRoSW52YWxpZEZvcndhcmRlclZlcnNpb24odHhCdWlsZGVyOiBUcmFuc2FjdGlvbkJ1aWxkZXIsIHRlc3REYXRhOiBhbnkpIHtcbiAgaXQoJ3Nob3VsZCBmYWlsIGlmIGZvcndhcmRlciB2ZXJzaW9uIGlzIGludmFsaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5BZGRyZXNzSW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICAgIGZlZTogJzEwJyxcbiAgICAgICAgZ2FzTGltaXQ6ICcxMDAwJyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KHRlc3REYXRhLkZPUldBUkRFUl9GQUNUT1JZX0FERFJFU1MpO1xuICAgICAgdHhCdWlsZGVyLmZvcndhcmRlclZlcnNpb24oMyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvdWxkLmVxdWFsKGUubWVzc2FnZSwgJ0ludmFsaWQgZm9yd2FyZGVyIHZlcnNpb246IDMnKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdEFkZHJlc3NJbml0aWFsaXphdGlvbkJ1aWxkc0NvcnJlY3RseUFuZFJldHVybnNBZGRyZXNzKFxuICB0eEJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlcixcbiAgdGVzdERhdGE6IGFueVxuKSB7XG4gIGl0KCdzaG91bGQgYnVpbGQgcHJvcGVybHkgYW5kIHJldHVybiBhIGNvcnJlY3QgYWRkcmVzcycsIGFzeW5jICgpID0+IHtcbiAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuQWRkcmVzc0luaXRpYWxpemF0aW9uKTtcbiAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgIGZlZTogJzEwJyxcbiAgICAgIGdhc0xpbWl0OiAnMTAwMCcsXG4gICAgfSk7XG4gICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgdHhCdWlsZGVyLmNvbnRyYWN0KHRlc3REYXRhLkZPUldBUkRFUl9GQUNUT1JZX0FERFJFU1MpO1xuICAgIHR4QnVpbGRlci5iYXNlQWRkcmVzcyh0ZXN0RGF0YS5CQVNFX0FERFJFU1MpO1xuICAgIHR4QnVpbGRlci5mZWVBZGRyZXNzKHRlc3REYXRhLkZFRV9BRERSRVNTKTtcbiAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyVmVyc2lvbig0KTtcbiAgICB0eEJ1aWxkZXIuc2FsdCgnMHgxJyk7XG4gICAgdHhCdWlsZGVyLmluaXRDb2RlKHRlc3REYXRhLkZPUldBUkRFUl9JTVBMRU1FTlRBVElPTl9BRERSRVNTKTtcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuS0VZUEFJUl9QUlYuZ2V0S2V5cygpLnBydiB9KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5kZXBsb3llZEFkZHJlc3MsIHRlc3REYXRhLkRFUExPWUVEX0FERFJFU1MpO1xuICAgIHNob3VsZC5lcXVhbCh0eEpzb24udG8sIHRlc3REYXRhLkZPUldBUkRFUl9GQUNUT1JZX0FERFJFU1MpO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RBZGRyZXNzSW5pdGlhbGl6YXRpb25CdWlsZHNGcm9tU2VyaWFsaXplZERhdGEodHhCdWlsZGVyOiBUcmFuc2FjdGlvbkJ1aWxkZXIsIHRlc3REYXRhOiBhbnkpIHtcbiAgaXQoJ3Nob3VsZCBidWlsZCBwcm9wZXJseSBmcm9tIHNlcmlhbGl6ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkFkZHJlc3NJbml0aWFsaXphdGlvbik7XG4gICAgdHhCdWlsZGVyLmZyb20odGVzdERhdGEuVU5TSUdORURfQUREUkVTU19JTklUKTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgIHNob3VsZC5lcXVhbCh0eEpzb24udG8sIHRlc3REYXRhLkZPUldBUkRFUl9GQUNUT1JZX0FERFJFU1MpO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RBZGRyZXNzSW5pdGlhbGl6YXRpb25CdWlsZHNGcm9tU2lnbmVkU2VyaWFsaXplZERhdGEoXG4gIHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyLFxuICB0ZXN0RGF0YTogYW55XG4pIHtcbiAgaXQoJ3Nob3VsZCBidWlsZCBwcm9wZXJseSBmcm9tIHNpZ25lZCBzZXJpYWxpemVkJywgYXN5bmMgKCkgPT4ge1xuICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5BZGRyZXNzSW5pdGlhbGl6YXRpb24pO1xuICAgIHR4QnVpbGRlci5mcm9tKHRlc3REYXRhLlNJR05FRF9BRERSRVNTX0lOSVQpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgdGVzdERhdGEuRk9SV0FSREVSX0ZBQ1RPUllfQUREUkVTUyk7XG4gICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5mcm9tLCB0ZXN0RGF0YS5BQ0NPVU5UXzEpO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RDb250cmFjdENhbGxGb3JDcmVhdGVGb3J3YXJkZXIodHhCdWlsZGVyOiBUcmFuc2FjdGlvbkJ1aWxkZXIsIHRlc3REYXRhOiBhbnkpIHtcbiAgaXQoJ3Nob3VsZCBidWlsZCBwcm9wZXJseSBjcmVhdGVGb3J3YXJkZXIgY2FsbCBmb3IgcmVjb3ZlcnknLCBhc3luYyAoKSA9PiB7XG4gICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbCk7XG4gICAgdHhCdWlsZGVyLmNvbnRyYWN0KHRlc3REYXRhLkJBU0VfQUREUkVTUyk7XG4gICAgdHhCdWlsZGVyLmRhdGEodGVzdERhdGEuQ1JFQVRFX0ZPUldBUkRFUl9NRVRIT0QpO1xuICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgZmVlOiAnMTAnLFxuICAgICAgZ2FzTGltaXQ6ICcxMDAwJyxcbiAgICB9KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgIHNob3VsZC5lcXVhbCh0eEpzb24udG8sIHRlc3REYXRhLkJBU0VfQUREUkVTUyk7XG4gIH0pO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export declare function runFlushNftTests(coinName: string, getBuilder: any): void;
2
+ //# sourceMappingURL=flushNft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flushNft.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/flushNft.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,KAAA,GAAG,IAAI,CAucnE"}
@@ -0,0 +1,381 @@
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.runFlushNftTests = runFlushNftTests;
7
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
+ const should_1 = __importDefault(require("should"));
9
+ function runFlushNftTests(coinName, getBuilder) {
10
+ describe(`${coinName} transaction builder flush NFTs`, () => {
11
+ let txBuilder;
12
+ beforeEach(() => {
13
+ txBuilder = getBuilder(coinName);
14
+ txBuilder.fee({
15
+ fee: '1000000000',
16
+ gasLimit: '100000',
17
+ });
18
+ txBuilder.counter(1);
19
+ });
20
+ describe('ERC721 Flush', () => {
21
+ it('should build a flush ERC721 transaction with forwarder v4', async () => {
22
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
23
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
24
+ const tokenId = '12345';
25
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
26
+ txBuilder.contract(forwarderAddress);
27
+ txBuilder.tokenAddress(tokenAddress);
28
+ txBuilder.forwarderAddress(forwarderAddress);
29
+ txBuilder.forwarderVersion(4);
30
+ txBuilder.tokenId(tokenId);
31
+ const tx = await txBuilder.build();
32
+ const txJson = tx.toJson();
33
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC721);
34
+ should_1.default.equal(txJson.to, forwarderAddress);
35
+ should_1.default.exist(txJson.data);
36
+ txJson.data.should.startWith('0x159e44d7');
37
+ should_1.default.exist(txJson.value);
38
+ txJson.value.should.equal('0');
39
+ should_1.default.exist(txJson.gasLimit);
40
+ txJson.gasLimit.should.equal('100000');
41
+ should_1.default.exist(txJson.gasPrice);
42
+ txJson.gasPrice.should.equal('1000000000');
43
+ // Verify the encoded parameters in the data
44
+ const encodedTokenAddress = tokenAddress.slice(2).toLowerCase().padStart(64, '0');
45
+ const encodedTokenId = BigInt(tokenId).toString(16).padStart(64, '0');
46
+ txJson.data.should.containEql(encodedTokenAddress);
47
+ txJson.data.should.containEql(encodedTokenId);
48
+ });
49
+ it('should build a flush ERC721 transaction with forwarder version < v4', async () => {
50
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
51
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
52
+ const contractAddress = '0x9e2c5712ab4caf402a98c4bf58c79a0dfe718ad1';
53
+ const tokenId = '54321';
54
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
55
+ txBuilder.contract(contractAddress);
56
+ txBuilder.tokenAddress(tokenAddress);
57
+ txBuilder.forwarderAddress(forwarderAddress);
58
+ txBuilder.forwarderVersion(2);
59
+ txBuilder.tokenId(tokenId);
60
+ const tx = await txBuilder.build();
61
+ const txJson = tx.toJson();
62
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC721);
63
+ should_1.default.equal(txJson.to, contractAddress);
64
+ should_1.default.exist(txJson.data);
65
+ txJson.data.should.startWith('0x5a953d0a'); // flushERC721Tokens method ID for v2 and below
66
+ should_1.default.equal(txJson.value, '0');
67
+ // Verify the encoded parameters
68
+ const encodedForwarderAddress = forwarderAddress.slice(2).toLowerCase().padStart(64, '0');
69
+ const encodedTokenAddress = tokenAddress.slice(2).toLowerCase().padStart(64, '0');
70
+ const encodedTokenId = BigInt(tokenId).toString(16).padStart(64, '0');
71
+ txJson.data.should.containEql(encodedForwarderAddress);
72
+ txJson.data.should.containEql(encodedTokenAddress);
73
+ txJson.data.should.containEql(encodedTokenId);
74
+ });
75
+ it('should build a flush ERC721 with large token ID', async () => {
76
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
77
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
78
+ const tokenId = '115792089237316195423570985008687907853269984665640564039457584007913129639935'; // max uint256
79
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
80
+ txBuilder.contract(forwarderAddress);
81
+ txBuilder.tokenAddress(tokenAddress);
82
+ txBuilder.forwarderAddress(forwarderAddress);
83
+ txBuilder.forwarderVersion(4);
84
+ txBuilder.tokenId(tokenId);
85
+ const tx = await txBuilder.build();
86
+ const txJson = tx.toJson();
87
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC721);
88
+ should_1.default.equal(txJson.to, forwarderAddress);
89
+ should_1.default.exist(txJson.data);
90
+ txJson.data.should.startWith('0x159e44d7');
91
+ // Verify large token ID is properly encoded
92
+ const maxUint256Hex = 'f'.repeat(64);
93
+ txJson.data.should.containEql(maxUint256Hex);
94
+ });
95
+ it('should build flush ERC721 with token ID as string zero', async () => {
96
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
97
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
98
+ const tokenId = '0';
99
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
100
+ txBuilder.contract(forwarderAddress);
101
+ txBuilder.tokenAddress(tokenAddress);
102
+ txBuilder.forwarderAddress(forwarderAddress);
103
+ txBuilder.forwarderVersion(4);
104
+ txBuilder.tokenId(tokenId);
105
+ const tx = await txBuilder.build();
106
+ const txJson = tx.toJson();
107
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC721);
108
+ should_1.default.equal(txJson.to, forwarderAddress);
109
+ should_1.default.exist(txJson.data);
110
+ // Verify token ID 0 is properly encoded
111
+ const encodedZeroTokenId = '0'.padStart(64, '0');
112
+ txJson.data.should.containEql(encodedZeroTokenId);
113
+ });
114
+ it('should fail to build flush ERC721 without token address', async () => {
115
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
116
+ const tokenId = '12345';
117
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
118
+ txBuilder.contract(forwarderAddress);
119
+ txBuilder.tokenId(tokenId);
120
+ txBuilder.forwarderVersion(4);
121
+ await txBuilder.build().should.be.rejectedWith('Invalid transaction: missing token address');
122
+ });
123
+ it('should fail to build flush ERC721 without token ID', async () => {
124
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
125
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
126
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
127
+ txBuilder.contract(forwarderAddress);
128
+ txBuilder.tokenAddress(tokenAddress);
129
+ txBuilder.forwarderVersion(4);
130
+ await txBuilder.build().should.be.rejectedWith('Token ID is required for ERC721 flush');
131
+ });
132
+ it('should fail to build flush ERC721 without contract address', async () => {
133
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
134
+ const tokenId = '12345';
135
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
136
+ txBuilder.tokenAddress(tokenAddress);
137
+ txBuilder.tokenId(tokenId);
138
+ txBuilder.forwarderVersion(4);
139
+ await txBuilder.build().should.be.rejected();
140
+ });
141
+ it('should decode flush ERC721 transaction from raw tx with v4', async () => {
142
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
143
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
144
+ const tokenId = '12345';
145
+ // Build a transaction first
146
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
147
+ txBuilder.contract(forwarderAddress);
148
+ txBuilder.forwarderAddress(forwarderAddress);
149
+ txBuilder.tokenAddress(tokenAddress);
150
+ txBuilder.tokenId(tokenId);
151
+ txBuilder.forwarderVersion(4);
152
+ const builtTx = await txBuilder.build();
153
+ const txHex = builtTx.toBroadcastFormat();
154
+ // Create a new builder and parse the transaction
155
+ const rebuilder = getBuilder(coinName);
156
+ rebuilder.from(txHex);
157
+ const rebuiltTx = await rebuilder.build();
158
+ should_1.default.equal(rebuiltTx.type, sdk_core_1.TransactionType.FlushERC721);
159
+ const txJson = rebuiltTx.toJson();
160
+ should_1.default.equal(txJson.to, forwarderAddress);
161
+ should_1.default.exist(txJson.data);
162
+ txJson.data.should.startWith('0x159e44d7');
163
+ });
164
+ it('should decode flush ERC721 transaction from raw tx with version < v4', async () => {
165
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
166
+ const contractAddress = '0x9e2c5712ab4caf402a98c4bf58c79a0dfe718ad1';
167
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
168
+ const tokenId = '99999';
169
+ // Build a transaction first
170
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC721);
171
+ txBuilder.contract(contractAddress);
172
+ txBuilder.tokenAddress(tokenAddress);
173
+ txBuilder.forwarderAddress(forwarderAddress);
174
+ txBuilder.tokenId(tokenId);
175
+ txBuilder.forwarderVersion(2);
176
+ const builtTx = await txBuilder.build();
177
+ const txHex = builtTx.toBroadcastFormat();
178
+ // Create a new builder and parse the transaction
179
+ const rebuilder = getBuilder(coinName);
180
+ rebuilder.from(txHex);
181
+ const rebuiltTx = await rebuilder.build();
182
+ should_1.default.equal(rebuiltTx.type, sdk_core_1.TransactionType.FlushERC721);
183
+ const txJson = rebuiltTx.toJson();
184
+ should_1.default.equal(txJson.to, contractAddress);
185
+ should_1.default.exist(txJson.data);
186
+ txJson.data.should.startWith('0x5a953d0a');
187
+ });
188
+ });
189
+ describe('ERC1155 Flush', () => {
190
+ it('should build a flush ERC1155 transaction with forwarder v4', async () => {
191
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
192
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
193
+ const tokenId = '99999';
194
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
195
+ txBuilder.contract(forwarderAddress);
196
+ txBuilder.tokenAddress(tokenAddress);
197
+ txBuilder.forwarderAddress(forwarderAddress);
198
+ txBuilder.tokenId(tokenId);
199
+ txBuilder.forwarderVersion(4);
200
+ const tx = await txBuilder.build();
201
+ const txJson = tx.toJson();
202
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC1155);
203
+ should_1.default.equal(txJson.to, forwarderAddress);
204
+ should_1.default.exist(txJson.data);
205
+ txJson.data.should.startWith('0x8972c17c'); // flushERC1155Tokens v4 method ID
206
+ should_1.default.exist(txJson.value);
207
+ txJson.value.should.equal('0');
208
+ should_1.default.exist(txJson.gasLimit);
209
+ txJson.gasLimit.should.equal('100000');
210
+ should_1.default.exist(txJson.gasPrice);
211
+ txJson.gasPrice.should.equal('1000000000');
212
+ // Verify the encoded parameters in the data
213
+ const encodedTokenAddress = tokenAddress.slice(2).toLowerCase().padStart(64, '0');
214
+ const encodedTokenId = BigInt(tokenId).toString(16).padStart(64, '0');
215
+ txJson.data.should.containEql(encodedTokenAddress);
216
+ txJson.data.should.containEql(encodedTokenId);
217
+ });
218
+ it('should build a flush ERC1155 transaction with forwarder version < v4', async () => {
219
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
220
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
221
+ const contractAddress = '0x9e2c5712ab4caf402a98c4bf58c79a0dfe718ad1';
222
+ const tokenId = '555';
223
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
224
+ txBuilder.contract(contractAddress);
225
+ txBuilder.tokenAddress(tokenAddress);
226
+ txBuilder.forwarderAddress(forwarderAddress);
227
+ txBuilder.forwarderVersion(2);
228
+ txBuilder.tokenId(tokenId);
229
+ const tx = await txBuilder.build();
230
+ const txJson = tx.toJson();
231
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC1155);
232
+ should_1.default.equal(txJson.to, contractAddress);
233
+ should_1.default.exist(txJson.data);
234
+ txJson.data.should.startWith('0xe6bd0aa4'); // flushForwarderERC1155Tokens method ID for v3 and below
235
+ should_1.default.equal(txJson.value, '0');
236
+ // Verify the encoded parameters
237
+ const encodedForwarderAddress = forwarderAddress.slice(2).toLowerCase().padStart(64, '0');
238
+ const encodedTokenAddress = tokenAddress.slice(2).toLowerCase().padStart(64, '0');
239
+ const encodedTokenId = BigInt(tokenId).toString(16).padStart(64, '0');
240
+ txJson.data.should.containEql(encodedForwarderAddress);
241
+ txJson.data.should.containEql(encodedTokenAddress);
242
+ txJson.data.should.containEql(encodedTokenId);
243
+ });
244
+ it('should fail to build flush ERC1155 without token address', async () => {
245
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
246
+ const tokenId = '99999';
247
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
248
+ txBuilder.contract(forwarderAddress);
249
+ txBuilder.tokenId(tokenId);
250
+ txBuilder.forwarderVersion(4);
251
+ await txBuilder.build().should.be.rejectedWith('Invalid transaction: missing token address');
252
+ });
253
+ it('should fail to build flush ERC1155 without token ID', async () => {
254
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
255
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
256
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
257
+ txBuilder.contract(forwarderAddress);
258
+ txBuilder.tokenAddress(tokenAddress);
259
+ txBuilder.forwarderVersion(4);
260
+ await txBuilder.build().should.be.rejectedWith('Token ID is required for ERC1155 flush');
261
+ });
262
+ it('should fail to build flush ERC1155 without contract address', async () => {
263
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
264
+ const tokenId = '12345';
265
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
266
+ txBuilder.tokenAddress(tokenAddress);
267
+ txBuilder.tokenId(tokenId);
268
+ txBuilder.forwarderVersion(4);
269
+ await txBuilder.build().should.be.rejected();
270
+ });
271
+ it('should build flush ERC1155 with token ID as string zero', async () => {
272
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
273
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
274
+ const tokenId = '0';
275
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
276
+ txBuilder.contract(forwarderAddress);
277
+ txBuilder.tokenAddress(tokenAddress);
278
+ txBuilder.forwarderAddress(forwarderAddress);
279
+ txBuilder.tokenId(tokenId);
280
+ txBuilder.forwarderVersion(4);
281
+ const tx = await txBuilder.build();
282
+ const txJson = tx.toJson();
283
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC1155);
284
+ should_1.default.equal(txJson.to, forwarderAddress);
285
+ should_1.default.exist(txJson.data);
286
+ // Verify token ID 0 is properly encoded
287
+ const encodedZeroTokenId = '0'.padStart(64, '0');
288
+ txJson.data.should.containEql(encodedZeroTokenId);
289
+ });
290
+ it('should handle large token IDs for ERC1155 with v4', async () => {
291
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
292
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
293
+ const tokenId = '115792089237316195423570985008687907853269984665640564039457584007913129639935'; // max uint256
294
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
295
+ txBuilder.contract(forwarderAddress);
296
+ txBuilder.forwarderAddress(forwarderAddress);
297
+ txBuilder.tokenAddress(tokenAddress);
298
+ txBuilder.tokenId(tokenId);
299
+ txBuilder.forwarderVersion(4);
300
+ const tx = await txBuilder.build();
301
+ const txJson = tx.toJson();
302
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC1155);
303
+ should_1.default.equal(txJson.to, forwarderAddress);
304
+ should_1.default.exist(txJson.data);
305
+ txJson.data.should.startWith('0x8972c17c');
306
+ // Verify large token ID is properly encoded
307
+ const maxUint256Hex = 'f'.repeat(64);
308
+ txJson.data.should.containEql(maxUint256Hex);
309
+ });
310
+ it('should handle large token IDs for ERC1155 with version < v4', async () => {
311
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
312
+ const contractAddress = '0x9e2c5712ab4caf402a98c4bf58c79a0dfe718ad1';
313
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
314
+ const tokenId = '115792089237316195423570985008687907853269984665640564039457584007913129639935'; // max uint256
315
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
316
+ txBuilder.contract(contractAddress);
317
+ txBuilder.tokenAddress(tokenAddress);
318
+ txBuilder.forwarderAddress(forwarderAddress);
319
+ txBuilder.tokenId(tokenId);
320
+ txBuilder.forwarderVersion(2);
321
+ const tx = await txBuilder.build();
322
+ const txJson = tx.toJson();
323
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.FlushERC1155);
324
+ should_1.default.equal(txJson.to, contractAddress);
325
+ should_1.default.exist(txJson.data);
326
+ txJson.data.should.startWith('0xe6bd0aa4');
327
+ // Verify large token ID is properly encoded
328
+ const maxUint256Hex = 'f'.repeat(64);
329
+ txJson.data.should.containEql(maxUint256Hex);
330
+ });
331
+ it('should decode flush ERC1155 transaction from raw tx with v4', async () => {
332
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
333
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
334
+ const tokenId = '99999';
335
+ // Build a transaction first
336
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
337
+ txBuilder.contract(forwarderAddress);
338
+ txBuilder.forwarderAddress(forwarderAddress);
339
+ txBuilder.tokenAddress(tokenAddress);
340
+ txBuilder.tokenId(tokenId);
341
+ txBuilder.forwarderVersion(4);
342
+ const builtTx = await txBuilder.build();
343
+ const txHex = builtTx.toBroadcastFormat();
344
+ // Create a new builder and parse the transaction
345
+ const rebuilder = getBuilder(coinName);
346
+ rebuilder.from(txHex);
347
+ const rebuiltTx = await rebuilder.build();
348
+ should_1.default.equal(rebuiltTx.type, sdk_core_1.TransactionType.FlushERC1155);
349
+ const txJson = rebuiltTx.toJson();
350
+ should_1.default.equal(txJson.to, forwarderAddress);
351
+ should_1.default.exist(txJson.data);
352
+ txJson.data.should.startWith('0x8972c17c');
353
+ });
354
+ it('should decode flush ERC1155 transaction from raw tx with version < v4', async () => {
355
+ const forwarderAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
356
+ const contractAddress = '0x9e2c5712ab4caf402a98c4bf58c79a0dfe718ad1';
357
+ const tokenAddress = '0xdf7decb1baa8f529f0c8982cbb4be50357195299';
358
+ const tokenId = '7777';
359
+ // Build a transaction first
360
+ txBuilder.type(sdk_core_1.TransactionType.FlushERC1155);
361
+ txBuilder.contract(contractAddress);
362
+ txBuilder.tokenAddress(tokenAddress);
363
+ txBuilder.forwarderAddress(forwarderAddress);
364
+ txBuilder.tokenId(tokenId);
365
+ txBuilder.forwarderVersion(1);
366
+ const builtTx = await txBuilder.build();
367
+ const txHex = builtTx.toBroadcastFormat();
368
+ // Create a new builder and parse the transaction
369
+ const rebuilder = getBuilder(coinName);
370
+ rebuilder.from(txHex);
371
+ const rebuiltTx = await rebuilder.build();
372
+ should_1.default.equal(rebuiltTx.type, sdk_core_1.TransactionType.FlushERC1155);
373
+ const txJson = rebuiltTx.toJson();
374
+ should_1.default.equal(txJson.to, contractAddress);
375
+ should_1.default.exist(txJson.data);
376
+ txJson.data.should.startWith('0xe6bd0aa4');
377
+ });
378
+ });
379
+ });
380
+ }
381
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2hOZnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL2ZsdXNoTmZ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBSUEsNENBdWNDO0FBM2NELG1EQUF1RDtBQUN2RCxvREFBNEI7QUFHNUIsU0FBZ0IsZ0JBQWdCLENBQUMsUUFBZ0IsRUFBRSxVQUFVO0lBQzNELFFBQVEsQ0FBQyxHQUFHLFFBQVEsaUNBQWlDLEVBQUUsR0FBRyxFQUFFO1FBQzFELElBQUksU0FBNkIsQ0FBQztRQUVsQyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsU0FBUyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQXVCLENBQUM7WUFDdkQsU0FBUyxDQUFDLEdBQUcsQ0FBQztnQkFDWixHQUFHLEVBQUUsWUFBWTtnQkFDakIsUUFBUSxFQUFFLFFBQVE7YUFDbkIsQ0FBQyxDQUFDO1lBQ0gsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFO1lBQzVCLEVBQUUsQ0FBQywyREFBMkQsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDekUsTUFBTSxnQkFBZ0IsR0FBRyw0Q0FBNEMsQ0FBQztnQkFDdEUsTUFBTSxZQUFZLEdBQUcsNENBQTRDLENBQUM7Z0JBQ2xFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQztnQkFFeEIsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM1QyxTQUFTLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3JDLFNBQVMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3JDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUM3QyxTQUFTLENBQUMsZ0JBQWdCLENBQUMs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Z0JBQ3RCLE1BQU0sU0FBUyxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUUxQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzNELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFDekMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5GbHVzaE5mdFRlc3RzKGNvaW5OYW1lOiBzdHJpbmcsIGdldEJ1aWxkZXIpOiB2b2lkIHtcbiAgZGVzY3JpYmUoYCR7Y29pbk5hbWV9IHRyYW5zYWN0aW9uIGJ1aWxkZXIgZmx1c2ggTkZUc2AsICgpID0+IHtcbiAgICBsZXQgdHhCdWlsZGVyOiBUcmFuc2FjdGlvbkJ1aWxkZXI7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoY29pbk5hbWUpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgIHR4QnVpbGRlci5mZWUoe1xuICAgICAgICBmZWU6ICcxMDAwMDAwMDAwJyxcbiAgICAgICAgZ2FzTGltaXQ6ICcxMDAwMDAnLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdFUkM3MjEgRmx1c2gnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgZmx1c2ggRVJDNzIxIHRyYW5zYWN0aW9uIHdpdGggZm9yd2FyZGVyIHY0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgICBjb25zdCB0b2tlbklkID0gJzEyMzQ1JztcblxuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3MjEpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbkFkZHJlc3ModG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckFkZHJlc3MoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJWZXJzaW9uKDQpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5JZCh0b2tlbklkKTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzIxKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5leGlzdCh0eEpzb24uZGF0YSk7XG4gICAgICAgIHR4SnNvbi5kYXRhLnNob3VsZC5zdGFydFdpdGgoJzB4MTU5ZTQ0ZDcnKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi52YWx1ZSk7XG4gICAgICAgIHR4SnNvbi52YWx1ZS5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5nYXNMaW1pdCk7XG4gICAgICAgIHR4SnNvbi5nYXNMaW1pdC5zaG91bGQuZXF1YWwoJzEwMDAwMCcpO1xuICAgICAgICBzaG91bGQuZXhpc3QodHhKc29uLmdhc1ByaWNlKTtcbiAgICAgICAgdHhKc29uLmdhc1ByaWNlLnNob3VsZC5lcXVhbCgnMTAwMDAwMDAwMCcpO1xuXG4gICAgICAgIC8vIFZlcmlmeSB0aGUgZW5jb2RlZCBwYXJhbWV0ZXJzIGluIHRoZSBkYXRhXG4gICAgICAgIGNvbnN0IGVuY29kZWRUb2tlbkFkZHJlc3MgPSB0b2tlbkFkZHJlc3Muc2xpY2UoMikudG9Mb3dlckNhc2UoKS5wYWRTdGFydCg2NCwgJzAnKTtcbiAgICAgICAgY29uc3QgZW5jb2RlZFRva2VuSWQgPSBCaWdJbnQodG9rZW5JZCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDY0LCAnMCcpO1xuICAgICAgICB0eEpzb24uZGF0YS5zaG91bGQuY29udGFpbkVxbChlbmNvZGVkVG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLmNvbnRhaW5FcWwoZW5jb2RlZFRva2VuSWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSBmbHVzaCBFUkM3MjEgdHJhbnNhY3Rpb24gd2l0aCBmb3J3YXJkZXIgdmVyc2lvbiA8IHY0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgICBjb25zdCBjb250cmFjdEFkZHJlc3MgPSAnMHg5ZTJjNTcxMmFiNGNhZjQwMmE5OGM0YmY1OGM3OWEwZGZlNzE4YWQxJztcbiAgICAgICAgY29uc3QgdG9rZW5JZCA9ICc1NDMyMSc7XG5cbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzIxKTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KGNvbnRyYWN0QWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbkFkZHJlc3ModG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckFkZHJlc3MoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJWZXJzaW9uKDIpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5JZCh0b2tlbklkKTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzIxKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgY29udHJhY3RBZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5kYXRhKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLnN0YXJ0V2l0aCgnMHg1YTk1M2QwYScpOyAvLyBmbHVzaEVSQzcyMVRva2VucyBtZXRob2QgSUQgZm9yIHYyIGFuZCBiZWxvd1xuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLnZhbHVlLCAnMCcpO1xuXG4gICAgICAgIC8vIFZlcmlmeSB0aGUgZW5jb2RlZCBwYXJhbWV0ZXJzXG4gICAgICAgIGNvbnN0IGVuY29kZWRGb3J3YXJkZXJBZGRyZXNzID0gZm9yd2FyZGVyQWRkcmVzcy5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLnBhZFN0YXJ0KDY0LCAnMCcpO1xuICAgICAgICBjb25zdCBlbmNvZGVkVG9rZW5BZGRyZXNzID0gdG9rZW5BZGRyZXNzLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCkucGFkU3RhcnQoNjQsICcwJyk7XG4gICAgICAgIGNvbnN0IGVuY29kZWRUb2tlbklkID0gQmlnSW50KHRva2VuSWQpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg2NCwgJzAnKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLmNvbnRhaW5FcWwoZW5jb2RlZEZvcndhcmRlckFkZHJlc3MpO1xuICAgICAgICB0eEpzb24uZGF0YS5zaG91bGQuY29udGFpbkVxbChlbmNvZGVkVG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLmNvbnRhaW5FcWwoZW5jb2RlZFRva2VuSWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSBmbHVzaCBFUkM3MjEgd2l0aCBsYXJnZSB0b2tlbiBJRCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUnOyAvLyBtYXggdWludDI1NlxuXG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzcyMSk7XG4gICAgICAgIHR4QnVpbGRlci5jb250cmFjdChmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuQWRkcmVzcyh0b2tlbkFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyQWRkcmVzcyhmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlclZlcnNpb24oNCk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3MjEpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLnRvLCBmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5kYXRhKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLnN0YXJ0V2l0aCgnMHgxNTllNDRkNycpO1xuXG4gICAgICAgIC8vIFZlcmlmeSBsYXJnZSB0b2tlbiBJRCBpcyBwcm9wZXJseSBlbmNvZGVkXG4gICAgICAgIGNvbnN0IG1heFVpbnQyNTZIZXggPSAnZicucmVwZWF0KDY0KTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLmNvbnRhaW5FcWwobWF4VWludDI1NkhleCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBidWlsZCBmbHVzaCBFUkM3MjEgd2l0aCB0b2tlbiBJRCBhcyBzdHJpbmcgemVybycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgICAgY29uc3QgdG9rZW5JZCA9ICcwJztcblxuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3MjEpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbkFkZHJlc3ModG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckFkZHJlc3MoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJWZXJzaW9uKDQpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5JZCh0b2tlbklkKTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzIxKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5leGlzdCh0eEpzb24uZGF0YSk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHRva2VuIElEIDAgaXMgcHJvcGVybHkgZW5jb2RlZFxuICAgICAgICBjb25zdCBlbmNvZGVkWmVyb1Rva2VuSWQgPSAnMCcucGFkU3RhcnQoNjQsICcwJyk7XG4gICAgICAgIHR4SnNvbi5kYXRhLnNob3VsZC5jb250YWluRXFsKGVuY29kZWRaZXJvVG9rZW5JZCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGZsdXNoIEVSQzcyMSB3aXRob3V0IHRva2VuIGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMjM0NSc7XG5cbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzIxKTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KGZvcndhcmRlckFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5JZCh0b2tlbklkKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlclZlcnNpb24oNCk7XG5cbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyB0b2tlbiBhZGRyZXNzJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGZsdXNoIEVSQzcyMSB3aXRob3V0IHRva2VuIElEJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuXG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzcyMSk7XG4gICAgICAgIHR4QnVpbGRlci5jb250cmFjdChmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuQWRkcmVzcyh0b2tlbkFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyVmVyc2lvbig0KTtcblxuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdUb2tlbiBJRCBpcyByZXF1aXJlZCBmb3IgRVJDNzIxIGZsdXNoJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGZsdXNoIEVSQzcyMSB3aXRob3V0IGNvbnRyYWN0IGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgICBjb25zdCB0b2tlbklkID0gJzEyMzQ1JztcblxuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3MjEpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5BZGRyZXNzKHRva2VuQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyVmVyc2lvbig0KTtcblxuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGRlY29kZSBmbHVzaCBFUkM3MjEgdHJhbnNhY3Rpb24gZnJvbSByYXcgdHggd2l0aCB2NCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMjM0NSc7XG5cbiAgICAgICAgLy8gQnVpbGQgYSB0cmFuc2FjdGlvbiBmaXJzdFxuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3MjEpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJBZGRyZXNzKGZvcndhcmRlckFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5BZGRyZXNzKHRva2VuQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyVmVyc2lvbig0KTtcblxuICAgICAgICBjb25zdCBidWlsdFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SGV4ID0gYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBidWlsZGVyIGFuZCBwYXJzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICAgICAgY29uc3QgcmVidWlsZGVyID0gZ2V0QnVpbGRlcihjb2luTmFtZSkgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgICByZWJ1aWxkZXIuZnJvbSh0eEhleCk7XG4gICAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzIxKTtcbiAgICAgICAgY29uc3QgdHhKc29uID0gcmVidWlsdFR4LnRvSnNvbigpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLnRvLCBmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5kYXRhKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLnN0YXJ0V2l0aCgnMHgxNTllNDRkNycpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZGVjb2RlIGZsdXNoIEVSQzcyMSB0cmFuc2FjdGlvbiBmcm9tIHJhdyB0eCB3aXRoIHZlcnNpb24gPCB2NCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgICBjb25zdCBjb250cmFjdEFkZHJlc3MgPSAnMHg5ZTJjNTcxMmFiNGNhZjQwMmE5OGM0YmY1OGM3OWEwZGZlNzE4YWQxJztcbiAgICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICAgIGNvbnN0IHRva2VuSWQgPSAnOTk5OTknO1xuXG4gICAgICAgIC8vIEJ1aWxkIGEgdHJhbnNhY3Rpb24gZmlyc3RcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzIxKTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KGNvbnRyYWN0QWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbkFkZHJlc3ModG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckFkZHJlc3MoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyVmVyc2lvbigyKTtcblxuICAgICAgICBjb25zdCBidWlsdFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SGV4ID0gYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBidWlsZGVyIGFuZCBwYXJzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICAgICAgY29uc3QgcmVidWlsZGVyID0gZ2V0QnVpbGRlcihjb2luTmFtZSkgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgICByZWJ1aWxkZXIuZnJvbSh0eEhleCk7XG4gICAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzIxKTtcbiAgICAgICAgY29uc3QgdHhKc29uID0gcmVidWlsdFR4LnRvSnNvbigpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLnRvLCBjb250cmFjdEFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZXhpc3QodHhKc29uLmRhdGEpO1xuICAgICAgICB0eEpzb24uZGF0YS5zaG91bGQuc3RhcnRXaXRoKCcweDVhOTUzZDBhJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdFUkMxMTU1IEZsdXNoJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBidWlsZCBhIGZsdXNoIEVSQzExNTUgdHJhbnNhY3Rpb24gd2l0aCBmb3J3YXJkZXIgdjQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICAgIGNvbnN0IHRva2VuSWQgPSAnOTk5OTknO1xuXG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzExNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbkFkZHJlc3ModG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckFkZHJlc3MoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyVmVyc2lvbig0KTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDMTE1NSk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24udG8sIGZvcndhcmRlckFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZXhpc3QodHhKc29uLmRhdGEpO1xuICAgICAgICB0eEpzb24uZGF0YS5zaG91bGQuc3RhcnRXaXRoKCcweDg5NzJjMTdjJyk7IC8vIGZsdXNoRVJDMTE1NVRva2VucyB2NCBtZXRob2QgSURcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi52YWx1ZSk7XG4gICAgICAgIHR4SnNvbi52YWx1ZS5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5nYXNMaW1pdCk7XG4gICAgICAgIHR4SnNvbi5nYXNMaW1pdC5zaG91bGQuZXF1YWwoJzEwMDAwMCcpO1xuICAgICAgICBzaG91bGQuZXhpc3QodHhKc29uLmdhc1ByaWNlKTtcbiAgICAgICAgdHhKc29uLmdhc1ByaWNlLnNob3VsZC5lcXVhbCgnMTAwMDAwMDAwMCcpO1xuXG4gICAgICAgIC8vIFZlcmlmeSB0aGUgZW5jb2RlZCBwYXJhbWV0ZXJzIGluIHRoZSBkYXRhXG4gICAgICAgIGNvbnN0IGVuY29kZWRUb2tlbkFkZHJlc3MgPSB0b2tlbkFkZHJlc3Muc2xpY2UoMikudG9Mb3dlckNhc2UoKS5wYWRTdGFydCg2NCwgJzAnKTtcbiAgICAgICAgY29uc3QgZW5jb2RlZFRva2VuSWQgPSBCaWdJbnQodG9rZW5JZCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDY0LCAnMCcpO1xuICAgICAgICB0eEpzb24uZGF0YS5zaG91bGQuY29udGFpbkVxbChlbmNvZGVkVG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLmNvbnRhaW5FcWwoZW5jb2RlZFRva2VuSWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSBmbHVzaCBFUkMxMTU1IHRyYW5zYWN0aW9uIHdpdGggZm9yd2FyZGVyIHZlcnNpb24gPCB2NCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgICAgY29uc3QgY29udHJhY3RBZGRyZXNzID0gJzB4OWUyYzU3MTJhYjRjYWY0MDJhOThjNGJmNThjNzlhMGRmZTcxOGFkMSc7XG4gICAgICAgIGNvbnN0IHRva2VuSWQgPSAnNTU1JztcblxuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkMxMTU1KTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KGNvbnRyYWN0QWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbkFkZHJlc3ModG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlckFkZHJlc3MoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJWZXJzaW9uKDIpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5JZCh0b2tlbklkKTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDMTE1NSk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24udG8sIGNvbnRyYWN0QWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5leGlzdCh0eEpzb24uZGF0YSk7XG4gICAgICAgIHR4SnNvbi5kYXRhLnNob3VsZC5zdGFydFdpdGgoJzB4ZTZiZDBhYTQnKTsgLy8gZmx1c2hGb3J3YXJkZXJFUkMxMTU1VG9rZW5zIG1ldGhvZCBJRCBmb3IgdjMgYW5kIGJlbG93XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24udmFsdWUsICcwJyk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHRoZSBlbmNvZGVkIHBhcmFtZXRlcnNcbiAgICAgICAgY29uc3QgZW5jb2RlZEZvcndhcmRlckFkZHJlc3MgPSBmb3J3YXJkZXJBZGRyZXNzLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCkucGFkU3RhcnQoNjQsICcwJyk7XG4gICAgICAgIGNvbnN0IGVuY29kZWRUb2tlbkFkZHJlc3MgPSB0b2tlbkFkZHJlc3Muc2xpY2UoMikudG9Mb3dlckNhc2UoKS5wYWRTdGFydCg2NCwgJzAnKTtcbiAgICAgICAgY29uc3QgZW5jb2RlZFRva2VuSWQgPSBCaWdJbnQodG9rZW5JZCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDY0LCAnMCcpO1xuICAgICAgICB0eEpzb24uZGF0YS5zaG91bGQuY29udGFpbkVxbChlbmNvZGVkRm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4SnNvbi5kYXRhLnNob3VsZC5jb250YWluRXFsKGVuY29kZWRUb2tlbkFkZHJlc3MpO1xuICAgICAgICB0eEpzb24uZGF0YS5zaG91bGQuY29udGFpbkVxbChlbmNvZGVkVG9rZW5JZCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGZsdXNoIEVSQzExNTUgd2l0aG91dCB0b2tlbiBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICAgIGNvbnN0IHRva2VuSWQgPSAnOTk5OTknO1xuXG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzExNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyVmVyc2lvbig0KTtcblxuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIHRva2VuIGFkZHJlc3MnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgZmx1c2ggRVJDMTE1NSB3aXRob3V0IHRva2VuIElEJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuXG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzExNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbkFkZHJlc3ModG9rZW5BZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlclZlcnNpb24oNCk7XG5cbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnVG9rZW4gSUQgaXMgcmVxdWlyZWQgZm9yIEVSQzExNTUgZmx1c2gnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgZmx1c2ggRVJDMTE1NSB3aXRob3V0IGNvbnRyYWN0IGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgICBjb25zdCB0b2tlbklkID0gJzEyMzQ1JztcblxuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkMxMTU1KTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuQWRkcmVzcyh0b2tlbkFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5JZCh0b2tlbklkKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlclZlcnNpb24oNCk7XG5cbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBidWlsZCBmbHVzaCBFUkMxMTU1IHdpdGggdG9rZW4gSUQgYXMgc3RyaW5nIHplcm8nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICAgIGNvbnN0IHRva2VuSWQgPSAnMCc7XG5cbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDMTE1NSk7XG4gICAgICAgIHR4QnVpbGRlci5jb250cmFjdChmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuQWRkcmVzcyh0b2tlbkFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyQWRkcmVzcyhmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuSWQodG9rZW5JZCk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJWZXJzaW9uKDQpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkMxMTU1KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5leGlzdCh0eEpzb24uZGF0YSk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHRva2VuIElEIDAgaXMgcHJvcGVybHkgZW5jb2RlZFxuICAgICAgICBjb25zdCBlbmNvZGVkWmVyb1Rva2VuSWQgPSAnMCcucGFkU3RhcnQoNjQsICcwJyk7XG4gICAgICAgIHR4SnNvbi5kYXRhLnNob3VsZC5jb250YWluRXFsKGVuY29kZWRaZXJvVG9rZW5JZCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbGFyZ2UgdG9rZW4gSURzIGZvciBFUkMxMTU1IHdpdGggdjQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gJzB4ZGY3ZGVjYjFiYWE4ZjUyOWYwYzg5ODJjYmI0YmU1MDM1NzE5NTI5OSc7XG4gICAgICAgIGNvbnN0IHRva2VuSWQgPSAnMTE1NzkyMDg5MjM3MzE2MTk1NDIzNTcwOTg1MDA4Njg3OTA3ODUzMjY5OTg0NjY1NjQwNTY0MDM5NDU3NTg0MDA3OTEzMTI5NjM5OTM1JzsgLy8gbWF4IHVpbnQyNTZcblxuICAgICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkMxMTU1KTtcbiAgICAgICAgdHhCdWlsZGVyLmNvbnRyYWN0KGZvcndhcmRlckFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyQWRkcmVzcyhmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuQWRkcmVzcyh0b2tlbkFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5JZCh0b2tlbklkKTtcbiAgICAgICAgdHhCdWlsZGVyLmZvcndhcmRlclZlcnNpb24oNCk7XG5cbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzExNTUpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLnRvLCBmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5kYXRhKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLnN0YXJ0V2l0aCgnMHg4OTcyYzE3YycpO1xuXG4gICAgICAgIC8vIFZlcmlmeSBsYXJnZSB0b2tlbiBJRCBpcyBwcm9wZXJseSBlbmNvZGVkXG4gICAgICAgIGNvbnN0IG1heFVpbnQyNTZIZXggPSAnZicucmVwZWF0KDY0KTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLmNvbnRhaW5FcWwobWF4VWludDI1NkhleCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbGFyZ2UgdG9rZW4gSURzIGZvciBFUkMxMTU1IHdpdGggdmVyc2lvbiA8IHY0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICAgIGNvbnN0IGNvbnRyYWN0QWRkcmVzcyA9ICcweDllMmM1NzEyYWI0Y2FmNDAyYTk4YzRiZjU4Yzc5YTBkZmU3MThhZDEnO1xuICAgICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgICAgY29uc3QgdG9rZW5JZCA9ICcxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUnOyAvLyBtYXggdWludDI1NlxuXG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzExNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoY29udHJhY3RBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuQWRkcmVzcyh0b2tlbkFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyQWRkcmVzcyhmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuSWQodG9rZW5JZCk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJWZXJzaW9uKDIpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkMxMTU1KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgY29udHJhY3RBZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5kYXRhKTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLnN0YXJ0V2l0aCgnMHhlNmJkMGFhNCcpO1xuXG4gICAgICAgIC8vIFZlcmlmeSBsYXJnZSB0b2tlbiBJRCBpcyBwcm9wZXJseSBlbmNvZGVkXG4gICAgICAgIGNvbnN0IG1heFVpbnQyNTZIZXggPSAnZicucmVwZWF0KDY0KTtcbiAgICAgICAgdHhKc29uLmRhdGEuc2hvdWxkLmNvbnRhaW5FcWwobWF4VWludDI1NkhleCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBkZWNvZGUgZmx1c2ggRVJDMTE1NSB0cmFuc2FjdGlvbiBmcm9tIHJhdyB0eCB3aXRoIHY0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9ICcweGRmN2RlY2IxYmFhOGY1MjlmMGM4OTgyY2JiNGJlNTAzNTcxOTUyOTknO1xuICAgICAgICBjb25zdCB0b2tlbklkID0gJzk5OTk5JztcblxuICAgICAgICAvLyBCdWlsZCBhIHRyYW5zYWN0aW9uIGZpcnN0XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzExNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJBZGRyZXNzKGZvcndhcmRlckFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIudG9rZW5BZGRyZXNzKHRva2VuQWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50b2tlbklkKHRva2VuSWQpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyVmVyc2lvbig0KTtcblxuICAgICAgICBjb25zdCBidWlsdFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SGV4ID0gYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBidWlsZGVyIGFuZCBwYXJzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICAgICAgY29uc3QgcmVidWlsZGVyID0gZ2V0QnVpbGRlcihjb2luTmFtZSkgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgICByZWJ1aWxkZXIuZnJvbSh0eEhleCk7XG4gICAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDMTE1NSk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHJlYnVpbHRUeC50b0pzb24oKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgZm9yd2FyZGVyQWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5leGlzdCh0eEpzb24uZGF0YSk7XG4gICAgICAgIHR4SnNvbi5kYXRhLnNob3VsZC5zdGFydFdpdGgoJzB4ODk3MmMxN2MnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGRlY29kZSBmbHVzaCBFUkMxMTU1IHRyYW5zYWN0aW9uIGZyb20gcmF3IHR4IHdpdGggdmVyc2lvbiA8IHY0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmb3J3YXJkZXJBZGRyZXNzID0gJzB4OGY5NzdlOTEyZWY1MDA1NDhhMGMzYmU2ZGRkZTk4OTlmMTE5OWI4MSc7XG4gICAgICAgIGNvbnN0IGNvbnRyYWN0QWRkcmVzcyA9ICcweDllMmM1NzEyYWI0Y2FmNDAyYTk4YzRiZjU4Yzc5YTBkZmU3MThhZDEnO1xuICAgICAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSAnMHhkZjdkZWNiMWJhYThmNTI5ZjBjODk4MmNiYjRiZTUwMzU3MTk1Mjk5JztcbiAgICAgICAgY29uc3QgdG9rZW5JZCA9ICc3Nzc3JztcblxuICAgICAgICAvLyBCdWlsZCBhIHRyYW5zYWN0aW9uIGZpcnN0XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzExNTUpO1xuICAgICAgICB0eEJ1aWxkZXIuY29udHJhY3QoY29udHJhY3RBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuQWRkcmVzcyh0b2tlbkFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuZm9yd2FyZGVyQWRkcmVzcyhmb3J3YXJkZXJBZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnRva2VuSWQodG9rZW5JZCk7XG4gICAgICAgIHR4QnVpbGRlci5mb3J3YXJkZXJWZXJzaW9uKDEpO1xuXG4gICAgICAgIGNvbnN0IGJ1aWx0VHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QgdHhIZXggPSBidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGJ1aWxkZXIgYW5kIHBhcnNlIHRoZSB0cmFuc2FjdGlvblxuICAgICAgICBjb25zdCByZWJ1aWxkZXIgPSBnZXRCdWlsZGVyKGNvaW5OYW1lKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICAgIHJlYnVpbGRlci5mcm9tKHR4SGV4KTtcbiAgICAgICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgcmVidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHJlYnVpbHRUeC50eXBlLCBUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkMxMTU1KTtcbiAgICAgICAgY29uc3QgdHhKc29uID0gcmVidWlsdFR4LnRvSnNvbigpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLnRvLCBjb250cmFjdEFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZXhpc3QodHhKc29uLmRhdGEpO1xuICAgICAgICB0eEpzb24uZGF0YS5zaG91bGQuc3RhcnRXaXRoKCcweGU2YmQwYWE0Jyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ export * from './addressInitialization';
2
+ export * from './send';
3
+ export * from './walletInitialization';
4
+ export * from './flushNft';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,QAAQ,CAAC;AACvB,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC"}