@bitgo-beta/sdk-coin-sui 3.0.3-beta.182 → 3.0.3-beta.1821
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.map +1 -1
- package/dist/src/lib/stakingBuilder.js +23 -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 +26 -15
- package/dist/src/lib/tokenTransferBuilder.d.ts +66 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/tokenTransferBuilder.js +202 -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 +129 -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 +254 -21
- package/dist/src/lib/walrusStakingBuilder.d.ts +66 -0
- package/dist/src/lib/walrusStakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/walrusStakingBuilder.js +200 -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 +269 -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 +152 -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 +255 -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 +1055 -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 +162 -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 -420
|
@@ -0,0 +1,202 @@
|
|
|
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 utils_1 = __importDefault(require("./utils"));
|
|
13
|
+
const builder_1 = require("./mystenlab/builder");
|
|
14
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
15
|
+
class TokenTransferBuilder extends transactionBuilder_1.TransactionBuilder {
|
|
16
|
+
constructor(_coinConfig) {
|
|
17
|
+
super(_coinConfig);
|
|
18
|
+
/**
|
|
19
|
+
* Balance held in the address balance system for the token being transferred.
|
|
20
|
+
* When set, this amount is included in the total available balance.
|
|
21
|
+
* At execution time, tx.withdrawal() + 0x2::coin::redeem_funds converts it
|
|
22
|
+
* to a Coin<T> that is merged with any coin objects before splitting.
|
|
23
|
+
*/
|
|
24
|
+
this._fundsInAddressBalance = new bignumber_js_1.default(0);
|
|
25
|
+
this._transaction = new tokenTransferTransaction_1.TokenTransferTransaction(_coinConfig);
|
|
26
|
+
}
|
|
27
|
+
get transactionType() {
|
|
28
|
+
return sdk_core_1.TransactionType.Send;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The full coin type string derived from the coin config (e.g. `0xabc::my_token::MY_TOKEN`).
|
|
32
|
+
*/
|
|
33
|
+
get tokenCoinType() {
|
|
34
|
+
const config = this._coinConfig;
|
|
35
|
+
return `${config.packageId}::${config.module}::${config.symbol}`;
|
|
36
|
+
}
|
|
37
|
+
/** @inheritdoc */
|
|
38
|
+
validateTransaction(transaction) {
|
|
39
|
+
if (!transaction.suiTransaction) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
this.validateTransactionFields();
|
|
43
|
+
}
|
|
44
|
+
/** @inheritdoc */
|
|
45
|
+
sign(key) {
|
|
46
|
+
this.transaction.setSuiTransaction(this.buildSuiTransaction());
|
|
47
|
+
super.sign(key);
|
|
48
|
+
}
|
|
49
|
+
/** @inheritdoc */
|
|
50
|
+
fromImplementation(rawTransaction) {
|
|
51
|
+
const tx = new tokenTransferTransaction_1.TokenTransferTransaction(this._coinConfig);
|
|
52
|
+
this.validateRawTransaction(rawTransaction);
|
|
53
|
+
tx.fromRawTransaction(rawTransaction);
|
|
54
|
+
this.initBuilder(tx);
|
|
55
|
+
return this.transaction;
|
|
56
|
+
}
|
|
57
|
+
/** @inheritdoc */
|
|
58
|
+
async buildImplementation() {
|
|
59
|
+
this.transaction.setSuiTransaction(this.buildSuiTransaction());
|
|
60
|
+
this.transaction.transactionType(this.transactionType);
|
|
61
|
+
if (this._signer) {
|
|
62
|
+
this.transaction.sign(this._signer);
|
|
63
|
+
}
|
|
64
|
+
this._signatures.forEach((signature) => {
|
|
65
|
+
this.transaction.addSignature(signature.publicKey, signature.signature);
|
|
66
|
+
});
|
|
67
|
+
this.transaction.loadInputsAndOutputs();
|
|
68
|
+
return this.transaction;
|
|
69
|
+
}
|
|
70
|
+
/** @inheritdoc */
|
|
71
|
+
initBuilder(tx) {
|
|
72
|
+
this._transaction = tx;
|
|
73
|
+
if (tx.signature && tx.signature.length > 0) {
|
|
74
|
+
this._signatures = [tx.suiSignature];
|
|
75
|
+
}
|
|
76
|
+
const txData = tx.toJson();
|
|
77
|
+
this.type(iface_1.SuiTransactionType.TokenTransfer);
|
|
78
|
+
this.sender(txData.sender);
|
|
79
|
+
this.gasData(txData.gasData);
|
|
80
|
+
// Only restore meaningful expirations (Epoch or ValidDuring) — ignore None.
|
|
81
|
+
if (txData.expiration && !('None' in txData.expiration)) {
|
|
82
|
+
this._expiration = txData.expiration;
|
|
83
|
+
}
|
|
84
|
+
const recipients = utils_1.default.getRecipients(tx.suiTransaction);
|
|
85
|
+
this.send(recipients);
|
|
86
|
+
// Reconstruct fundsInAddressBalance from BalanceWithdrawal input if present.
|
|
87
|
+
// After BCS deserialization inputs are CallArg format: { BalanceWithdrawal: {...} }
|
|
88
|
+
// During building they are TransactionBlockInput format: { kind:'Input', value: { BalanceWithdrawal: {...} } }
|
|
89
|
+
const withdrawalInput = tx.suiTransaction?.tx?.inputs?.find((input) => (input !== null && typeof input === 'object' && 'BalanceWithdrawal' in input) ||
|
|
90
|
+
(input?.value !== null && typeof input?.value === 'object' && 'BalanceWithdrawal' in (input.value ?? {})));
|
|
91
|
+
if (withdrawalInput) {
|
|
92
|
+
const bw = withdrawalInput.BalanceWithdrawal ?? withdrawalInput.value?.BalanceWithdrawal;
|
|
93
|
+
this._fundsInAddressBalance = new bignumber_js_1.default(String(bw.reservation?.MaxAmountU64 ?? bw.amount));
|
|
94
|
+
}
|
|
95
|
+
if (txData.inputObjects && txData.inputObjects.length > 0) {
|
|
96
|
+
this.inputObjects(txData.inputObjects);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
send(recipients) {
|
|
100
|
+
this.validateRecipients(recipients);
|
|
101
|
+
this._recipients = recipients;
|
|
102
|
+
return this;
|
|
103
|
+
}
|
|
104
|
+
inputObjects(inputObject) {
|
|
105
|
+
this.validateInputObjectRefs(inputObject);
|
|
106
|
+
this._inputObjects = inputObject;
|
|
107
|
+
return this;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Set the amount of token funds held in the Sui address balance system for this sender.
|
|
111
|
+
*
|
|
112
|
+
* @param {string} amount - amount in base units held in address balance
|
|
113
|
+
*/
|
|
114
|
+
fundsInAddressBalance(amount) {
|
|
115
|
+
this._fundsInAddressBalance = new bignumber_js_1.default(amount);
|
|
116
|
+
return this;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Validates all fields are defined correctly
|
|
120
|
+
*/
|
|
121
|
+
validateTransactionFields() {
|
|
122
|
+
(0, assert_1.default)(this._type, new sdk_core_1.BuildTransactionError('type is required before building'));
|
|
123
|
+
(0, assert_1.default)(this._sender, new sdk_core_1.BuildTransactionError('sender is required before building'));
|
|
124
|
+
(0, assert_1.default)(this._recipients && this._recipients.length > 0, new sdk_core_1.BuildTransactionError('at least one recipient is required before building'));
|
|
125
|
+
(0, assert_1.default)(this._gasData, new sdk_core_1.BuildTransactionError('gasData is required before building'));
|
|
126
|
+
this.validateGasData(this._gasData);
|
|
127
|
+
// Must have at least coin objects OR address balance
|
|
128
|
+
(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'));
|
|
129
|
+
if (this._inputObjects && this._inputObjects.length > 0) {
|
|
130
|
+
this.validateInputObjectRefs(this._inputObjects);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Validates the individual object refs (does not require non-empty array). */
|
|
134
|
+
validateInputObjectRefs(inputObjects) {
|
|
135
|
+
if (inputObjects) {
|
|
136
|
+
inputObjects.forEach((inputObject) => {
|
|
137
|
+
this.validateSuiObjectRef(inputObject, 'input object');
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Build SuiTransaction.
|
|
143
|
+
*
|
|
144
|
+
* Two build paths:
|
|
145
|
+
*
|
|
146
|
+
* Path A — coin objects only (fundsInAddressBalance = 0):
|
|
147
|
+
* MergeCoins(inputObject[0], [inputObject[1..]]) → SplitCoins → TransferObjects
|
|
148
|
+
*
|
|
149
|
+
* Path B — coin objects + address balance (or address balance only):
|
|
150
|
+
* MoveCall(0x2::coin::redeem_funds, [withdrawal(amount, coinType)]) → Coin<T>
|
|
151
|
+
* MergeCoins(inputObject[0] | addrCoin, [rest...]) → SplitCoins → TransferObjects
|
|
152
|
+
*
|
|
153
|
+
* @return {SuiTransaction<TokenTransferProgrammableTransaction>}
|
|
154
|
+
* @protected
|
|
155
|
+
*/
|
|
156
|
+
buildSuiTransaction() {
|
|
157
|
+
this.validateTransactionFields();
|
|
158
|
+
const programmableTxBuilder = new builder_1.TransactionBlock();
|
|
159
|
+
const inputObjects = (this._inputObjects ?? []).map((object) => programmableTxBuilder.object(builder_1.Inputs.ObjectRef(object)));
|
|
160
|
+
// If address balance is available, withdraw it as Coin<T> and add to the pool
|
|
161
|
+
if (this._fundsInAddressBalance.gt(0)) {
|
|
162
|
+
const coinType = this.tokenCoinType;
|
|
163
|
+
const [addrCoin] = programmableTxBuilder.moveCall({
|
|
164
|
+
target: '0x2::coin::redeem_funds',
|
|
165
|
+
typeArguments: [coinType],
|
|
166
|
+
arguments: [
|
|
167
|
+
programmableTxBuilder.withdrawal({
|
|
168
|
+
amount: BigInt(this._fundsInAddressBalance.toFixed()),
|
|
169
|
+
type: coinType,
|
|
170
|
+
}),
|
|
171
|
+
],
|
|
172
|
+
});
|
|
173
|
+
inputObjects.push(addrCoin);
|
|
174
|
+
}
|
|
175
|
+
const mergedObject = inputObjects.shift();
|
|
176
|
+
if (inputObjects.length > 0) {
|
|
177
|
+
programmableTxBuilder.mergeCoins(mergedObject, inputObjects);
|
|
178
|
+
}
|
|
179
|
+
this._recipients.forEach((recipient) => {
|
|
180
|
+
const splitObject = programmableTxBuilder.splitCoins(mergedObject, [
|
|
181
|
+
programmableTxBuilder.pure(BigInt(recipient.amount)),
|
|
182
|
+
]);
|
|
183
|
+
programmableTxBuilder.transferObjects([splitObject], programmableTxBuilder.object(recipient.address));
|
|
184
|
+
});
|
|
185
|
+
const txData = programmableTxBuilder.blockData;
|
|
186
|
+
return {
|
|
187
|
+
type: this._type,
|
|
188
|
+
sender: this._sender,
|
|
189
|
+
tx: {
|
|
190
|
+
inputs: [...txData.inputs],
|
|
191
|
+
transactions: [...txData.transactions],
|
|
192
|
+
},
|
|
193
|
+
gasData: {
|
|
194
|
+
...this._gasData,
|
|
195
|
+
},
|
|
196
|
+
expiration: this._expiration,
|
|
197
|
+
fundsInAddressBalance: this._fundsInAddressBalance.gt(0) ? this._fundsInAddressBalance.toFixed() : undefined,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
exports.TokenTransferBuilder = TokenTransferBuilder;
|
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5UcmFuc2ZlckJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Rva2VuVHJhbnNmZXJCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixtREFBa0c7QUFFbEcsbUNBQW1HO0FBRW5HLDZEQUEwRDtBQUMxRCx5RUFBc0U7QUFFdEUsb0RBQTRCO0FBQzVCLGlEQUk2QjtBQUM3QixnRUFBcUM7QUFFckMsTUFBYSxvQkFBcUIsU0FBUSx1Q0FBd0Q7SUFXaEcsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFUckI7Ozs7O1dBS0c7UUFDTywyQkFBc0IsR0FBYyxJQUFJLHNCQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFJN0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLG1EQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFZLGFBQWE7UUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQXNCLENBQUM7UUFDM0MsT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEtBQUssTUFBTSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbkUsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixtQkFBbUIsQ0FBQyxXQUFxQztRQUN2RCxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2hDLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixJQUFJLENBQUMsR0FBWTtRQUNmLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLG1C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QUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNyQyxNQUFNLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFO2dCQUNqRSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNyRCxDQUFDLENBQUM7WUFDSCxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDeEcsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxTQUFTLENBQUM7UUFDL0MsT0FBTztZQUNMLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSztZQUNoQixNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDcEIsRUFBRSxFQUFFO2dCQUNGLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDMUIsWUFBWSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO2FBQ3ZDO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLEdBQUcsSUFBSSxDQUFDLFFBQVE7YUFDakI7WUFDRCxVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDNUIscUJBQXFCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQzdHLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFuT0Qsb0RBbU9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlLCBSZWNpcGllbnQsIEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgQmFzZUtleSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcsIFN1aUNvaW4gfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFN1aVRyYW5zYWN0aW9uLCBTdWlUcmFuc2FjdGlvblR5cGUsIFRva2VuVHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbiB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IFRva2VuVHJhbnNmZXJUcmFuc2FjdGlvbiB9IGZyb20gJy4vdG9rZW5UcmFuc2ZlclRyYW5zYWN0aW9uJztcbmltcG9ydCB7IFN1aU9iamVjdFJlZiB9IGZyb20gJy4vbXlzdGVubGFiL3R5cGVzJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7XG4gIElucHV0cyxcbiAgVHJhbnNhY3Rpb25CbG9jayBhcyBQcm9ncmFtbWluZ1RyYW5zYWN0aW9uQmxvY2tCdWlsZGVyLFxuICBUcmFuc2FjdGlvbkFyZ3VtZW50LFxufSBmcm9tICcuL215c3RlbmxhYi9idWlsZGVyJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcblxuZXhwb3J0IGNsYXNzIFRva2VuVHJhbnNmZXJCdWlsZGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25CdWlsZGVyPFRva2VuVHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj4ge1xuICBwcm90ZWN0ZWQgX3JlY2lwaWVudHM6IFJlY2lwaWVudFtdO1xuICBwcm90ZWN0ZWQgX2lucHV0T2JqZWN0czogU3VpT2JqZWN0UmVmW107XG4gIC8qKlxuICAgKiBCYWxhbmNlIGhlbGQgaW4gdGhlIGFkZHJlc3MgYmFsYW5jZSBzeXN0ZW0gZm9yIHRoZSB0b2tlbiBiZWluZyB0cmFuc2ZlcnJlZC5cbiAgICogV2hlbiBzZXQsIHRoaXMgYW1vdW50IGlzIGluY2x1ZGVkIGluIHRoZSB0b3RhbCBhdmFpbGFibGUgYmFsYW5jZS5cbiAgICogQXQgZXhlY3V0aW9uIHRpbWUsIHR4LndpdGhkcmF3YWwoKSArIDB4Mjo6Y29pbjo6cmVkZWVtX2Z1bmRzIGNvbnZlcnRzIGl0XG4gICAqIHRvIGEgQ29pbjxUPiB0aGF0IGlzIG1lcmdlZCB3aXRoIGFueSBjb2luIG9iamVjdHMgYmVmb3JlIHNwbGl0dGluZy5cbiAgICovXG4gIHByb3RlY3RlZCBfZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiBCaWdOdW1iZXIgPSBuZXcgQmlnTnVtYmVyKDApO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IG5ldyBUb2tlblRyYW5zZmVyVHJhbnNhY3Rpb24oX2NvaW5Db25maWcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZ1bGwgY29pbiB0eXBlIHN0cmluZyBkZXJpdmVkIGZyb20gdGhlIGNvaW4gY29uZmlnIChlLmcuIGAweGFiYzo6bXlfdG9rZW46Ok1ZX1RPS0VOYCkuXG4gICAqL1xuICBwcml2YXRlIGdldCB0b2tlbkNvaW5UeXBlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5fY29pbkNvbmZpZyBhcyBTdWlDb2luO1xuICAgIHJldHVybiBgJHtjb25maWcucGFja2FnZUlkfTo6JHtjb25maWcubW9kdWxlfTo6JHtjb25maWcuc3ltYm9sfWA7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbjogVG9rZW5UcmFuc2ZlclRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0cmFuc2FjdGlvbi5zdWlUcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlVHJhbnNhY3Rpb25GaWVsZHMoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBzaWduKGtleTogQmFzZUtleSk6IHZvaWQge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0U3VpVHJhbnNhY3Rpb24odGhpcy5idWlsZFN1aVRyYW5zYWN0aW9uKCkpO1xuICAgIHN1cGVyLnNpZ24oa2V5KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBUcmFuc2FjdGlvbjxUb2tlblRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0eCA9IG5ldyBUb2tlblRyYW5zZmVyVHJhbnNhY3Rpb24odGhpcy5fY29pbkNvbmZpZyk7XG4gICAgdGhpcy52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICB0eC5mcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb248VG9rZW5UcmFuc2ZlclByb2dyYW1tYWJsZVRyYW5zYWN0aW9uPj4ge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0U3VpVHJhbnNhY3Rpb24odGhpcy5idWlsZFN1aVRyYW5zYWN0aW9uKCkpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24udHJhbnNhY3Rpb25UeXBlKHRoaXMudHJhbnNhY3Rpb25UeXBlKTtcblxuICAgIGlmICh0aGlzLl9zaWduZXIpIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uc2lnbih0aGlzLl9zaWduZXIpO1xuICAgIH1cblxuICAgIHRoaXMuX3NpZ25hdHVyZXMuZm9yRWFjaCgoc2lnbmF0dXJlKSA9PiB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLmFkZFNpZ25hdHVyZShzaWduYXR1cmUucHVibGljS2V5LCBzaWduYXR1cmUuc2lnbmF0dXJlKTtcbiAgICB9KTtcblxuICAgIHRoaXMudHJhbnNhY3Rpb24ubG9hZElucHV0c0FuZE91dHB1dHMoKTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpbml0QnVpbGRlcih0eDogVG9rZW5UcmFuc2ZlclRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB0eDtcblxuICAgIGlmICh0eC5zaWduYXR1cmUgJiYgdHguc2lnbmF0dXJlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX3NpZ25hdHVyZXMgPSBbdHguc3VpU2lnbmF0dXJlXTtcbiAgICB9XG4gICAgY29uc3QgdHhEYXRhID0gdHgudG9Kc29uKCk7XG4gICAgdGhpcy50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5Ub2tlblRyYW5zZmVyKTtcbiAgICB0aGlzLnNlbmRlcih0eERhdGEuc2VuZGVyKTtcbiAgICB0aGlzLmdhc0RhdGEodHhEYXRhLmdhc0RhdGEpO1xuXG4gICAgLy8gT25seSByZXN0b3JlIG1lYW5pbmdmdWwgZXhwaXJhdGlvbnMgKEVwb2NoIG9yIFZhbGlkRHVyaW5nKSDigJQgaWdub3JlIE5vbmUuXG4gICAgaWYgKHR4RGF0YS5leHBpcmF0aW9uICYmICEoJ05vbmUnIGluIHR4RGF0YS5leHBpcmF0aW9uKSkge1xuICAgICAgdGhpcy5fZXhwaXJhdGlvbiA9IHR4RGF0YS5leHBpcmF0aW9uO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY2lwaWVudHMgPSB1dGlscy5nZXRSZWNpcGllbnRzKHR4LnN1aVRyYW5zYWN0aW9uKTtcbiAgICB0aGlzLnNlbmQocmVjaXBpZW50cyk7XG5cbiAgICAvLyBSZWNvbnN0cnVjdCBmdW5kc0luQWRkcmVzc0JhbGFuY2UgZnJvbSBCYWxhbmNlV2l0aGRyYXdhbCBpbnB1dCBpZiBwcmVzZW50LlxuICAgIC8vIEFmdGVyIEJDUyBkZXNlcmlhbGl6YXRpb24gaW5wdXRzIGFyZSBDYWxsQXJnIGZvcm1hdDogeyBCYWxhbmNlV2l0aGRyYXdhbDogey4uLn0gfVxuICAgIC8vIER1cmluZyBidWlsZGluZyB0aGV5IGFyZSBUcmFuc2FjdGlvbkJsb2NrSW5wdXQgZm9ybWF0OiB7IGtpbmQ6J0lucHV0JywgdmFsdWU6IHsgQmFsYW5jZVdpdGhkcmF3YWw6IHsuLi59IH0gfVxuICAgIGNvbnN0IHdpdGhkcmF3YWxJbnB1dCA9ICh0eC5zdWlUcmFuc2FjdGlvbj8udHg/LmlucHV0cyBhcyBhbnlbXSk/LmZpbmQoXG4gICAgICAoaW5wdXQ6IGFueSkgPT5cbiAgICAgICAgKGlucHV0ICE9PSBudWxsICYmIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiYgJ0JhbGFuY2VXaXRoZHJhd2FsJyBpbiBpbnB1dCkgfHxcbiAgICAgICAgKGlucHV0Py52YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgaW5wdXQ/LnZhbHVlID09PSAnb2JqZWN0JyAmJiAnQmFsYW5jZVdpdGhkcmF3YWwnIGluIChpbnB1dC52YWx1ZSA/PyB7fSkpXG4gICAgKTtcbiAgICBpZiAod2l0aGRyYXdhbElucHV0KSB7XG4gICAgICBjb25zdCBidyA9IHdpdGhkcmF3YWxJbnB1dC5CYWxhbmNlV2l0aGRyYXdhbCA/PyB3aXRoZHJhd2FsSW5wdXQudmFsdWU/LkJhbGFuY2VXaXRoZHJhd2FsO1xuICAgICAgdGhpcy5fZnVuZHNJbkFkZHJlc3NCYWxhbmNlID0gbmV3IEJpZ051bWJlcihTdHJpbmcoYncucmVzZXJ2YXRpb24/Lk1heEFtb3VudFU2NCA/PyBidy5hbW91bnQpKTtcbiAgICB9XG5cbiAgICBpZiAodHhEYXRhLmlucHV0T2JqZWN0cyAmJiB0eERhdGEuaW5wdXRPYmplY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaW5wdXRPYmplY3RzKHR4RGF0YS5pbnB1dE9iamVjdHMpO1xuICAgIH1cbiAgfVxuXG4gIHNlbmQocmVjaXBpZW50czogUmVjaXBpZW50W10pOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlUmVjaXBpZW50cyhyZWNpcGllbnRzKTtcbiAgICB0aGlzLl9yZWNpcGllbnRzID0gcmVjaXBpZW50cztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlucHV0T2JqZWN0cyhpbnB1dE9iamVjdDogU3VpT2JqZWN0UmVmW10pOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlSW5wdXRPYmplY3RSZWZzKGlucHV0T2JqZWN0KTtcbiAgICB0aGlzLl9pbnB1dE9iamVjdHMgPSBpbnB1dE9iamVjdDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGFtb3VudCBvZiB0b2tlbiBmdW5kcyBoZWxkIGluIHRoZSBTdWkgYWRkcmVzcyBiYWxhbmNlIHN5c3RlbSBmb3IgdGhpcyBzZW5kZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhbW91bnQgLSBhbW91bnQgaW4gYmFzZSB1bml0cyBoZWxkIGluIGFkZHJlc3MgYmFsYW5jZVxuICAgKi9cbiAgZnVuZHNJbkFkZHJlc3NCYWxhbmNlKGFtb3VudDogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5fZnVuZHNJbkFkZHJlc3NCYWxhbmNlID0gbmV3IEJpZ051bWJlcihhbW91bnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbGwgZmllbGRzIGFyZSBkZWZpbmVkIGNvcnJlY3RseVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRyYW5zYWN0aW9uRmllbGRzKCk6IHZvaWQge1xuICAgIGFzc2VydCh0aGlzLl90eXBlLCBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCd0eXBlIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpKTtcbiAgICBhc3NlcnQodGhpcy5fc2VuZGVyLCBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdzZW5kZXIgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJykpO1xuICAgIGFzc2VydChcbiAgICAgIHRoaXMuX3JlY2lwaWVudHMgJiYgdGhpcy5fcmVjaXBpZW50cy5sZW5ndGggPiAwLFxuICAgICAgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignYXQgbGVhc3Qgb25lIHJlY2lwaWVudCBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKVxuICAgICk7XG4gICAgYXNzZXJ0KHRoaXMuX2dhc0RhdGEsIG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ2dhc0RhdGEgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJykpO1xuICAgIHRoaXMudmFsaWRhdGVHYXNEYXRhKHRoaXMuX2dhc0RhdGEpO1xuXG4gICAgLy8gTXVzdCBoYXZlIGF0IGxlYXN0IGNvaW4gb2JqZWN0cyBPUiBhZGRyZXNzIGJhbGFuY2VcbiAgICBhc3NlcnQoXG4gICAgICAodGhpcy5faW5wdXRPYmplY3RzICYmIHRoaXMuX2lucHV0T2JqZWN0cy5sZW5ndGggPiAwKSB8fCB0aGlzLl9mdW5kc0luQWRkcmVzc0JhbGFuY2UuZ3QoMCksXG4gICAgICBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdpbnB1dCBvYmplY3RzIG9yIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZSByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKVxuICAgICk7XG4gICAgaWYgKHRoaXMuX2lucHV0T2JqZWN0cyAmJiB0aGlzLl9pbnB1dE9iamVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy52YWxpZGF0ZUlucHV0T2JqZWN0UmVmcyh0aGlzLl9pbnB1dE9iamVjdHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZXMgdGhlIGluZGl2aWR1YWwgb2JqZWN0IHJlZnMgKGRvZXMgbm90IHJlcXVpcmUgbm9uLWVtcHR5IGFycmF5KS4gKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUlucHV0T2JqZWN0UmVmcyhpbnB1dE9iamVjdHM6IFN1aU9iamVjdFJlZltdKTogdm9pZCB7XG4gICAgaWYgKGlucHV0T2JqZWN0cykge1xuICAgICAgaW5wdXRPYmplY3RzLmZvckVhY2goKGlucHV0T2JqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVTdWlPYmplY3RSZWYoaW5wdXRPYmplY3QsICdpbnB1dCBvYmplY3QnKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBTdWlUcmFuc2FjdGlvbi5cbiAgICpcbiAgICogVHdvIGJ1aWxkIHBhdGhzOlxuICAgKlxuICAgKiBQYXRoIEEg4oCUIGNvaW4gb2JqZWN0cyBvbmx5IChmdW5kc0luQWRkcmVzc0JhbGFuY2UgPSAwKTpcbiAgICogICBNZXJnZUNvaW5zKGlucHV0T2JqZWN0WzBdLCBbaW5wdXRPYmplY3RbMS4uXV0pIOKGkiBTcGxpdENvaW5zIOKGkiBUcmFuc2Zlck9iamVjdHNcbiAgICpcbiAgICogUGF0aCBCIOKAlCBjb2luIG9iamVjdHMgKyBhZGRyZXNzIGJhbGFuY2UgKG9yIGFkZHJlc3MgYmFsYW5jZSBvbmx5KTpcbiAgICogICBNb3ZlQ2FsbCgweDI6OmNvaW46OnJlZGVlbV9mdW5kcywgW3dpdGhkcmF3YWwoYW1vdW50LCBjb2luVHlwZSldKSDihpIgQ29pbjxUPlxuICAgKiAgIE1lcmdlQ29pbnMoaW5wdXRPYmplY3RbMF0gfCBhZGRyQ29pbiwgW3Jlc3QuLi5dKSDihpIgU3BsaXRDb2lucyDihpIgVHJhbnNmZXJPYmplY3RzXG4gICAqXG4gICAqIEByZXR1cm4ge1N1aVRyYW5zYWN0aW9uPFRva2VuVHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj59XG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZFN1aVRyYW5zYWN0aW9uKCk6IFN1aVRyYW5zYWN0aW9uPFRva2VuVHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj4ge1xuICAgIHRoaXMudmFsaWRhdGVUcmFuc2FjdGlvbkZpZWxkcygpO1xuXG4gICAgY29uc3QgcHJvZ3JhbW1hYmxlVHhCdWlsZGVyID0gbmV3IFByb2dyYW1taW5nVHJhbnNhY3Rpb25CbG9ja0J1aWxkZXIoKTtcblxuICAgIGNvbnN0IGlucHV0T2JqZWN0czogVHJhbnNhY3Rpb25Bcmd1bWVudFtdID0gKHRoaXMuX2lucHV0T2JqZWN0cyA/PyBbXSkubWFwKChvYmplY3QpID0+XG4gICAgICBwcm9ncmFtbWFibGVUeEJ1aWxkZXIub2JqZWN0KElucHV0cy5PYmplY3RSZWYob2JqZWN0KSlcbiAgICApO1xuXG4gICAgLy8gSWYgYWRkcmVzcyBiYWxhbmNlIGlzIGF2YWlsYWJsZSwgd2l0aGRyYXcgaXQgYXMgQ29pbjxUPiBhbmQgYWRkIHRvIHRoZSBwb29sXG4gICAgaWYgKHRoaXMuX2Z1bmRzSW5BZGRyZXNzQmFsYW5jZS5ndCgwKSkge1xuICAgICAgY29uc3QgY29pblR5cGUgPSB0aGlzLnRva2VuQ29pblR5cGU7XG4gICAgICBjb25zdCBbYWRkckNvaW5dID0gcHJvZ3JhbW1hYmxlVHhCdWlsZGVyLm1vdmVDYWxsKHtcbiAgICAgICAgdGFyZ2V0OiAnMHgyOjpjb2luOjpyZWRlZW1fZnVuZHMnLFxuICAgICAgICB0eXBlQXJndW1lbnRzOiBbY29pblR5cGVdLFxuICAgICAgICBhcmd1bWVudHM6IFtcbiAgICAgICAgICBwcm9ncmFtbWFibGVUeEJ1aWxkZXIud2l0aGRyYXdhbCh7XG4gICAgICAgICAgICBhbW91bnQ6IEJpZ0ludCh0aGlzLl9mdW5kc0luQWRkcmVzc0JhbGFuY2UudG9GaXhlZCgpKSxcbiAgICAgICAgICAgIHR5cGU6IGNvaW5UeXBlLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgICBpbnB1dE9iamVjdHMucHVzaChhZGRyQ29pbik7XG4gICAgfVxuXG4gICAgY29uc3QgbWVyZ2VkT2JqZWN0ID0gaW5wdXRPYmplY3RzLnNoaWZ0KCkgYXMgVHJhbnNhY3Rpb25Bcmd1bWVudDtcbiAgICBpZiAoaW5wdXRPYmplY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHByb2dyYW1tYWJsZVR4QnVpbGRlci5tZXJnZUNvaW5zKG1lcmdlZE9iamVjdCwgaW5wdXRPYmplY3RzKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWNpcGllbnRzLmZvckVhY2goKHJlY2lwaWVudCkgPT4ge1xuICAgICAgY29uc3Qgc3BsaXRPYmplY3QgPSBwcm9ncmFtbWFibGVUeEJ1aWxkZXIuc3BsaXRDb2lucyhtZXJnZWRPYmplY3QsIFtcbiAgICAgICAgcHJvZ3JhbW1hYmxlVHhCdWlsZGVyLnB1cmUoQmlnSW50KHJlY2lwaWVudC5hbW91bnQpKSxcbiAgICAgIF0pO1xuICAgICAgcHJvZ3JhbW1hYmxlVHhCdWlsZGVyLnRyYW5zZmVyT2JqZWN0cyhbc3BsaXRPYmplY3RdLCBwcm9ncmFtbWFibGVUeEJ1aWxkZXIub2JqZWN0KHJlY2lwaWVudC5hZGRyZXNzKSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0eERhdGEgPSBwcm9ncmFtbWFibGVUeEJ1aWxkZXIuYmxvY2tEYXRhO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiB0aGlzLl90eXBlLFxuICAgICAgc2VuZGVyOiB0aGlzLl9zZW5kZXIsXG4gICAgICB0eDoge1xuICAgICAgICBpbnB1dHM6IFsuLi50eERhdGEuaW5wdXRzXSxcbiAgICAgICAgdHJhbnNhY3Rpb25zOiBbLi4udHhEYXRhLnRyYW5zYWN0aW9uc10sXG4gICAgICB9LFxuICAgICAgZ2FzRGF0YToge1xuICAgICAgICAuLi50aGlzLl9nYXNEYXRhLFxuICAgICAgfSxcbiAgICAgIGV4cGlyYXRpb246IHRoaXMuX2V4cGlyYXRpb24sXG4gICAgICBmdW5kc0luQWRkcmVzc0JhbGFuY2U6IHRoaXMuX2Z1bmRzSW5BZGRyZXNzQmFsYW5jZS5ndCgwKSA/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"}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.TokenTransferTransaction = void 0;
|
|
40
|
+
const transaction_1 = require("./transaction");
|
|
41
|
+
const constants_1 = require("./constants");
|
|
42
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
43
|
+
const types_1 = require("./mystenlab/types");
|
|
44
|
+
const utils_1 = __importStar(require("./utils"));
|
|
45
|
+
const builder_1 = require("./mystenlab/builder");
|
|
46
|
+
const bcs_1 = require("@mysten/bcs");
|
|
47
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
48
|
+
class TokenTransferTransaction extends transaction_1.Transaction {
|
|
49
|
+
constructor(_coinConfig) {
|
|
50
|
+
super(_coinConfig);
|
|
51
|
+
}
|
|
52
|
+
get suiTransaction() {
|
|
53
|
+
return this._suiTransaction;
|
|
54
|
+
}
|
|
55
|
+
setSuiTransaction(tx) {
|
|
56
|
+
this._suiTransaction = tx;
|
|
57
|
+
}
|
|
58
|
+
/** @inheritDoc */
|
|
59
|
+
get id() {
|
|
60
|
+
return this._id || constants_1.UNAVAILABLE_TEXT;
|
|
61
|
+
}
|
|
62
|
+
addSignature(publicKey, signature) {
|
|
63
|
+
this._signatures.push(signature.toString('hex'));
|
|
64
|
+
this._signature = { publicKey, signature };
|
|
65
|
+
this.serialize();
|
|
66
|
+
}
|
|
67
|
+
get suiSignature() {
|
|
68
|
+
return this._signature;
|
|
69
|
+
}
|
|
70
|
+
/** @inheritdoc */
|
|
71
|
+
canSign(key) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
/** @inheritdoc */
|
|
75
|
+
toBroadcastFormat() {
|
|
76
|
+
if (!this._suiTransaction) {
|
|
77
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction');
|
|
78
|
+
}
|
|
79
|
+
return this.serialize();
|
|
80
|
+
}
|
|
81
|
+
/** @inheritdoc */
|
|
82
|
+
toJson() {
|
|
83
|
+
if (!this._suiTransaction) {
|
|
84
|
+
throw new sdk_core_1.ParseTransactionError('Empty transaction');
|
|
85
|
+
}
|
|
86
|
+
const tx = this._suiTransaction;
|
|
87
|
+
return {
|
|
88
|
+
id: this._id,
|
|
89
|
+
sender: tx.sender,
|
|
90
|
+
kind: { ProgrammableTransaction: tx.tx },
|
|
91
|
+
gasData: tx.gasData,
|
|
92
|
+
expiration: tx.expiration ?? { None: null },
|
|
93
|
+
inputObjects: this.getInputObjectsFromTx(tx.tx),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** @inheritDoc */
|
|
97
|
+
explainTransaction() {
|
|
98
|
+
const result = this.toJson();
|
|
99
|
+
const displayOrder = ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'];
|
|
100
|
+
const outputs = [];
|
|
101
|
+
const explanationResult = {
|
|
102
|
+
displayOrder,
|
|
103
|
+
id: this.id,
|
|
104
|
+
outputs,
|
|
105
|
+
outputAmount: '0',
|
|
106
|
+
changeOutputs: [],
|
|
107
|
+
changeAmount: '0',
|
|
108
|
+
fee: { fee: this.suiTransaction.gasData.budget.toString() },
|
|
109
|
+
type: this.type,
|
|
110
|
+
};
|
|
111
|
+
switch (this.type) {
|
|
112
|
+
case sdk_core_1.TransactionType.Send:
|
|
113
|
+
return this.explainTokenTransferTransaction(result, explanationResult);
|
|
114
|
+
default:
|
|
115
|
+
throw new sdk_core_1.InvalidTransactionError('Transaction type not supported');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Set the transaction type.
|
|
120
|
+
*
|
|
121
|
+
* @param {TransactionType} transactionType The transaction type to be set.
|
|
122
|
+
*/
|
|
123
|
+
transactionType(transactionType) {
|
|
124
|
+
this._type = transactionType;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Load the input and output data on this transaction.
|
|
128
|
+
*/
|
|
129
|
+
loadInputsAndOutputs() {
|
|
130
|
+
if (!this.suiTransaction) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const recipients = utils_1.default.getRecipients(this._suiTransaction);
|
|
134
|
+
// Use BigNumber: token consolidation amounts can exceed 2^53 and a Number-based sum
|
|
135
|
+
// would lose precision.
|
|
136
|
+
const totalAmount = recipients.reduce((accumulator, current) => accumulator.plus(current.amount), new bignumber_js_1.default(0));
|
|
137
|
+
this._outputs = recipients.map((recipient) => ({
|
|
138
|
+
address: recipient.address,
|
|
139
|
+
value: recipient.amount,
|
|
140
|
+
coin: this._coinConfig.name,
|
|
141
|
+
}));
|
|
142
|
+
this._inputs = [
|
|
143
|
+
{
|
|
144
|
+
address: this.suiTransaction.sender,
|
|
145
|
+
value: totalAmount.toFixed(),
|
|
146
|
+
coin: this._coinConfig.name,
|
|
147
|
+
},
|
|
148
|
+
];
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Sets this transaction payload
|
|
152
|
+
*
|
|
153
|
+
* @param {string} rawTransaction
|
|
154
|
+
*/
|
|
155
|
+
fromRawTransaction(rawTransaction) {
|
|
156
|
+
try {
|
|
157
|
+
utils_1.default.isValidRawTransaction(rawTransaction);
|
|
158
|
+
this._suiTransaction = transaction_1.Transaction.deserializeSuiTransaction(rawTransaction);
|
|
159
|
+
this._type = sdk_core_1.TransactionType.Send;
|
|
160
|
+
this._id = this._suiTransaction.id;
|
|
161
|
+
this.loadInputsAndOutputs();
|
|
162
|
+
}
|
|
163
|
+
catch (e) {
|
|
164
|
+
throw e;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Helper function for serialize() to get the correct txData with transaction type
|
|
169
|
+
*
|
|
170
|
+
* @return {TxData}
|
|
171
|
+
*/
|
|
172
|
+
getTxData() {
|
|
173
|
+
if (!this._suiTransaction) {
|
|
174
|
+
throw new sdk_core_1.InvalidTransactionError('empty transaction');
|
|
175
|
+
}
|
|
176
|
+
const inputs = this._suiTransaction.tx.inputs.map((input) => {
|
|
177
|
+
if (input.hasOwnProperty('Object')) {
|
|
178
|
+
return input;
|
|
179
|
+
}
|
|
180
|
+
if (input.hasOwnProperty('Pure')) {
|
|
181
|
+
if (input.Pure.length === constants_1.SUI_ADDRESS_LENGTH) {
|
|
182
|
+
const address = (0, types_1.normalizeSuiAddress)(builder_1.builder.de(bcs_1.BCS.ADDRESS, Buffer.from(input.Pure).toString('base64'), 'base64'));
|
|
183
|
+
return builder_1.Inputs.Pure(address, bcs_1.BCS.ADDRESS);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
const amount = builder_1.builder.de(bcs_1.BCS.U64, Buffer.from(input.Pure).toString('base64'), 'base64');
|
|
187
|
+
return builder_1.Inputs.Pure(amount, bcs_1.BCS.U64);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (input.hasOwnProperty('BalanceWithdrawal')) {
|
|
191
|
+
return input;
|
|
192
|
+
}
|
|
193
|
+
if (input.kind === 'Input' &&
|
|
194
|
+
(input.value.hasOwnProperty('Object') ||
|
|
195
|
+
input.value.hasOwnProperty('Pure') ||
|
|
196
|
+
input.value.hasOwnProperty('BalanceWithdrawal'))) {
|
|
197
|
+
return input.value;
|
|
198
|
+
}
|
|
199
|
+
return builder_1.Inputs.Pure(input.value, input.type === 'pure' ? bcs_1.BCS.U64 : bcs_1.BCS.ADDRESS);
|
|
200
|
+
});
|
|
201
|
+
const programmableTx = {
|
|
202
|
+
inputs,
|
|
203
|
+
transactions: this._suiTransaction.tx.transactions,
|
|
204
|
+
};
|
|
205
|
+
return {
|
|
206
|
+
sender: this._suiTransaction.sender,
|
|
207
|
+
expiration: this._suiTransaction.expiration ?? { None: null },
|
|
208
|
+
gasData: this._suiTransaction.gasData,
|
|
209
|
+
kind: {
|
|
210
|
+
ProgrammableTransaction: programmableTx,
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Returns a complete explanation for a transfer transaction
|
|
216
|
+
* @param {TxData} json The transaction data in json format
|
|
217
|
+
* @param {TransactionExplanation} explanationResult The transaction explanation to be completed
|
|
218
|
+
* @returns {TransactionExplanation}
|
|
219
|
+
*/
|
|
220
|
+
explainTokenTransferTransaction(json, explanationResult) {
|
|
221
|
+
const recipients = utils_1.default.getRecipients(this.suiTransaction);
|
|
222
|
+
const outputs = recipients.map((recipient) => recipient);
|
|
223
|
+
const outputAmount = recipients
|
|
224
|
+
.reduce((accumulator, current) => accumulator.plus(current.amount), new bignumber_js_1.default(0))
|
|
225
|
+
.toFixed();
|
|
226
|
+
return {
|
|
227
|
+
...explanationResult,
|
|
228
|
+
outputAmount,
|
|
229
|
+
outputs,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Extracts the objects that were provided as inputs while building the transaction.
|
|
234
|
+
* Handles both the simple case (MergeCoins/SplitCoins first) and the address-balance
|
|
235
|
+
* case where MoveCall(redeem_funds) may precede MergeCoins/SplitCoins.
|
|
236
|
+
* @param tx
|
|
237
|
+
* @returns {SuiObjectRef[]} Objects that are inputs for the transaction
|
|
238
|
+
*/
|
|
239
|
+
getInputObjectsFromTx(tx) {
|
|
240
|
+
const inputs = tx.inputs;
|
|
241
|
+
// Scan all transactions to find the first MergeCoins or SplitCoins,
|
|
242
|
+
// which holds references to the coin object inputs.
|
|
243
|
+
let args = [];
|
|
244
|
+
for (const txn of tx.transactions) {
|
|
245
|
+
const transaction = txn;
|
|
246
|
+
if (transaction.kind === 'MergeCoins') {
|
|
247
|
+
const { destination, sources } = transaction;
|
|
248
|
+
args = [destination, ...sources];
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
else if (transaction.kind === 'SplitCoins') {
|
|
252
|
+
args = [transaction.coin];
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
const inputObjects = [];
|
|
257
|
+
args.forEach((arg) => {
|
|
258
|
+
if (arg.kind === 'Input') {
|
|
259
|
+
let input = inputs[arg.index];
|
|
260
|
+
if ('value' in input) {
|
|
261
|
+
input = input.value;
|
|
262
|
+
}
|
|
263
|
+
if ('Object' in input && (0, utils_1.isImmOrOwnedObj)(input.Object)) {
|
|
264
|
+
inputObjects.push(input.Object.ImmOrOwned);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
return inputObjects;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
exports.TokenTransferTransaction = TokenTransferTransaction;
|
|
272
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5UcmFuc2ZlclRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90b2tlblRyYW5zZmVyVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsK0NBQTRDO0FBQzVDLDJDQUFtRTtBQUNuRSxtREFROEI7QUFDOUIsNkNBQStFO0FBQy9FLGlEQUFpRDtBQUNqRCxpREFNNkI7QUFDN0IscUNBQWtDO0FBQ2xDLGdFQUFxQztBQUVyQyxNQUFhLHdCQUF5QixTQUFRLHlCQUFpRDtJQUM3RixZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBd0Q7UUFDeEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixJQUFJLEVBQUU7UUFDSixPQUFPLElBQUksQ0FBQyxHQUFHLElBQUksNEJBQWdCLENBQUM7SUFDdEMsQ0FBQztJQUVELFlBQVksQ0FBQyxTQUF3QixFQUFFLFNBQWlCO1FBQ3RELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsT0FBTyxDQUFDLEdBQVk7UUFDbEIsT0FBTyxJQUFJLENB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QUFJLFFBQVEsSUFBSSxLQUFLLElBQUksSUFBQSx1QkFBZSxFQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUN2RCxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzdDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUExUEQsNERBMFBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3VpVHJhbnNhY3Rpb24sIFRva2VuVHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgVHhEYXRhIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgU1VJX0FERFJFU1NfTEVOR1RILCBVTkFWQUlMQUJMRV9URVhUIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgQmFzZUtleSxcbiAgUHVibGljS2V5IGFzIEJhc2VQdWJsaWNLZXksXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFNpZ25hdHVyZSxcbiAgVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQ2FsbEFyZywgbm9ybWFsaXplU3VpQWRkcmVzcywgU3VpT2JqZWN0UmVmIH0gZnJvbSAnLi9teXN0ZW5sYWIvdHlwZXMnO1xuaW1wb3J0IHV0aWxzLCB7IGlzSW1tT3JPd25lZE9iaiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgYnVpbGRlcixcbiAgSW5wdXRzLFxuICBUcmFuc2FjdGlvbkFyZ3VtZW50LFxuICBUcmFuc2FjdGlvbkJsb2NrSW5wdXQsXG4gIFRyYW5zYWN0aW9uVHlwZSBhcyBTdWlUcmFuc2FjdGlvbkJsb2NrVHlwZSxcbn0gZnJvbSAnLi9teXN0ZW5sYWIvYnVpbGRlcic7XG5pbXBvcnQgeyBCQ1MgfSBmcm9tICdAbXlzdGVuL2Jjcyc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUb2tlblRyYW5zZmVyVHJhbnNhY3Rpb24gZXh0ZW5kcyBUcmFuc2FjdGlvbjxUb2tlblRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+IHtcbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgZ2V0IHN1aVRyYW5zYWN0aW9uKCk6IFN1aVRyYW5zYWN0aW9uPFRva2VuVHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl9zdWlUcmFuc2FjdGlvbjtcbiAgfVxuXG4gIHNldFN1aVRyYW5zYWN0aW9uKHR4OiBTdWlUcmFuc2FjdGlvbjxUb2tlblRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+KTogdm9pZCB7XG4gICAgdGhpcy5fc3VpVHJhbnNhY3Rpb24gPSB0eDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faWQgfHwgVU5BVkFJTEFCTEVfVEVYVDtcbiAgfVxuXG4gIGFkZFNpZ25hdHVyZShwdWJsaWNLZXk6IEJhc2VQdWJsaWNLZXksIHNpZ25hdHVyZTogQnVmZmVyKTogdm9pZCB7XG4gICAgdGhpcy5fc2lnbmF0dXJlcy5wdXNoKHNpZ25hdHVyZS50b1N0cmluZygnaGV4JykpO1xuICAgIHRoaXMuX3NpZ25hdHVyZSA9IHsgcHVibGljS2V5LCBzaWduYXR1cmUgfTtcbiAgICB0aGlzLnNlcmlhbGl6ZSgpO1xuICB9XG5cbiAgZ2V0IHN1aVNpZ25hdHVyZSgpOiBTaWduYXR1cmUge1xuICAgIHJldHVybiB0aGlzLl9zaWduYXR1cmU7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbihrZXk6IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0Jyb2FkY2FzdEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fc3VpVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKCk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLl9zdWlUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCB0eCA9IHRoaXMuX3N1aVRyYW5zYWN0aW9uO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5faWQsXG4gICAgICBzZW5kZXI6IHR4LnNlbmRlcixcbiAgICAgIGtpbmQ6IHsgUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb246IHR4LnR4IH0sXG4gICAgICBnYXNEYXRhOiB0eC5nYXNEYXRhLFxuICAgICAgZXhwaXJhdGlvbjogdHguZXhwaXJhdGlvbiA/PyB7IE5vbmU6IG51bGwgfSxcbiAgICAgIGlucHV0T2JqZWN0czogdGhpcy5nZXRJbnB1dE9iamVjdHNGcm9tVHgodHgudHgpLFxuICAgIH07XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudG9Kc29uKCk7XG4gICAgY29uc3QgZGlzcGxheU9yZGVyID0gWydpZCcsICdvdXRwdXRzJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VPdXRwdXRzJywgJ2NoYW5nZUFtb3VudCcsICdmZWUnLCAndHlwZSddO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10gPSBbXTtcblxuICAgIGNvbnN0IGV4cGxhbmF0aW9uUmVzdWx0OiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0ge1xuICAgICAgZGlzcGxheU9yZGVyLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBvdXRwdXRzLFxuICAgICAgb3V0cHV0QW1vdW50OiAnMCcsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgZmVlOiB7IGZlZTogdGhpcy5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLmJ1ZGdldC50b1N0cmluZygpIH0sXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgfTtcblxuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TZW5kOlxuICAgICAgICByZXR1cm4gdGhpcy5leHBsYWluVG9rZW5UcmFuc2ZlclRyYW5zYWN0aW9uKHJlc3VsdCwgZXhwbGFuYXRpb25SZXN1bHQpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldC5cbiAgICovXG4gIHRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvblR5cGU6IFRyYW5zYWN0aW9uVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhIG9uIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBsb2FkSW5wdXRzQW5kT3V0cHV0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3VpVHJhbnNhY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWNpcGllbnRzID0gdXRpbHMuZ2V0UmVjaXBpZW50cyh0aGlzLl9zdWlUcmFuc2FjdGlvbik7XG4gICAgLy8gVXNlIEJpZ051bWJlcjogdG9rZW4gY29uc29saWRhdGlvbiBhbW91bnRzIGNhbiBleGNlZWQgMl41MyBhbmQgYSBOdW1iZXItYmFzZWQgc3VtXG4gICAgLy8gd291bGQgbG9zZSBwcmVjaXNpb24uXG4gICAgY29uc3QgdG90YWxBbW91bnQgPSByZWNpcGllbnRzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGFjY3VtdWxhdG9yLnBsdXMoY3VycmVudC5hbW91bnQpLCBuZXcgQmlnTnVtYmVyKDApKTtcbiAgICB0aGlzLl9vdXRwdXRzID0gcmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCkgPT4gKHtcbiAgICAgIGFkZHJlc3M6IHJlY2lwaWVudC5hZGRyZXNzLFxuICAgICAgdmFsdWU6IHJlY2lwaWVudC5hbW91bnQsXG4gICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgfSkpO1xuICAgIHRoaXMuX2lucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogdGhpcy5zdWlUcmFuc2FjdGlvbi5zZW5kZXIsXG4gICAgICAgIHZhbHVlOiB0b3RhbEFtb3VudC50b0ZpeGVkKCksXG4gICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoaXMgdHJhbnNhY3Rpb24gcGF5bG9hZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmF3VHJhbnNhY3Rpb25cbiAgICovXG4gIGZyb21SYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gICAgICB0aGlzLl9zdWlUcmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uLmRlc2VyaWFsaXplU3VpVHJhbnNhY3Rpb24oXG4gICAgICAgIHJhd1RyYW5zYWN0aW9uXG4gICAgICApIGFzIFN1aVRyYW5zYWN0aW9uPFRva2VuVHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj47XG4gICAgICB0aGlzLl90eXBlID0gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gICAgICB0aGlzLl9pZCA9IHRoaXMuX3N1aVRyYW5zYWN0aW9uLmlkO1xuICAgICAgdGhpcy5sb2FkSW5wdXRzQW5kT3V0cHV0cygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiBmb3Igc2VyaWFsaXplKCkgdG8gZ2V0IHRoZSBjb3JyZWN0IHR4RGF0YSB3aXRoIHRyYW5zYWN0aW9uIHR5cGVcbiAgICpcbiAgICogQHJldHVybiB7VHhEYXRhfVxuICAgKi9cbiAgcHVibGljIGdldFR4RGF0YSgpOiBUeERhdGEge1xuICAgIGlmICghdGhpcy5fc3VpVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignZW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzOiBDYWxsQXJnW10gfCBUcmFuc2FjdGlvbkJsb2NrSW5wdXRbXSA9IHRoaXMuX3N1aVRyYW5zYWN0aW9uLnR4LmlucHV0cy5tYXAoKGlucHV0KSA9PiB7XG4gICAgICBpZiAoaW5wdXQuaGFzT3duUHJvcGVydHkoJ09iamVjdCcpKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgIH1cbiAgICAgIGlmIChpbnB1dC5oYXNPd25Qcm9wZXJ0eSgnUHVyZScpKSB7XG4gICAgICAgIGlmIChpbnB1dC5QdXJlLmxlbmd0aCA9PT0gU1VJX0FERFJFU1NfTEVOR1RIKSB7XG4gICAgICAgICAgY29uc3QgYWRkcmVzcyA9IG5vcm1hbGl6ZVN1aUFkZHJlc3MoXG4gICAgICAgICAgICBidWlsZGVyLmRlKEJDUy5BRERSRVNTLCBCdWZmZXIuZnJvbShpbnB1dC5QdXJlKS50b1N0cmluZygnYmFzZTY0JyksICdiYXNlNjQnKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIElucHV0cy5QdXJlKGFkZHJlc3MsIEJDUy5BRERSRVNTKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBhbW91bnQgPSBidWlsZGVyLmRlKEJDUy5VNjQsIEJ1ZmZlci5mcm9tKGlucHV0LlB1cmUpLnRvU3RyaW5nKCdiYXNlNjQnKSwgJ2Jhc2U2NCcpO1xuICAgICAgICAgIHJldHVybiBJbnB1dHMuUHVyZShhbW91bnQsIEJDUy5VNjQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaW5wdXQuaGFzT3duUHJvcGVydHkoJ0JhbGFuY2VXaXRoZHJhd2FsJykpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBpbnB1dC5raW5kID09PSAnSW5wdXQnICYmXG4gICAgICAgIChpbnB1dC52YWx1ZS5oYXNPd25Qcm9wZXJ0eSgnT2JqZWN0JykgfHxcbiAgICAgICAgICBpbnB1dC52YWx1ZS5oYXNPd25Qcm9wZXJ0eSgnUHVyZScpIHx8XG4gICAgICAgICAgaW5wdXQudmFsdWUuaGFzT3duUHJvcGVydHkoJ0JhbGFuY2VXaXRoZHJhd2FsJykpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGlucHV0LnZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIElucHV0cy5QdXJlKGlucHV0LnZhbHVlLCBpbnB1dC50eXBlID09PSAncHVyZScgPyBCQ1MuVTY0IDogQkNTLkFERFJFU1MpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvZ3JhbW1hYmxlVHggPSB7XG4gICAgICBpbnB1dHMsXG4gICAgICB0cmFuc2FjdGlvbnM6IHRoaXMuX3N1aVRyYW5zYWN0aW9uLnR4LnRyYW5zYWN0aW9ucyxcbiAgICB9IGFzIFRva2VuVHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbjtcblxuICAgIHJldHVybiB7XG4gICAgICBzZW5kZXI6IHRoaXMuX3N1aVRyYW5zYWN0aW9uLnNlbmRlcixcbiAgICAgIGV4cGlyYXRpb246IHRoaXMuX3N1aVRyYW5zYWN0aW9uLmV4cGlyYXRpb24gPz8geyBOb25lOiBudWxsIH0sXG4gICAgICBnYXNEYXRhOiB0aGlzLl9zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLFxuICAgICAga2luZDoge1xuICAgICAgICBQcm9ncmFtbWFibGVUcmFuc2FjdGlvbjogcHJvZ3JhbW1hYmxlVHgsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXBsZXRlIGV4cGxhbmF0aW9uIGZvciBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7VHhEYXRhfSBqc29uIFRoZSB0cmFuc2FjdGlvbiBkYXRhIGluIGpzb24gZm9ybWF0XG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25FeHBsYW5hdGlvbn0gZXhwbGFuYXRpb25SZXN1bHQgVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uIHRvIGJlIGNvbXBsZXRlZFxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25FeHBsYW5hdGlvbn1cbiAgICovXG4gIGV4cGxhaW5Ub2tlblRyYW5zZmVyVHJhbnNhY3Rpb24oanNvbjogVHhEYXRhLCBleHBsYW5hdGlvblJlc3VsdDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IHJlY2lwaWVudHMgPSB1dGlscy5nZXRSZWNpcGllbnRzKHRoaXMuc3VpVHJhbnNhY3Rpb24pO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10gPSByZWNpcGllbnRzLm1hcCgocmVjaXBpZW50KSA9PiByZWNpcGllbnQpO1xuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IHJlY2lwaWVudHNcbiAgICAgIC5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PiBhY2N1bXVsYXRvci5wbHVzKGN1cnJlbnQuYW1vdW50KSwgbmV3IEJpZ051bWJlcigwKSlcbiAgICAgIC50b0ZpeGVkKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZXhwbGFuYXRpb25SZXN1bHQsXG4gICAgICBvdXRwdXRBbW91bnQsXG4gICAgICBvdXRwdXRzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIG9iamVjdHMgdGhhdCB3ZXJlIHByb3ZpZGVkIGFzIGlucHV0cyB3aGlsZSBidWlsZGluZyB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEhhbmRsZXMgYm90aCB0aGUgc2ltcGxlIGNhc2UgKE1lcmdlQ29pbnMvU3BsaXRDb2lucyBmaXJzdCkgYW5kIHRoZSBhZGRyZXNzLWJhbGFuY2VcbiAgICogY2FzZSB3aGVyZSBNb3ZlQ2FsbChyZWRlZW1fZnVuZHMpIG1heSBwcmVjZWRlIE1lcmdlQ29pbnMvU3BsaXRDb2lucy5cbiAgICogQHBhcmFtIHR4XG4gICAqIEByZXR1cm5zIHtTdWlPYmplY3RSZWZbXX0gT2JqZWN0cyB0aGF0IGFyZSBpbnB1dHMgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBnZXRJbnB1dE9iamVjdHNGcm9tVHgodHg6IFRva2VuVHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbik6IFN1aU9iamVjdFJlZltdIHtcbiAgICBjb25zdCBpbnB1dHMgPSB0eC5pbnB1dHM7XG5cbiAgICAvLyBTY2FuIGFsbCB0cmFuc2FjdGlvbnMgdG8gZmluZCB0aGUgZmlyc3QgTWVyZ2VDb2lucyBvciBTcGxpdENvaW5zLFxuICAgIC8vIHdoaWNoIGhvbGRzIHJlZmVyZW5jZXMgdG8gdGhlIGNvaW4gb2JqZWN0IGlucHV0cy5cbiAgICBsZXQgYXJnczogVHJhbnNhY3Rpb25Bcmd1bWVudFtdID0gW107XG4gICAgZm9yIChjb25zdCB0eG4gb2YgdHgudHJhbnNhY3Rpb25zKSB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHR4biBhcyBTdWlUcmFuc2FjdGlvbkJsb2NrVHlwZTtcbiAgICAgIGlmICh0cmFuc2FjdGlvbi5raW5kID09PSAnTWVyZ2VDb2lucycpIHtcbiAgICAgICAgY29uc3QgeyBkZXN0aW5hdGlvbiwgc291cmNlcyB9ID0gdHJhbnNhY3Rpb247XG4gICAgICAgIGFyZ3MgPSBbZGVzdGluYXRpb24sIC4uLnNvdXJjZXNdO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSBpZiAodHJhbnNhY3Rpb24ua2luZCA9PT0gJ1NwbGl0Q29pbnMnKSB7XG4gICAgICAgIGFyZ3MgPSBbdHJhbnNhY3Rpb24uY29pbl07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlucHV0T2JqZWN0czogU3VpT2JqZWN0UmVmW10gPSBbXTtcbiAgICBhcmdzLmZvckVhY2goKGFyZykgPT4ge1xuICAgICAgaWYgKGFyZy5raW5kID09PSAnSW5wdXQnKSB7XG4gICAgICAgIGxldCBpbnB1dCA9IGlucHV0c1thcmcuaW5kZXhdO1xuICAgICAgICBpZiAoJ3ZhbHVlJyBpbiBpbnB1dCkge1xuICAgICAgICAgIGlucHV0ID0gaW5wdXQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdPYmplY3QnIGluIGlucHV0ICYmIGlzSW1tT3JPd25lZE9iaihpbnB1dC5PYmplY3QpKSB7XG4gICAgICAgICAgaW5wdXRPYmplY3RzLnB1c2goaW5wdXQuT2JqZWN0LkltbU9yT3duZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaW5wdXRPYmplY3RzO1xuICB9XG59XG4iXX0=
|