@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.
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -2
- package/dist/src/lib/compareTransactionBlocks.js +2 -3
- package/dist/src/lib/constants.d.ts +9 -2
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +18 -2
- package/dist/src/lib/customTransaction.js +3 -3
- package/dist/src/lib/customTransactionBuilder.js +5 -5
- package/dist/src/lib/iface.d.ts +80 -12
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +34 -5
- package/dist/src/lib/index.d.ts +6 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +36 -10
- package/dist/src/lib/keyPair.js +24 -10
- package/dist/src/lib/mystenlab/builder/Inputs.d.ts +64 -11
- package/dist/src/lib/mystenlab/builder/Inputs.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/builder/Inputs.js +63 -19
- package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts +88 -355
- package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/builder/TransactionBlock.js +44 -25
- package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts +152 -77
- package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/builder/TransactionDataBlock.js +54 -44
- package/dist/src/lib/mystenlab/builder/Transactions.d.ts +133 -188
- package/dist/src/lib/mystenlab/builder/Transactions.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/builder/Transactions.js +52 -53
- package/dist/src/lib/mystenlab/builder/bcs.d.ts +1 -1
- package/dist/src/lib/mystenlab/builder/bcs.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/builder/bcs.js +2 -2
- package/dist/src/lib/mystenlab/builder/index.js +6 -2
- package/dist/src/lib/mystenlab/builder/serializer.js +6 -8
- package/dist/src/lib/mystenlab/builder/utils.d.ts +1 -1
- package/dist/src/lib/mystenlab/builder/utils.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/builder/utils.js +4 -4
- package/dist/src/lib/mystenlab/cryptography/hash.js +3 -4
- package/dist/src/lib/mystenlab/framework/framework.d.ts +6 -6
- package/dist/src/lib/mystenlab/framework/framework.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/framework/framework.js +22 -25
- package/dist/src/lib/mystenlab/framework/index.js +6 -2
- package/dist/src/lib/mystenlab/framework/sui-system-state.js +2 -2
- package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.js +2 -2
- package/dist/src/lib/mystenlab/types/coin.d.ts +13 -11
- package/dist/src/lib/mystenlab/types/coin.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/coin.js +20 -19
- package/dist/src/lib/mystenlab/types/common.d.ts +8 -8
- package/dist/src/lib/mystenlab/types/common.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/common.js +22 -22
- package/dist/src/lib/mystenlab/types/events.d.ts +15 -15
- package/dist/src/lib/mystenlab/types/events.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/events.js +17 -17
- package/dist/src/lib/mystenlab/types/index.js +6 -2
- package/dist/src/lib/mystenlab/types/normalized.d.ts +21 -21
- package/dist/src/lib/mystenlab/types/normalized.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/normalized.js +41 -41
- package/dist/src/lib/mystenlab/types/objects.d.ts +51 -51
- package/dist/src/lib/mystenlab/types/objects.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/objects.js +96 -106
- package/dist/src/lib/mystenlab/types/option.d.ts +1 -1
- package/dist/src/lib/mystenlab/types/option.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/option.js +2 -3
- package/dist/src/lib/mystenlab/types/sui-bcs.d.ts +55 -29
- package/dist/src/lib/mystenlab/types/sui-bcs.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/sui-bcs.js +29 -5
- package/dist/src/lib/mystenlab/types/transactions.d.ts +625 -625
- package/dist/src/lib/mystenlab/types/transactions.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/transactions.js +178 -194
- package/dist/src/lib/mystenlab/types/validator.d.ts +13 -13
- package/dist/src/lib/mystenlab/types/validator.d.ts.map +1 -1
- package/dist/src/lib/mystenlab/types/validator.js +124 -124
- package/dist/src/lib/resources/walrusConfig.d.ts +22 -0
- package/dist/src/lib/resources/walrusConfig.d.ts.map +1 -0
- package/dist/src/lib/resources/walrusConfig.js +37 -0
- package/dist/src/lib/rpcClient.d.ts +5 -0
- package/dist/src/lib/rpcClient.d.ts.map +1 -0
- package/dist/src/lib/rpcClient.js +74 -0
- package/dist/src/lib/stakingBuilder.d.ts +10 -0
- package/dist/src/lib/stakingBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingBuilder.js +59 -7
- package/dist/src/lib/stakingTransaction.d.ts +0 -1
- package/dist/src/lib/stakingTransaction.d.ts.map +1 -1
- package/dist/src/lib/stakingTransaction.js +36 -18
- package/dist/src/lib/tokenTransferBuilder.d.ts +93 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/tokenTransferBuilder.js +266 -0
- package/dist/src/lib/tokenTransferTransaction.d.ts +59 -0
- package/dist/src/lib/tokenTransferTransaction.d.ts.map +1 -0
- package/dist/src/lib/tokenTransferTransaction.js +272 -0
- package/dist/src/lib/transaction.d.ts +21 -4
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +144 -17
- package/dist/src/lib/transactionBuilder.d.ts +13 -4
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +34 -4
- package/dist/src/lib/transactionBuilderFactory.d.ts +11 -2
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +32 -1
- package/dist/src/lib/transferBuilder.d.ts +58 -1
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +310 -24
- package/dist/src/lib/transferTransaction.d.ts +6 -1
- package/dist/src/lib/transferTransaction.d.ts.map +1 -1
- package/dist/src/lib/transferTransaction.js +129 -12
- package/dist/src/lib/unstakingBuilder.js +6 -6
- package/dist/src/lib/unstakingTransaction.d.ts +0 -1
- package/dist/src/lib/unstakingTransaction.d.ts.map +1 -1
- package/dist/src/lib/unstakingTransaction.js +31 -17
- package/dist/src/lib/utils.d.ts +24 -3
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +295 -22
- package/dist/src/lib/walrusStakingBuilder.d.ts +77 -0
- package/dist/src/lib/walrusStakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/walrusStakingBuilder.js +276 -0
- package/dist/src/lib/walrusStakingTransaction.d.ts +52 -0
- package/dist/src/lib/walrusStakingTransaction.d.ts.map +1 -0
- package/dist/src/lib/walrusStakingTransaction.js +289 -0
- package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts +36 -0
- package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts.map +1 -0
- package/dist/src/lib/walrusWithdrawStakeBuilder.js +173 -0
- package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts +21 -0
- package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts.map +1 -0
- package/dist/src/lib/walrusWithdrawStakeTransaction.js +190 -0
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +5 -1
- package/dist/src/sui.d.ts +46 -8
- package/dist/src/sui.d.ts.map +1 -1
- package/dist/src/sui.js +525 -37
- package/dist/src/suiToken.d.ts +22 -0
- package/dist/src/suiToken.d.ts.map +1 -0
- package/dist/src/suiToken.js +61 -0
- package/dist/src/tsui.js +1 -1
- package/dist/test/integration/index.d.ts +1 -0
- package/dist/test/integration/index.d.ts.map +1 -0
- package/dist/test/integration/index.js +1 -0
- package/dist/test/local_fullnode/RpcClient.d.ts +60 -0
- package/dist/test/local_fullnode/RpcClient.d.ts.map +1 -0
- package/dist/test/local_fullnode/RpcClient.js +111 -0
- package/dist/test/local_fullnode/faucet.d.ts +6 -0
- package/dist/test/local_fullnode/faucet.d.ts.map +1 -0
- package/dist/test/local_fullnode/faucet.js +17 -0
- package/dist/test/local_fullnode/transactions.d.ts +2 -0
- package/dist/test/local_fullnode/transactions.d.ts.map +1 -0
- package/dist/test/local_fullnode/transactions.js +190 -0
- package/dist/test/resources/sui.d.ts +458 -0
- package/dist/test/resources/sui.d.ts.map +1 -0
- package/dist/test/resources/sui.js +632 -0
- package/dist/test/unit/compareTransactionBlocks.d.ts +2 -0
- package/dist/test/unit/compareTransactionBlocks.d.ts.map +1 -0
- package/dist/test/unit/compareTransactionBlocks.js +64 -0
- package/dist/test/unit/getBuilderFactory.d.ts +3 -0
- package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/getBuilderFactory.js +10 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +72 -0
- package/dist/test/unit/sui.d.ts +2 -0
- package/dist/test/unit/sui.d.ts.map +1 -0
- package/dist/test/unit/sui.js +2423 -0
- package/dist/test/unit/suiToken.d.ts +2 -0
- package/dist/test/unit/suiToken.d.ts.map +1 -0
- package/dist/test/unit/suiToken.js +39 -0
- package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/customTransactionBuilder.js +106 -0
- package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingBuilder.js +294 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +431 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +639 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +1181 -0
- package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/unstakingBuilder.js +115 -0
- package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walrusStakingBuilder.js +289 -0
- package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.js +181 -0
- package/dist/test/unit/transferTransaction.d.ts +2 -0
- package/dist/test/unit/transferTransaction.d.ts.map +1 -0
- package/dist/test/unit/transferTransaction.js +94 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +186 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +16 -12
- package/.eslintignore +0 -6
- package/.mocharc.yml +0 -7
- 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"}
|