@bitgo-beta/sdk-coin-sui 3.0.3-beta.202 → 3.0.3-beta.2021

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 (197) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +7 -2
  4. package/dist/src/lib/compareTransactionBlocks.js +2 -3
  5. package/dist/src/lib/constants.d.ts +9 -2
  6. package/dist/src/lib/constants.d.ts.map +1 -1
  7. package/dist/src/lib/constants.js +18 -2
  8. package/dist/src/lib/customTransaction.js +3 -3
  9. package/dist/src/lib/customTransactionBuilder.js +5 -5
  10. package/dist/src/lib/iface.d.ts +80 -12
  11. package/dist/src/lib/iface.d.ts.map +1 -1
  12. package/dist/src/lib/iface.js +34 -5
  13. package/dist/src/lib/index.d.ts +6 -0
  14. package/dist/src/lib/index.d.ts.map +1 -1
  15. package/dist/src/lib/index.js +36 -10
  16. package/dist/src/lib/keyPair.js +24 -10
  17. package/dist/src/lib/mystenlab/builder/Inputs.d.ts +64 -11
  18. package/dist/src/lib/mystenlab/builder/Inputs.d.ts.map +1 -1
  19. package/dist/src/lib/mystenlab/builder/Inputs.js +63 -19
  20. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts +88 -355
  21. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts.map +1 -1
  22. package/dist/src/lib/mystenlab/builder/TransactionBlock.js +44 -25
  23. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts +152 -77
  24. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts.map +1 -1
  25. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.js +54 -44
  26. package/dist/src/lib/mystenlab/builder/Transactions.d.ts +133 -188
  27. package/dist/src/lib/mystenlab/builder/Transactions.d.ts.map +1 -1
  28. package/dist/src/lib/mystenlab/builder/Transactions.js +52 -53
  29. package/dist/src/lib/mystenlab/builder/bcs.d.ts +1 -1
  30. package/dist/src/lib/mystenlab/builder/bcs.d.ts.map +1 -1
  31. package/dist/src/lib/mystenlab/builder/bcs.js +2 -2
  32. package/dist/src/lib/mystenlab/builder/index.js +6 -2
  33. package/dist/src/lib/mystenlab/builder/serializer.js +6 -8
  34. package/dist/src/lib/mystenlab/builder/utils.d.ts +1 -1
  35. package/dist/src/lib/mystenlab/builder/utils.d.ts.map +1 -1
  36. package/dist/src/lib/mystenlab/builder/utils.js +4 -4
  37. package/dist/src/lib/mystenlab/cryptography/hash.js +3 -4
  38. package/dist/src/lib/mystenlab/framework/framework.d.ts +6 -6
  39. package/dist/src/lib/mystenlab/framework/framework.d.ts.map +1 -1
  40. package/dist/src/lib/mystenlab/framework/framework.js +22 -25
  41. package/dist/src/lib/mystenlab/framework/index.js +6 -2
  42. package/dist/src/lib/mystenlab/framework/sui-system-state.js +2 -2
  43. package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.js +2 -2
  44. package/dist/src/lib/mystenlab/types/coin.d.ts +17 -15
  45. package/dist/src/lib/mystenlab/types/coin.d.ts.map +1 -1
  46. package/dist/src/lib/mystenlab/types/coin.js +20 -19
  47. package/dist/src/lib/mystenlab/types/common.d.ts +8 -8
  48. package/dist/src/lib/mystenlab/types/common.d.ts.map +1 -1
  49. package/dist/src/lib/mystenlab/types/common.js +22 -22
  50. package/dist/src/lib/mystenlab/types/events.d.ts +15 -15
  51. package/dist/src/lib/mystenlab/types/events.d.ts.map +1 -1
  52. package/dist/src/lib/mystenlab/types/events.js +17 -17
  53. package/dist/src/lib/mystenlab/types/index.js +6 -2
  54. package/dist/src/lib/mystenlab/types/normalized.d.ts +21 -21
  55. package/dist/src/lib/mystenlab/types/normalized.d.ts.map +1 -1
  56. package/dist/src/lib/mystenlab/types/normalized.js +41 -41
  57. package/dist/src/lib/mystenlab/types/objects.d.ts +51 -51
  58. package/dist/src/lib/mystenlab/types/objects.d.ts.map +1 -1
  59. package/dist/src/lib/mystenlab/types/objects.js +96 -106
  60. package/dist/src/lib/mystenlab/types/option.d.ts +1 -1
  61. package/dist/src/lib/mystenlab/types/option.d.ts.map +1 -1
  62. package/dist/src/lib/mystenlab/types/option.js +2 -3
  63. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts +55 -29
  64. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts.map +1 -1
  65. package/dist/src/lib/mystenlab/types/sui-bcs.js +29 -5
  66. package/dist/src/lib/mystenlab/types/transactions.d.ts +625 -625
  67. package/dist/src/lib/mystenlab/types/transactions.d.ts.map +1 -1
  68. package/dist/src/lib/mystenlab/types/transactions.js +178 -194
  69. package/dist/src/lib/mystenlab/types/validator.d.ts +13 -13
  70. package/dist/src/lib/mystenlab/types/validator.d.ts.map +1 -1
  71. package/dist/src/lib/mystenlab/types/validator.js +124 -124
  72. package/dist/src/lib/resources/walrusConfig.d.ts +22 -0
  73. package/dist/src/lib/resources/walrusConfig.d.ts.map +1 -0
  74. package/dist/src/lib/resources/walrusConfig.js +37 -0
  75. package/dist/src/lib/rpcClient.d.ts +5 -0
  76. package/dist/src/lib/rpcClient.d.ts.map +1 -0
  77. package/dist/src/lib/rpcClient.js +74 -0
  78. package/dist/src/lib/stakingBuilder.d.ts +10 -0
  79. package/dist/src/lib/stakingBuilder.d.ts.map +1 -1
  80. package/dist/src/lib/stakingBuilder.js +59 -7
  81. package/dist/src/lib/stakingTransaction.d.ts +0 -1
  82. package/dist/src/lib/stakingTransaction.d.ts.map +1 -1
  83. package/dist/src/lib/stakingTransaction.js +36 -18
  84. package/dist/src/lib/tokenTransferBuilder.d.ts +93 -0
  85. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  86. package/dist/src/lib/tokenTransferBuilder.js +266 -0
  87. package/dist/src/lib/tokenTransferTransaction.d.ts +59 -0
  88. package/dist/src/lib/tokenTransferTransaction.d.ts.map +1 -0
  89. package/dist/src/lib/tokenTransferTransaction.js +272 -0
  90. package/dist/src/lib/transaction.d.ts +21 -4
  91. package/dist/src/lib/transaction.d.ts.map +1 -1
  92. package/dist/src/lib/transaction.js +144 -17
  93. package/dist/src/lib/transactionBuilder.d.ts +13 -4
  94. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  95. package/dist/src/lib/transactionBuilder.js +34 -4
  96. package/dist/src/lib/transactionBuilderFactory.d.ts +11 -2
  97. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  98. package/dist/src/lib/transactionBuilderFactory.js +32 -1
  99. package/dist/src/lib/transferBuilder.d.ts +58 -1
  100. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  101. package/dist/src/lib/transferBuilder.js +310 -24
  102. package/dist/src/lib/transferTransaction.d.ts +6 -1
  103. package/dist/src/lib/transferTransaction.d.ts.map +1 -1
  104. package/dist/src/lib/transferTransaction.js +129 -12
  105. package/dist/src/lib/unstakingBuilder.js +6 -6
  106. package/dist/src/lib/unstakingTransaction.d.ts +0 -1
  107. package/dist/src/lib/unstakingTransaction.d.ts.map +1 -1
  108. package/dist/src/lib/unstakingTransaction.js +31 -17
  109. package/dist/src/lib/utils.d.ts +24 -3
  110. package/dist/src/lib/utils.d.ts.map +1 -1
  111. package/dist/src/lib/utils.js +295 -22
  112. package/dist/src/lib/walrusStakingBuilder.d.ts +77 -0
  113. package/dist/src/lib/walrusStakingBuilder.d.ts.map +1 -0
  114. package/dist/src/lib/walrusStakingBuilder.js +276 -0
  115. package/dist/src/lib/walrusStakingTransaction.d.ts +52 -0
  116. package/dist/src/lib/walrusStakingTransaction.d.ts.map +1 -0
  117. package/dist/src/lib/walrusStakingTransaction.js +289 -0
  118. package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts +36 -0
  119. package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts.map +1 -0
  120. package/dist/src/lib/walrusWithdrawStakeBuilder.js +177 -0
  121. package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts +21 -0
  122. package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts.map +1 -0
  123. package/dist/src/lib/walrusWithdrawStakeTransaction.js +190 -0
  124. package/dist/src/register.d.ts.map +1 -1
  125. package/dist/src/register.js +5 -1
  126. package/dist/src/sui.d.ts +58 -8
  127. package/dist/src/sui.d.ts.map +1 -1
  128. package/dist/src/sui.js +538 -37
  129. package/dist/src/suiToken.d.ts +22 -0
  130. package/dist/src/suiToken.d.ts.map +1 -0
  131. package/dist/src/suiToken.js +61 -0
  132. package/dist/src/tsui.js +1 -1
  133. package/dist/test/integration/index.d.ts +1 -0
  134. package/dist/test/integration/index.d.ts.map +1 -0
  135. package/dist/test/integration/index.js +1 -0
  136. package/dist/test/local_fullnode/RpcClient.d.ts +60 -0
  137. package/dist/test/local_fullnode/RpcClient.d.ts.map +1 -0
  138. package/dist/test/local_fullnode/RpcClient.js +111 -0
  139. package/dist/test/local_fullnode/faucet.d.ts +6 -0
  140. package/dist/test/local_fullnode/faucet.d.ts.map +1 -0
  141. package/dist/test/local_fullnode/faucet.js +17 -0
  142. package/dist/test/local_fullnode/transactions.d.ts +2 -0
  143. package/dist/test/local_fullnode/transactions.d.ts.map +1 -0
  144. package/dist/test/local_fullnode/transactions.js +190 -0
  145. package/dist/test/resources/sui.d.ts +458 -0
  146. package/dist/test/resources/sui.d.ts.map +1 -0
  147. package/dist/test/resources/sui.js +632 -0
  148. package/dist/test/unit/compareTransactionBlocks.d.ts +2 -0
  149. package/dist/test/unit/compareTransactionBlocks.d.ts.map +1 -0
  150. package/dist/test/unit/compareTransactionBlocks.js +64 -0
  151. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  152. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  153. package/dist/test/unit/getBuilderFactory.js +10 -0
  154. package/dist/test/unit/keyPair.d.ts +2 -0
  155. package/dist/test/unit/keyPair.d.ts.map +1 -0
  156. package/dist/test/unit/keyPair.js +72 -0
  157. package/dist/test/unit/sui.d.ts +2 -0
  158. package/dist/test/unit/sui.d.ts.map +1 -0
  159. package/dist/test/unit/sui.js +2747 -0
  160. package/dist/test/unit/suiToken.d.ts +2 -0
  161. package/dist/test/unit/suiToken.d.ts.map +1 -0
  162. package/dist/test/unit/suiToken.js +39 -0
  163. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts +2 -0
  164. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
  165. package/dist/test/unit/transactionBuilder/customTransactionBuilder.js +106 -0
  166. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
  167. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
  168. package/dist/test/unit/transactionBuilder/stakingBuilder.js +294 -0
  169. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  170. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  171. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +431 -0
  172. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  173. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  174. package/dist/test/unit/transactionBuilder/transactionBuilder.js +639 -0
  175. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  176. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  177. package/dist/test/unit/transactionBuilder/transferBuilder.js +1181 -0
  178. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts +2 -0
  179. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts.map +1 -0
  180. package/dist/test/unit/transactionBuilder/unstakingBuilder.js +115 -0
  181. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts +2 -0
  182. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts.map +1 -0
  183. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.js +289 -0
  184. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts +2 -0
  185. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts.map +1 -0
  186. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.js +250 -0
  187. package/dist/test/unit/transferTransaction.d.ts +2 -0
  188. package/dist/test/unit/transferTransaction.d.ts.map +1 -0
  189. package/dist/test/unit/transferTransaction.js +94 -0
  190. package/dist/test/unit/utils.d.ts +2 -0
  191. package/dist/test/unit/utils.d.ts.map +1 -0
  192. package/dist/test/unit/utils.js +186 -0
  193. package/dist/tsconfig.tsbuildinfo +1 -0
  194. package/package.json +16 -12
  195. package/.eslintignore +0 -6
  196. package/.mocharc.yml +0 -7
  197. package/CHANGELOG.md +0 -465
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=suiToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suiToken.d.ts","sourceRoot":"","sources":["../../../test/unit/suiToken.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("should");
4
+ const sdk_test_1 = require("@bitgo-beta/sdk-test");
5
+ const sdk_api_1 = require("@bitgo-beta/sdk-api");
6
+ const src_1 = require("../../src");
7
+ describe('Sui Tokens', function () {
8
+ let bitgo;
9
+ let suiTokenCoin;
10
+ const tokenName = 'tsui:deep';
11
+ before(function () {
12
+ bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
13
+ src_1.SuiToken.createTokenConstructors().forEach(({ name, coinConstructor }) => {
14
+ bitgo.safeRegister(name, coinConstructor);
15
+ });
16
+ bitgo.initializeTestVars();
17
+ suiTokenCoin = bitgo.coin(tokenName);
18
+ });
19
+ it('should return constants', function () {
20
+ suiTokenCoin.getChain().should.equal(tokenName);
21
+ suiTokenCoin.getBaseChain().should.equal('tsui');
22
+ suiTokenCoin.getFullName().should.equal('Sui Token');
23
+ suiTokenCoin.getBaseFactor().should.equal(1e6);
24
+ suiTokenCoin.type.should.equal(tokenName);
25
+ suiTokenCoin.name.should.equal('Deepbook');
26
+ suiTokenCoin.coin.should.equal('tsui');
27
+ suiTokenCoin.network.should.equal('Testnet');
28
+ suiTokenCoin.decimalPlaces.should.equal(6);
29
+ suiTokenCoin.packageId.should.equal('0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8');
30
+ suiTokenCoin.module.should.equal('deep');
31
+ suiTokenCoin.symbol.should.equal('DEEP');
32
+ suiTokenCoin.contractAddress.should.equal('0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP');
33
+ const [packageId, module, symbol] = suiTokenCoin.contractAddress.split('::');
34
+ packageId.should.equal(suiTokenCoin.packageId);
35
+ module.should.equal(suiTokenCoin.module);
36
+ symbol.should.equal(suiTokenCoin.symbol);
37
+ });
38
+ });
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VpVG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvc3VpVG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQkFBZ0I7QUFFaEIsbURBQStEO0FBQy9ELGlEQUErQztBQUMvQyxtQ0FBcUM7QUFFckMsUUFBUSxDQUFDLFlBQVksRUFBRTtJQUNyQixJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxZQUFZLENBQUM7SUFDakIsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDO0lBRTlCLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEQsY0FBUSxDQUFDLHVCQUF1QixFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRTtZQUN2RSxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLFlBQVksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHlCQUF5QixFQUFFO1FBQzVCLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hELFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0MsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QyxZQUFZLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7UUFDMUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxZQUFZLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ3ZDLGdGQUFnRixDQUNqRixDQUFDO1FBQ0YsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0UsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0MsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc2hvdWxkJztcblxuaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1hcGknO1xuaW1wb3J0IHsgU3VpVG9rZW4gfSBmcm9tICcuLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnU3VpIFRva2VucycsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBzdWlUb2tlbkNvaW47XG4gIGNvbnN0IHRva2VuTmFtZSA9ICd0c3VpOmRlZXAnO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAndGVzdCcgfSk7XG4gICAgU3VpVG9rZW4uY3JlYXRlVG9rZW5Db25zdHJ1Y3RvcnMoKS5mb3JFYWNoKCh7IG5hbWUsIGNvaW5Db25zdHJ1Y3RvciB9KSA9PiB7XG4gICAgICBiaXRnby5zYWZlUmVnaXN0ZXIobmFtZSwgY29pbkNvbnN0cnVjdG9yKTtcbiAgICB9KTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBzdWlUb2tlbkNvaW4gPSBiaXRnby5jb2luKHRva2VuTmFtZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIGNvbnN0YW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICBzdWlUb2tlbkNvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwodG9rZW5OYW1lKTtcbiAgICBzdWlUb2tlbkNvaW4uZ2V0QmFzZUNoYWluKCkuc2hvdWxkLmVxdWFsKCd0c3VpJyk7XG4gICAgc3VpVG9rZW5Db2luLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdTdWkgVG9rZW4nKTtcbiAgICBzdWlUb2tlbkNvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTYpO1xuICAgIHN1aVRva2VuQ29pbi50eXBlLnNob3VsZC5lcXVhbCh0b2tlbk5hbWUpO1xuICAgIHN1aVRva2VuQ29pbi5uYW1lLnNob3VsZC5lcXVhbCgnRGVlcGJvb2snKTtcbiAgICBzdWlUb2tlbkNvaW4uY29pbi5zaG91bGQuZXF1YWwoJ3RzdWknKTtcbiAgICBzdWlUb2tlbkNvaW4ubmV0d29yay5zaG91bGQuZXF1YWwoJ1Rlc3RuZXQnKTtcbiAgICBzdWlUb2tlbkNvaW4uZGVjaW1hbFBsYWNlcy5zaG91bGQuZXF1YWwoNik7XG4gICAgc3VpVG9rZW5Db2luLnBhY2thZ2VJZC5zaG91bGQuZXF1YWwoJzB4MzZkYmVmODY2YTFkNjJiZjczMjg5ODlhMTBmYjJmMDdkNzY5ZjRlZTU4N2MwZGU0YTBhMjU2ZTU3ZTBhNThhOCcpO1xuICAgIHN1aVRva2VuQ29pbi5tb2R1bGUuc2hvdWxkLmVxdWFsKCdkZWVwJyk7XG4gICAgc3VpVG9rZW5Db2luLnN5bWJvbC5zaG91bGQuZXF1YWwoJ0RFRVAnKTtcbiAgICBzdWlUb2tlbkNvaW4uY29udHJhY3RBZGRyZXNzLnNob3VsZC5lcXVhbChcbiAgICAgICcweDM2ZGJlZjg2NmExZDYyYmY3MzI4OTg5YTEwZmIyZjA3ZDc2OWY0ZWU1ODdjMGRlNGEwYTI1NmU1N2UwYTU4YTg6OmRlZXA6OkRFRVAnXG4gICAgKTtcbiAgICBjb25zdCBbcGFja2FnZUlkLCBtb2R1bGUsIHN5bWJvbF0gPSBzdWlUb2tlbkNvaW4uY29udHJhY3RBZGRyZXNzLnNwbGl0KCc6OicpO1xuICAgIHBhY2thZ2VJZC5zaG91bGQuZXF1YWwoc3VpVG9rZW5Db2luLnBhY2thZ2VJZCk7XG4gICAgbW9kdWxlLnNob3VsZC5lcXVhbChzdWlUb2tlbkNvaW4ubW9kdWxlKTtcbiAgICBzeW1ib2wuc2hvdWxkLmVxdWFsKHN1aVRva2VuQ29pbi5zeW1ib2wpO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=customTransactionBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customTransactionBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/customTransactionBuilder.ts"],"names":[],"mappings":""}
@@ -0,0 +1,106 @@
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 statics_1 = require("@bitgo-beta/statics");
7
+ const customTransaction_1 = require("../../../src/lib/customTransaction");
8
+ const sui_1 = require("../../resources/sui");
9
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
10
+ const should_1 = __importDefault(require("should"));
11
+ const getBuilderFactory_1 = require("../getBuilderFactory");
12
+ const iface_1 = require("../../../src/lib/iface");
13
+ describe('Sui Custom Transaction Builder', () => {
14
+ const coinName = 'tsui';
15
+ const factory = (0, getBuilderFactory_1.getBuilderFactory)(coinName);
16
+ describe('Succeed', () => {
17
+ it('should build a custom tx from raw tx hex and explain tx', async function () {
18
+ const tx = new customTransaction_1.CustomTransaction(statics_1.coins.get('tsui'));
19
+ tx.fromRawTransaction(sui_1.CUSTOM_TX_STAKING_POOL_SPLIT);
20
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.CustomTx);
21
+ should_1.default.equal(tx.id, '3HzMxgn3F8WCL1J3Qrk9iLhPpDnGYcSnK36CJ78s7jKg');
22
+ should_1.default.equal(tx.inputs.length, 1);
23
+ should_1.default.equal(tx.inputs[0].address, '0x6c10d1bf12e4610da1d92ef15e6bc581e1d5e79db33024e8cc1e00c21f0c7ddf');
24
+ should_1.default.equal(tx.inputs[0].value, '5000000000');
25
+ should_1.default.equal(tx.inputs[0].coin, coinName);
26
+ should_1.default.equal(tx.outputs.length, 1);
27
+ should_1.default.equal(tx.outputs[0].address, '0x5be5ee85cf5825bd07df7bbe78f19bcaafd42e9e685fda1acf24233cd7b925a6');
28
+ should_1.default.equal(tx.outputs[0].value, '5000000000');
29
+ should_1.default.equal(tx.outputs[0].coin, coinName);
30
+ const txData = tx.getTxData();
31
+ should_1.default.equal(txData.sender, '0x6c10d1bf12e4610da1d92ef15e6bc581e1d5e79db33024e8cc1e00c21f0c7ddf');
32
+ should_1.default.equal(txData.expiration['None'], null);
33
+ should_1.default.equal(txData.gasData.budget, '1000000000');
34
+ should_1.default.equal(txData.kind.ProgrammableTransaction.inputs.length, 3);
35
+ should_1.default.equal(txData.kind.ProgrammableTransaction.transactions.length, 2);
36
+ const txJson = tx.toJson();
37
+ should_1.default.equal(txJson.sender, '0x6c10d1bf12e4610da1d92ef15e6bc581e1d5e79db33024e8cc1e00c21f0c7ddf');
38
+ should_1.default.equal(txJson.expiration['None'], null);
39
+ should_1.default.equal(txJson.gasData.budget, '1000000000');
40
+ should_1.default.equal(txJson.kind.ProgrammableTransaction.inputs.length, 3);
41
+ should_1.default.equal(txJson.kind.ProgrammableTransaction.transactions.length, 2);
42
+ const explainedTx = tx.explainTransaction();
43
+ should_1.default.equal(explainedTx.id, '3HzMxgn3F8WCL1J3Qrk9iLhPpDnGYcSnK36CJ78s7jKg');
44
+ should_1.default.equal(explainedTx.outputs.length, 1);
45
+ should_1.default.equal(explainedTx.outputs[0].address, '0x5be5ee85cf5825bd07df7bbe78f19bcaafd42e9e685fda1acf24233cd7b925a6');
46
+ should_1.default.equal(explainedTx.outputs[0].amount, '5000000000');
47
+ should_1.default.equal(explainedTx.outputAmount, '5000000000');
48
+ should_1.default.equal(explainedTx.fee.fee, '1000000000');
49
+ should_1.default.equal(explainedTx.type, sdk_core_1.TransactionType.CustomTx);
50
+ const recipients = tx.recipients;
51
+ should_1.default.equal(recipients.length, 1);
52
+ should_1.default.equal(recipients[0].address, '0x5be5ee85cf5825bd07df7bbe78f19bcaafd42e9e685fda1acf24233cd7b925a6');
53
+ });
54
+ it('should init builder from a custom tx', async function () {
55
+ const tx = new customTransaction_1.CustomTransaction(statics_1.coins.get('tsui'));
56
+ tx.fromRawTransaction(sui_1.CUSTOM_TX_STAKING_POOL_SPLIT);
57
+ const txBuilder = factory.getCustomTransactionBuilder();
58
+ txBuilder.initBuilder(tx);
59
+ const rebuiltTx = (await txBuilder.build());
60
+ should_1.default.equal(rebuiltTx.type, sdk_core_1.TransactionType.CustomTx);
61
+ should_1.default.equal(rebuiltTx.id, '3HzMxgn3F8WCL1J3Qrk9iLhPpDnGYcSnK36CJ78s7jKg');
62
+ should_1.default.equal(rebuiltTx.inputs.length, 1);
63
+ should_1.default.equal(rebuiltTx.inputs[0].address, '0x6c10d1bf12e4610da1d92ef15e6bc581e1d5e79db33024e8cc1e00c21f0c7ddf');
64
+ should_1.default.equal(rebuiltTx.inputs[0].value, '5000000000');
65
+ should_1.default.equal(rebuiltTx.inputs[0].coin, coinName);
66
+ should_1.default.equal(rebuiltTx.outputs.length, 1);
67
+ should_1.default.equal(rebuiltTx.outputs[0].address, '0x5be5ee85cf5825bd07df7bbe78f19bcaafd42e9e685fda1acf24233cd7b925a6');
68
+ should_1.default.equal(rebuiltTx.outputs[0].value, '5000000000');
69
+ should_1.default.equal(rebuiltTx.outputs[0].coin, coinName);
70
+ });
71
+ it('should build a tx with public_transfer function', async function () {
72
+ const tx = new customTransaction_1.CustomTransaction(statics_1.coins.get('tsui'));
73
+ tx.fromRawTransaction(sui_1.CUSTOM_TX_PUBLIC_TRANSFER);
74
+ should_1.default.equal(tx.suiTransaction.type, iface_1.SuiTransactionType.CustomTx);
75
+ const rawTx = tx.toBroadcastFormat();
76
+ should_1.default.equal(rawTx, sui_1.CUSTOM_TX_PUBLIC_TRANSFER);
77
+ should_1.default.equal(tx.id, 'FmsE5YgfTU2kiCfYmVE6Zmrow3JaXcA243tBjjNUmLex');
78
+ should_1.default.equal(tx.inputs[0].address, '0xce724b63fdfe875a7eeb425e42785c7c05be95bc4f00fbc5c6c75e0dc264abe2');
79
+ should_1.default.equal(tx.inputs[0].value, '20000000000');
80
+ should_1.default.equal(tx.inputs.length, 1);
81
+ should_1.default.equal(tx.outputs.length, 17);
82
+ should_1.default.equal(tx.recipients.length, 17);
83
+ should_1.default.equal(tx.recipients[0].address, '0x0f220421254dae4355a96b2ffb87ef46566c0918f8dd0e89a53c2ced4355cf12');
84
+ should_1.default.equal(tx.recipients[0].amount, '0');
85
+ should_1.default.equal(tx.recipients[0].data, 'unknown amount');
86
+ should_1.default.equal(tx.recipients[8].address, '0x8d3f38a4a4dfc6bd7bcfda4c9bff36ff89c4d5564672d85c533d86a2201b8158');
87
+ should_1.default.equal(tx.recipients[8].amount, '10000000000');
88
+ should_1.default.equal(tx.recipients[14].address, '0xe60d6acf56b10033f2e770807028978ef6896a5bb1da38b12ea68ebe20d11704');
89
+ should_1.default.equal(tx.recipients[14].amount, '10000000000');
90
+ });
91
+ it('should build a custom tx and serialize it and deserialize it', async function () {
92
+ const tx = new customTransaction_1.CustomTransaction(statics_1.coins.get('tsui'));
93
+ tx.fromRawTransaction(sui_1.CUSTOM_TX_STAKING_POOL_SPLIT);
94
+ should_1.default.equal(tx.suiTransaction.type, iface_1.SuiTransactionType.CustomTx);
95
+ const rawTx = tx.toBroadcastFormat();
96
+ should_1.default.equal(rawTx, sui_1.CUSTOM_TX_STAKING_POOL_SPLIT);
97
+ const deserialized = (await factory.from(rawTx).build());
98
+ should_1.default.deepEqual(deserialized, tx);
99
+ deserialized.toBroadcastFormat().should.equal(rawTx);
100
+ });
101
+ it('should reject a custom tx with unsupported txn type', async function () {
102
+ (0, should_1.default)(() => factory.from(sui_1.UNSUPPORTED_TX)).throwError('unsupported target method 0000000000000000000000000000000000000000000000000000000000000003::staking_pool::split_staked_sui');
103
+ });
104
+ });
105
+ });
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9jdXN0b21UcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpREFBNEM7QUFDNUMsMEVBQXVFO0FBQ3ZFLDZDQUE4RztBQUM5RyxtREFBdUQ7QUFDdkQsb0RBQTRCO0FBQzVCLDREQUF5RDtBQUV6RCxrREFBNEQ7QUFFNUQsUUFBUSxDQUFDLGdDQUFnQyxFQUFFLEdBQUcsRUFBRTtJQUM5QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUM7SUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBQSxxQ0FBaUIsRUFBQyxRQUFRLENBQUMsQ0FBQztJQUU1QyxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN2QixFQUFFLENBQUMseURBQXlELEVBQUUsS0FBSztZQUNqRSxNQUFNLEVBQUUsR0FBRyxJQUFJLHFDQUFpQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNwRCxFQUFFLENBQUMsa0JBQWtCLENBQUMsa0NBQTRCLENBQUMsQ0FBQztZQUNwRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSw4Q0FBOEMsQ0FBQyxDQUFDO1lBQ3BFLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLG9FQUFvRSxDQUFDLENBQUM7WUFDekcsZ0JBQU0sQ0FBQyxLQUFL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LFVBQVUsQ0FDbkQsNEhBQTRILENBQzdILENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgQ3VzdG9tVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL2N1c3RvbVRyYW5zYWN0aW9uJztcbmltcG9ydCB7IENVU1RPTV9UWF9QVUJMSUNfVFJBTlNGRVIsIENVU1RPTV9UWF9TVEFLSU5HX1BPT0xfU1BMSVQsIFVOU1VQUE9SVEVEX1RYIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3N1aSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uL2dldEJ1aWxkZXJGYWN0b3J5JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIGFzIFN1aVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IFN1aVRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvaWZhY2UnO1xuXG5kZXNjcmliZSgnU3VpIEN1c3RvbSBUcmFuc2FjdGlvbiBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBjb2luTmFtZSA9ICd0c3VpJztcbiAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KGNvaW5OYW1lKTtcblxuICBkZXNjcmliZSgnU3VjY2VlZCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgY3VzdG9tIHR4IGZyb20gcmF3IHR4IGhleCBhbmQgZXhwbGFpbiB0eCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IEN1c3RvbVRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHN1aScpKTtcbiAgICAgIHR4LmZyb21SYXdUcmFuc2FjdGlvbihDVVNUT01fVFhfU1RBS0lOR19QT09MX1NQTElUKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlkLCAnM0h6TXhnbjNGOFdDTDFKM1FyazlpTGhQcERuR1ljU25LMzZDSjc4czdqS2cnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHNbMF0uYWRkcmVzcywgJzB4NmMxMGQxYmYxMmU0NjEwZGExZDkyZWYxNWU2YmM1ODFlMWQ1ZTc5ZGIzMzAyNGU4Y2MxZTAwYzIxZjBjN2RkZicpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0c1swXS52YWx1ZSwgJzUwMDAwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHNbMF0uY29pbiwgY29pbk5hbWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5vdXRwdXRzWzBdLmFkZHJlc3MsICcweDViZTVlZTg1Y2Y1ODI1YmQwN2RmN2JiZTc4ZjE5YmNhYWZkNDJlOWU2ODVmZGExYWNmMjQyMzNjZDdiOTI1YTYnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5vdXRwdXRzWzBdLnZhbHVlLCAnNTAwMDAwMDAwMCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHNbMF0uY29pbiwgY29pbk5hbWUpO1xuXG4gICAgICBjb25zdCB0eERhdGEgPSB0eC5nZXRUeERhdGEoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eERhdGEuc2VuZGVyLCAnMHg2YzEwZDFiZjEyZTQ2MTBkYTFkOTJlZjE1ZTZiYzU4MWUxZDVlNzlkYjMzMDI0ZThjYzFlMDBjMjFmMGM3ZGRmJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHhEYXRhLmV4cGlyYXRpb25bJ05vbmUnXSwgbnVsbCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhEYXRhLmdhc0RhdGEuYnVkZ2V0LCAnMTAwMDAwMDAwMCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4RGF0YS5raW5kLlByb2dyYW1tYWJsZVRyYW5zYWN0aW9uLmlucHV0cy5sZW5ndGgsIDMpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4RGF0YS5raW5kLlByb2dyYW1tYWJsZVRyYW5zYWN0aW9uLnRyYW5zYWN0aW9ucy5sZW5ndGgsIDIpO1xuXG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uc2VuZGVyLCAnMHg2YzEwZDFiZjEyZTQ2MTBkYTFkOTJlZjE1ZTZiYzU4MWUxZDVlNzlkYjMzMDI0ZThjYzFlMDBjMjFmMGM3ZGRmJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmV4cGlyYXRpb25bJ05vbmUnXSwgbnVsbCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmdhc0RhdGEuYnVkZ2V0LCAnMTAwMDAwMDAwMCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5raW5kLlByb2dyYW1tYWJsZVRyYW5zYWN0aW9uLmlucHV0cy5sZW5ndGgsIDMpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5raW5kLlByb2dyYW1tYWJsZVRyYW5zYWN0aW9uLnRyYW5zYWN0aW9ucy5sZW5ndGgsIDIpO1xuXG4gICAgICBjb25zdCBleHBsYWluZWRUeCA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgc2hvdWxkLmVxdWFsKGV4cGxhaW5lZFR4LmlkLCAnM0h6TXhnbjNGOFdDTDFKM1FyazlpTGhQcERuR1ljU25LMzZDSjc4czdqS2cnKTtcbiAgICAgIHNob3VsZC5lcXVhbChleHBsYWluZWRUeC5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIGV4cGxhaW5lZFR4Lm91dHB1dHNbMF0uYWRkcmVzcyxcbiAgICAgICAgJzB4NWJlNWVlODVjZjU4MjViZDA3ZGY3YmJlNzhmMTliY2FhZmQ0MmU5ZTY4NWZkYTFhY2YyNDIzM2NkN2I5MjVhNidcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXF1YWwoZXhwbGFpbmVkVHgub3V0cHV0c1swXS5hbW91bnQsICc1MDAwMDAwMDAwJyk7XG4gICAgICBzaG91bGQuZXF1YWwoZXhwbGFpbmVkVHgub3V0cHV0QW1vdW50LCAnNTAwMDAwMDAwMCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKGV4cGxhaW5lZFR4LmZlZS5mZWUsICcxMDAwMDAwMDAwJyk7XG4gICAgICBzaG91bGQuZXF1YWwoZXhwbGFpbmVkVHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4KTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IHR4LnJlY2lwaWVudHM7XG4gICAgICBzaG91bGQuZXF1YWwocmVjaXBpZW50cy5sZW5ndGgsIDEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJlY2lwaWVudHNbMF0uYWRkcmVzcywgJzB4NWJlNWVlODVjZjU4MjViZDA3ZGY3YmJlNzhmMTliY2FhZmQ0MmU5ZTY4NWZkYTFhY2YyNDIzM2NkN2I5MjVhNicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbml0IGJ1aWxkZXIgZnJvbSBhIGN1c3RvbSB0eCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IEN1c3RvbVRyYW5zYWN0aW9uKGNvaW5zLmdldCgndHN1aScpKTtcbiAgICAgIHR4LmZyb21SYXdUcmFuc2FjdGlvbihDVVNUT01fVFhfU1RBS0lOR19QT09MX1NQTElUKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tVHJhbnNhY3Rpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgICAgY29uc3QgcmVidWlsdFR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBTdWlUcmFuc2FjdGlvbjxDdXN0b21UcmFuc2FjdGlvbj47XG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeCk7XG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4LmlkLCAnM0h6TXhnbjNGOFdDTDFKM1FyazlpTGhQcERuR1ljU25LMzZDSjc4czdqS2cnKTtcbiAgICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHguaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4LmlucHV0c1swXS5hZGRyZXNzLCAnMHg2YzEwZDFiZjEyZTQ2MTBkYTFkOTJlZjE1ZTZiYzU4MWUxZDVlNzlkYjMzMDI0ZThjYzFlMDBjMjFmMGM3ZGRmJyk7XG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4LmlucHV0c1swXS52YWx1ZSwgJzUwMDAwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHguaW5wdXRzWzBdLmNvaW4sIGNvaW5OYW1lKTtcbiAgICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHgub3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJlYnVpbHRUeC5vdXRwdXRzWzBdLmFkZHJlc3MsICcweDViZTVlZTg1Y2Y1ODI1YmQwN2RmN2JiZTc4ZjE5YmNhYWZkNDJlOWU2ODVmZGExYWNmMjQyMzNjZDdiOTI1YTYnKTtcbiAgICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHgub3V0cHV0c1swXS52YWx1ZSwgJzUwMDAwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHgub3V0cHV0c1swXS5jb2luLCBjb2luTmFtZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHggd2l0aCBwdWJsaWNfdHJhbnNmZXIgZnVuY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBDdXN0b21UcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RzdWknKSk7XG4gICAgICB0eC5mcm9tUmF3VHJhbnNhY3Rpb24oQ1VTVE9NX1RYX1BVQkxJQ19UUkFOU0ZFUik7XG4gICAgICBzaG91bGQuZXF1YWwodHguc3VpVHJhbnNhY3Rpb24udHlwZSwgU3VpVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4KTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgQ1VTVE9NX1RYX1BVQkxJQ19UUkFOU0ZFUik7XG4gICAgICBzaG91bGQuZXF1YWwodHguaWQsICdGbXNFNVlnZlRVMmtpQ2ZZbVZFNlptcm93M0phWGNBMjQzdEJqak5VbUxleCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0c1swXS5hZGRyZXNzLCAnMHhjZTcyNGI2M2ZkZmU4NzVhN2VlYjQyNWU0Mjc4NWM3YzA1YmU5NWJjNGYwMGZiYzVjNmM3NWUwZGMyNjRhYmUyJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaW5wdXRzWzBdLnZhbHVlLCAnMjAwMDAwMDAwMDAnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5vdXRwdXRzLmxlbmd0aCwgMTcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnJlY2lwaWVudHMubGVuZ3RoLCAxNyk7XG4gICAgICBzaG91bGQuZXF1YWwodHgucmVjaXBpZW50c1swXS5hZGRyZXNzLCAnMHgwZjIyMDQyMTI1NGRhZTQzNTVhOTZiMmZmYjg3ZWY0NjU2NmMwOTE4ZjhkZDBlODlhNTNjMmNlZDQzNTVjZjEyJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHgucmVjaXBpZW50c1swXS5hbW91bnQsICcwJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHgucmVjaXBpZW50c1swXS5kYXRhLCAndW5rbm93biBhbW91bnQnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5yZWNpcGllbnRzWzhdLmFkZHJlc3MsICcweDhkM2YzOGE0YTRkZmM2YmQ3YmNmZGE0YzliZmYzNmZmODljNGQ1NTY0NjcyZDg1YzUzM2Q4NmEyMjAxYjgxNTgnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5yZWNpcGllbnRzWzhdLmFtb3VudCwgJzEwMDAwMDAwMDAwJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHgucmVjaXBpZW50c1sxNF0uYWRkcmVzcywgJzB4ZTYwZDZhY2Y1NmIxMDAzM2YyZTc3MDgwNzAyODk3OGVmNjg5NmE1YmIxZGEzOGIxMmVhNjhlYmUyMGQxMTcwNCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnJlY2lwaWVudHNbMTRdLmFtb3VudCwgJzEwMDAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgY3VzdG9tIHR4IGFuZCBzZXJpYWxpemUgaXQgYW5kIGRlc2VyaWFsaXplIGl0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgQ3VzdG9tVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0c3VpJykpO1xuICAgICAgdHguZnJvbVJhd1RyYW5zYWN0aW9uKENVU1RPTV9UWF9TVEFLSU5HX1BPT0xfU1BMSVQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnN1aVRyYW5zYWN0aW9uLnR5cGUsIFN1aVRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIENVU1RPTV9UWF9TVEFLSU5HX1BPT0xfU1BMSVQpO1xuICAgICAgY29uc3QgZGVzZXJpYWxpemVkID0gKGF3YWl0IGZhY3RvcnkuZnJvbShyYXdUeCkuYnVpbGQoKSkgYXMgQ3VzdG9tVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKGRlc2VyaWFsaXplZCwgdHgpO1xuICAgICAgZGVzZXJpYWxpemVkLnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgY3VzdG9tIHR4IHdpdGggdW5zdXBwb3J0ZWQgdHhuIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQoKCkgPT4gZmFjdG9yeS5mcm9tKFVOU1VQUE9SVEVEX1RYKSkudGhyb3dFcnJvcihcbiAgICAgICAgJ3Vuc3VwcG9ydGVkIHRhcmdldCBtZXRob2QgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzo6c3Rha2luZ19wb29sOjpzcGxpdF9zdGFrZWRfc3VpJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stakingBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stakingBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/stakingBuilder.ts"],"names":[],"mappings":""}
@@ -0,0 +1,294 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const assert_1 = __importDefault(require("assert"));
40
+ const getBuilderFactory_1 = require("../getBuilderFactory");
41
+ const testData = __importStar(require("../../resources/sui"));
42
+ const should_1 = __importDefault(require("should"));
43
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
44
+ const utils_1 = __importDefault(require("../../../src/lib/utils"));
45
+ const transaction_1 = require("../../../src/lib/transaction");
46
+ const iface_1 = require("../../../src/lib/iface");
47
+ const constants_1 = require("../../../src/lib/constants");
48
+ describe('Sui Staking Builder', () => {
49
+ const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsui');
50
+ describe('Succeed', () => {
51
+ it('should build a staking tx', async function () {
52
+ const txBuilder = factory.getStakingBuilder();
53
+ txBuilder.type(iface_1.SuiTransactionType.AddStake);
54
+ txBuilder.sender(testData.sender.address);
55
+ txBuilder.stake([testData.requestAddStake]);
56
+ txBuilder.gasData(testData.gasData);
57
+ const tx = await txBuilder.build();
58
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingAdd);
59
+ tx.suiTransaction.gasData.payment.should.deepEqual(testData.coinsGasPayment);
60
+ tx.inputs.length.should.equal(1);
61
+ tx.inputs[0].should.deepEqual({
62
+ address: testData.sender.address,
63
+ value: testData.STAKING_AMOUNT.toString(),
64
+ coin: 'tsui',
65
+ });
66
+ tx.outputs.length.should.equal(1);
67
+ tx.outputs[0].should.deepEqual({
68
+ address: testData.requestAddStake.validatorAddress,
69
+ value: testData.requestAddStake.amount.toString(),
70
+ coin: 'tsui',
71
+ });
72
+ const rawTx = tx.toBroadcastFormat();
73
+ should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
74
+ should_1.default.equal(rawTx, testData.ADD_STAKE);
75
+ });
76
+ it('should build a staking tx with more than 255 input objects', async function () {
77
+ const numberOfPaymentObjects = 1000;
78
+ const txBuilder = factory.getStakingBuilder();
79
+ txBuilder.type(iface_1.SuiTransactionType.AddStake);
80
+ txBuilder.sender(testData.sender.address);
81
+ const gasData = {
82
+ ...testData.gasData,
83
+ payment: testData.generateObjects(numberOfPaymentObjects),
84
+ };
85
+ txBuilder.stake([testData.requestAddStake]);
86
+ txBuilder.gasData(gasData);
87
+ const tx = await txBuilder.build();
88
+ (0, assert_1.default)(tx instanceof transaction_1.Transaction);
89
+ tx.type.should.equal(sdk_core_1.TransactionType.StakingAdd);
90
+ tx.inputs.length.should.equal(1);
91
+ tx.inputs[0].should.deepEqual({
92
+ address: testData.sender.address,
93
+ value: testData.STAKING_AMOUNT.toString(),
94
+ coin: 'tsui',
95
+ });
96
+ tx.outputs.length.should.equal(1);
97
+ tx.outputs[0].should.deepEqual({
98
+ address: testData.requestAddStake.validatorAddress,
99
+ value: testData.requestAddStake.amount.toString(),
100
+ coin: 'tsui',
101
+ });
102
+ tx.suiTransaction.gasData.owner.should.equal(gasData.owner);
103
+ tx.suiTransaction.gasData.price.should.equal(gasData.price);
104
+ tx.suiTransaction.gasData.budget.should.equal(gasData.budget);
105
+ tx.suiTransaction.gasData.payment.length.should.equal(constants_1.MAX_GAS_OBJECTS - 1);
106
+ const programmableTx = tx.suiTransaction.tx;
107
+ // total objects - objects sent as gas payment
108
+ // + (staked amount object + SUI system state object + validator address = 3)
109
+ programmableTx.inputs.length.should.equal(numberOfPaymentObjects - (constants_1.MAX_GAS_OBJECTS - 1) + 3);
110
+ programmableTx.transactions[0].kind.should.equal('MergeCoins');
111
+ programmableTx.transactions[0].sources.length.should.equal(constants_1.MAX_COMMAND_ARGS - 1);
112
+ programmableTx.transactions[1].kind.should.equal('MergeCoins');
113
+ programmableTx.transactions[1].sources.length.should.equal(numberOfPaymentObjects - (constants_1.MAX_COMMAND_ARGS - 1) - (constants_1.MAX_GAS_OBJECTS - 1));
114
+ const rawTx = tx.toBroadcastFormat();
115
+ should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
116
+ const rebuilder = factory.from(rawTx);
117
+ rebuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
118
+ const rebuiltTx = await rebuilder.build();
119
+ rebuiltTx.toBroadcastFormat().should.equal(rawTx);
120
+ rebuiltTx.toJson().gasData.payment.length.should.equal(numberOfPaymentObjects);
121
+ });
122
+ });
123
+ describe('fundsInAddressBalance', () => {
124
+ const FUNDS_IN_ADDRESS_BALANCE = '5000000000'; // 5 SUI in MIST
125
+ it('should build AddStake with mixed coin objects + address balance (redeem → merge → split → add_stake)', async function () {
126
+ // When fundsInAddressBalance > 0, the PTB must insert redeem_funds + mergeCoins into gas
127
+ // coin BEFORE the splitCoins + request_add_stake commands, so the full balance is available.
128
+ const txBuilder = factory.getStakingBuilder();
129
+ txBuilder.type(iface_1.SuiTransactionType.AddStake);
130
+ txBuilder.sender(testData.sender.address);
131
+ txBuilder.stake([testData.requestAddStake]);
132
+ txBuilder.gasData(testData.gasData);
133
+ txBuilder.fundsInAddressBalance(FUNDS_IN_ADDRESS_BALANCE);
134
+ const tx = await txBuilder.build();
135
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingAdd);
136
+ const suiTx = tx;
137
+ // Expected PTB command sequence:
138
+ // 0: MoveCall(redeem_funds) — materialise Coin<SUI> from address balance
139
+ // 1: MergeCoins(gas, [addrCoin]) — merge address-balance coin into gas coin
140
+ // 2: SplitCoins(gas, [amount]) — split stake amount from gas coin
141
+ // 3: MoveCall(request_add_stake) — stake to validator
142
+ const cmds = suiTx.suiTransaction.tx.transactions;
143
+ cmds.length.should.equal(4, 'expected 4 commands: redeem, merge, split, add_stake');
144
+ cmds[0].kind.should.equal('MoveCall', 'command 0 must be MoveCall(redeem_funds)');
145
+ cmds[0].target.should.equal('0x2::coin::redeem_funds');
146
+ cmds[1].kind.should.equal('MergeCoins', 'command 1 must be MergeCoins(gas, [addrCoin])');
147
+ cmds[2].kind.should.equal('SplitCoins', 'command 2 must be SplitCoins(gas, [amount])');
148
+ cmds[3].kind.should.equal('MoveCall', 'command 3 must be MoveCall(request_add_stake)');
149
+ cmds[3].target.should.endWith('::sui_system::request_add_stake');
150
+ // fundsInAddressBalance must be persisted on the SuiTransaction
151
+ suiTx.suiTransaction.fundsInAddressBalance.should.equal(FUNDS_IN_ADDRESS_BALANCE);
152
+ // getStakeRequests must still correctly identify the request despite the extra commands
153
+ const requests = utils_1.default.getStakeRequests(suiTx.suiTransaction.tx);
154
+ requests.length.should.equal(1);
155
+ requests[0].validatorAddress.should.equal(testData.requestAddStake.validatorAddress);
156
+ requests[0].amount.should.equal(testData.requestAddStake.amount);
157
+ // toJson must emit fundsInAddressBalance
158
+ const json = tx.toJson();
159
+ json.fundsInAddressBalance.should.equal(FUNDS_IN_ADDRESS_BALANCE);
160
+ const rawTx = tx.toBroadcastFormat();
161
+ should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
162
+ });
163
+ it('should round-trip: build → serialize → initBuilder restores fundsInAddressBalance', async function () {
164
+ const txBuilder = factory.getStakingBuilder();
165
+ txBuilder.type(iface_1.SuiTransactionType.AddStake);
166
+ txBuilder.sender(testData.sender.address);
167
+ txBuilder.stake([testData.requestAddStake]);
168
+ txBuilder.gasData(testData.gasData);
169
+ txBuilder.fundsInAddressBalance(FUNDS_IN_ADDRESS_BALANCE);
170
+ const tx = await txBuilder.build();
171
+ const rawTx = tx.toBroadcastFormat();
172
+ should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
173
+ // Deserialize and rebuild
174
+ const rebuilder = factory.from(rawTx);
175
+ rebuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
176
+ const rebuiltTx = await rebuilder.build();
177
+ rebuiltTx.toBroadcastFormat().should.equal(rawTx);
178
+ // initBuilder must have restored fundsInAddressBalance
179
+ const rebuiltSuiTx = rebuiltTx;
180
+ rebuiltSuiTx.suiTransaction.fundsInAddressBalance.should.equal(FUNDS_IN_ADDRESS_BALANCE);
181
+ // stake requests must still be intact
182
+ const requests = utils_1.default.getStakeRequests(rebuiltSuiTx.suiTransaction.tx);
183
+ requests.length.should.equal(1);
184
+ requests[0].validatorAddress.should.equal(testData.requestAddStake.validatorAddress);
185
+ });
186
+ it('should build multiple stake requests with fundsInAddressBalance (multi-stake)', async function () {
187
+ const txBuilder = factory.getStakingBuilder();
188
+ txBuilder.type(iface_1.SuiTransactionType.AddStake);
189
+ txBuilder.sender(testData.sender.address);
190
+ txBuilder.stake(testData.requestAddStakeMany);
191
+ txBuilder.gasData(testData.gasData);
192
+ txBuilder.fundsInAddressBalance(FUNDS_IN_ADDRESS_BALANCE);
193
+ const tx = await txBuilder.build();
194
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingAdd);
195
+ const suiTx = tx;
196
+ const cmds = suiTx.suiTransaction.tx.transactions;
197
+ // Command sequence: redeem_funds, mergeCoins, then for each stake: splitCoins + request_add_stake
198
+ cmds[0].kind.should.equal('MoveCall', 'command 0 must be redeem_funds');
199
+ cmds[0].target.should.equal('0x2::coin::redeem_funds');
200
+ cmds[1].kind.should.equal('MergeCoins', 'command 1 must be mergeCoins');
201
+ const numStakes = testData.requestAddStakeMany.length;
202
+ // After redeem+merge, each stake adds 2 commands: splitCoins + MoveCall
203
+ cmds.length.should.equal(2 + numStakes * 2);
204
+ const requests = utils_1.default.getStakeRequests(suiTx.suiTransaction.tx);
205
+ requests.length.should.equal(numStakes);
206
+ for (let i = 0; i < numStakes; i++) {
207
+ requests[i].validatorAddress.should.equal(testData.requestAddStakeMany[i].validatorAddress);
208
+ requests[i].amount.should.equal(testData.requestAddStakeMany[i].amount);
209
+ }
210
+ });
211
+ it('should not insert redeem_funds when fundsInAddressBalance is 0 (default behavior unchanged)', async function () {
212
+ const txBuilder = factory.getStakingBuilder();
213
+ txBuilder.type(iface_1.SuiTransactionType.AddStake);
214
+ txBuilder.sender(testData.sender.address);
215
+ txBuilder.stake([testData.requestAddStake]);
216
+ txBuilder.gasData(testData.gasData);
217
+ // No fundsInAddressBalance call — default is 0
218
+ const tx = await txBuilder.build();
219
+ const suiTx = tx;
220
+ const cmds = suiTx.suiTransaction.tx.transactions;
221
+ // Original 2-command sequence: splitCoins + request_add_stake
222
+ cmds.length.should.equal(2);
223
+ cmds[0].kind.should.equal('SplitCoins');
224
+ cmds[1].kind.should.equal('MoveCall');
225
+ cmds[1].target.should.endWith('::sui_system::request_add_stake');
226
+ should_1.default.equal(suiTx.suiTransaction.fundsInAddressBalance, undefined);
227
+ });
228
+ it('should build Case 2 (addr-bal only, empty payment): redeem → merge → split → add_stake', async function () {
229
+ // Case 2: gasData.payment=[] — the stake amount comes entirely from address balance.
230
+ // SplitCoins(GasCoin) is unsafe with empty payment because GasCoin only carries up to
231
+ // gas-budget-worth of balance. The same redeem_funds → mergeCoins(gas) path is used,
232
+ // after which GasCoin holds the full address balance and SplitCoins works correctly.
233
+ const gasDataNoPayment = {
234
+ ...testData.gasDataWithoutGasPayment,
235
+ payment: [],
236
+ };
237
+ const txBuilder = factory.getStakingBuilder();
238
+ txBuilder.type(iface_1.SuiTransactionType.AddStake);
239
+ txBuilder.sender(testData.sender.address);
240
+ txBuilder.stake([testData.requestAddStake]);
241
+ txBuilder.gasData(gasDataNoPayment);
242
+ txBuilder.fundsInAddressBalance(FUNDS_IN_ADDRESS_BALANCE);
243
+ const tx = await txBuilder.build();
244
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingAdd);
245
+ const suiTx = tx;
246
+ suiTx.suiTransaction.gasData.payment.length.should.equal(0);
247
+ // Command sequence: redeem_funds, mergeCoins, splitCoins, request_add_stake
248
+ const cmds = suiTx.suiTransaction.tx.transactions;
249
+ cmds.length.should.equal(4);
250
+ cmds[0].kind.should.equal('MoveCall');
251
+ cmds[0].target.should.equal('0x2::coin::redeem_funds');
252
+ cmds[1].kind.should.equal('MergeCoins');
253
+ cmds[2].kind.should.equal('SplitCoins');
254
+ cmds[3].kind.should.equal('MoveCall');
255
+ cmds[3].target.should.endWith('::sui_system::request_add_stake');
256
+ suiTx.suiTransaction.fundsInAddressBalance.should.equal(FUNDS_IN_ADDRESS_BALANCE);
257
+ const rawTx = tx.toBroadcastFormat();
258
+ should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
259
+ // Round-trip
260
+ const rebuilder = factory.from(rawTx);
261
+ const rebuiltTx = await rebuilder.build();
262
+ rebuiltTx.toBroadcastFormat().should.equal(rawTx);
263
+ });
264
+ });
265
+ describe('Fail', () => {
266
+ it('should fail for invalid sender', async function () {
267
+ const builder = factory.getStakingBuilder();
268
+ (0, should_1.default)(() => builder.sender('randomString')).throwError('Invalid or missing sender, got: randomString');
269
+ });
270
+ it('should fail for invalid gasData', function () {
271
+ const builder = factory.getStakingBuilder();
272
+ (0, should_1.default)(() => builder.gasData(testData.invalidGasOwner)).throwError(`Invalid gas address ${testData.invalidGasOwner.owner}`);
273
+ });
274
+ it('should fail for invalid gasBudget', function () {
275
+ const builder = factory.getStakingBuilder();
276
+ (0, should_1.default)(() => builder.gasData(testData.invalidGasBudget)).throwError('Invalid gas budget -1');
277
+ });
278
+ it('should fail for invalid gasPayment', function () {
279
+ const builder = factory.getStakingBuilder();
280
+ const invalidGasPayment = {
281
+ ...testData.gasDataWithoutGasPayment,
282
+ payment: [
283
+ {
284
+ objectId: '',
285
+ version: -1,
286
+ digest: '',
287
+ },
288
+ ],
289
+ };
290
+ (0, should_1.default)(() => builder.gasData(invalidGasPayment)).throwError('Invalid payment, invalid or missing version');
291
+ });
292
+ });
293
+ });
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ0J1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3N0YWtpbmdCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDREQUF5RDtBQUN6RCw4REFBZ0Q7QUFDaEQsb0RBQTRCO0FBQzVCLG1EQUF1RDtBQUN2RCxtRUFBMkM7QUFDM0MsOERBQTZFO0FBQzdFLGtEQUE0RjtBQUM1RiwwREFBK0U7QUFFL0UsUUFBUSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsRUFBRTtJQUNuQyxNQUFNLE9BQU8sR0FBRyxJQUFBLHFDQUFpQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO1FBQ3ZCLEVBQUUsQ0FBQywyQkFBMkIsRUFBRSxLQUFLO1lBQ25DLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzlDLFNBQVMsQ0FBQyxJQUFJLENBQUMsMEJBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUM1QyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyxNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDakQsRUFBcUQsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFD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Q0UsUUFBUSxFQUFFLEVBQUU7d0JBQ1osT0FBTyxFQUFFLENBQUMsQ0FBQzt3QkFDWCxNQUFNLEVBQUUsRUFBRTtxQkFDWDtpQkFDRjthQUNGLENBQUM7WUFDRixJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLDZDQUE2QyxDQUFDLENBQUM7UUFDN0csQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc3VpJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB1dGlscyBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIGFzIFN1aVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBTdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24sIFN1aVRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvaWZhY2UnO1xuaW1wb3J0IHsgTUFYX0NPTU1BTkRfQVJHUywgTUFYX0dBU19PQkpFQ1RTIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9jb25zdGFudHMnO1xuXG5kZXNjcmliZSgnU3VpIFN0YWtpbmcgQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KCd0c3VpJyk7XG5cbiAgZGVzY3JpYmUoJ1N1Y2NlZWQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHN0YWtpbmcgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuQWRkU3Rha2UpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc3Rha2UoW3Rlc3REYXRhLnJlcXVlc3RBZGRTdGFrZV0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWRkKTtcbiAgICAgICh0eCBhcyBTdWlUcmFuc2FjdGlvbjxTdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+KS5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLnBheW1lbnQhLnNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgIHRlc3REYXRhLmNvaW5zR2FzUGF5bWVudFxuICAgICAgKTtcblxuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogdGVzdERhdGEuU1RBS0lOR19BTU9VTlQudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yZXF1ZXN0QWRkU3Rha2UudmFsaWRhdG9yQWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLnJlcXVlc3RBZGRTdGFrZS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkFERF9TVEFLRSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc3Rha2luZyB0eCB3aXRoIG1vcmUgdGhhbiAyNTUgaW5wdXQgb2JqZWN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG51bWJlck9mUGF5bWVudE9iamVjdHMgPSAxMDAwO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLkFkZFN0YWtlKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuXG4gICAgICBjb25zdCBnYXNEYXRhID0ge1xuICAgICAgICAuLi50ZXN0RGF0YS5nYXNEYXRhLFxuICAgICAgICBwYXltZW50OiB0ZXN0RGF0YS5nZW5lcmF0ZU9iamVjdHMobnVtYmVyT2ZQYXltZW50T2JqZWN0cyksXG4gICAgICB9O1xuXG4gICAgICB0eEJ1aWxkZXIuc3Rha2UoW3Rlc3REYXRhLnJlcXVlc3RBZGRTdGFrZV0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoZ2FzRGF0YSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBhc3NlcnQodHggaW5zdGFuY2VvZiBTdWlUcmFuc2FjdGlvbik7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FkZCk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5TVEFLSU5HX0FNT1VOVC50b1N0cmluZygpLFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlcXVlc3RBZGRTdGFrZS52YWxpZGF0b3JBZGRyZXNzLFxuICAgICAgICB2YWx1ZTogdGVzdERhdGEucmVxdWVzdEFkZFN0YWtlLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9KTtcblxuICAgICAgdHguc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5vd25lci5zaG91bGQuZXF1YWwoZ2FzRGF0YS5vd25lcik7XG4gICAgICB0eC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLnByaWNlLnNob3VsZC5lcXVhbChnYXNEYXRhLnByaWNlKTtcbiAgICAgIHR4LnN1aVRyYW5zYWN0aW9uLmdhc0RhdGEuYnVkZ2V0LnNob3VsZC5lcXVhbChnYXNEYXRhLmJ1ZGdldCk7XG4gICAgICB0eC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLnBheW1lbnQubGVuZ3RoLnNob3VsZC5lcXVhbChNQVhfR0FTX09CSkVDVFMgLSAxKTtcblxuICAgICAgY29uc3QgcHJvZ3JhbW1hYmxlVHggPSB0eC5zdWlUcmFuc2FjdGlvbi50eDtcblxuICAgICAgLy8gdG90YWwgb2JqZWN0cyAtIG9iamVjdHMgc2VudCBhcyBnYXMgcGF5bWVudFxuICAgICAgLy8gKyAoc3Rha2VkIGFtb3VudCBvYmplY3QgKyBTVUkgc3lzdGVtIHN0YXRlIG9iamVjdCArIHZhbGlkYXRvciBhZGRyZXNzID0gMylcbiAgICAgIHByb2dyYW1tYWJsZVR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKG51bWJlck9mUGF5bWVudE9iamVjdHMgLSAoTUFYX0dBU19PQkpFQ1RTIC0gMSkgKyAzKTtcbiAgICAgIHByb2dyYW1tYWJsZVR4LnRyYW5zYWN0aW9uc1swXS5raW5kLnNob3VsZC5lcXVhbCgnTWVyZ2VDb2lucycpO1xuICAgICAgcHJvZ3JhbW1hYmxlVHgudHJhbnNhY3Rpb25zWzBdLnNvdXJjZXMubGVuZ3RoLnNob3VsZC5lcXVhbChNQVhfQ09NTUFORF9BUkdTIC0gMSk7XG4gICAgICBwcm9ncmFtbWFibGVUeC50cmFuc2FjdGlvbnNbMV0ua2luZC5zaG91bGQuZXF1YWwoJ01lcmdlQ29pbnMnKTtcbiAgICAgIHByb2dyYW1tYWJsZVR4LnRyYW5zYWN0aW9uc1sxXS5zb3VyY2VzLmxlbmd0aC5zaG91bGQuZXF1YWwoXG4gICAgICAgIG51bWJlck9mUGF5bWVudE9iamVjdHMgLSAoTUFYX0NPTU1BTkRfQVJHUyAtIDEpIC0gKE1BWF9HQVNfT0JKRUNUUyAtIDEpXG4gICAgICApO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBjb25zdCByZWJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgcmVidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSBhd2FpdCByZWJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHJlYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdUeCk7XG4gICAgICByZWJ1aWx0VHgudG9Kc29uKCkuZ2FzRGF0YS5wYXltZW50Lmxlbmd0aC5zaG91bGQuZXF1YWwobnVtYmVyT2ZQYXltZW50T2JqZWN0cyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmdW5kc0luQWRkcmVzc0JhbGFuY2UnLCAoKSA9PiB7XG4gICAgY29uc3QgRlVORFNfSU5fQUREUkVTU19CQUxBTkNFID0gJzUwMDAwMDAwMDAnOyAvLyA1IFNVSSBpbiBNSVNUXG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIEFkZFN0YWtlIHdpdGggbWl4ZWQgY29pbiBvYmplY3RzICsgYWRkcmVzcyBiYWxhbmNlIChyZWRlZW0g4oaSIG1lcmdlIOKGkiBzcGxpdCDihpIgYWRkX3N0YWtlKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFdoZW4gZnVuZHNJbkFkZHJlc3NCYWxhbmNlID4gMCwgdGhlIFBUQiBtdXN0IGluc2VydCByZWRlZW1fZnVuZHMgKyBtZXJnZUNvaW5zIGludG8gZ2FzXG4gICAgICAvLyBjb2luIEJFRk9SRSB0aGUgc3BsaXRDb2lucyArIHJlcXVlc3RfYWRkX3N0YWtlIGNvbW1hbmRzLCBzbyB0aGUgZnVsbCBiYWxhbmNlIGlzIGF2YWlsYWJsZS5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5BZGRTdGFrZSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zdGFrZShbdGVzdERhdGEucmVxdWVzdEFkZFN0YWtlXSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5mdW5kc0luQWRkcmVzc0JhbGFuY2UoRlVORFNfSU5fQUREUkVTU19CQUxBTkNFKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FkZCk7XG5cbiAgICAgIGNvbnN0IHN1aVR4ID0gdHggYXMgU3VpVHJhbnNhY3Rpb248U3Rha2luZ1Byb2dyYW1tYWJsZVRyYW5zYWN0aW9uPjtcblxuICAgICAgLy8gRXhwZWN0ZWQgUFRCIGNvbW1hbmQgc2VxdWVuY2U6XG4gICAgICAvLyAgIDA6IE1vdmVDYWxsKHJlZGVlbV9mdW5kcykgICAgICAg4oCUIG1hdGVyaWFsaXNlIENvaW48U1VJPiBmcm9tIGFkZHJlc3MgYmFsYW5jZVxuICAgICAgLy8gICAxOiBNZXJnZUNvaW5zKGdhcywgW2FkZHJDb2luXSkgIOKAlCBtZXJnZSBhZGRyZXNzLWJhbGFuY2UgY29pbiBpbnRvIGdhcyBjb2luXG4gICAgICAvLyAgIDI6IFNwbGl0Q29pbnMoZ2FzLCBbYW1vdW50XSkgICAg4oCUIHNwbGl0IHN0YWtlIGFtb3VudCBmcm9tIGdhcyBjb2luXG4gICAgICAvLyAgIDM6IE1vdmVDYWxsKHJlcXVlc3RfYWRkX3N0YWtlKSAg4oCUIHN0YWtlIHRvIHZhbGlkYXRvclxuICAgICAgY29uc3QgY21kcyA9IHN1aVR4LnN1aVRyYW5zYWN0aW9uLnR4LnRyYW5zYWN0aW9ucyBhcyBhbnlbXTtcbiAgICAgIGNtZHMubGVuZ3RoLnNob3VsZC5lcXVhbCg0LCAnZXhwZWN0ZWQgNCBjb21tYW5kczogcmVkZWVtLCBtZXJnZSwgc3BsaXQsIGFkZF9zdGFrZScpO1xuICAgICAgY21kc1swXS5raW5kLnNob3VsZC5lcXVhbCgnTW92ZUNhbGwnLCAnY29tbWFuZCAwIG11c3QgYmUgTW92ZUNhbGwocmVkZWVtX2Z1bmRzKScpO1xuICAgICAgY21kc1swXS50YXJnZXQuc2hvdWxkLmVxdWFsKCcweDI6OmNvaW46OnJlZGVlbV9mdW5kcycpO1xuICAgICAgY21kc1sxXS5raW5kLnNob3VsZC5lcXVhbCgnTWVyZ2VDb2lucycsICdjb21tYW5kIDEgbXVzdCBiZSBNZXJnZUNvaW5zKGdhcywgW2FkZHJDb2luXSknKTtcbiAgICAgIGNtZHNbMl0ua2luZC5zaG91bGQuZXF1YWwoJ1NwbGl0Q29pbnMnLCAnY29tbWFuZCAyIG11c3QgYmUgU3BsaXRDb2lucyhnYXMsIFthbW91bnRdKScpO1xuICAgICAgY21kc1szXS5raW5kLnNob3VsZC5lcXVhbCgnTW92ZUNhbGwnLCAnY29tbWFuZCAzIG11c3QgYmUgTW92ZUNhbGwocmVxdWVzdF9hZGRfc3Rha2UpJyk7XG4gICAgICBjbWRzWzNdLnRhcmdldC5zaG91bGQuZW5kV2l0aCgnOjpzdWlfc3lzdGVtOjpyZXF1ZXN0X2FkZF9zdGFrZScpO1xuXG4gICAgICAvLyBmdW5kc0luQWRkcmVzc0JhbGFuY2UgbXVzdCBiZSBwZXJzaXN0ZWQgb24gdGhlIFN1aVRyYW5zYWN0aW9uXG4gICAgICBzdWlUeC5zdWlUcmFuc2FjdGlvbi5mdW5kc0luQWRkcmVzc0JhbGFuY2UhLnNob3VsZC5lcXVhbChGVU5EU19JTl9BRERSRVNTX0JBTEFOQ0UpO1xuXG4gICAgICAvLyBnZXRTdGFrZVJlcXVlc3RzIG11c3Qgc3RpbGwgY29ycmVjdGx5IGlkZW50aWZ5IHRoZSByZXF1ZXN0IGRlc3BpdGUgdGhlIGV4dHJhIGNvbW1hbmRzXG4gICAgICBjb25zdCByZXF1ZXN0cyA9IHV0aWxzLmdldFN0YWtlUmVxdWVzdHMoc3VpVHguc3VpVHJhbnNhY3Rpb24udHgpO1xuICAgICAgcmVxdWVzdHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHJlcXVlc3RzWzBdLnZhbGlkYXRvckFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnJlcXVlc3RBZGRTdGFrZS52YWxpZGF0b3JBZGRyZXNzKTtcbiAgICAgIHJlcXVlc3RzWzBdLmFtb3VudC5zaG91bGQuZXF1YWwodGVzdERhdGEucmVxdWVzdEFkZFN0YWtlLmFtb3VudCk7XG5cbiAgICAgIC8vIHRvSnNvbiBtdXN0IGVtaXQgZnVuZHNJbkFkZHJlc3NCYWxhbmNlXG4gICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBqc29uLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZSEuc2hvdWxkLmVxdWFsKEZVTkRTX0lOX0FERFJFU1NfQkFMQU5DRSk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcm91bmQtdHJpcDogYnVpbGQg4oaSIHNlcmlhbGl6ZSDihpIgaW5pdEJ1aWxkZXIgcmVzdG9yZXMgZnVuZHNJbkFkZHJlc3NCYWxhbmNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLkFkZFN0YWtlKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnN0YWtlKFt0ZXN0RGF0YS5yZXF1ZXN0QWRkU3Rha2VdKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgdHhCdWlsZGVyLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZShGVU5EU19JTl9BRERSRVNTX0JBTEFOQ0UpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuXG4gICAgICAvLyBEZXNlcmlhbGl6ZSBhbmQgcmVidWlsZFxuICAgICAgY29uc3QgcmVidWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIHJlYnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgcmVidWlsZGVyLmJ1aWxkKCk7XG4gICAgICByZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3VHgpO1xuXG4gICAgICAvLyBpbml0QnVpbGRlciBtdXN0IGhhdmUgcmVzdG9yZWQgZnVuZHNJbkFkZHJlc3NCYWxhbmNlXG4gICAgICBjb25zdCByZWJ1aWx0U3VpVHggPSByZWJ1aWx0VHggYXMgU3VpVHJhbnNhY3Rpb248U3Rha2luZ1Byb2dyYW1tYWJsZVRyYW5zYWN0aW9uPjtcbiAgICAgIHJlYnVpbHRTdWlUeC5zdWlUcmFuc2FjdGlvbi5mdW5kc0luQWRkcmVzc0JhbGFuY2UhLnNob3VsZC5lcXVhbChGVU5EU19JTl9BRERSRVNTX0JBTEFOQ0UpO1xuXG4gICAgICAvLyBzdGFrZSByZXF1ZXN0cyBtdXN0IHN0aWxsIGJlIGludGFjdFxuICAgICAgY29uc3QgcmVxdWVzdHMgPSB1dGlscy5nZXRTdGFrZVJlcXVlc3RzKHJlYnVpbHRTdWlUeC5zdWlUcmFuc2FjdGlvbi50eCk7XG4gICAgICByZXF1ZXN0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgcmVxdWVzdHNbMF0udmFsaWRhdG9yQWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEucmVxdWVzdEFkZFN0YWtlLnZhbGlkYXRvckFkZHJlc3MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBtdWx0aXBsZSBzdGFrZSByZXF1ZXN0cyB3aXRoIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZSAobXVsdGktc3Rha2UpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLkFkZFN0YWtlKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnN0YWtlKHRlc3REYXRhLnJlcXVlc3RBZGRTdGFrZU1hbnkpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICB0eEJ1aWxkZXIuZnVuZHNJbkFkZHJlc3NCYWxhbmNlKEZVTkRTX0lOX0FERFJFU1NfQkFMQU5DRSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBZGQpO1xuXG4gICAgICBjb25zdCBzdWlUeCA9IHR4IGFzIFN1aVRyYW5zYWN0aW9uPFN0YWtpbmdQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj47XG4gICAgICBjb25zdCBjbWRzID0gc3VpVHguc3VpVHJhbnNhY3Rpb24udHgudHJhbnNhY3Rpb25zIGFzIGFueVtdO1xuXG4gICAgICAvLyBDb21tYW5kIHNlcXVlbmNlOiByZWRlZW1fZnVuZHMsIG1lcmdlQ29pbnMsIHRoZW4gZm9yIGVhY2ggc3Rha2U6IHNwbGl0Q29pbnMgKyByZXF1ZXN0X2FkZF9zdGFrZVxuICAgICAgY21kc1swXS5raW5kLnNob3VsZC5lcXVhbCgnTW92ZUNhbGwnLCAnY29tbWFuZCAwIG11c3QgYmUgcmVkZWVtX2Z1bmRzJyk7XG4gICAgICBjbWRzWzBdLnRhcmdldC5zaG91bGQuZXF1YWwoJzB4Mjo6Y29pbjo6cmVkZWVtX2Z1bmRzJyk7XG4gICAgICBjbWRzWzFdLmtpbmQuc2hvdWxkLmVxdWFsKCdNZXJnZUNvaW5zJywgJ2NvbW1hbmQgMSBtdXN0IGJlIG1lcmdlQ29pbnMnKTtcblxuICAgICAgY29uc3QgbnVtU3Rha2VzID0gdGVzdERhdGEucmVxdWVzdEFkZFN0YWtlTWFueS5sZW5ndGg7XG4gICAgICAvLyBBZnRlciByZWRlZW0rbWVyZ2UsIGVhY2ggc3Rha2UgYWRkcyAyIGNvbW1hbmRzOiBzcGxpdENvaW5zICsgTW92ZUNhbGxcbiAgICAgIGNtZHMubGVuZ3RoLnNob3VsZC5lcXVhbCgyICsgbnVtU3Rha2VzICogMik7XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RzID0gdXRpbHMuZ2V0U3Rha2VSZXF1ZXN0cyhzdWlUeC5zdWlUcmFuc2FjdGlvbi50eCk7XG4gICAgICByZXF1ZXN0cy5sZW5ndGguc2hvdWxkLmVxdWFsKG51bVN0YWtlcyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVN0YWtlczsgaSsrKSB7XG4gICAgICAgIHJlcXVlc3RzW2ldLnZhbGlkYXRvckFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnJlcXVlc3RBZGRTdGFrZU1hbnlbaV0udmFsaWRhdG9yQWRkcmVzcyk7XG4gICAgICAgIHJlcXVlc3RzW2ldLmFtb3VudC5zaG91bGQuZXF1YWwodGVzdERhdGEucmVxdWVzdEFkZFN0YWtlTWFueVtpXS5hbW91bnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgaW5zZXJ0IHJlZGVlbV9mdW5kcyB3aGVuIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZSBpcyAwIChkZWZhdWx0IGJlaGF2aW9yIHVuY2hhbmdlZCknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuQWRkU3Rha2UpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc3Rha2UoW3Rlc3REYXRhLnJlcXVlc3RBZGRTdGFrZV0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICAvLyBObyBmdW5kc0luQWRkcmVzc0JhbGFuY2UgY2FsbCDigJQgZGVmYXVsdCBpcyAwXG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBzdWlUeCA9IHR4IGFzIFN1aVRyYW5zYWN0aW9uPFN0YWtpbmdQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj47XG4gICAgICBjb25zdCBjbWRzID0gc3VpVHguc3VpVHJhbnNhY3Rpb24udHgudHJhbnNhY3Rpb25zIGFzIGFueVtdO1xuXG4gICAgICAvLyBPcmlnaW5hbCAyLWNvbW1hbmQgc2VxdWVuY2U6IHNwbGl0Q29pbnMgKyByZXF1ZXN0X2FkZF9zdGFrZVxuICAgICAgY21kcy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgY21kc1swXS5raW5kLnNob3VsZC5lcXVhbCgnU3BsaXRDb2lucycpO1xuICAgICAgY21kc1sxXS5raW5kLnNob3VsZC5lcXVhbCgnTW92ZUNhbGwnKTtcbiAgICAgIGNtZHNbMV0udGFyZ2V0LnNob3VsZC5lbmRXaXRoKCc6OnN1aV9zeXN0ZW06OnJlcXVlc3RfYWRkX3N0YWtlJyk7XG5cbiAgICAgIHNob3VsZC5lcXVhbChzdWlUeC5zdWlUcmFuc2FjdGlvbi5mdW5kc0luQWRkcmVzc0JhbGFuY2UsIHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIENhc2UgMiAoYWRkci1iYWwgb25seSwgZW1wdHkgcGF5bWVudCk6IHJlZGVlbSDihpIgbWVyZ2Ug4oaSIHNwbGl0IOKGkiBhZGRfc3Rha2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBDYXNlIDI6IGdhc0RhdGEucGF5bWVudD1bXSDigJQgdGhlIHN0YWtlIGFtb3VudCBjb21lcyBlbnRpcmVseSBmcm9tIGFkZHJlc3MgYmFsYW5jZS5cbiAgICAgIC8vIFNwbGl0Q29pbnMoR2FzQ29pbikgaXMgdW5zYWZlIHdpdGggZW1wdHkgcGF5bWVudCBiZWNhdXNlIEdhc0NvaW4gb25seSBjYXJyaWVzIHVwIHRvXG4gICAgICAvLyBnYXMtYnVkZ2V0LXdvcnRoIG9mIGJhbGFuY2UuIFRoZSBzYW1lIHJlZGVlbV9mdW5kcyDihpIgbWVyZ2VDb2lucyhnYXMpIHBhdGggaXMgdXNlZCxcbiAgICAgIC8vIGFmdGVyIHdoaWNoIEdhc0NvaW4gaG9sZHMgdGhlIGZ1bGwgYWRkcmVzcyBiYWxhbmNlIGFuZCBTcGxpdENvaW5zIHdvcmtzIGNvcnJlY3RseS5cbiAgICAgIGNvbnN0IGdhc0RhdGFOb1BheW1lbnQgPSB7XG4gICAgICAgIC4uLnRlc3REYXRhLmdhc0RhdGFXaXRob3V0R2FzUGF5bWVudCxcbiAgICAgICAgcGF5bWVudDogW10sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLkFkZFN0YWtlKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnN0YWtlKFt0ZXN0RGF0YS5yZXF1ZXN0QWRkU3Rha2VdKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKGdhc0RhdGFOb1BheW1lbnQpO1xuICAgICAgdHhCdWlsZGVyLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZShGVU5EU19JTl9BRERSRVNTX0JBTEFOQ0UpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWRkKTtcblxuICAgICAgY29uc3Qgc3VpVHggPSB0eCBhcyBTdWlUcmFuc2FjdGlvbjxTdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+O1xuICAgICAgc3VpVHguc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5wYXltZW50Lmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG5cbiAgICAgIC8vIENvbW1hbmQgc2VxdWVuY2U6IHJlZGVlbV9mdW5kcywgbWVyZ2VDb2lucywgc3BsaXRDb2lucywgcmVxdWVzdF9hZGRfc3Rha2VcbiAgICAgIGNvbnN0IGNtZHMgPSBzdWlUeC5zdWlUcmFuc2FjdGlvbi50eC50cmFuc2FjdGlvbnMgYXMgYW55W107XG4gICAgICBjbWRzLmxlbmd0aC5zaG91bGQuZXF1YWwoNCk7XG4gICAgICBjbWRzWzBdLmtpbmQuc2hvdWxkLmVxdWFsKCdNb3ZlQ2FsbCcpO1xuICAgICAgY21kc1swXS50YXJnZXQuc2hvdWxkLmVxdWFsKCcweDI6OmNvaW46OnJlZGVlbV9mdW5kcycpO1xuICAgICAgY21kc1sxXS5raW5kLnNob3VsZC5lcXVhbCgnTWVyZ2VDb2lucycpO1xuICAgICAgY21kc1syXS5raW5kLnNob3VsZC5lcXVhbCgnU3BsaXRDb2lucycpO1xuICAgICAgY21kc1szXS5raW5kLnNob3VsZC5lcXVhbCgnTW92ZUNhbGwnKTtcbiAgICAgIGNtZHNbM10udGFyZ2V0LnNob3VsZC5lbmRXaXRoKCc6OnN1aV9zeXN0ZW06OnJlcXVlc3RfYWRkX3N0YWtlJyk7XG5cbiAgICAgIHN1aVR4LnN1aVRyYW5zYWN0aW9uLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZSEuc2hvdWxkLmVxdWFsKEZVTkRTX0lOX0FERFJFU1NfQkFMQU5DRSk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcblxuICAgICAgLy8gUm91bmQtdHJpcFxuICAgICAgY29uc3QgcmVidWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuICAgICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZhaWwnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIHNlbmRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5zZW5kZXIoJ3JhbmRvbVN0cmluZycpKS50aHJvd0Vycm9yKCdJbnZhbGlkIG9yIG1pc3Npbmcgc2VuZGVyLCBnb3Q6IHJhbmRvbVN0cmluZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIGdhc0RhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nQnVpbGRlcigpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5pbnZhbGlkR2FzT3duZXIpKS50aHJvd0Vycm9yKFxuICAgICAgICBgSW52YWxpZCBnYXMgYWRkcmVzcyAke3Rlc3REYXRhLmludmFsaWRHYXNPd25lci5vd25lcn1gXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIGdhc0J1ZGdldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmludmFsaWRHYXNCdWRnZXQpKS50aHJvd0Vycm9yKCdJbnZhbGlkIGdhcyBidWRnZXQgLTEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCBnYXNQYXltZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIGNvbnN0IGludmFsaWRHYXNQYXltZW50ID0ge1xuICAgICAgICAuLi50ZXN0RGF0YS5nYXNEYXRhV2l0aG91dEdhc1BheW1lbnQsXG4gICAgICAgIHBheW1lbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvYmplY3RJZDogJycsXG4gICAgICAgICAgICB2ZXJzaW9uOiAtMSxcbiAgICAgICAgICAgIGRpZ2VzdDogJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5nYXNEYXRhKGludmFsaWRHYXNQYXltZW50KSkudGhyb3dFcnJvcignSW52YWxpZCBwYXltZW50LCBpbnZhbGlkIG9yIG1pc3NpbmcgdmVyc2lvbicpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tokenTransferBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenTransferBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/tokenTransferBuilder.ts"],"names":[],"mappings":""}