@bitgo-beta/sdk-coin-sui 3.0.3-beta.20 → 3.0.3-beta.2000

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 (207) 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.d.ts +8 -0
  5. package/dist/src/lib/compareTransactionBlocks.d.ts.map +1 -0
  6. package/dist/src/lib/compareTransactionBlocks.js +12 -0
  7. package/dist/src/lib/constants.d.ts +10 -2
  8. package/dist/src/lib/constants.d.ts.map +1 -1
  9. package/dist/src/lib/constants.js +19 -2
  10. package/dist/src/lib/customTransaction.d.ts +57 -0
  11. package/dist/src/lib/customTransaction.d.ts.map +1 -0
  12. package/dist/src/lib/customTransaction.js +159 -0
  13. package/dist/src/lib/customTransactionBuilder.d.ts +46 -0
  14. package/dist/src/lib/customTransactionBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/customTransactionBuilder.js +117 -0
  16. package/dist/src/lib/iface.d.ts +96 -10
  17. package/dist/src/lib/iface.d.ts.map +1 -1
  18. package/dist/src/lib/iface.js +47 -5
  19. package/dist/src/lib/index.d.ts +8 -0
  20. package/dist/src/lib/index.d.ts.map +1 -1
  21. package/dist/src/lib/index.js +40 -10
  22. package/dist/src/lib/keyPair.js +24 -10
  23. package/dist/src/lib/mystenlab/builder/Inputs.d.ts +64 -11
  24. package/dist/src/lib/mystenlab/builder/Inputs.d.ts.map +1 -1
  25. package/dist/src/lib/mystenlab/builder/Inputs.js +63 -19
  26. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts +88 -355
  27. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts.map +1 -1
  28. package/dist/src/lib/mystenlab/builder/TransactionBlock.js +65 -48
  29. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts +152 -77
  30. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts.map +1 -1
  31. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.js +54 -44
  32. package/dist/src/lib/mystenlab/builder/Transactions.d.ts +133 -188
  33. package/dist/src/lib/mystenlab/builder/Transactions.d.ts.map +1 -1
  34. package/dist/src/lib/mystenlab/builder/Transactions.js +52 -53
  35. package/dist/src/lib/mystenlab/builder/bcs.d.ts +1 -1
  36. package/dist/src/lib/mystenlab/builder/bcs.d.ts.map +1 -1
  37. package/dist/src/lib/mystenlab/builder/bcs.js +2 -2
  38. package/dist/src/lib/mystenlab/builder/index.js +6 -2
  39. package/dist/src/lib/mystenlab/builder/serializer.js +6 -8
  40. package/dist/src/lib/mystenlab/builder/utils.d.ts +1 -1
  41. package/dist/src/lib/mystenlab/builder/utils.d.ts.map +1 -1
  42. package/dist/src/lib/mystenlab/builder/utils.js +4 -4
  43. package/dist/src/lib/mystenlab/cryptography/hash.js +3 -4
  44. package/dist/src/lib/mystenlab/framework/framework.d.ts +6 -6
  45. package/dist/src/lib/mystenlab/framework/framework.d.ts.map +1 -1
  46. package/dist/src/lib/mystenlab/framework/framework.js +22 -25
  47. package/dist/src/lib/mystenlab/framework/index.js +6 -2
  48. package/dist/src/lib/mystenlab/framework/sui-system-state.d.ts +2 -0
  49. package/dist/src/lib/mystenlab/framework/sui-system-state.d.ts.map +1 -1
  50. package/dist/src/lib/mystenlab/framework/sui-system-state.js +6 -3
  51. package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.js +2 -2
  52. package/dist/src/lib/mystenlab/types/coin.d.ts +17 -15
  53. package/dist/src/lib/mystenlab/types/coin.d.ts.map +1 -1
  54. package/dist/src/lib/mystenlab/types/coin.js +20 -19
  55. package/dist/src/lib/mystenlab/types/common.d.ts +8 -8
  56. package/dist/src/lib/mystenlab/types/common.d.ts.map +1 -1
  57. package/dist/src/lib/mystenlab/types/common.js +22 -22
  58. package/dist/src/lib/mystenlab/types/events.d.ts +15 -15
  59. package/dist/src/lib/mystenlab/types/events.d.ts.map +1 -1
  60. package/dist/src/lib/mystenlab/types/events.js +17 -17
  61. package/dist/src/lib/mystenlab/types/index.js +6 -2
  62. package/dist/src/lib/mystenlab/types/normalized.d.ts +21 -21
  63. package/dist/src/lib/mystenlab/types/normalized.d.ts.map +1 -1
  64. package/dist/src/lib/mystenlab/types/normalized.js +41 -41
  65. package/dist/src/lib/mystenlab/types/objects.d.ts +100 -100
  66. package/dist/src/lib/mystenlab/types/objects.d.ts.map +1 -1
  67. package/dist/src/lib/mystenlab/types/objects.js +96 -106
  68. package/dist/src/lib/mystenlab/types/option.d.ts +1 -1
  69. package/dist/src/lib/mystenlab/types/option.d.ts.map +1 -1
  70. package/dist/src/lib/mystenlab/types/option.js +2 -3
  71. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts +55 -29
  72. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts.map +1 -1
  73. package/dist/src/lib/mystenlab/types/sui-bcs.js +30 -6
  74. package/dist/src/lib/mystenlab/types/transactions.d.ts +641 -641
  75. package/dist/src/lib/mystenlab/types/transactions.d.ts.map +1 -1
  76. package/dist/src/lib/mystenlab/types/transactions.js +178 -194
  77. package/dist/src/lib/mystenlab/types/validator.d.ts +17 -17
  78. package/dist/src/lib/mystenlab/types/validator.d.ts.map +1 -1
  79. package/dist/src/lib/mystenlab/types/validator.js +124 -124
  80. package/dist/src/lib/resources/walrusConfig.d.ts +22 -0
  81. package/dist/src/lib/resources/walrusConfig.d.ts.map +1 -0
  82. package/dist/src/lib/resources/walrusConfig.js +37 -0
  83. package/dist/src/lib/rpcClient.d.ts +5 -0
  84. package/dist/src/lib/rpcClient.d.ts.map +1 -0
  85. package/dist/src/lib/rpcClient.js +74 -0
  86. package/dist/src/lib/stakingBuilder.d.ts +13 -3
  87. package/dist/src/lib/stakingBuilder.d.ts.map +1 -1
  88. package/dist/src/lib/stakingBuilder.js +83 -28
  89. package/dist/src/lib/stakingTransaction.d.ts +1 -1
  90. package/dist/src/lib/stakingTransaction.d.ts.map +1 -1
  91. package/dist/src/lib/stakingTransaction.js +44 -29
  92. package/dist/src/lib/tokenTransferBuilder.d.ts +93 -0
  93. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  94. package/dist/src/lib/tokenTransferBuilder.js +266 -0
  95. package/dist/src/lib/tokenTransferTransaction.d.ts +59 -0
  96. package/dist/src/lib/tokenTransferTransaction.d.ts.map +1 -0
  97. package/dist/src/lib/tokenTransferTransaction.js +272 -0
  98. package/dist/src/lib/transaction.d.ts +23 -4
  99. package/dist/src/lib/transaction.d.ts.map +1 -1
  100. package/dist/src/lib/transaction.js +162 -18
  101. package/dist/src/lib/transactionBuilder.d.ts +13 -4
  102. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  103. package/dist/src/lib/transactionBuilder.js +34 -4
  104. package/dist/src/lib/transactionBuilderFactory.d.ts +14 -2
  105. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  106. package/dist/src/lib/transactionBuilderFactory.js +42 -1
  107. package/dist/src/lib/transferBuilder.d.ts +58 -1
  108. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  109. package/dist/src/lib/transferBuilder.js +310 -24
  110. package/dist/src/lib/transferTransaction.d.ts +7 -1
  111. package/dist/src/lib/transferTransaction.d.ts.map +1 -1
  112. package/dist/src/lib/transferTransaction.js +129 -12
  113. package/dist/src/lib/unstakingBuilder.d.ts +8 -1
  114. package/dist/src/lib/unstakingBuilder.d.ts.map +1 -1
  115. package/dist/src/lib/unstakingBuilder.js +99 -20
  116. package/dist/src/lib/unstakingTransaction.d.ts +26 -2
  117. package/dist/src/lib/unstakingTransaction.d.ts.map +1 -1
  118. package/dist/src/lib/unstakingTransaction.js +162 -23
  119. package/dist/src/lib/utils.d.ts +36 -5
  120. package/dist/src/lib/utils.d.ts.map +1 -1
  121. package/dist/src/lib/utils.js +369 -26
  122. package/dist/src/lib/walrusStakingBuilder.d.ts +77 -0
  123. package/dist/src/lib/walrusStakingBuilder.d.ts.map +1 -0
  124. package/dist/src/lib/walrusStakingBuilder.js +276 -0
  125. package/dist/src/lib/walrusStakingTransaction.d.ts +52 -0
  126. package/dist/src/lib/walrusStakingTransaction.d.ts.map +1 -0
  127. package/dist/src/lib/walrusStakingTransaction.js +289 -0
  128. package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts +36 -0
  129. package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts.map +1 -0
  130. package/dist/src/lib/walrusWithdrawStakeBuilder.js +177 -0
  131. package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts +21 -0
  132. package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts.map +1 -0
  133. package/dist/src/lib/walrusWithdrawStakeTransaction.js +190 -0
  134. package/dist/src/register.d.ts.map +1 -1
  135. package/dist/src/register.js +5 -1
  136. package/dist/src/sui.d.ts +58 -8
  137. package/dist/src/sui.d.ts.map +1 -1
  138. package/dist/src/sui.js +536 -37
  139. package/dist/src/suiToken.d.ts +22 -0
  140. package/dist/src/suiToken.d.ts.map +1 -0
  141. package/dist/src/suiToken.js +61 -0
  142. package/dist/src/tsui.js +1 -1
  143. package/dist/test/integration/index.d.ts +1 -0
  144. package/dist/test/integration/index.d.ts.map +1 -0
  145. package/dist/test/integration/index.js +1 -0
  146. package/dist/test/local_fullnode/RpcClient.d.ts +60 -0
  147. package/dist/test/local_fullnode/RpcClient.d.ts.map +1 -0
  148. package/dist/test/local_fullnode/RpcClient.js +111 -0
  149. package/dist/test/local_fullnode/faucet.d.ts +6 -0
  150. package/dist/test/local_fullnode/faucet.d.ts.map +1 -0
  151. package/dist/test/local_fullnode/faucet.js +17 -0
  152. package/dist/test/local_fullnode/transactions.d.ts +2 -0
  153. package/dist/test/local_fullnode/transactions.d.ts.map +1 -0
  154. package/dist/test/local_fullnode/transactions.js +190 -0
  155. package/dist/test/resources/sui.d.ts +458 -0
  156. package/dist/test/resources/sui.d.ts.map +1 -0
  157. package/dist/test/resources/sui.js +632 -0
  158. package/dist/test/unit/compareTransactionBlocks.d.ts +2 -0
  159. package/dist/test/unit/compareTransactionBlocks.d.ts.map +1 -0
  160. package/dist/test/unit/compareTransactionBlocks.js +64 -0
  161. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  162. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  163. package/dist/test/unit/getBuilderFactory.js +10 -0
  164. package/dist/test/unit/keyPair.d.ts +2 -0
  165. package/dist/test/unit/keyPair.d.ts.map +1 -0
  166. package/dist/test/unit/keyPair.js +72 -0
  167. package/dist/test/unit/sui.d.ts +2 -0
  168. package/dist/test/unit/sui.d.ts.map +1 -0
  169. package/dist/test/unit/sui.js +2747 -0
  170. package/dist/test/unit/suiToken.d.ts +2 -0
  171. package/dist/test/unit/suiToken.d.ts.map +1 -0
  172. package/dist/test/unit/suiToken.js +39 -0
  173. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts +2 -0
  174. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
  175. package/dist/test/unit/transactionBuilder/customTransactionBuilder.js +106 -0
  176. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
  177. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
  178. package/dist/test/unit/transactionBuilder/stakingBuilder.js +294 -0
  179. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  180. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  181. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +431 -0
  182. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  183. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  184. package/dist/test/unit/transactionBuilder/transactionBuilder.js +639 -0
  185. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  186. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  187. package/dist/test/unit/transactionBuilder/transferBuilder.js +1181 -0
  188. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts +2 -0
  189. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts.map +1 -0
  190. package/dist/test/unit/transactionBuilder/unstakingBuilder.js +115 -0
  191. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts +2 -0
  192. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts.map +1 -0
  193. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.js +289 -0
  194. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts +2 -0
  195. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts.map +1 -0
  196. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.js +250 -0
  197. package/dist/test/unit/transferTransaction.d.ts +2 -0
  198. package/dist/test/unit/transferTransaction.d.ts.map +1 -0
  199. package/dist/test/unit/transferTransaction.js +94 -0
  200. package/dist/test/unit/utils.d.ts +2 -0
  201. package/dist/test/unit/utils.d.ts.map +1 -0
  202. package/dist/test/unit/utils.js +186 -0
  203. package/dist/tsconfig.tsbuildinfo +1 -0
  204. package/package.json +19 -12
  205. package/.eslintignore +0 -6
  206. package/.mocharc.yml +0 -8
  207. package/CHANGELOG.md +0 -171
