@bitgo-beta/sdk-coin-sui 3.0.3-beta.192 → 3.0.3-beta.1921

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 +13 -11
  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 +173 -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 +46 -8
  127. package/dist/src/sui.d.ts.map +1 -1
  128. package/dist/src/sui.js +525 -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 +2423 -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 +181 -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 -450
@@ -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"}