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