@@ -0,0 +1,93 @@
1
+ import { TransactionType, Recipient, BaseKey } from '@bitgo-beta/sdk-core';
2
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
3
+ import { SuiTransaction, TokenTransferProgrammableTransaction } from './iface';
4
+ import { Transaction } from './transaction';
5
+ import { TransactionBuilder } from './transactionBuilder';
6
+ import { TokenTransferTransaction } from './tokenTransferTransaction';
7
+ import { SuiObjectRef } from './mystenlab/types';
8
+ import BigNumber from 'bignumber.js';
9
+ export declare class TokenTransferBuilder extends TransactionBuilder<TokenTransferProgrammableTransaction> {
10
+ protected _recipients: Recipient[];
11
+ protected _inputObjects: SuiObjectRef[];
12
+ /**
13
+ * Balance held in the address balance system for the token being transferred.
14
+ * When set, this amount is included in the total available balance.
15
+ * At execution time, tx.withdrawal() + 0x2::coin::redeem_funds converts it
16
+ * to a Coin<T> that is merged with any coin objects before splitting.
17
+ */
18
+ protected _fundsInAddressBalance: BigNumber;
19
+ /**
20
+ * Coin type recovered from a deserialized transaction (the `redeem_funds` type argument /
21
+ * `BalanceWithdrawal` type). When set it takes precedence over the coin type derived from the
22
+ * coin config, so re-building a transaction (e.g. to attach a TSS signature before broadcast)
23
+ * preserves the exact coin type it was signed with even when the builder was constructed with
24
+ * the parent chain config rather than the token config.
25
+ */
26
+ protected _tokenCoinTypeOverride?: string;
27
+ constructor(_coinConfig: Readonly<CoinConfig>);
28
+ protected get transactionType(): TransactionType;
29
+ /**
30
+ * The full coin type string derived from the coin config (e.g. `0xabc::my_token::MY_TOKEN`).
31
+ */
32
+ private get tokenCoinType();
33
+ /** @inheritdoc */
34
+ validateTransaction(transaction: TokenTransferTransaction): void;
35
+ /** @inheritdoc */
36
+ sign(key: BaseKey): void;
37
+ /** @inheritdoc */
38
+ protected fromImplementation(rawTransaction: string): Transaction<TokenTransferProgrammableTransaction>;
39
+ /** @inheritdoc */
40
+ protected buildImplementation(): Promise<Transaction<TokenTransferProgrammableTransaction>>;
41
+ /** @inheritdoc */
42
+ initBuilder(tx: TokenTransferTransaction): void;
43
+ send(recipients: Recipient[]): this;
44
+ inputObjects(inputObject: SuiObjectRef[]): this;
45
+ /**
46
+ * Set the amount of token funds held in the Sui address balance system for this sender.
47
+ *
48
+ * @param {string} amount - amount in base units held in address balance
49
+ */
50
+ fundsInAddressBalance(amount: string): this;
51
+ /**
52
+ * Validates all fields are defined correctly
53
+ */
54
+ private validateTransactionFields;
55
+ /** Validates the individual object refs (does not require non-empty array). */
56
+ private validateInputObjectRefs;
57
+ /**
58
+ * Build SuiTransaction.
59
+ *
60
+ * Two build paths:
61
+ *
62
+ * Path A — coin objects only (fundsInAddressBalance = 0):
63
+ * MergeCoins(inputObject[0], [inputObject[1..]]) → SplitCoins → TransferObjects
64
+ *
65
+ * Path B — coin objects + address balance (or address balance only):
66
+ * MoveCall(0x2::coin::redeem_funds, [withdrawal(amount, coinType)]) → Coin<T>
67
+ * MergeCoins(inputObject[0] | addrCoin, [rest...]) → SplitCoins → TransferObjects
68
+ *
69
+ * Exception A — addr-bal only, full amount (fundsInAddressBalance === sum(recipient amounts)):
70
+ * MoveCall(0x2::coin::redeem_funds, [withdrawal(amount, coinType)]) → Coin<T>
71
+ * SplitCoins(addrCoin, [amount0]) → TransferObjects(split0, addr0) # recipients 0..N-2
72
+ * ...
73
+ * TransferObjects([addrCoin], addrN-1) # last recipient directly
74
+ * (After N-1 splits addrCoin.balance === recipients[N-1].amount exactly, so it can be
75
+ * transferred directly. SplitCoins on the last recipient would leave a zero-balance Coin<T>
76
+ * unused, which causes UnusedValueWithoutDrop since Coin<T> has no drop ability.)
77
+ *
78
+ * Exception B — addr-bal only, partial amount (fundsInAddressBalance > sum(recipient amounts)):
79
+ * MoveCall(0x2::coin::redeem_funds, [withdrawal(amount, coinType)]) → Coin<T>
80
+ * SplitCoins(addrCoin, [amount0]) → TransferObjects(split0, addr0) # all recipients
81
+ * ...
82
+ * TransferObjects([addrCoin], sender) # return change to sender
83
+ * (addrCoin still holds the unspent remainder; transferring it back to the sender consumes
84
+ * the command result, avoiding UnusedValueWithoutDrop. Mirrors the native SUI TransferBuilder
85
+ * change-return path. Unlike native SUI, MergeCoins(gas, [addrCoin]) is not possible here
86
+ * because gas is Coin<SUI> and addrCoin is Coin<T> — incompatible types.)
87
+ *
88
+ * @return {SuiTransaction<TokenTransferProgrammableTransaction>}
89
+ * @protected
90
+ */
91
+ protected buildSuiTransaction(): SuiTransaction<TokenTransferProgrammableTransaction>;
92
+ }
93
+ //# sourceMappingURL=tokenTransferBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenTransferBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/tokenTransferBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAyB,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAW,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAsB,oCAAoC,EAAE,MAAM,SAAS,CAAC;AACnG,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAuB,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAQtE,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,qBAAa,oBAAqB,SAAQ,kBAAkB,CAAC,oCAAoC,CAAC;IAChG,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC;IACnC,SAAS,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC;IACxC;;;;;OAKG;IACH,SAAS,CAAC,sBAAsB,EAAE,SAAS,CAAoB;IAE/D;;;;;;OAMG;IACH,SAAS,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;gBAE9B,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED;;OAEG;IACH,OAAO,KAAK,aAAa,GAMxB;IAED,kBAAkB;IAClB,mBAAmB,CAAC,WAAW,EAAE,wBAAwB,GAAG,IAAI;IAOhE,kBAAkB;IAClB,IAAI,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAKxB,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW,CAAC,oCAAoC,CAAC;IAQvG,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC,oCAAoC,CAAC,CAAC;IAgBjG,kBAAkB;IAClB,WAAW,CAAC,EAAE,EAAE,wBAAwB,GAAG,IAAI;IAkD/C,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI;IAMnC,YAAY,CAAC,WAAW,EAAE,YAAY,EAAE,GAAG,IAAI;IAM/C;;;;OAIG;IACH,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK3C;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAoBjC,+EAA+E;IAC/E,OAAO,CAAC,uBAAuB;IAQ/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACH,SAAS,CAAC,mBAAmB,IAAI,cAAc,CAAC,oCAAoC,CAAC;CA+EtF"}
@@ -0,0 +1,266 @@
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.TokenTransferBuilder = void 0;
7
+ const assert_1 = __importDefault(require("assert"));
8
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
9
+ const iface_1 = require("./iface");
10
+ const transactionBuilder_1 = require("./transactionBuilder");
11
+ const tokenTransferTransaction_1 = require("./tokenTransferTransaction");
12
+ const types_1 = require("./mystenlab/types");
13
+ const utils_1 = __importDefault(require("./utils"));
14
+ const builder_1 = require("./mystenlab/builder");
15
+ const type_tag_serializer_1 = require("./mystenlab/txn-data-serializers/type-tag-serializer");
16
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
17
+ class TokenTransferBuilder extends transactionBuilder_1.TransactionBuilder {
18
+ constructor(_coinConfig) {
19
+ super(_coinConfig);
20
+ /**
21
+ * Balance held in the address balance system for the token being transferred.
22
+ * When set, this amount is included in the total available balance.
23
+ * At execution time, tx.withdrawal() + 0x2::coin::redeem_funds converts it
24
+ * to a Coin<T> that is merged with any coin objects before splitting.
25
+ */
26
+ this._fundsInAddressBalance = new bignumber_js_1.default(0);
27
+ this._transaction = new tokenTransferTransaction_1.TokenTransferTransaction(_coinConfig);
28
+ }
29
+ get transactionType() {
30
+ return sdk_core_1.TransactionType.Send;
31
+ }
32
+ /**
33
+ * The full coin type string derived from the coin config (e.g. `0xabc::my_token::MY_TOKEN`).
34
+ */
35
+ get tokenCoinType() {
36
+ if (this._tokenCoinTypeOverride) {
37
+ return this._tokenCoinTypeOverride;
38
+ }
39
+ const config = this._coinConfig;
40
+ return `${config.packageId}::${config.module}::${config.symbol}`;
41
+ }
42
+ /** @inheritdoc */
43
+ validateTransaction(transaction) {
44
+ if (!transaction.suiTransaction) {
45
+ return;
46
+ }
47
+ this.validateTransactionFields();
48
+ }
49
+ /** @inheritdoc */
50
+ sign(key) {
51
+ this.transaction.setSuiTransaction(this.buildSuiTransaction());
52
+ super.sign(key);
53
+ }
54
+ /** @inheritdoc */
55
+ fromImplementation(rawTransaction) {
56
+ const tx = new tokenTransferTransaction_1.TokenTransferTransaction(this._coinConfig);
57
+ this.validateRawTransaction(rawTransaction);
58
+ tx.fromRawTransaction(rawTransaction);
59
+ this.initBuilder(tx);
60
+ return this.transaction;
61
+ }
62
+ /** @inheritdoc */
63
+ async buildImplementation() {
64
+ this.transaction.setSuiTransaction(this.buildSuiTransaction());
65
+ this.transaction.transactionType(this.transactionType);
66
+ if (this._signer) {
67
+ this.transaction.sign(this._signer);
68
+ }
69
+ this._signatures.forEach((signature) => {
70
+ this.transaction.addSignature(signature.publicKey, signature.signature);
71
+ });
72
+ this.transaction.loadInputsAndOutputs();
73
+ return this.transaction;
74
+ }
75
+ /** @inheritdoc */
76
+ initBuilder(tx) {
77
+ this._transaction = tx;
78
+ if (tx.signature && tx.signature.length > 0) {
79
+ this._signatures = [tx.suiSignature];
80
+ }
81
+ const txData = tx.toJson();
82
+ this.type(iface_1.SuiTransactionType.TokenTransfer);
83
+ this.sender(txData.sender);
84
+ this.gasData(txData.gasData);
85
+ // Only restore meaningful expirations (Epoch or ValidDuring) — ignore None.
86
+ if (txData.expiration && !('None' in txData.expiration)) {
87
+ this._expiration = txData.expiration;
88
+ }
89
+ const recipients = utils_1.default.getRecipients(tx.suiTransaction);
90
+ this.send(recipients);
91
+ // Reconstruct fundsInAddressBalance from BalanceWithdrawal input if present.
92
+ // After BCS deserialization inputs are CallArg format: { BalanceWithdrawal: {...} }
93
+ // During building they are TransactionBlockInput format: { kind:'Input', value: { BalanceWithdrawal: {...} } }
94
+ const withdrawalInput = tx.suiTransaction?.tx?.inputs?.find((input) => (input !== null && typeof input === 'object' && 'BalanceWithdrawal' in input) ||
95
+ (input?.value !== null && typeof input?.value === 'object' && 'BalanceWithdrawal' in (input.value ?? {})));
96
+ if (withdrawalInput) {
97
+ const bw = withdrawalInput.BalanceWithdrawal ?? withdrawalInput.value?.BalanceWithdrawal;
98
+ this._fundsInAddressBalance = new bignumber_js_1.default(String(bw.reservation?.MaxAmountU64 ?? bw.amount));
99
+ // Recover the coin type from the withdrawal's TypeTag so that re-building uses the exact
100
+ // coin type the transaction was created (and signed) with. Without this, buildSuiTransaction
101
+ // would re-derive the coin type from this._coinConfig, which is the parent chain config
102
+ // (no packageId/module/symbol) when the builder is constructed via the chain — producing an
103
+ // `undefined::undefined::undefined` coin type and a signature that fails on-chain verification.
104
+ const withdrawalTypeTag = bw?.typeArg?.Balance;
105
+ if (withdrawalTypeTag) {
106
+ // BCS decodes the struct address without the `0x` prefix; normalize it so the recovered
107
+ // coin type matches the config-derived form (`0x<addr>::module::name`). The serialized
108
+ // bytes are identical either way since parseFromStr re-normalizes the address on encode.
109
+ const [address, ...rest] = type_tag_serializer_1.TypeTagSerializer.tagToString(withdrawalTypeTag).split('::');
110
+ this._tokenCoinTypeOverride = [(0, types_1.normalizeSuiAddress)(address), ...rest].join('::');
111
+ }
112
+ }
113
+ if (txData.inputObjects && txData.inputObjects.length > 0) {
114
+ this.inputObjects(txData.inputObjects);
115
+ }
116
+ }
117
+ send(recipients) {
118
+ this.validateRecipients(recipients);
119
+ this._recipients = recipients;
120
+ return this;
121
+ }
122
+ inputObjects(inputObject) {
123
+ this.validateInputObjectRefs(inputObject);
124
+ this._inputObjects = inputObject;
125
+ return this;
126
+ }
127
+ /**
128
+ * Set the amount of token funds held in the Sui address balance system for this sender.
129
+ *
130
+ * @param {string} amount - amount in base units held in address balance
131
+ */
132
+ fundsInAddressBalance(amount) {
133
+ this._fundsInAddressBalance = new bignumber_js_1.default(amount);
134
+ return this;
135
+ }
136
+ /**
137
+ * Validates all fields are defined correctly
138
+ */
139
+ validateTransactionFields() {
140
+ (0, assert_1.default)(this._type, new sdk_core_1.BuildTransactionError('type is required before building'));
141
+ (0, assert_1.default)(this._sender, new sdk_core_1.BuildTransactionError('sender is required before building'));
142
+ (0, assert_1.default)(this._recipients && this._recipients.length > 0, new sdk_core_1.BuildTransactionError('at least one recipient is required before building'));
143
+ (0, assert_1.default)(this._gasData, new sdk_core_1.BuildTransactionError('gasData is required before building'));
144
+ this.validateGasData(this._gasData);
145
+ // Must have at least coin objects OR address balance
146
+ (0, assert_1.default)((this._inputObjects && this._inputObjects.length > 0) || this._fundsInAddressBalance.gt(0), new sdk_core_1.BuildTransactionError('input objects or fundsInAddressBalance required before building'));
147
+ if (this._inputObjects && this._inputObjects.length > 0) {
148
+ this.validateInputObjectRefs(this._inputObjects);
149
+ }
150
+ }
151
+ /** Validates the individual object refs (does not require non-empty array). */
152
+ validateInputObjectRefs(inputObjects) {
153
+ if (inputObjects) {
154
+ inputObjects.forEach((inputObject) => {
155
+ this.validateSuiObjectRef(inputObject, 'input object');
156
+ });
157
+ }
158
+ }
159
+ /**
160
+ * Build SuiTransaction.
161
+ *
162
+ * Two build paths:
163
+ *
164
+ * Path A — coin objects only (fundsInAddressBalance = 0):
165
+ * MergeCoins(inputObject[0], [inputObject[1..]]) → SplitCoins → TransferObjects
166
+ *
167
+ * Path B — coin objects + address balance (or address balance only):
168
+ * MoveCall(0x2::coin::redeem_funds, [withdrawal(amount, coinType)]) → Coin<T>
169
+ * MergeCoins(inputObject[0] | addrCoin, [rest...]) → SplitCoins → TransferObjects
170
+ *
171
+ * Exception A — addr-bal only, full amount (fundsInAddressBalance === sum(recipient amounts)):
172
+ * MoveCall(0x2::coin::redeem_funds, [withdrawal(amount, coinType)]) → Coin<T>
173
+ * SplitCoins(addrCoin, [amount0]) → TransferObjects(split0, addr0) # recipients 0..N-2
174
+ * ...
175
+ * TransferObjects([addrCoin], addrN-1) # last recipient directly
176
+ * (After N-1 splits addrCoin.balance === recipients[N-1].amount exactly, so it can be
177
+ * transferred directly. SplitCoins on the last recipient would leave a zero-balance Coin<T>
178
+ * unused, which causes UnusedValueWithoutDrop since Coin<T> has no drop ability.)
179
+ *
180
+ * Exception B — addr-bal only, partial amount (fundsInAddressBalance > sum(recipient amounts)):
181
+ * MoveCall(0x2::coin::redeem_funds, [withdrawal(amount, coinType)]) → Coin<T>
182
+ * SplitCoins(addrCoin, [amount0]) → TransferObjects(split0, addr0) # all recipients
183
+ * ...
184
+ * TransferObjects([addrCoin], sender) # return change to sender
185
+ * (addrCoin still holds the unspent remainder; transferring it back to the sender consumes
186
+ * the command result, avoiding UnusedValueWithoutDrop. Mirrors the native SUI TransferBuilder
187
+ * change-return path. Unlike native SUI, MergeCoins(gas, [addrCoin]) is not possible here
188
+ * because gas is Coin<SUI> and addrCoin is Coin<T> — incompatible types.)
189
+ *
190
+ * @return {SuiTransaction<TokenTransferProgrammableTransaction>}
191
+ * @protected
192
+ */
193
+ buildSuiTransaction() {
194
+ this.validateTransactionFields();
195
+ const programmableTxBuilder = new builder_1.TransactionBlock();
196
+ const inputObjects = (this._inputObjects ?? []).map((object) => programmableTxBuilder.object(builder_1.Inputs.ObjectRef(object)));
197
+ // If address balance is available, withdraw it as Coin<T> and add to the pool
198
+ if (this._fundsInAddressBalance.gt(0)) {
199
+ const coinType = this.tokenCoinType;
200
+ const [addrCoin] = programmableTxBuilder.moveCall({
201
+ target: '0x2::coin::redeem_funds',
202
+ typeArguments: [coinType],
203
+ arguments: [
204
+ programmableTxBuilder.withdrawal({
205
+ amount: BigInt(this._fundsInAddressBalance.toFixed()),
206
+ type: coinType,
207
+ }),
208
+ ],
209
+ });
210
+ inputObjects.push(addrCoin);
211
+ }
212
+ const mergedObject = inputObjects.shift();
213
+ if (inputObjects.length > 0) {
214
+ programmableTxBuilder.mergeCoins(mergedObject, inputObjects);
215
+ }
216
+ // addrCoin (the Coin<T> returned by redeem_funds) is a command result and must be explicitly
217
+ // consumed — Coin<T> has no `drop` ability, so leaving it unused causes UnusedValueWithoutDrop.
218
+ // This only applies when there are no coin objects (addr-bal only); in the hybrid case addrCoin
219
+ // is consumed upfront by the MergeCoins above.
220
+ const recipientTotal = this._recipients.reduce((sum, r) => sum.plus(r.amount), new bignumber_js_1.default(0));
221
+ const isAddrBalOnly = (this._inputObjects ?? []).length === 0 && this._fundsInAddressBalance.gt(0);
222
+ if (isAddrBalOnly && this._fundsInAddressBalance.eq(recipientTotal)) {
223
+ // Exception A — full amount: split for first N-1 recipients, transfer addrCoin directly
224
+ // to the last. After N-1 splits addrCoin.balance === recipients[N-1].amount exactly.
225
+ this._recipients.slice(0, -1).forEach((recipient) => {
226
+ const splitObject = programmableTxBuilder.splitCoins(mergedObject, [
227
+ programmableTxBuilder.pure(BigInt(recipient.amount)),
228
+ ]);
229
+ programmableTxBuilder.transferObjects([splitObject], programmableTxBuilder.object(recipient.address));
230
+ });
231
+ const lastRecipient = this._recipients[this._recipients.length - 1];
232
+ programmableTxBuilder.transferObjects([mergedObject], programmableTxBuilder.object(lastRecipient.address));
233
+ }
234
+ else {
235
+ // Standard path: split and transfer for every recipient.
236
+ this._recipients.forEach((recipient) => {
237
+ const splitObject = programmableTxBuilder.splitCoins(mergedObject, [
238
+ programmableTxBuilder.pure(BigInt(recipient.amount)),
239
+ ]);
240
+ programmableTxBuilder.transferObjects([splitObject], programmableTxBuilder.object(recipient.address));
241
+ });
242
+ if (isAddrBalOnly && this._fundsInAddressBalance.gt(recipientTotal)) {
243
+ // Exception B — partial amount: addrCoin still holds the unspent remainder.
244
+ // Return it to the sender to consume the command result (MergeCoins into gas is not
245
+ // possible here — gas is Coin<SUI> but addrCoin is Coin<T>, incompatible types).
246
+ programmableTxBuilder.transferObjects([mergedObject], programmableTxBuilder.object(this._sender));
247
+ }
248
+ }
249
+ const txData = programmableTxBuilder.blockData;
250
+ return {
251
+ type: this._type,
252
+ sender: this._sender,
253
+ tx: {
254
+ inputs: [...txData.inputs],
255
+ transactions: [...txData.transactions],
256
+ },
257
+ gasData: {
258
+ ...this._gasData,
259
+ },
260
+ expiration: this._expiration,
261
+ fundsInAddressBalance: this._fundsInAddressBalance.gt(0) ? this._fundsInAddressBalance.toFixed() : undefined,
262
+ };
263
+ }
264
+ }
265
+ exports.TokenTransferBuilder = TokenTransferBuilder;
266
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5UcmFuc2ZlckJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Rva2VuVHJhbnNmZXJCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixtREFBa0c7QUFFbEcsbUNBQW1HO0FBRW5HLDZEQUEwRDtBQUMxRCx5RUFBc0U7QUFDdEUsNkNBQXNFO0FBQ3RFLG9EQUE0QjtBQUM1QixpREFJNkI7QUFDN0IsOEZBQXlGO0FBQ3pGLGdFQUFxQztBQUVyQyxNQUFhLG9CQUFxQixTQUFRLHVDQUF3RDtJQW9CaEcsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFsQnJCOzs7OztXQUtHO1FBQ08sMkJBQXNCLEdBQWMsSUFBSSxzQkFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBYTdELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxtREFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsSUFBYyxlQUFlO1FBQzNCLE9BQU8sMEJBQWUsQ0FBQyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBWSxhQUFhO1FBQ3ZCLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDaEMsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDckMsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFzQixDQUFDO1FBQzNDLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ25FLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsbUJBQW1CLENBQUMsV0FBcUM7UUFDdkQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNoQyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyx5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QUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN4RyxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDcEUsNEVBQTRFO2dCQUM1RSxvRkFBb0Y7Z0JBQ3BGLGlGQUFpRjtnQkFDakYscUJBQXFCLENBQUMsZUFBZSxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUscUJBQXFCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQUMsU0FBUyxDQUFDO1FBQy9DLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDaEIsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3BCLEVBQUUsRUFBRTtnQkFDRixNQUFNLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQzFCLFlBQVksRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQzthQUN2QztZQUNELE9BQU8sRUFBRTtnQkFDUCxHQUFHLElBQUksQ0FBQyxRQUFRO2FBQ2pCO1lBQ0QsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzVCLHFCQUFxQixFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUM3RyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBMVNELG9EQTBTQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSwgUmVjaXBpZW50LCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIEJhc2VLZXkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnLCBTdWlDb2luIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBTdWlUcmFuc2FjdGlvbiwgU3VpVHJhbnNhY3Rpb25UeXBlLCBUb2tlblRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24gfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBUb2tlblRyYW5zZmVyVHJhbnNhY3Rpb24gfSBmcm9tICcuL3Rva2VuVHJhbnNmZXJUcmFuc2FjdGlvbic7XG5pbXBvcnQgeyBub3JtYWxpemVTdWlBZGRyZXNzLCBTdWlPYmplY3RSZWYgfSBmcm9tICcuL215c3RlbmxhYi90eXBlcyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge1xuICBJbnB1dHMsXG4gIFRyYW5zYWN0aW9uQmxvY2sgYXMgUHJvZ3JhbW1pbmdUcmFuc2FjdGlvbkJsb2NrQnVpbGRlcixcbiAgVHJhbnNhY3Rpb25Bcmd1bWVudCxcbn0gZnJvbSAnLi9teXN0ZW5sYWIvYnVpbGRlcic7XG5pbXBvcnQgeyBUeXBlVGFnU2VyaWFsaXplciB9IGZyb20gJy4vbXlzdGVubGFiL3R4bi1kYXRhLXNlcmlhbGl6ZXJzL3R5cGUtdGFnLXNlcmlhbGl6ZXInO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuXG5leHBvcnQgY2xhc3MgVG9rZW5UcmFuc2ZlckJ1aWxkZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXI8VG9rZW5UcmFuc2ZlclByb2dyYW1tYWJsZVRyYW5zYWN0aW9uPiB7XG4gIHByb3RlY3RlZCBfcmVjaXBpZW50czogUmVjaXBpZW50W107XG4gIHByb3RlY3RlZCBfaW5wdXRPYmplY3RzOiBTdWlPYmplY3RSZWZbXTtcbiAgLyoqXG4gICAqIEJhbGFuY2UgaGVsZCBpbiB0aGUgYWRkcmVzcyBiYWxhbmNlIHN5c3RlbSBmb3IgdGhlIHRva2VuIGJlaW5nIHRyYW5zZmVycmVkLlxuICAgKiBXaGVuIHNldCwgdGhpcyBhbW91bnQgaXMgaW5jbHVkZWQgaW4gdGhlIHRvdGFsIGF2YWlsYWJsZSBiYWxhbmNlLlxuICAgKiBBdCBleGVjdXRpb24gdGltZSwgdHgud2l0aGRyYXdhbCgpICsgMHgyOjpjb2luOjpyZWRlZW1fZnVuZHMgY29udmVydHMgaXRcbiAgICogdG8gYSBDb2luPFQ+IHRoYXQgaXMgbWVyZ2VkIHdpdGggYW55IGNvaW4gb2JqZWN0cyBiZWZvcmUgc3BsaXR0aW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9mdW5kc0luQWRkcmVzc0JhbGFuY2U6IEJpZ051bWJlciA9IG5ldyBCaWdOdW1iZXIoMCk7XG5cbiAgLyoqXG4gICAqIENvaW4gdHlwZSByZWNvdmVyZWQgZnJvbSBhIGRlc2VyaWFsaXplZCB0cmFuc2FjdGlvbiAodGhlIGByZWRlZW1fZnVuZHNgIHR5cGUgYXJndW1lbnQgL1xuICAgKiBgQmFsYW5jZVdpdGhkcmF3YWxgIHR5cGUpLiBXaGVuIHNldCBpdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIGNvaW4gdHlwZSBkZXJpdmVkIGZyb20gdGhlXG4gICAqIGNvaW4gY29uZmlnLCBzbyByZS1idWlsZGluZyBhIHRyYW5zYWN0aW9uIChlLmcuIHRvIGF0dGFjaCBhIFRTUyBzaWduYXR1cmUgYmVmb3JlIGJyb2FkY2FzdClcbiAgICogcHJlc2VydmVzIHRoZSBleGFjdCBjb2luIHR5cGUgaXQgd2FzIHNpZ25lZCB3aXRoIGV2ZW4gd2hlbiB0aGUgYnVpbGRlciB3YXMgY29uc3RydWN0ZWQgd2l0aFxuICAgKiB0aGUgcGFyZW50IGNoYWluIGNvbmZpZyByYXRoZXIgdGhhbiB0aGUgdG9rZW4gY29uZmlnLlxuICAgKi9cbiAgcHJvdGVjdGVkIF90b2tlbkNvaW5UeXBlT3ZlcnJpZGU/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gbmV3IFRva2VuVHJhbnNmZXJUcmFuc2FjdGlvbihfY29pbkNvbmZpZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZnVsbCBjb2luIHR5cGUgc3RyaW5nIGRlcml2ZWQgZnJvbSB0aGUgY29pbiBjb25maWcgKGUuZy4gYDB4YWJjOjpteV90b2tlbjo6TVlfVE9LRU5gKS5cbiAgICovXG4gIHByaXZhdGUgZ2V0IHRva2VuQ29pblR5cGUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fdG9rZW5Db2luVHlwZU92ZXJyaWRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdG9rZW5Db2luVHlwZU92ZXJyaWRlO1xuICAgIH1cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLl9jb2luQ29uZmlnIGFzIFN1aUNvaW47XG4gICAgcmV0dXJuIGAke2NvbmZpZy5wYWNrYWdlSWR9Ojoke2NvbmZpZy5tb2R1bGV9Ojoke2NvbmZpZy5zeW1ib2x9YDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUb2tlblRyYW5zZmVyVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRyYW5zYWN0aW9uLnN1aVRyYW5zYWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVUcmFuc2FjdGlvbkZpZWxkcygpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHNpZ24oa2V5OiBCYXNlS2V5KTogdm9pZCB7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRTdWlUcmFuc2FjdGlvbih0aGlzLmJ1aWxkU3VpVHJhbnNhY3Rpb24oKSk7XG4gICAgc3VwZXIuc2lnbihrZXkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBmcm9tSW1wbGVtZW50YXRpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IFRyYW5zYWN0aW9uPFRva2VuVHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4ID0gbmV3IFRva2VuVHJhbnNmZXJUcmFuc2FjdGlvbih0aGlzLl9jb2luQ29uZmlnKTtcbiAgICB0aGlzLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24pO1xuICAgIHR4LmZyb21SYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gICAgdGhpcy5pbml0QnVpbGRlcih0eCk7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxUcmFuc2FjdGlvbjxUb2tlblRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+PiB7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRTdWlUcmFuc2FjdGlvbih0aGlzLmJ1aWxkU3VpVHJhbnNhY3Rpb24oKSk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi50cmFuc2FjdGlvblR5cGUodGhpcy50cmFuc2FjdGlvblR5cGUpO1xuXG4gICAgaWYgKHRoaXMuX3NpZ25lcikge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbi5zaWduKHRoaXMuX3NpZ25lcik7XG4gICAgfVxuXG4gICAgdGhpcy5fc2lnbmF0dXJlcy5mb3JFYWNoKChzaWduYXR1cmUpID0+IHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uYWRkU2lnbmF0dXJlKHNpZ25hdHVyZS5wdWJsaWNLZXksIHNpZ25hdHVyZS5zaWduYXR1cmUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5sb2FkSW5wdXRzQW5kT3V0cHV0cygpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGluaXRCdWlsZGVyKHR4OiBUb2tlblRyYW5zZmVyVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IHR4O1xuXG4gICAgaWYgKHR4LnNpZ25hdHVyZSAmJiB0eC5zaWduYXR1cmUubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fc2lnbmF0dXJlcyA9IFt0eC5zdWlTaWduYXR1cmVdO1xuICAgIH1cbiAgICBjb25zdCB0eERhdGEgPSB0eC50b0pzb24oKTtcbiAgICB0aGlzLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRva2VuVHJhbnNmZXIpO1xuICAgIHRoaXMuc2VuZGVyKHR4RGF0YS5zZW5kZXIpO1xuICAgIHRoaXMuZ2FzRGF0YSh0eERhdGEuZ2FzRGF0YSk7XG5cbiAgICAvLyBPbmx5IHJlc3RvcmUgbWVhbmluZ2Z1bCBleHBpcmF0aW9ucyAoRXBvY2ggb3IgVmFsaWREdXJpbmcpIOKAlCBpZ25vcmUgTm9uZS5cbiAgICBpZiAodHhEYXRhLmV4cGlyYXRpb24gJiYgISgnTm9uZScgaW4gdHhEYXRhLmV4cGlyYXRpb24pKSB7XG4gICAgICB0aGlzLl9leHBpcmF0aW9uID0gdHhEYXRhLmV4cGlyYXRpb247XG4gICAgfVxuXG4gICAgY29uc3QgcmVjaXBpZW50cyA9IHV0aWxzLmdldFJlY2lwaWVudHModHguc3VpVHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuc2VuZChyZWNpcGllbnRzKTtcblxuICAgIC8vIFJlY29uc3RydWN0IGZ1bmRzSW5BZGRyZXNzQmFsYW5jZSBmcm9tIEJhbGFuY2VXaXRoZHJhd2FsIGlucHV0IGlmIHByZXNlbnQuXG4gICAgLy8gQWZ0ZXIgQkNTIGRlc2VyaWFsaXphdGlvbiBpbnB1dHMgYXJlIENhbGxBcmcgZm9ybWF0OiB7IEJhbGFuY2VXaXRoZHJhd2FsOiB7Li4ufSB9XG4gICAgLy8gRHVyaW5nIGJ1aWxkaW5nIHRoZXkgYXJlIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCBmb3JtYXQ6IHsga2luZDonSW5wdXQnLCB2YWx1ZTogeyBCYWxhbmNlV2l0aGRyYXdhbDogey4uLn0gfSB9XG4gICAgY29uc3Qgd2l0aGRyYXdhbElucHV0ID0gKHR4LnN1aVRyYW5zYWN0aW9uPy50eD8uaW5wdXRzIGFzIGFueVtdKT8uZmluZChcbiAgICAgIChpbnB1dDogYW55KSA9PlxuICAgICAgICAoaW5wdXQgIT09IG51bGwgJiYgdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiAnQmFsYW5jZVdpdGhkcmF3YWwnIGluIGlucHV0KSB8fFxuICAgICAgICAoaW5wdXQ/LnZhbHVlICE9PSBudWxsICYmIHR5cGVvZiBpbnB1dD8udmFsdWUgPT09ICdvYmplY3QnICYmICdCYWxhbmNlV2l0aGRyYXdhbCcgaW4gKGlucHV0LnZhbHVlID8/IHt9KSlcbiAgICApO1xuICAgIGlmICh3aXRoZHJhd2FsSW5wdXQpIHtcbiAgICAgIGNvbnN0IGJ3ID0gd2l0aGRyYXdhbElucHV0LkJhbGFuY2VXaXRoZHJhd2FsID8/IHdpdGhkcmF3YWxJbnB1dC52YWx1ZT8uQmFsYW5jZVdpdGhkcmF3YWw7XG4gICAgICB0aGlzLl9mdW5kc0luQWRkcmVzc0JhbGFuY2UgPSBuZXcgQmlnTnVtYmVyKFN0cmluZyhidy5yZXNlcnZhdGlvbj8uTWF4QW1vdW50VTY0ID8/IGJ3LmFtb3VudCkpO1xuICAgICAgLy8gUmVjb3ZlciB0aGUgY29pbiB0eXBlIGZyb20gdGhlIHdpdGhkcmF3YWwncyBUeXBlVGFnIHNvIHRoYXQgcmUtYnVpbGRpbmcgdXNlcyB0aGUgZXhhY3RcbiAgICAgIC8vIGNvaW4gdHlwZSB0aGUgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQgKGFuZCBzaWduZWQpIHdpdGguIFdpdGhvdXQgdGhpcywgYnVpbGRTdWlUcmFuc2FjdGlvblxuICAgICAgLy8gd291bGQgcmUtZGVyaXZlIHRoZSBjb2luIHR5cGUgZnJvbSB0aGlzLl9jb2luQ29uZmlnLCB3aGljaCBpcyB0aGUgcGFyZW50IGNoYWluIGNvbmZpZ1xuICAgICAgLy8gKG5vIHBhY2thZ2VJZC9tb2R1bGUvc3ltYm9sKSB3aGVuIHRoZSBidWlsZGVyIGlzIGNvbnN0cnVjdGVkIHZpYSB0aGUgY2hhaW4g4oCUIHByb2R1Y2luZyBhblxuICAgICAgLy8gYHVuZGVmaW5lZDo6dW5kZWZpbmVkOjp1bmRlZmluZWRgIGNvaW4gdHlwZSBhbmQgYSBzaWduYXR1cmUgdGhhdCBmYWlscyBvbi1jaGFpbiB2ZXJpZmljYXRpb24uXG4gICAgICBjb25zdCB3aXRoZHJhd2FsVHlwZVRhZyA9IGJ3Py50eXBlQXJnPy5CYWxhbmNlO1xuICAgICAgaWYgKHdpdGhkcmF3YWxUeXBlVGFnKSB7XG4gICAgICAgIC8vIEJDUyBkZWNvZGVzIHRoZSBzdHJ1Y3QgYWRkcmVzcyB3aXRob3V0IHRoZSBgMHhgIHByZWZpeDsgbm9ybWFsaXplIGl0IHNvIHRoZSByZWNvdmVyZWRcbiAgICAgICAgLy8gY29pbiB0eXBlIG1hdGNoZXMgdGhlIGNvbmZpZy1kZXJpdmVkIGZvcm0gKGAweDxhZGRyPjo6bW9kdWxlOjpuYW1lYCkuIFRoZSBzZXJpYWxpemVkXG4gICAgICAgIC8vIGJ5dGVzIGFyZSBpZGVudGljYWwgZWl0aGVyIHdheSBzaW5jZSBwYXJzZUZyb21TdHIgcmUtbm9ybWFsaXplcyB0aGUgYWRkcmVzcyBvbiBlbmNvZGUuXG4gICAgICAgIGNvbnN0IFthZGRyZXNzLCAuLi5yZXN0XSA9IFR5cGVUYWdTZXJpYWxpemVyLnRhZ1RvU3RyaW5nKHdpdGhkcmF3YWxUeXBlVGFnKS5zcGxpdCgnOjonKTtcbiAgICAgICAgdGhpcy5fdG9rZW5Db2luVHlwZU92ZXJyaWRlID0gW25vcm1hbGl6ZVN1aUFkZHJlc3MoYWRkcmVzcyksIC4uLnJlc3RdLmpvaW4oJzo6Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR4RGF0YS5pbnB1dE9iamVjdHMgJiYgdHhEYXRhLmlucHV0T2JqZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmlucHV0T2JqZWN0cyh0eERhdGEuaW5wdXRPYmplY3RzKTtcbiAgICB9XG4gIH1cblxuICBzZW5kKHJlY2lwaWVudHM6IFJlY2lwaWVudFtdKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZVJlY2lwaWVudHMocmVjaXBpZW50cyk7XG4gICAgdGhpcy5fcmVjaXBpZW50cyA9IHJlY2lwaWVudHM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpbnB1dE9iamVjdHMoaW5wdXRPYmplY3Q6IFN1aU9iamVjdFJlZltdKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZUlucHV0T2JqZWN0UmVmcyhpbnB1dE9iamVjdCk7XG4gICAgdGhpcy5faW5wdXRPYmplY3RzID0gaW5wdXRPYmplY3Q7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBhbW91bnQgb2YgdG9rZW4gZnVuZHMgaGVsZCBpbiB0aGUgU3VpIGFkZHJlc3MgYmFsYW5jZSBzeXN0ZW0gZm9yIHRoaXMgc2VuZGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IC0gYW1vdW50IGluIGJhc2UgdW5pdHMgaGVsZCBpbiBhZGRyZXNzIGJhbGFuY2VcbiAgICovXG4gIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZShhbW91bnQ6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMuX2Z1bmRzSW5BZGRyZXNzQmFsYW5jZSA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYWxsIGZpZWxkcyBhcmUgZGVmaW5lZCBjb3JyZWN0bHlcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVUcmFuc2FjdGlvbkZpZWxkcygpOiB2b2lkIHtcbiAgICBhc3NlcnQodGhpcy5fdHlwZSwgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcigndHlwZSBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKSk7XG4gICAgYXNzZXJ0KHRoaXMuX3NlbmRlciwgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignc2VuZGVyIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpKTtcbiAgICBhc3NlcnQoXG4gICAgICB0aGlzLl9yZWNpcGllbnRzICYmIHRoaXMuX3JlY2lwaWVudHMubGVuZ3RoID4gMCxcbiAgICAgIG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ2F0IGxlYXN0IG9uZSByZWNpcGllbnQgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJylcbiAgICApO1xuICAgIGFzc2VydCh0aGlzLl9nYXNEYXRhLCBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdnYXNEYXRhIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpKTtcbiAgICB0aGlzLnZhbGlkYXRlR2FzRGF0YSh0aGlzLl9nYXNEYXRhKTtcblxuICAgIC8vIE11c3QgaGF2ZSBhdCBsZWFzdCBjb2luIG9iamVjdHMgT1IgYWRkcmVzcyBiYWxhbmNlXG4gICAgYXNzZXJ0KFxuICAgICAgKHRoaXMuX2lucHV0T2JqZWN0cyAmJiB0aGlzLl9pbnB1dE9iamVjdHMubGVuZ3RoID4gMCkgfHwgdGhpcy5fZnVuZHNJbkFkZHJlc3NCYWxhbmNlLmd0KDApLFxuICAgICAgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignaW5wdXQgb2JqZWN0cyBvciBmdW5kc0luQWRkcmVzc0JhbGFuY2UgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJylcbiAgICApO1xuICAgIGlmICh0aGlzLl9pbnB1dE9iamVjdHMgJiYgdGhpcy5faW5wdXRPYmplY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudmFsaWRhdGVJbnB1dE9iamVjdFJlZnModGhpcy5faW5wdXRPYmplY3RzKTtcbiAgICB9XG4gIH1cblxuICAvKiogVmFsaWRhdGVzIHRoZSBpbmRpdmlkdWFsIG9iamVjdCByZWZzIChkb2VzIG5vdCByZXF1aXJlIG5vbi1lbXB0eSBhcnJheSkuICovXG4gIHByaXZhdGUgdmFsaWRhdGVJbnB1dE9iamVjdFJlZnMoaW5wdXRPYmplY3RzOiBTdWlPYmplY3RSZWZbXSk6IHZvaWQge1xuICAgIGlmIChpbnB1dE9iamVjdHMpIHtcbiAgICAgIGlucHV0T2JqZWN0cy5mb3JFYWNoKChpbnB1dE9iamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnZhbGlkYXRlU3VpT2JqZWN0UmVmKGlucHV0T2JqZWN0LCAnaW5wdXQgb2JqZWN0Jyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgU3VpVHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFR3byBidWlsZCBwYXRoczpcbiAgICpcbiAgICogUGF0aCBBIOKAlCBjb2luIG9iamVjdHMgb25seSAoZnVuZHNJbkFkZHJlc3NCYWxhbmNlID0gMCk6XG4gICAqICAgTWVyZ2VDb2lucyhpbnB1dE9iamVjdFswXSwgW2lucHV0T2JqZWN0WzEuLl1dKSDihpIgU3BsaXRDb2lucyDihpIgVHJhbnNmZXJPYmplY3RzXG4gICAqXG4gICAqIFBhdGggQiDigJQgY29pbiBvYmplY3RzICsgYWRkcmVzcyBiYWxhbmNlIChvciBhZGRyZXNzIGJhbGFuY2Ugb25seSk6XG4gICAqICAgTW92ZUNhbGwoMHgyOjpjb2luOjpyZWRlZW1fZnVuZHMsIFt3aXRoZHJhd2FsKGFtb3VudCwgY29pblR5cGUpXSkg4oaSIENvaW48VD5cbiAgICogICBNZXJnZUNvaW5zKGlucHV0T2JqZWN0WzBdIHwgYWRkckNvaW4sIFtyZXN0Li4uXSkg4oaSIFNwbGl0Q29pbnMg4oaSIFRyYW5zZmVyT2JqZWN0c1xuICAgKlxuICAgKiAgIEV4Y2VwdGlvbiBBIOKAlCBhZGRyLWJhbCBvbmx5LCBmdWxsIGFtb3VudCAoZnVuZHNJbkFkZHJlc3NCYWxhbmNlID09PSBzdW0ocmVjaXBpZW50IGFtb3VudHMpKTpcbiAgICogICBNb3ZlQ2FsbCgweDI6OmNvaW46OnJlZGVlbV9mdW5kcywgW3dpdGhkcmF3YWwoYW1vdW50LCBjb2luVHlwZSldKSDihpIgQ29pbjxUPlxuICAgKiAgIFNwbGl0Q29pbnMoYWRkckNvaW4sIFthbW91bnQwXSkg4oaSIFRyYW5zZmVyT2JqZWN0cyhzcGxpdDAsIGFkZHIwKSAgICMgcmVjaXBpZW50cyAwLi5OLTJcbiAgICogICAuLi5cbiAgICogICBUcmFuc2Zlck9iamVjdHMoW2FkZHJDb2luXSwgYWRkck4tMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGFzdCByZWNpcGllbnQgZGlyZWN0bHlcbiAgICogICAoQWZ0ZXIgTi0xIHNwbGl0cyBhZGRyQ29pbi5iYWxhbmNlID09PSByZWNpcGllbnRzW04tMV0uYW1vdW50IGV4YWN0bHksIHNvIGl0IGNhbiBiZVxuICAgKiAgIHRyYW5zZmVycmVkIGRpcmVjdGx5LiBTcGxpdENvaW5zIG9uIHRoZSBsYXN0IHJlY2lwaWVudCB3b3VsZCBsZWF2ZSBhIHplcm8tYmFsYW5jZSBDb2luPFQ+XG4gICAqICAgdW51c2VkLCB3aGljaCBjYXVzZXMgVW51c2VkVmFsdWVXaXRob3V0RHJvcCBzaW5jZSBDb2luPFQ+IGhhcyBubyBkcm9wIGFiaWxpdHkuKVxuICAgKlxuICAgKiAgIEV4Y2VwdGlvbiBCIOKAlCBhZGRyLWJhbCBvbmx5LCBwYXJ0aWFsIGFtb3VudCAoZnVuZHNJbkFkZHJlc3NCYWxhbmNlID4gc3VtKHJlY2lwaWVudCBhbW91bnRzKSk6XG4gICAqICAgTW92ZUNhbGwoMHgyOjpjb2luOjpyZWRlZW1fZnVuZHMsIFt3aXRoZHJhd2FsKGFtb3VudCwgY29pblR5cGUpXSkg4oaSIENvaW48VD5cbiAgICogICBTcGxpdENvaW5zKGFkZHJDb2luLCBbYW1vdW50MF0pIOKGkiBUcmFuc2Zlck9iamVjdHMoc3BsaXQwLCBhZGRyMCkgICAjIGFsbCByZWNpcGllbnRzXG4gICAqICAgLi4uXG4gICAqICAgVHJhbnNmZXJPYmplY3RzKFthZGRyQ29pbl0sIHNlbmRlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJldHVybiBjaGFuZ2UgdG8gc2VuZGVyXG4gICAqICAgKGFkZHJDb2luIHN0aWxsIGhvbGRzIHRoZSB1bnNwZW50IHJlbWFpbmRlcjsgdHJhbnNmZXJyaW5nIGl0IGJhY2sgdG8gdGhlIHNlbmRlciBjb25zdW1lc1xuICAgKiAgIHRoZSBjb21tYW5kIHJlc3VsdCwgYXZvaWRpbmcgVW51c2VkVmFsdWVXaXRob3V0RHJvcC4gTWlycm9ycyB0aGUgbmF0aXZlIFNVSSBUcmFuc2ZlckJ1aWxkZXJcbiAgICogICBjaGFuZ2UtcmV0dXJuIHBhdGguIFVubGlrZSBuYXRpdmUgU1VJLCBNZXJnZUNvaW5zKGdhcywgW2FkZHJDb2luXSkgaXMgbm90IHBvc3NpYmxlIGhlcmVcbiAgICogICBiZWNhdXNlIGdhcyBpcyBDb2luPFNVST4gYW5kIGFkZHJDb2luIGlzIENvaW48VD4g4oCUIGluY29tcGF0aWJsZSB0eXBlcy4pXG4gICAqXG4gICAqIEByZXR1cm4ge1N1aVRyYW5zYWN0aW9uPFRva2VuVHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj59XG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZFN1aVRyYW5zYWN0aW9uKCk6IFN1aVRyYW5zYWN0aW9uPFRva2VuVHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj4ge1xuICAgIHRoaXMudmFsaWRhdGVUcmFuc2FjdGlvbkZpZWxkcygpO1xuXG4gICAgY29uc3QgcHJvZ3JhbW1hYmxlVHhCdWlsZGVyID0gbmV3IFByb2dyYW1taW5nVHJhbnNhY3Rpb25CbG9ja0J1aWxkZXIoKTtcblxuICAgIGNvbnN0IGlucHV0T2JqZWN0czogVHJhbnNhY3Rpb25Bcmd1bWVudFtdID0gKHRoaXMuX2lucHV0T2JqZWN0cyA/PyBbXSkubWFwKChvYmplY3QpID0+XG4gICAgICBwcm9ncmFtbWFibGVUeEJ1aWxkZXIub2JqZWN0KElucHV0cy5PYmplY3RSZWYob2JqZWN0KSlcbiAgICApO1xuXG4gICAgLy8gSWYgYWRkcmVzcyBiYWxhbmNlIGlzIGF2YWlsYWJsZSwgd2l0aGRyYXcgaXQgYXMgQ29pbjxUPiBhbmQgYWRkIHRvIHRoZSBwb29sXG4gICAgaWYgKHRoaXMuX2Z1bmRzSW5BZGRyZXNzQmFsYW5jZS5ndCgwKSkge1xuICAgICAgY29uc3QgY29pblR5cGUgPSB0aGlzLnRva2VuQ29pblR5cGU7XG4gICAgICBjb25zdCBbYWRkckNvaW5dID0gcHJvZ3JhbW1hYmxlVHhCdWlsZGVyLm1vdmVDYWxsKHtcbiAgICAgICAgdGFyZ2V0OiAnMHgyOjpjb2luOjpyZWRlZW1fZnVuZHMnLFxuICAgICAgICB0eXBlQXJndW1lbnRzOiBbY29pblR5cGVdLFxuICAgICAgICBhcmd1bWVudHM6IFtcbiAgICAgICAgICBwcm9ncmFtbWFibGVUeEJ1aWxkZXIud2l0aGRyYXdhbCh7XG4gICAgICAgICAgICBhbW91bnQ6IEJpZ0ludCh0aGlzLl9mdW5kc0luQWRkcmVzc0JhbGFuY2UudG9GaXhlZCgpKSxcbiAgICAgICAgICAgIHR5cGU6IGNvaW5UeXBlLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgICBpbnB1dE9iamVjdHMucHVzaChhZGRyQ29pbik7XG4gICAgfVxuXG4gICAgY29uc3QgbWVyZ2VkT2JqZWN0ID0gaW5wdXRPYmplY3RzLnNoaWZ0KCkgYXMgVHJhbnNhY3Rpb25Bcmd1bWVudDtcbiAgICBpZiAoaW5wdXRPYmplY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHByb2dyYW1tYWJsZVR4QnVpbGRlci5tZXJnZUNvaW5zKG1lcmdlZE9iamVjdCwgaW5wdXRPYmplY3RzKTtcbiAgICB9XG5cbiAgICAvLyBhZGRyQ29pbiAodGhlIENvaW48VD4gcmV0dXJuZWQgYnkgcmVkZWVtX2Z1bmRzKSBpcyBhIGNvbW1hbmQgcmVzdWx0IGFuZCBtdXN0IGJlIGV4cGxpY2l0bHlcbiAgICAvLyBjb25zdW1lZCDigJQgQ29pbjxUPiBoYXMgbm8gYGRyb3BgIGFiaWxpdHksIHNvIGxlYXZpbmcgaXQgdW51c2VkIGNhdXNlcyBVbnVzZWRWYWx1ZVdpdGhvdXREcm9wLlxuICAgIC8vIFRoaXMgb25seSBhcHBsaWVzIHdoZW4gdGhlcmUgYXJlIG5vIGNvaW4gb2JqZWN0cyAoYWRkci1iYWwgb25seSk7IGluIHRoZSBoeWJyaWQgY2FzZSBhZGRyQ29pblxuICAgIC8vIGlzIGNvbnN1bWVkIHVwZnJvbnQgYnkgdGhlIE1lcmdlQ29pbnMgYWJvdmUuXG4gICAgY29uc3QgcmVjaXBpZW50VG90YWwgPSB0aGlzLl9yZWNpcGllbnRzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0ucGx1cyhyLmFtb3VudCksIG5ldyBCaWdOdW1iZXIoMCkpO1xuICAgIGNvbnN0IGlzQWRkckJhbE9ubHkgPSAodGhpcy5faW5wdXRPYmplY3RzID8/IFtdKS5sZW5ndGggPT09IDAgJiYgdGhpcy5fZnVuZHNJbkFkZHJlc3NCYWxhbmNlLmd0KDApO1xuXG4gICAgaWYgKGlzQWRkckJhbE9ubHkgJiYgdGhpcy5fZnVuZHNJbkFkZHJlc3NCYWxhbmNlLmVxKHJlY2lwaWVudFRvdGFsKSkge1xuICAgICAgLy8gRXhjZXB0aW9uIEEg4oCUIGZ1bGwgYW1vdW50OiBzcGxpdCBmb3IgZmlyc3QgTi0xIHJlY2lwaWVudHMsIHRyYW5zZmVyIGFkZHJDb2luIGRpcmVjdGx5XG4gICAgICAvLyB0byB0aGUgbGFzdC4gQWZ0ZXIgTi0xIHNwbGl0cyBhZGRyQ29pbi5iYWxhbmNlID09PSByZWNpcGllbnRzW04tMV0uYW1vdW50IGV4YWN0bHkuXG4gICAgICB0aGlzLl9yZWNpcGllbnRzLnNsaWNlKDAsIC0xKS5mb3JFYWNoKChyZWNpcGllbnQpID0+IHtcbiAgICAgICAgY29uc3Qgc3BsaXRPYmplY3QgPSBwcm9ncmFtbWFibGVUeEJ1aWxkZXIuc3BsaXRDb2lucyhtZXJnZWRPYmplY3QsIFtcbiAgICAgICAgICBwcm9ncmFtbWFibGVUeEJ1aWxkZXIucHVyZShCaWdJbnQocmVjaXBpZW50LmFtb3VudCkpLFxuICAgICAgICBdKTtcbiAgICAgICAgcHJvZ3JhbW1hYmxlVHhCdWlsZGVyLnRyYW5zZmVyT2JqZWN0cyhbc3BsaXRPYmplY3RdLCBwcm9ncmFtbWFibGVUeEJ1aWxkZXIub2JqZWN0KHJlY2lwaWVudC5hZGRyZXNzKSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxhc3RSZWNpcGllbnQgPSB0aGlzLl9yZWNpcGllbnRzW3RoaXMuX3JlY2lwaWVudHMubGVuZ3RoIC0gMV07XG4gICAgICBwcm9ncmFtbWFibGVUeEJ1aWxkZXIudHJhbnNmZXJPYmplY3RzKFttZXJnZWRPYmplY3RdLCBwcm9ncmFtbWFibGVUeEJ1aWxkZXIub2JqZWN0KGxhc3RSZWNpcGllbnQuYWRkcmVzcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdGFuZGFyZCBwYXRoOiBzcGxpdCBhbmQgdHJhbnNmZXIgZm9yIGV2ZXJ5IHJlY2lwaWVudC5cbiAgICAgIHRoaXMuX3JlY2lwaWVudHMuZm9yRWFjaCgocmVjaXBpZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHNwbGl0T2JqZWN0ID0gcHJvZ3JhbW1hYmxlVHhCdWlsZGVyLnNwbGl0Q29pbnMobWVyZ2VkT2JqZWN0LCBbXG4gICAgICAgICAgcHJvZ3JhbW1hYmxlVHhCdWlsZGVyLnB1cmUoQmlnSW50KHJlY2lwaWVudC5hbW91bnQpKSxcbiAgICAgICAgXSk7XG4gICAgICAgIHByb2dyYW1tYWJsZVR4QnVpbGRlci50cmFuc2Zlck9iamVjdHMoW3NwbGl0T2JqZWN0XSwgcHJvZ3JhbW1hYmxlVHhCdWlsZGVyLm9iamVjdChyZWNpcGllbnQuYWRkcmVzcykpO1xuICAgICAgfSk7XG4gICAgICBpZiAoaXNBZGRyQmFsT25seSAmJiB0aGlzLl9mdW5kc0luQWRkcmVzc0JhbGFuY2UuZ3QocmVjaXBpZW50VG90YWwpKSB7XG4gICAgICAgIC8vIEV4Y2VwdGlvbiBCIOKAlCBwYXJ0aWFsIGFtb3VudDogYWRkckNvaW4gc3RpbGwgaG9sZHMgdGhlIHVuc3BlbnQgcmVtYWluZGVyLlxuICAgICAgICAvLyBSZXR1cm4gaXQgdG8gdGhlIHNlbmRlciB0byBjb25zdW1lIHRoZSBjb21tYW5kIHJlc3VsdCAoTWVyZ2VDb2lucyBpbnRvIGdhcyBpcyBub3RcbiAgICAgICAgLy8gcG9zc2libGUgaGVyZSDigJQgZ2FzIGlzIENvaW48U1VJPiBidXQgYWRkckNvaW4gaXMgQ29pbjxUPiwgaW5jb21wYXRpYmxlIHR5cGVzKS5cbiAgICAgICAgcHJvZ3JhbW1hYmxlVHhCdWlsZGVyLnRyYW5zZmVyT2JqZWN0cyhbbWVyZ2VkT2JqZWN0XSwgcHJvZ3JhbW1hYmxlVHhCdWlsZGVyLm9iamVjdCh0aGlzLl9zZW5kZXIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0eERhdGEgPSBwcm9ncmFtbWFibGVUeEJ1aWxkZXIuYmxvY2tEYXRhO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiB0aGlzLl90eXBlLFxuICAgICAgc2VuZGVyOiB0aGlzLl9zZW5kZXIsXG4gICAgICB0eDoge1xuICAgICAgICBpbnB1dHM6IFsuLi50eERhdGEuaW5wdXRzXSxcbiAgICAgICAgdHJhbnNhY3Rpb25zOiBbLi4udHhEYXRhLnRyYW5zYWN0aW9uc10sXG4gICAgICB9LFxuICAgICAgZ2FzRGF0YToge1xuICAgICAgICAuLi50aGlzLl9nYXNEYXRhLFxuICAgICAgfSxcbiAgICAgIGV4cGlyYXRpb246IHRoaXMuX2V4cGlyYXRpb24sXG4gICAgICBmdW5kc0luQWRkcmVzc0JhbGFuY2U6IHRoaXMuX2Z1bmRzSW5BZGRyZXNzQmFsYW5jZS5ndCgwKSA/IHRoaXMuX2Z1bmRzSW5BZGRyZXNzQmFsYW5jZS50b0ZpeGVkKCkgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,59 @@
1
+ import { SuiTransaction, TokenTransferProgrammableTransaction, TransactionExplanation, TxData } from './iface';
2
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
3
+ import { Transaction } from './transaction';
4
+ import { BaseKey, PublicKey as BasePublicKey, Signature, TransactionType } from '@bitgo-beta/sdk-core';
5
+ export declare class TokenTransferTransaction extends Transaction<TokenTransferProgrammableTransaction> {
6
+ constructor(_coinConfig: Readonly<CoinConfig>);
7
+ get suiTransaction(): SuiTransaction<TokenTransferProgrammableTransaction>;
8
+ setSuiTransaction(tx: SuiTransaction<TokenTransferProgrammableTransaction>): void;
9
+ /** @inheritDoc */
10
+ get id(): string;
11
+ addSignature(publicKey: BasePublicKey, signature: Buffer): void;
12
+ get suiSignature(): Signature;
13
+ /** @inheritdoc */
14
+ canSign(key: BaseKey): boolean;
15
+ /** @inheritdoc */
16
+ toBroadcastFormat(): string;
17
+ /** @inheritdoc */
18
+ toJson(): TxData;
19
+ /** @inheritDoc */
20
+ explainTransaction(): TransactionExplanation;
21
+ /**
22
+ * Set the transaction type.
23
+ *
24
+ * @param {TransactionType} transactionType The transaction type to be set.
25
+ */
26
+ transactionType(transactionType: TransactionType): void;
27
+ /**
28
+ * Load the input and output data on this transaction.
29
+ */
30
+ loadInputsAndOutputs(): void;
31
+ /**
32
+ * Sets this transaction payload
33
+ *
34
+ * @param {string} rawTransaction
35
+ */
36
+ fromRawTransaction(rawTransaction: string): void;
37
+ /**
38
+ * Helper function for serialize() to get the correct txData with transaction type
39
+ *
40
+ * @return {TxData}
41
+ */
42
+ getTxData(): TxData;
43
+ /**
44
+ * Returns a complete explanation for a transfer transaction
45
+ * @param {TxData} json The transaction data in json format
46
+ * @param {TransactionExplanation} explanationResult The transaction explanation to be completed
47
+ * @returns {TransactionExplanation}
48
+ */
49
+ explainTokenTransferTransaction(json: TxData, explanationResult: TransactionExplanation): TransactionExplanation;
50
+ /**
51
+ * Extracts the objects that were provided as inputs while building the transaction.
52
+ * Handles both the simple case (MergeCoins/SplitCoins first) and the address-balance
53
+ * case where MoveCall(redeem_funds) may precede MergeCoins/SplitCoins.
54
+ * @param tx
55
+ * @returns {SuiObjectRef[]} Objects that are inputs for the transaction
56
+ */
57
+ private getInputObjectsFromTx;
58
+ }
59
+ //# sourceMappingURL=tokenTransferTransaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenTransferTransaction.d.ts","sourceRoot":"","sources":["../../../src/lib/tokenTransferTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,oCAAoC,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC/G,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EACL,OAAO,EACP,SAAS,IAAI,aAAa,EAG1B,SAAS,EAET,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAa9B,qBAAa,wBAAyB,SAAQ,WAAW,CAAC,oCAAoC,CAAC;gBACjF,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C,IAAI,cAAc,IAAI,cAAc,CAAC,oCAAoC,CAAC,CAEzE;IAED,iBAAiB,CAAC,EAAE,EAAE,cAAc,CAAC,oCAAoC,CAAC,GAAG,IAAI;IAIjF,kBAAkB;IAClB,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAM/D,IAAI,YAAY,IAAI,SAAS,CAE5B;IAED,kBAAkB;IAClB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAI9B,kBAAkB;IAClB,iBAAiB,IAAI,MAAM;IAO3B,kBAAkB;IAClB,MAAM,IAAI,MAAM;IAgBhB,kBAAkB;IAClB,kBAAkB,IAAI,sBAAsB;IAwB5C;;;;OAIG;IACH,eAAe,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAIvD;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAuB5B;;;;OAIG;IACH,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAchD;;;;OAIG;IACI,SAAS,IAAI,MAAM;IAgD1B;;;;;OAKG;IACH,+BAA+B,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,sBAAsB,GAAG,sBAAsB;IAchH;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;CAiC9B"}