@bitgo-beta/sdk-coin-vet 1.0.1-beta.5 → 1.0.1-beta.500
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 +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/lib/constants.d.ts +29 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +31 -3
- package/dist/src/lib/iface.d.ts +38 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +3 -0
- package/dist/src/lib/index.d.ts +26 -1
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +52 -2
- package/dist/src/lib/keyPair.d.ts +26 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +65 -0
- package/dist/src/lib/transaction/addressInitializationTransaction.d.ts +31 -0
- package/dist/src/lib/transaction/addressInitializationTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/addressInitializationTransaction.js +170 -0
- package/dist/src/lib/transaction/burnNftTransaction.d.ts +29 -0
- package/dist/src/lib/transaction/burnNftTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/burnNftTransaction.js +138 -0
- package/dist/src/lib/transaction/claimRewards.d.ts +41 -0
- package/dist/src/lib/transaction/claimRewards.d.ts.map +1 -0
- package/dist/src/lib/transaction/claimRewards.js +210 -0
- package/dist/src/lib/transaction/delegateClauseTransaction.d.ts +27 -0
- package/dist/src/lib/transaction/delegateClauseTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/delegateClauseTransaction.js +158 -0
- package/dist/src/lib/transaction/exitDelegation.d.ts +29 -0
- package/dist/src/lib/transaction/exitDelegation.d.ts.map +1 -0
- package/dist/src/lib/transaction/exitDelegation.js +143 -0
- package/dist/src/lib/transaction/flushTokenTransaction.d.ts +20 -0
- package/dist/src/lib/transaction/flushTokenTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/flushTokenTransaction.js +98 -0
- package/dist/src/lib/transaction/nftTransaction.d.ts +17 -0
- package/dist/src/lib/transaction/nftTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/nftTransaction.js +108 -0
- package/dist/src/lib/transaction/stakeClauseTransaction.d.ts +27 -0
- package/dist/src/lib/transaction/stakeClauseTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/stakeClauseTransaction.js +158 -0
- package/dist/src/lib/transaction/stakingTransaction.d.ts +31 -0
- package/dist/src/lib/transaction/stakingTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/stakingTransaction.js +169 -0
- package/dist/src/lib/transaction/tokenTransaction.d.ts +14 -0
- package/dist/src/lib/transaction/tokenTransaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/tokenTransaction.js +95 -0
- package/dist/src/lib/transaction/transaction.d.ts +109 -0
- package/dist/src/lib/transaction/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction/transaction.js +484 -0
- package/dist/src/lib/transactionBuilder/addressInitializationBuilder.d.ts +78 -0
- package/dist/src/lib/transactionBuilder/addressInitializationBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/addressInitializationBuilder.js +158 -0
- package/dist/src/lib/transactionBuilder/burnNftBuilder.d.ts +59 -0
- package/dist/src/lib/transactionBuilder/burnNftBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/burnNftBuilder.js +118 -0
- package/dist/src/lib/transactionBuilder/claimRewardsBuilder.d.ts +57 -0
- package/dist/src/lib/transactionBuilder/claimRewardsBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/claimRewardsBuilder.js +142 -0
- package/dist/src/lib/transactionBuilder/delegateTxnBuilder.d.ts +72 -0
- package/dist/src/lib/transactionBuilder/delegateTxnBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/delegateTxnBuilder.js +133 -0
- package/dist/src/lib/transactionBuilder/exitDelegationBuilder.d.ts +59 -0
- package/dist/src/lib/transactionBuilder/exitDelegationBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/exitDelegationBuilder.js +118 -0
- package/dist/src/lib/transactionBuilder/flushTokenTransactionBuilder.d.ts +66 -0
- package/dist/src/lib/transactionBuilder/flushTokenTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/flushTokenTransactionBuilder.js +129 -0
- package/dist/src/lib/transactionBuilder/nftTransactionBuilder.d.ts +23 -0
- package/dist/src/lib/transactionBuilder/nftTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/nftTransactionBuilder.js +93 -0
- package/dist/src/lib/transactionBuilder/stakeClauseTxnBuilder.d.ts +73 -0
- package/dist/src/lib/transactionBuilder/stakeClauseTxnBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/stakeClauseTxnBuilder.js +146 -0
- package/dist/src/lib/transactionBuilder/stakingBuilder.d.ts +73 -0
- package/dist/src/lib/transactionBuilder/stakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/stakingBuilder.js +147 -0
- package/dist/src/lib/transactionBuilder/tokenTransactionBuilder.d.ts +21 -0
- package/dist/src/lib/transactionBuilder/tokenTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/tokenTransactionBuilder.js +70 -0
- package/dist/src/lib/transactionBuilder/transactionBuilder.d.ts +55 -0
- package/dist/src/lib/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/transactionBuilder.js +159 -0
- package/dist/src/lib/transactionBuilder/transferBuilder.d.ts +10 -0
- package/dist/src/lib/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder/transferBuilder.js +45 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +77 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +173 -0
- package/dist/src/lib/types.d.ts +32 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +3 -0
- package/dist/src/lib/utils.d.ts +102 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +301 -6
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +9 -1
- package/dist/src/vet.d.ts +87 -4
- package/dist/src/vet.d.ts.map +1 -1
- package/dist/src/vet.js +613 -13
- package/dist/src/vetNFTCollection.d.ts +18 -0
- package/dist/src/vetNFTCollection.d.ts.map +1 -0
- package/dist/src/vetNFTCollection.js +52 -0
- package/dist/src/vetToken.d.ts +19 -0
- package/dist/src/vetToken.d.ts.map +1 -0
- package/dist/src/vetToken.js +52 -0
- package/dist/test/resources/vet.d.ts +72 -0
- package/dist/test/resources/vet.d.ts.map +1 -0
- package/dist/test/resources/vet.js +127 -0
- package/dist/test/transactionBuilder/addressInitializationBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/addressInitializationBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/addressInitializationBuilder.js +141 -0
- package/dist/test/transactionBuilder/burnNftBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/burnNftBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/burnNftBuilder.js +150 -0
- package/dist/test/transactionBuilder/claimRewardsBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/claimRewardsBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/claimRewardsBuilder.js +246 -0
- package/dist/test/transactionBuilder/delegateClauseTxnBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/delegateClauseTxnBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/delegateClauseTxnBuilder.js +185 -0
- package/dist/test/transactionBuilder/exitDelegationBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/exitDelegationBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/exitDelegationBuilder.js +150 -0
- package/dist/test/transactionBuilder/flushTokenTransactionBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/flushTokenTransactionBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/flushTokenTransactionBuilder.js +132 -0
- package/dist/test/transactionBuilder/nftTransactionBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/nftTransactionBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/nftTransactionBuilder.js +242 -0
- package/dist/test/transactionBuilder/stakeClauseTransactionBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/stakeClauseTransactionBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/stakeClauseTransactionBuilder.js +247 -0
- package/dist/test/transactionBuilder/stakingTransaction.d.ts +2 -0
- package/dist/test/transactionBuilder/stakingTransaction.d.ts.map +1 -0
- package/dist/test/transactionBuilder/stakingTransaction.js +250 -0
- package/dist/test/transactionBuilder/tokenTransactionBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/tokenTransactionBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/tokenTransactionBuilder.js +249 -0
- package/dist/test/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/transactionBuilder/transferBuilder.js +214 -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 +181 -0
- package/dist/test/unit/stakingFlowE2E.d.ts +2 -0
- package/dist/test/unit/stakingFlowE2E.d.ts.map +1 -0
- package/dist/test/unit/stakingFlowE2E.js +222 -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 +106 -0
- package/dist/test/unit/vet.d.ts +2 -0
- package/dist/test/unit/vet.d.ts.map +1 -0
- package/dist/test/unit/vet.js +251 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +22 -8
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
package/dist/src/lib/utils.js
CHANGED
|
@@ -1,27 +1,322 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.Utils = void 0;
|
|
7
|
+
const sdk_core_1 = require("@vechain/sdk-core");
|
|
8
|
+
const ethereumjs_abi_1 = __importDefault(require("ethereumjs-abi"));
|
|
9
|
+
const ethereumjs_util_1 = require("ethereumjs-util");
|
|
10
|
+
const sdk_core_2 = require("@bitgo-beta/sdk-core");
|
|
11
|
+
const abstract_eth_1 = require("@bitgo-beta/abstract-eth");
|
|
12
|
+
const constants_1 = require("./constants");
|
|
13
|
+
const keyPair_1 = require("./keyPair");
|
|
4
14
|
class Utils {
|
|
5
15
|
isValidAddress(address) {
|
|
6
|
-
|
|
16
|
+
return this.isValidHex(address, constants_1.VET_ADDRESS_LENGTH);
|
|
7
17
|
}
|
|
8
18
|
isValidBlockId(hash) {
|
|
9
|
-
|
|
19
|
+
return this.isValidHex(hash, constants_1.VET_BLOCK_ID_LENGTH);
|
|
10
20
|
}
|
|
11
21
|
isValidPrivateKey(key) {
|
|
12
|
-
|
|
22
|
+
try {
|
|
23
|
+
new keyPair_1.KeyPair({ prv: key });
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
13
29
|
}
|
|
14
30
|
isValidPublicKey(key) {
|
|
15
|
-
|
|
31
|
+
try {
|
|
32
|
+
new keyPair_1.KeyPair({ pub: key });
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
16
38
|
}
|
|
17
39
|
isValidSignature(signature) {
|
|
18
40
|
throw new Error('Method not implemented');
|
|
19
41
|
}
|
|
20
42
|
isValidTransactionId(txId) {
|
|
21
|
-
|
|
43
|
+
return this.isValidHex(txId, constants_1.VET_TRANSACTION_ID_LENGTH);
|
|
44
|
+
}
|
|
45
|
+
isValidHex(value, length) {
|
|
46
|
+
const regex = new RegExp(`^(0x|0X)[a-fA-F0-9]{${length}}$`);
|
|
47
|
+
return regex.test(value);
|
|
48
|
+
}
|
|
49
|
+
deserializeTransaction(serializedTransaction) {
|
|
50
|
+
const txBytes = sdk_core_1.HexUInt.of(serializedTransaction).bytes;
|
|
51
|
+
try {
|
|
52
|
+
return sdk_core_1.Transaction.decode(txBytes, false);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
if (err.message?.includes('Expected 9 items, but got 10')) {
|
|
56
|
+
// Likely signed, so retry with isSigned = true
|
|
57
|
+
return sdk_core_1.Transaction.decode(txBytes, true);
|
|
58
|
+
}
|
|
59
|
+
throw err;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
getTransactionTypeFromClause(clauses) {
|
|
63
|
+
if (clauses[0].data === '0x') {
|
|
64
|
+
return sdk_core_2.TransactionType.Send;
|
|
65
|
+
}
|
|
66
|
+
else if (clauses[0].data.startsWith(abstract_eth_1.v4CreateForwarderMethodId)) {
|
|
67
|
+
return sdk_core_2.TransactionType.AddressInitialization;
|
|
68
|
+
}
|
|
69
|
+
else if (clauses[0].data.startsWith(abstract_eth_1.flushForwarderTokensMethodIdV4)) {
|
|
70
|
+
return sdk_core_2.TransactionType.FlushTokens;
|
|
71
|
+
}
|
|
72
|
+
else if (clauses[0].data.startsWith(constants_1.TRANSFER_TOKEN_METHOD_ID)) {
|
|
73
|
+
return sdk_core_2.TransactionType.SendToken;
|
|
74
|
+
}
|
|
75
|
+
else if (clauses[0].data.startsWith(constants_1.STAKING_METHOD_ID)) {
|
|
76
|
+
return sdk_core_2.TransactionType.ContractCall;
|
|
77
|
+
}
|
|
78
|
+
else if (clauses[0].data.startsWith(constants_1.STAKE_CLAUSE_METHOD_ID)) {
|
|
79
|
+
return sdk_core_2.TransactionType.StakingActivate;
|
|
80
|
+
}
|
|
81
|
+
else if (clauses[0].data.startsWith(constants_1.DELEGATE_CLAUSE_METHOD_ID)) {
|
|
82
|
+
return sdk_core_2.TransactionType.StakingDelegate;
|
|
83
|
+
}
|
|
84
|
+
else if (clauses[0].data.startsWith(constants_1.EXIT_DELEGATION_METHOD_ID)) {
|
|
85
|
+
return sdk_core_2.TransactionType.StakingUnlock;
|
|
86
|
+
}
|
|
87
|
+
else if (clauses[0].data.startsWith(constants_1.BURN_NFT_METHOD_ID)) {
|
|
88
|
+
return sdk_core_2.TransactionType.StakingWithdraw;
|
|
89
|
+
}
|
|
90
|
+
else if (clauses[0].data.startsWith(constants_1.CLAIM_BASE_REWARDS_METHOD_ID) ||
|
|
91
|
+
clauses[0].data.startsWith(constants_1.CLAIM_STAKING_REWARDS_METHOD_ID)) {
|
|
92
|
+
return sdk_core_2.TransactionType.StakingClaim;
|
|
93
|
+
}
|
|
94
|
+
else if (clauses[0].data.startsWith(constants_1.TRANSFER_NFT_METHOD_ID)) {
|
|
95
|
+
return sdk_core_2.TransactionType.SendNFT;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
return sdk_core_2.TransactionType.SendToken;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
getTransferTokenData(toAddress, amountWei) {
|
|
102
|
+
const methodName = 'transfer';
|
|
103
|
+
const types = ['address', 'uint256'];
|
|
104
|
+
const params = [toAddress, new ethereumjs_util_1.BN(amountWei)];
|
|
105
|
+
const method = ethereumjs_abi_1.default.methodID(methodName, types);
|
|
106
|
+
const args = ethereumjs_abi_1.default.rawEncode(types, params);
|
|
107
|
+
return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
|
|
108
|
+
}
|
|
109
|
+
getTransferNFTData(from, to, tokenId) {
|
|
110
|
+
const methodName = 'transferFrom';
|
|
111
|
+
const types = ['address', 'address', 'uint256'];
|
|
112
|
+
const params = [from, to, new ethereumjs_util_1.BN(tokenId)];
|
|
113
|
+
const method = ethereumjs_abi_1.default.methodID(methodName, types);
|
|
114
|
+
const args = ethereumjs_abi_1.default.rawEncode(types, params);
|
|
115
|
+
return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Decodes staking transaction data to extract levelId and autorenew
|
|
119
|
+
*
|
|
120
|
+
* @param {string} data - The encoded transaction data
|
|
121
|
+
* @returns {object} - Object containing levelId and autorenew
|
|
122
|
+
*/
|
|
123
|
+
decodeStakingData(data) {
|
|
124
|
+
try {
|
|
125
|
+
const parameters = data.slice(10);
|
|
126
|
+
// Decode using ethereumjs-abi directly
|
|
127
|
+
const decoded = ethereumjs_abi_1.default.rawDecode(['uint8', 'bool'], Buffer.from(parameters, 'hex'));
|
|
128
|
+
return {
|
|
129
|
+
levelId: Number(decoded[0]),
|
|
130
|
+
autorenew: Boolean(decoded[1]),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
throw new Error(`Failed to decode staking data: ${error.message}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Decodes staking transaction data to extract levelId and autorenew
|
|
139
|
+
*
|
|
140
|
+
* @param {string} data - The encoded transaction data
|
|
141
|
+
* @returns {object} - Object containing levelId and autorenew
|
|
142
|
+
*/
|
|
143
|
+
decodeStakeClauseData(data) {
|
|
144
|
+
try {
|
|
145
|
+
const parameters = data.slice(10);
|
|
146
|
+
// Decode using ethereumjs-abi directly
|
|
147
|
+
const decoded = ethereumjs_abi_1.default.rawDecode(['uint8'], Buffer.from(parameters, 'hex'));
|
|
148
|
+
return {
|
|
149
|
+
levelId: Number(decoded[0]),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
throw new Error(`Failed to decode staking data: ${error.message}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Decodes delegate transaction data to extract tokenId and validatorAddress
|
|
158
|
+
*
|
|
159
|
+
* @param {string} data - The encoded transaction data
|
|
160
|
+
* @returns {object} - Object containing levelId and validator address
|
|
161
|
+
*/
|
|
162
|
+
decodeDelegateClauseData(data) {
|
|
163
|
+
try {
|
|
164
|
+
const parameters = data.slice(10);
|
|
165
|
+
// Decode using ethereumjs-abi directly
|
|
166
|
+
const decoded = ethereumjs_abi_1.default.rawDecode(['uint256', 'address'], Buffer.from(parameters, 'hex'));
|
|
167
|
+
return {
|
|
168
|
+
tokenId: String(decoded[0]),
|
|
169
|
+
validator: String(decoded[1]),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
throw new Error(`Failed to decode delegation data: ${error.message}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
decodeTransferTokenData(data) {
|
|
177
|
+
const [address, amount] = (0, abstract_eth_1.getRawDecoded)(['address', 'uint256'], (0, abstract_eth_1.getBufferedByteCode)(constants_1.TRANSFER_TOKEN_METHOD_ID, data));
|
|
178
|
+
const recipientAddress = (0, ethereumjs_util_1.addHexPrefix)(address.toString()).toLowerCase();
|
|
179
|
+
return {
|
|
180
|
+
address: recipientAddress,
|
|
181
|
+
amount: amount.toString(),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
decodeTransferNFTData(data) {
|
|
185
|
+
const [from, to, tokenIdBN] = (0, abstract_eth_1.getRawDecoded)(['address', 'address', 'uint256'], (0, abstract_eth_1.getBufferedByteCode)(constants_1.TRANSFER_NFT_METHOD_ID, data));
|
|
186
|
+
const recipientAddress = (0, ethereumjs_util_1.addHexPrefix)(to.toString()).toLowerCase();
|
|
187
|
+
const recipient = {
|
|
188
|
+
address: recipientAddress,
|
|
189
|
+
amount: '1',
|
|
190
|
+
};
|
|
191
|
+
const sender = (0, ethereumjs_util_1.addHexPrefix)(from.toString()).toLowerCase();
|
|
192
|
+
const tokenId = tokenIdBN.toString();
|
|
193
|
+
return {
|
|
194
|
+
recipients: [recipient],
|
|
195
|
+
sender,
|
|
196
|
+
tokenId,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Decodes claim rewards transaction data to extract tokenId
|
|
201
|
+
*
|
|
202
|
+
* @param {string} data - The encoded claim rewards method call data
|
|
203
|
+
* @returns {string} - The tokenId as a string
|
|
204
|
+
*/
|
|
205
|
+
decodeClaimRewardsData(data) {
|
|
206
|
+
try {
|
|
207
|
+
// Remove method ID (first 10 characters: '0x' + 4-byte method ID)
|
|
208
|
+
const methodData = data.slice(10);
|
|
209
|
+
// Extract tokenId from first 32-byte slot
|
|
210
|
+
// The tokenId is a uint256, so we take the full 64 hex characters
|
|
211
|
+
const tokenIdHex = methodData.slice(0, 64);
|
|
212
|
+
// Convert hex to decimal string
|
|
213
|
+
return BigInt('0x' + tokenIdHex).toString();
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
throw new Error(`Failed to decode claim rewards data: ${error.message}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Decodes exit delegation transaction data to extract tokenId
|
|
221
|
+
*
|
|
222
|
+
* @param {string} data - The encoded exit delegation method call data
|
|
223
|
+
* @returns {string} - The tokenId as a string
|
|
224
|
+
*/
|
|
225
|
+
decodeExitDelegationData(data) {
|
|
226
|
+
try {
|
|
227
|
+
if (!data.startsWith(constants_1.EXIT_DELEGATION_METHOD_ID)) {
|
|
228
|
+
throw new Error('Invalid exit delegation method data');
|
|
229
|
+
}
|
|
230
|
+
const tokenIdHex = data.slice(constants_1.EXIT_DELEGATION_METHOD_ID.length);
|
|
231
|
+
// Convert hex to decimal (matching original parseInt logic)
|
|
232
|
+
return parseInt(tokenIdHex, 16).toString();
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
throw new Error(`Failed to decode exit delegation data: ${error.message}`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Decodes burn NFT transaction data to extract tokenId
|
|
240
|
+
*
|
|
241
|
+
* @param {string} data - The encoded burn NFT method call data
|
|
242
|
+
* @returns {string} - The tokenId as a string
|
|
243
|
+
*/
|
|
244
|
+
decodeBurnNftData(data) {
|
|
245
|
+
try {
|
|
246
|
+
if (!data.startsWith(constants_1.BURN_NFT_METHOD_ID)) {
|
|
247
|
+
throw new Error('Invalid burn NFT method data');
|
|
248
|
+
}
|
|
249
|
+
const tokenIdHex = data.slice(constants_1.BURN_NFT_METHOD_ID.length);
|
|
250
|
+
// Convert hex to decimal (matching original parseInt logic)
|
|
251
|
+
return parseInt(tokenIdHex, 16).toString();
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
throw new Error(`Failed to decode burn NFT data: ${error.message}`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Get the network-appropriate stargate contract address
|
|
259
|
+
* @param {CoinConfig} coinConfig - The coin configuration object
|
|
260
|
+
* @returns {string} The delegation contract address for the network
|
|
261
|
+
*/
|
|
262
|
+
getDefaultDelegationAddress(coinConfig) {
|
|
263
|
+
const isTestnet = coinConfig.network.type === 'testnet';
|
|
264
|
+
return isTestnet ? constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET : constants_1.STARGATE_DELEGATION_ADDRESS;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Get the network-appropriate staking contract address
|
|
268
|
+
* @param {CoinConfig} coinConfig - The coin configuration object
|
|
269
|
+
* @returns {string} The staking contract address for the network
|
|
270
|
+
*/
|
|
271
|
+
getDefaultStakingAddress(coinConfig) {
|
|
272
|
+
const isTestnet = coinConfig.network.type === 'testnet';
|
|
273
|
+
return isTestnet ? constants_1.STARGATE_CONTRACT_ADDRESS_TESTNET : constants_1.STARGATE_NFT_ADDRESS;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Check if an address is a valid delegation contract address for any network
|
|
277
|
+
* @param {string} address - The address to check
|
|
278
|
+
* @returns {boolean} True if the address is a delegation contract address
|
|
279
|
+
*/
|
|
280
|
+
isDelegationContractAddress(address) {
|
|
281
|
+
const lowerAddress = address.toLowerCase();
|
|
282
|
+
return (lowerAddress === constants_1.STARGATE_DELEGATION_ADDRESS.toLowerCase() ||
|
|
283
|
+
lowerAddress === constants_1.STARGATE_DELEGATION_ADDRESS_TESTNET.toLowerCase());
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Check if an address is a valid NFT contract address for any network
|
|
287
|
+
* @param {string} address - The address to check
|
|
288
|
+
* @returns {boolean} True if the address is an NFT contract address
|
|
289
|
+
*/
|
|
290
|
+
isNftContractAddress(address) {
|
|
291
|
+
const lowerAddress = address.toLowerCase();
|
|
292
|
+
return (lowerAddress === constants_1.STARGATE_NFT_ADDRESS.toLowerCase() || lowerAddress === constants_1.STARGATE_NFT_ADDRESS_TESTNET.toLowerCase());
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Validate that a contract address matches the expected stargate address for the network
|
|
296
|
+
* @param {string} address - The contract address to validate
|
|
297
|
+
* @param {CoinConfig} coinConfig - The coin configuration object
|
|
298
|
+
* @throws {Error} If the address doesn't match the expected contract address
|
|
299
|
+
*/
|
|
300
|
+
validateStakingContractAddress(address, coinConfig) {
|
|
301
|
+
const expectedAddress = this.getDefaultStakingAddress(coinConfig);
|
|
302
|
+
if (address.toLowerCase() !== expectedAddress.toLowerCase()) {
|
|
303
|
+
throw new Error(`Invalid staking contract address. Expected ${expectedAddress} for ${coinConfig.network.type}, got ${address}`);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Validate that a contract address matches the expected stargate contract for the network
|
|
308
|
+
* @param {string} address - The contract address to validate
|
|
309
|
+
* @param {CoinConfig} coinConfig - The coin configuration object
|
|
310
|
+
* @throws {Error} If the address doesn't match the expected delegation contract address
|
|
311
|
+
*/
|
|
312
|
+
validateDelegationContractAddress(address, coinConfig) {
|
|
313
|
+
const expectedAddress = this.getDefaultDelegationAddress(coinConfig);
|
|
314
|
+
if (address.toLowerCase() !== expectedAddress.toLowerCase()) {
|
|
315
|
+
throw new Error(`Invalid delegation contract address. Expected ${expectedAddress} for ${coinConfig.network.type}, got ${address}`);
|
|
316
|
+
}
|
|
22
317
|
}
|
|
23
318
|
}
|
|
24
319
|
exports.Utils = Utils;
|
|
25
320
|
const utils = new Utils();
|
|
26
321
|
exports.default = utils;
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLE1BQWEsS0FBSztJQUNoQixjQUFjLENBQUMsT0FBZTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsaUJBQWlCLENBQUMsR0FBVztRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELGdCQUFnQixDQUFDLEdBQVc7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxTQUFpQjtRQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELG9CQUFvQixDQUFDLElBQVk7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzVDLENBQUM7Q0FDRjtBQXhCRCxzQkF3QkM7QUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBRTFCLGtCQUFlLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VVdGlscyB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuZXhwb3J0IGNsYXNzIFV0aWxzIGltcGxlbWVudHMgQmFzZVV0aWxzIHtcbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIGlzVmFsaWRQcml2YXRlS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBpc1ZhbGlkUHVibGljS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuXG5jb25zdCB1dGlscyA9IG5ldyBVdGlscygpO1xuXG5leHBvcnQgZGVmYXVsdCB1dGlscztcbiJdfQ==
|
|
322
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUE0RTtBQUM1RSxvRUFBeUM7QUFDekMscURBQW1EO0FBQ25ELG1EQUF3RjtBQUN4RiwyREFLa0M7QUFDbEMsMkNBa0JxQjtBQUNyQix1Q0FBb0M7QUFHcEMsTUFBYSxLQUFLO0lBQ2hCLGNBQWMsQ0FBQyxPQUFlO1FBQzVCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsOEJBQWtCLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQVk7UUFDekIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSwrQkFBbUIsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxHQUFXO1FBQzNCLElBQUksQ0FBQztZQUNILElBQUksaUJBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsR0FBVztRQUMxQixJQUFJLENBQUM7WUFDSCxJQUFJLGlCQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLFNBQWlCO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsb0JBQW9CLENBQUMsSUFBWTtRQUMvQixPQUFPLElBQUksQ0FB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Q0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsOEJBQThCLENBQUMsT0FBZSxFQUFFLFVBQWdDO1FBQzlFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRSxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxlQUFlLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUM1RCxNQUFNLElBQUksS0FBSyxDQUNiLDhDQUE4QyxlQUFlLFFBQVEsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFNBQVMsT0FBTyxFQUFFLENBQy9HLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsaUNBQWlDLENBQUMsT0FBZSxFQUFFLFVBQWdDO1FBQ2pGLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRSxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxlQUFlLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUM1RCxNQUFNLElBQUksS0FBSyxDQUNiLGlEQUFpRCxlQUFlLFFBQVEsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFNBQVMsT0FBTyxFQUFFLENBQ2xILENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBdFZELHNCQXNWQztBQUVELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFFMUIsa0JBQWUsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSGV4VUludCwgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uQ2xhdXNlIH0gZnJvbSAnQHZlY2hhaW4vc2RrLWNvcmUnO1xuaW1wb3J0IEV0aGVyZXVtQWJpIGZyb20gJ2V0aGVyZXVtanMtYWJpJztcbmltcG9ydCB7IGFkZEhleFByZWZpeCwgQk4gfSBmcm9tICdldGhlcmV1bWpzLXV0aWwnO1xuaW1wb3J0IHsgQmFzZVV0aWxzLCBUcmFuc2FjdGlvblJlY2lwaWVudCwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHtcbiAgdjRDcmVhdGVGb3J3YXJkZXJNZXRob2RJZCxcbiAgZmx1c2hGb3J3YXJkZXJUb2tlbnNNZXRob2RJZFY0LFxuICBnZXRSYXdEZWNvZGVkLFxuICBnZXRCdWZmZXJlZEJ5dGVDb2RlLFxufSBmcm9tICdAYml0Z28tYmV0YS9hYnN0cmFjdC1ldGgnO1xuaW1wb3J0IHtcbiAgVFJBTlNGRVJfVE9LRU5fTUVUSE9EX0lELFxuICBTVEFLSU5HX01FVEhPRF9JRCxcbiAgU1RBS0VfQ0xBVVNFX01FVEhPRF9JRCxcbiAgRVhJVF9ERUxFR0FUSU9OX01FVEhPRF9JRCxcbiAgQlVSTl9ORlRfTUVUSE9EX0lELFxuICBWRVRfQUREUkVTU19MRU5HVEgsXG4gIFZFVF9CTE9DS19JRF9MRU5HVEgsXG4gIFZFVF9UUkFOU0FDVElPTl9JRF9MRU5HVEgsXG4gIFRSQU5TRkVSX05GVF9NRVRIT0RfSUQsXG4gIENMQUlNX0JBU0VfUkVXQVJEU19NRVRIT0RfSUQsXG4gIENMQUlNX1NUQUtJTkdfUkVXQVJEU19NRVRIT0RfSUQsXG4gIFNUQVJHQVRFX05GVF9BRERSRVNTLFxuICBTVEFSR0FURV9ORlRfQUREUkVTU19URVNUTkVULFxuICBTVEFSR0FURV9ERUxFR0FUSU9OX0FERFJFU1MsXG4gIERFTEVHQVRFX0NMQVVTRV9NRVRIT0RfSUQsXG4gIFNUQVJHQVRFX0NPTlRSQUNUX0FERFJFU1NfVEVTVE5FVCxcbiAgU1RBUkdBVEVfREVMRUdBVElPTl9BRERSRVNTX1RFU1RORVQsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuXG5leHBvcnQgY2xhc3MgVXRpbHMgaW1wbGVtZW50cyBCYXNlVXRpbHMge1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkSGV4KGFkZHJlc3MsIFZFVF9BRERSRVNTX0xFTkdUSCk7XG4gIH1cblxuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkSGV4KGhhc2gsIFZFVF9CTE9DS19JRF9MRU5HVEgpO1xuICB9XG5cbiAgaXNWYWxpZFByaXZhdGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgbmV3IEtleVBhaXIoeyBwcnY6IGtleSB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpc1ZhbGlkUHVibGljS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiBrZXkgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZEhleCh0eElkLCBWRVRfVFJBTlNBQ1RJT05fSURfTEVOR1RIKTtcbiAgfVxuXG4gIGlzVmFsaWRIZXgodmFsdWU6IHN0cmluZywgbGVuZ3RoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYF4oMHh8MFgpW2EtZkEtRjAtOV17JHtsZW5ndGh9fSRgKTtcbiAgICByZXR1cm4gcmVnZXgudGVzdCh2YWx1ZSk7XG4gIH1cblxuICBkZXNlcmlhbGl6ZVRyYW5zYWN0aW9uKHNlcmlhbGl6ZWRUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4Qnl0ZXMgPSBIZXhVSW50Lm9mKHNlcmlhbGl6ZWRUcmFuc2FjdGlvbikuYnl0ZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBUcmFuc2FjdGlvbi5kZWNvZGUodHhCeXRlcywgZmFsc2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyci5tZXNzYWdlPy5pbmNsdWRlcygnRXhwZWN0ZWQgOSBpdGVtcywgYnV0IGdvdCAxMCcpKSB7XG4gICAgICAgIC8vIExpa2VseSBzaWduZWQsIHNvIHJldHJ5IHdpdGggaXNTaWduZWQgPSB0cnVlXG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvbi5kZWNvZGUodHhCeXRlcywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgZ2V0VHJhbnNhY3Rpb25UeXBlRnJvbUNsYXVzZShjbGF1c2VzOiBUcmFuc2FjdGlvbkNsYXVzZVtdKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICBpZiAoY2xhdXNlc1swXS5kYXRhID09PSAnMHgnKSB7XG4gICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gICAgfSBlbHNlIGlmIChjbGF1c2VzWzBdLmRhdGEuc3RhcnRzV2l0aCh2NENyZWF0ZUZvcndhcmRlck1ldGhvZElkKSkge1xuICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5BZGRyZXNzSW5pdGlhbGl6YXRpb247XG4gICAgfSBlbHNlIGlmIChjbGF1c2VzWzBdLmRhdGEuc3RhcnRzV2l0aChmbHVzaEZvcndhcmRlclRva2Vuc01ldGhvZElkVjQpKSB7XG4gICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkZsdXNoVG9rZW5zO1xuICAgIH0gZWxzZSBpZiAoY2xhdXNlc1swXS5kYXRhLnN0YXJ0c1dpdGgoVFJBTlNGRVJfVE9LRU5fTUVUSE9EX0lEKSkge1xuICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kVG9rZW47XG4gICAgfSBlbHNlIGlmIChjbGF1c2VzWzBdLmRhdGEuc3RhcnRzV2l0aChTVEFLSU5HX01FVEhPRF9JRCkpIHtcbiAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsO1xuICAgIH0gZWxzZSBpZiAoY2xhdXNlc1swXS5kYXRhLnN0YXJ0c1dpdGgoU1RBS0VfQ0xBVVNFX01FVEhPRF9JRCkpIHtcbiAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlO1xuICAgIH0gZWxzZSBpZiAoY2xhdXNlc1swXS5kYXRhLnN0YXJ0c1dpdGgoREVMRUdBVEVfQ0xBVVNFX01FVEhPRF9JRCkpIHtcbiAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlbGVnYXRlO1xuICAgIH0gZWxzZSBpZiAoY2xhdXNlc1swXS5kYXRhLnN0YXJ0c1dpdGgoRVhJVF9ERUxFR0FUSU9OX01FVEhPRF9JRCkpIHtcbiAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1VubG9jaztcbiAgICB9IGVsc2UgaWYgKGNsYXVzZXNbMF0uZGF0YS5zdGFydHNXaXRoKEJVUk5fTkZUX01FVEhPRF9JRCkpIHtcbiAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3O1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjbGF1c2VzWzBdLmRhdGEuc3RhcnRzV2l0aChDTEFJTV9CQVNFX1JFV0FSRFNfTUVUSE9EX0lEKSB8fFxuICAgICAgY2xhdXNlc1swXS5kYXRhLnN0YXJ0c1dpdGgoQ0xBSU1fU1RBS0lOR19SRVdBUkRTX01FVEhPRF9JRClcbiAgICApIHtcbiAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0NsYWltO1xuICAgIH0gZWxzZSBpZiAoY2xhdXNlc1swXS5kYXRhLnN0YXJ0c1dpdGgoVFJBTlNGRVJfTkZUX01FVEhPRF9JRCkpIHtcbiAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU2VuZE5GVDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kVG9rZW47XG4gICAgfVxuICB9XG5cbiAgZ2V0VHJhbnNmZXJUb2tlbkRhdGEodG9BZGRyZXNzOiBzdHJpbmcsIGFtb3VudFdlaTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtZXRob2ROYW1lID0gJ3RyYW5zZmVyJztcbiAgICBjb25zdCB0eXBlcyA9IFsnYWRkcmVzcycsICd1aW50MjU2J107XG4gICAgY29uc3QgcGFyYW1zID0gW3RvQWRkcmVzcywgbmV3IEJOKGFtb3VudFdlaSldO1xuXG4gICAgY29uc3QgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQobWV0aG9kTmFtZSwgdHlwZXMpO1xuICAgIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUodHlwZXMsIHBhcmFtcyk7XG5cbiAgICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG4gIH1cblxuICBnZXRUcmFuc2Zlck5GVERhdGEoZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCB0b2tlbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSAndHJhbnNmZXJGcm9tJztcbiAgICBjb25zdCB0eXBlcyA9IFsnYWRkcmVzcycsICdhZGRyZXNzJywgJ3VpbnQyNTYnXTtcbiAgICBjb25zdCBwYXJhbXMgPSBbZnJvbSwgdG8sIG5ldyBCTih0b2tlbklkKV07XG5cbiAgICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRChtZXRob2ROYW1lLCB0eXBlcyk7XG4gICAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZSh0eXBlcywgcGFyYW1zKTtcblxuICAgIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIHN0YWtpbmcgdHJhbnNhY3Rpb24gZGF0YSB0byBleHRyYWN0IGxldmVsSWQgYW5kIGF1dG9yZW5ld1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YSAtIFRoZSBlbmNvZGVkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICogQHJldHVybnMge29iamVjdH0gLSBPYmplY3QgY29udGFpbmluZyBsZXZlbElkIGFuZCBhdXRvcmVuZXdcbiAgICovXG4gIGRlY29kZVN0YWtpbmdEYXRhKGRhdGE6IHN0cmluZyk6IHsgbGV2ZWxJZDogbnVtYmVyOyBhdXRvcmVuZXc6IGJvb2xlYW4gfSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBkYXRhLnNsaWNlKDEwKTtcblxuICAgICAgLy8gRGVjb2RlIHVzaW5nIGV0aGVyZXVtanMtYWJpIGRpcmVjdGx5XG4gICAgICBjb25zdCBkZWNvZGVkID0gRXRoZXJldW1BYmkucmF3RGVjb2RlKFsndWludDgnLCAnYm9vbCddLCBCdWZmZXIuZnJvbShwYXJhbWV0ZXJzLCAnaGV4JykpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZXZlbElkOiBOdW1iZXIoZGVjb2RlZFswXSksXG4gICAgICAgIGF1dG9yZW5ldzogQm9vbGVhbihkZWNvZGVkWzFdKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlY29kZSBzdGFraW5nIGRhdGE6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyBzdGFraW5nIHRyYW5zYWN0aW9uIGRhdGEgdG8gZXh0cmFjdCBsZXZlbElkIGFuZCBhdXRvcmVuZXdcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgLSBUaGUgZW5jb2RlZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IC0gT2JqZWN0IGNvbnRhaW5pbmcgbGV2ZWxJZCBhbmQgYXV0b3JlbmV3XG4gICAqL1xuICBkZWNvZGVTdGFrZUNsYXVzZURhdGEoZGF0YTogc3RyaW5nKTogeyBsZXZlbElkOiBudW1iZXIgfSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBkYXRhLnNsaWNlKDEwKTtcblxuICAgICAgLy8gRGVjb2RlIHVzaW5nIGV0aGVyZXVtanMtYWJpIGRpcmVjdGx5XG4gICAgICBjb25zdCBkZWNvZGVkID0gRXRoZXJldW1BYmkucmF3RGVjb2RlKFsndWludDgnXSwgQnVmZmVyLmZyb20ocGFyYW1ldGVycywgJ2hleCcpKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGV2ZWxJZDogTnVtYmVyKGRlY29kZWRbMF0pLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGVjb2RlIHN0YWtpbmcgZGF0YTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGRlbGVnYXRlIHRyYW5zYWN0aW9uIGRhdGEgdG8gZXh0cmFjdCB0b2tlbklkIGFuZCB2YWxpZGF0b3JBZGRyZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIC0gVGhlIGVuY29kZWQgdHJhbnNhY3Rpb24gZGF0YVxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIE9iamVjdCBjb250YWluaW5nIGxldmVsSWQgYW5kIHZhbGlkYXRvciBhZGRyZXNzXG4gICAqL1xuICBkZWNvZGVEZWxlZ2F0ZUNsYXVzZURhdGEoZGF0YTogc3RyaW5nKTogeyB0b2tlbklkOiBzdHJpbmc7IHZhbGlkYXRvcjogc3RyaW5nIH0ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJzID0gZGF0YS5zbGljZSgxMCk7XG5cbiAgICAgIC8vIERlY29kZSB1c2luZyBldGhlcmV1bWpzLWFiaSBkaXJlY3RseVxuICAgICAgY29uc3QgZGVjb2RlZCA9IEV0aGVyZXVtQWJpLnJhd0RlY29kZShbJ3VpbnQyNTYnLCAnYWRkcmVzcyddLCBCdWZmZXIuZnJvbShwYXJhbWV0ZXJzLCAnaGV4JykpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b2tlbklkOiBTdHJpbmcoZGVjb2RlZFswXSksXG4gICAgICAgIHZhbGlkYXRvcjogU3RyaW5nKGRlY29kZWRbMV0pLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGVjb2RlIGRlbGVnYXRpb24gZGF0YTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGRlY29kZVRyYW5zZmVyVG9rZW5EYXRhKGRhdGE6IHN0cmluZyk6IFRyYW5zYWN0aW9uUmVjaXBpZW50IHtcbiAgICBjb25zdCBbYWRkcmVzcywgYW1vdW50XSA9IGdldFJhd0RlY29kZWQoXG4gICAgICBbJ2FkZHJlc3MnLCAndWludDI1NiddLFxuICAgICAgZ2V0QnVmZmVyZWRCeXRlQ29kZShUUkFOU0ZFUl9UT0tFTl9NRVRIT0RfSUQsIGRhdGEpXG4gICAgKTtcbiAgICBjb25zdCByZWNpcGllbnRBZGRyZXNzID0gYWRkSGV4UHJlZml4KGFkZHJlc3MudG9TdHJpbmcoKSkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4ge1xuICAgICAgYWRkcmVzczogcmVjaXBpZW50QWRkcmVzcyxcbiAgICAgIGFtb3VudDogYW1vdW50LnRvU3RyaW5nKCksXG4gICAgfTtcbiAgfVxuXG4gIGRlY29kZVRyYW5zZmVyTkZURGF0YShkYXRhOiBzdHJpbmcpOiB7XG4gICAgcmVjaXBpZW50czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXTtcbiAgICBzZW5kZXI6IHN0cmluZztcbiAgICB0b2tlbklkOiBzdHJpbmc7XG4gIH0ge1xuICAgIGNvbnN0IFtmcm9tLCB0bywgdG9rZW5JZEJOXSA9IGdldFJhd0RlY29kZWQoXG4gICAgICBbJ2FkZHJlc3MnLCAnYWRkcmVzcycsICd1aW50MjU2J10sXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKFRSQU5TRkVSX05GVF9NRVRIT0RfSUQsIGRhdGEpXG4gICAgKTtcbiAgICBjb25zdCByZWNpcGllbnRBZGRyZXNzID0gYWRkSGV4UHJlZml4KHRvLnRvU3RyaW5nKCkpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgcmVjaXBpZW50OiBUcmFuc2FjdGlvblJlY2lwaWVudCA9IHtcbiAgICAgIGFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICBhbW91bnQ6ICcxJyxcbiAgICB9O1xuICAgIGNvbnN0IHNlbmRlciA9IGFkZEhleFByZWZpeChmcm9tLnRvU3RyaW5nKCkpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgdG9rZW5JZCA9IHRva2VuSWRCTi50b1N0cmluZygpO1xuICAgIHJldHVybiB7XG4gICAgICByZWNpcGllbnRzOiBbcmVjaXBpZW50XSxcbiAgICAgIHNlbmRlcixcbiAgICAgIHRva2VuSWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGNsYWltIHJld2FyZHMgdHJhbnNhY3Rpb24gZGF0YSB0byBleHRyYWN0IHRva2VuSWRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgLSBUaGUgZW5jb2RlZCBjbGFpbSByZXdhcmRzIG1ldGhvZCBjYWxsIGRhdGFcbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgdG9rZW5JZCBhcyBhIHN0cmluZ1xuICAgKi9cbiAgZGVjb2RlQ2xhaW1SZXdhcmRzRGF0YShkYXRhOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICAvLyBSZW1vdmUgbWV0aG9kIElEIChmaXJzdCAxMCBjaGFyYWN0ZXJzOiAnMHgnICsgNC1ieXRlIG1ldGhvZCBJRClcbiAgICAgIGNvbnN0IG1ldGhvZERhdGEgPSBkYXRhLnNsaWNlKDEwKTtcblxuICAgICAgLy8gRXh0cmFjdCB0b2tlbklkIGZyb20gZmlyc3QgMzItYnl0ZSBzbG90XG4gICAgICAvLyBUaGUgdG9rZW5JZCBpcyBhIHVpbnQyNTYsIHNvIHdlIHRha2UgdGhlIGZ1bGwgNjQgaGV4IGNoYXJhY3RlcnNcbiAgICAgIGNvbnN0IHRva2VuSWRIZXggPSBtZXRob2REYXRhLnNsaWNlKDAsIDY0KTtcblxuICAgICAgLy8gQ29udmVydCBoZXggdG8gZGVjaW1hbCBzdHJpbmdcbiAgICAgIHJldHVybiBCaWdJbnQoJzB4JyArIHRva2VuSWRIZXgpLnRvU3RyaW5nKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlY29kZSBjbGFpbSByZXdhcmRzIGRhdGE6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyBleGl0IGRlbGVnYXRpb24gdHJhbnNhY3Rpb24gZGF0YSB0byBleHRyYWN0IHRva2VuSWRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgLSBUaGUgZW5jb2RlZCBleGl0IGRlbGVnYXRpb24gbWV0aG9kIGNhbGwgZGF0YVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSB0b2tlbklkIGFzIGEgc3RyaW5nXG4gICAqL1xuICBkZWNvZGVFeGl0RGVsZWdhdGlvbkRhdGEoZGF0YTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFkYXRhLnN0YXJ0c1dpdGgoRVhJVF9ERUxFR0FUSU9OX01FVEhPRF9JRCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGV4aXQgZGVsZWdhdGlvbiBtZXRob2QgZGF0YScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0b2tlbklkSGV4ID0gZGF0YS5zbGljZShFWElUX0RFTEVHQVRJT05fTUVUSE9EX0lELmxlbmd0aCk7XG4gICAgICAvLyBDb252ZXJ0IGhleCB0byBkZWNpbWFsIChtYXRjaGluZyBvcmlnaW5hbCBwYXJzZUludCBsb2dpYylcbiAgICAgIHJldHVybiBwYXJzZUludCh0b2tlbklkSGV4LCAxNikudG9TdHJpbmcoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGVjb2RlIGV4aXQgZGVsZWdhdGlvbiBkYXRhOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgYnVybiBORlQgdHJhbnNhY3Rpb24gZGF0YSB0byBleHRyYWN0IHRva2VuSWRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgLSBUaGUgZW5jb2RlZCBidXJuIE5GVCBtZXRob2QgY2FsbCBkYXRhXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHRva2VuSWQgYXMgYSBzdHJpbmdcbiAgICovXG4gIGRlY29kZUJ1cm5OZnREYXRhKGRhdGE6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghZGF0YS5zdGFydHNXaXRoKEJVUk5fTkZUX01FVEhPRF9JRCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJ1cm4gTkZUIG1ldGhvZCBkYXRhJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRva2VuSWRIZXggPSBkYXRhLnNsaWNlKEJVUk5fTkZUX01FVEhPRF9JRC5sZW5ndGgpO1xuICAgICAgLy8gQ29udmVydCBoZXggdG8gZGVjaW1hbCAobWF0Y2hpbmcgb3JpZ2luYWwgcGFyc2VJbnQgbG9naWMpXG4gICAgICByZXR1cm4gcGFyc2VJbnQodG9rZW5JZEhleCwgMTYpLnRvU3RyaW5nKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlY29kZSBidXJuIE5GVCBkYXRhOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbmV0d29yay1hcHByb3ByaWF0ZSBzdGFyZ2F0ZSBjb250cmFjdCBhZGRyZXNzXG4gICAqIEBwYXJhbSB7Q29pbkNvbmZpZ30gY29pbkNvbmZpZyAtIFRoZSBjb2luIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBkZWxlZ2F0aW9uIGNvbnRyYWN0IGFkZHJlc3MgZm9yIHRoZSBuZXR3b3JrXG4gICAqL1xuICBnZXREZWZhdWx0RGVsZWdhdGlvbkFkZHJlc3MoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGlzVGVzdG5ldCA9IGNvaW5Db25maWcubmV0d29yay50eXBlID09PSAndGVzdG5ldCc7XG4gICAgcmV0dXJuIGlzVGVzdG5ldCA/IFNUQVJHQVRFX0NPTlRSQUNUX0FERFJFU1NfVEVTVE5FVCA6IFNUQVJHQVRFX0RFTEVHQVRJT05fQUREUkVTUztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG5ldHdvcmstYXBwcm9wcmlhdGUgc3Rha2luZyBjb250cmFjdCBhZGRyZXNzXG4gICAqIEBwYXJhbSB7Q29pbkNvbmZpZ30gY29pbkNvbmZpZyAtIFRoZSBjb2luIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzdGFraW5nIGNvbnRyYWN0IGFkZHJlc3MgZm9yIHRoZSBuZXR3b3JrXG4gICAqL1xuICBnZXREZWZhdWx0U3Rha2luZ0FkZHJlc3MoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGlzVGVzdG5ldCA9IGNvaW5Db25maWcubmV0d29yay50eXBlID09PSAndGVzdG5ldCc7XG4gICAgcmV0dXJuIGlzVGVzdG5ldCA/IFNUQVJHQVRFX0NPTlRSQUNUX0FERFJFU1NfVEVTVE5FVCA6IFNUQVJHQVRFX05GVF9BRERSRVNTO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGFkZHJlc3MgaXMgYSB2YWxpZCBkZWxlZ2F0aW9uIGNvbnRyYWN0IGFkZHJlc3MgZm9yIGFueSBuZXR3b3JrXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gVGhlIGFkZHJlc3MgdG8gY2hlY2tcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBkZWxlZ2F0aW9uIGNvbnRyYWN0IGFkZHJlc3NcbiAgICovXG4gIGlzRGVsZWdhdGlvbkNvbnRyYWN0QWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBsb3dlckFkZHJlc3MgPSBhZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIGxvd2VyQWRkcmVzcyA9PT0gU1RBUkdBVEVfREVMRUdBVElPTl9BRERSRVNTLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgIGxvd2VyQWRkcmVzcyA9PT0gU1RBUkdBVEVfREVMRUdBVElPTl9BRERSRVNTX1RFU1RORVQudG9Mb3dlckNhc2UoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYWRkcmVzcyBpcyBhIHZhbGlkIE5GVCBjb250cmFjdCBhZGRyZXNzIGZvciBhbnkgbmV0d29ya1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIGFuIE5GVCBjb250cmFjdCBhZGRyZXNzXG4gICAqL1xuICBpc05mdENvbnRyYWN0QWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBsb3dlckFkZHJlc3MgPSBhZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIGxvd2VyQWRkcmVzcyA9PT0gU1RBUkdBVEVfTkZUX0FERFJFU1MudG9Mb3dlckNhc2UoKSB8fCBsb3dlckFkZHJlc3MgPT09IFNUQVJHQVRFX05GVF9BRERSRVNTX1RFU1RORVQudG9Mb3dlckNhc2UoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCBhIGNvbnRyYWN0IGFkZHJlc3MgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgc3RhcmdhdGUgYWRkcmVzcyBmb3IgdGhlIG5ldHdvcmtcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgLSBUaGUgY29udHJhY3QgYWRkcmVzcyB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0ge0NvaW5Db25maWd9IGNvaW5Db25maWcgLSBUaGUgY29pbiBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGFkZHJlc3MgZG9lc24ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgY29udHJhY3QgYWRkcmVzc1xuICAgKi9cbiAgdmFsaWRhdGVTdGFraW5nQ29udHJhY3RBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pOiB2b2lkIHtcbiAgICBjb25zdCBleHBlY3RlZEFkZHJlc3MgPSB0aGlzLmdldERlZmF1bHRTdGFraW5nQWRkcmVzcyhjb2luQ29uZmlnKTtcbiAgICBpZiAoYWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9PSBleHBlY3RlZEFkZHJlc3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBzdGFraW5nIGNvbnRyYWN0IGFkZHJlc3MuIEV4cGVjdGVkICR7ZXhwZWN0ZWRBZGRyZXNzfSBmb3IgJHtjb2luQ29uZmlnLm5ldHdvcmsudHlwZX0sIGdvdCAke2FkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCBhIGNvbnRyYWN0IGFkZHJlc3MgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgc3RhcmdhdGUgY29udHJhY3QgZm9yIHRoZSBuZXR3b3JrXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gVGhlIGNvbnRyYWN0IGFkZHJlc3MgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtDb2luQ29uZmlnfSBjb2luQ29uZmlnIC0gVGhlIGNvaW4gY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBhZGRyZXNzIGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIGRlbGVnYXRpb24gY29udHJhY3QgYWRkcmVzc1xuICAgKi9cbiAgdmFsaWRhdGVEZWxlZ2F0aW9uQ29udHJhY3RBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pOiB2b2lkIHtcbiAgICBjb25zdCBleHBlY3RlZEFkZHJlc3MgPSB0aGlzLmdldERlZmF1bHREZWxlZ2F0aW9uQWRkcmVzcyhjb2luQ29uZmlnKTtcbiAgICBpZiAoYWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9PSBleHBlY3RlZEFkZHJlc3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBkZWxlZ2F0aW9uIGNvbnRyYWN0IGFkZHJlc3MuIEV4cGVjdGVkICR7ZXhwZWN0ZWRBZGRyZXNzfSBmb3IgJHtjb2luQ29uZmlnLm5ldHdvcmsudHlwZX0sIGdvdCAke2FkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoKTtcblxuZXhwb3J0IGRlZmF1bHQgdXRpbHM7XG4iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAMjD,eAAO,MAAM,QAAQ,QAAS,SAAS,KAAG,IASzC,CAAC"}
|
package/dist/src/register.js
CHANGED
|
@@ -3,9 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.register = void 0;
|
|
4
4
|
const vet_1 = require("./vet");
|
|
5
5
|
const tvet_1 = require("./tvet");
|
|
6
|
+
const vetToken_1 = require("./vetToken");
|
|
7
|
+
const vetNFTCollection_1 = require("./vetNFTCollection");
|
|
6
8
|
const register = (sdk) => {
|
|
7
9
|
sdk.register('vet', vet_1.Vet.createInstance);
|
|
8
10
|
sdk.register('tvet', tvet_1.Tvet.createInstance);
|
|
11
|
+
vetToken_1.VetToken.createTokenConstructors().forEach(({ name, coinConstructor }) => {
|
|
12
|
+
sdk.register(name, coinConstructor);
|
|
13
|
+
});
|
|
14
|
+
vetNFTCollection_1.VetNFTCollection.createNFTCollectionConstructors().forEach(({ name, coinConstructor }) => {
|
|
15
|
+
sdk.register(name, coinConstructor);
|
|
16
|
+
});
|
|
9
17
|
};
|
|
10
18
|
exports.register = register;
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsK0JBQTRCO0FBQzVCLGlDQUE4QjtBQUM5Qix5Q0FBc0M7QUFDdEMseURBQXNEO0FBRS9DLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBYyxFQUFRLEVBQUU7SUFDL0MsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsU0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3hDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFdBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMxQyxtQkFBUSxDQUFDLHVCQUF1QixFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRTtRQUN2RSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNILG1DQUFnQixDQUFDLCtCQUErQixFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRTtRQUN2RixHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQVRXLFFBQUEsUUFBUSxZQVNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFZldCB9IGZyb20gJy4vdmV0JztcbmltcG9ydCB7IFR2ZXQgfSBmcm9tICcuL3R2ZXQnO1xuaW1wb3J0IHsgVmV0VG9rZW4gfSBmcm9tICcuL3ZldFRva2VuJztcbmltcG9ydCB7IFZldE5GVENvbGxlY3Rpb24gfSBmcm9tICcuL3ZldE5GVENvbGxlY3Rpb24nO1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXIgPSAoc2RrOiBCaXRHb0Jhc2UpOiB2b2lkID0+IHtcbiAgc2RrLnJlZ2lzdGVyKCd2ZXQnLCBWZXQuY3JlYXRlSW5zdGFuY2UpO1xuICBzZGsucmVnaXN0ZXIoJ3R2ZXQnLCBUdmV0LmNyZWF0ZUluc3RhbmNlKTtcbiAgVmV0VG9rZW4uY3JlYXRlVG9rZW5Db25zdHJ1Y3RvcnMoKS5mb3JFYWNoKCh7IG5hbWUsIGNvaW5Db25zdHJ1Y3RvciB9KSA9PiB7XG4gICAgc2RrLnJlZ2lzdGVyKG5hbWUsIGNvaW5Db25zdHJ1Y3Rvcik7XG4gIH0pO1xuICBWZXRORlRDb2xsZWN0aW9uLmNyZWF0ZU5GVENvbGxlY3Rpb25Db25zdHJ1Y3RvcnMoKS5mb3JFYWNoKCh7IG5hbWUsIGNvaW5Db25zdHJ1Y3RvciB9KSA9PiB7XG4gICAgc2RrLnJlZ2lzdGVyKG5hbWUsIGNvaW5Db25zdHJ1Y3Rvcik7XG4gIH0pO1xufTtcbiJdfQ==
|
package/dist/src/vet.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import BigNumber from 'bignumber.js';
|
|
2
|
+
import { TransactionClause } from '@vechain/sdk-core';
|
|
3
|
+
import { AuditDecryptedKeyParams, BaseCoin, BaseTransaction, BitGoBase, BuildNftTransferDataOptions, KeyPair, MPCAlgorithm, MultisigType, ParsedTransaction, SignedTransaction, SignTransactionOptions, TokenTransferRecipientParams, VerifyAddressOptions, VerifyTransactionOptions, BaseBroadcastTransactionOptions, BaseBroadcastTransactionResult } from '@bitgo-beta/sdk-core';
|
|
2
4
|
import { BaseCoin as StaticsBaseCoin } from '@bitgo-beta/statics';
|
|
5
|
+
import { Hash } from 'crypto';
|
|
6
|
+
import { TransactionBuilderFactory } from './lib';
|
|
7
|
+
import { ExplainTransactionOptions, RecoverOptions, RecoveryTransaction, UnsignedSweepRecoveryTransaction, VetParseTransactionOptions } from './lib/types';
|
|
8
|
+
import { VetTransactionExplanation } from './lib/iface';
|
|
3
9
|
/**
|
|
4
10
|
* Full Name: Vechain
|
|
5
11
|
* Docs: https://docs.vechain.org/
|
|
@@ -16,6 +22,7 @@ export declare class Vet extends BaseCoin {
|
|
|
16
22
|
getChain(): string;
|
|
17
23
|
getFamily(): string;
|
|
18
24
|
getFullName(): string;
|
|
25
|
+
valuelessTransferAllowed(): boolean;
|
|
19
26
|
/** @inheritDoc */
|
|
20
27
|
supportsTss(): boolean;
|
|
21
28
|
/** inherited doc */
|
|
@@ -24,17 +31,93 @@ export declare class Vet extends BaseCoin {
|
|
|
24
31
|
allowsAccountConsolidations(): boolean;
|
|
25
32
|
verifyTransaction(params: VerifyTransactionOptions): Promise<boolean>;
|
|
26
33
|
isWalletAddress(params: VerifyAddressOptions): Promise<boolean>;
|
|
27
|
-
parseTransaction(): Promise<ParsedTransaction>;
|
|
34
|
+
parseTransaction(params: VetParseTransactionOptions): Promise<ParsedTransaction>;
|
|
28
35
|
/**
|
|
29
36
|
* Explain a Vechain transaction
|
|
30
37
|
* @param params
|
|
31
38
|
*/
|
|
32
|
-
explainTransaction(params:
|
|
39
|
+
explainTransaction(params: ExplainTransactionOptions): Promise<VetTransactionExplanation | undefined>;
|
|
33
40
|
generateKeyPair(seed?: Buffer): KeyPair;
|
|
34
41
|
isValidPub(pub: string): boolean;
|
|
35
42
|
isValidAddress(address: string): boolean;
|
|
36
43
|
signTransaction(params: SignTransactionOptions): Promise<SignedTransaction>;
|
|
37
|
-
protected getTxBuilderFactory():
|
|
44
|
+
protected getTxBuilderFactory(): TransactionBuilderFactory;
|
|
38
45
|
protected rebuildTransaction(txHex: string): Promise<BaseTransaction>;
|
|
46
|
+
/** @inheritDoc */
|
|
47
|
+
auditDecryptedKey(params: AuditDecryptedKeyParams): void;
|
|
48
|
+
/**
|
|
49
|
+
* Function to get coin specific hash function used to generate transaction digests.
|
|
50
|
+
* @returns {@see Hash} hash function if implemented, otherwise throws exception
|
|
51
|
+
*/
|
|
52
|
+
getHashFunction(): Hash;
|
|
53
|
+
buildNftTransferData(params: BuildNftTransferDataOptions): TokenTransferRecipientParams;
|
|
54
|
+
/**
|
|
55
|
+
* Broadcasts a signed transaction to the VeChain network.
|
|
56
|
+
*
|
|
57
|
+
* @param {BaseBroadcastTransactionOptions} payload - The payload containing the serialized signed transaction.
|
|
58
|
+
* @param {string} payload.serializedSignedTransaction - The serialized signed transaction to broadcast.
|
|
59
|
+
* @returns {Promise<BaseBroadcastTransactionResult>} A promise that resolves to an empty object if the broadcast is successful.
|
|
60
|
+
* @throws {Error} If the broadcast fails, an error is thrown with the failure message.
|
|
61
|
+
*/
|
|
62
|
+
broadcastTransaction(payload: BaseBroadcastTransactionOptions): Promise<BaseBroadcastTransactionResult>;
|
|
63
|
+
/** @inheritDoc */
|
|
64
|
+
recover(params: RecoverOptions): Promise<RecoveryTransaction | UnsignedSweepRecoveryTransaction>;
|
|
65
|
+
/**
|
|
66
|
+
* Returns the public node URL for the VeChain network.
|
|
67
|
+
* @returns {string} The URL of the public VeChain node.
|
|
68
|
+
*/
|
|
69
|
+
private getPublicNodeUrl;
|
|
70
|
+
/**
|
|
71
|
+
* Calculates the transaction fee based on the estimated gas limit and fee estimate data.
|
|
72
|
+
* @param {FeeEstimateData} feeEstimateData - The fee estimate data.
|
|
73
|
+
* @param {BigNumber} estimatedGasLimit - The estimated gas limit for the transaction.
|
|
74
|
+
* @returns {BigNumber} The calculated transaction fee.
|
|
75
|
+
*/
|
|
76
|
+
private calculateFee;
|
|
77
|
+
/**
|
|
78
|
+
* Ensures that the given address has sufficient VTHO balance to cover the transaction fee.
|
|
79
|
+
* @param {string} baseAddress - The address to check for VTHO balance.
|
|
80
|
+
* @param {BigNumber} requiredGasUnits - The required gas units for the transaction.
|
|
81
|
+
* @throws {Error} If the VTHO balance is insufficient or if there's an error checking the balance.
|
|
82
|
+
*/
|
|
83
|
+
ensureVthoBalanceForFee(baseAddress: string, requiredGasUnits: BigNumber): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Fetches the balance for a given Vechain address.
|
|
86
|
+
*
|
|
87
|
+
* @param address The Vechain address (e.g., "0x...") to check.
|
|
88
|
+
* @param tokenContractAddress (Optional) The contract address of a VIP180 token.
|
|
89
|
+
* @returns A Promise that resolves to a BigNumber instance of the balance.
|
|
90
|
+
*/
|
|
91
|
+
getBalance(address: string, tokenContractAddress?: string): Promise<BigNumber>;
|
|
92
|
+
/**
|
|
93
|
+
* Retrieves the block reference from the VeChain network.
|
|
94
|
+
* @returns {Promise<string>} A promise that resolves to the block reference string.
|
|
95
|
+
* @throws {Error} If there's an error fetching the block reference or if the response is invalid.
|
|
96
|
+
*/
|
|
97
|
+
getBlockRef(): Promise<string>;
|
|
98
|
+
/**
|
|
99
|
+
* Generates a random nonce for use in transactions.
|
|
100
|
+
* @returns {string} A hexadecimal string representing the random nonce.
|
|
101
|
+
*/
|
|
102
|
+
getRandomNonce(): string;
|
|
103
|
+
/**
|
|
104
|
+
* Estimates the gas required for a set of transaction clauses.
|
|
105
|
+
* @param {TransactionClause[]} clauses - An array of transaction clauses.
|
|
106
|
+
* @param {string} caller - The address of the transaction caller.
|
|
107
|
+
* @returns {Promise<BigNumber>} A promise that resolves to the estimated gas amount.
|
|
108
|
+
* @throws {Error} If the clauses are invalid, the caller is not provided, or if there's an error in gas estimation.
|
|
109
|
+
*/
|
|
110
|
+
estimateGas(clauses: TransactionClause[], caller: string): Promise<BigNumber>;
|
|
111
|
+
/**
|
|
112
|
+
* Builds a recovery transaction for the given address.
|
|
113
|
+
* @param {Object} buildParams - The parameters for building the recovery transaction.
|
|
114
|
+
* @param {string} buildParams.baseAddress - The address to recover funds from.
|
|
115
|
+
* @param {RecoverOptions} buildParams.params - The recovery options.
|
|
116
|
+
* @returns {Promise<Transaction>} A promise that resolves to the built recovery transaction.
|
|
117
|
+
* @throws {Error} If there's no VET balance to recover or if there's an error building the transaction.
|
|
118
|
+
*/
|
|
119
|
+
private buildRecoveryTransaction;
|
|
120
|
+
recoverTokens(params: RecoverOptions): Promise<RecoveryTransaction | UnsignedSweepRecoveryTransaction>;
|
|
121
|
+
private buildTokenRecoveryTransaction;
|
|
39
122
|
}
|
|
40
123
|
//# sourceMappingURL=vet.d.ts.map
|
package/dist/src/vet.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vet.d.ts","sourceRoot":"","sources":["../../src/vet.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vet.d.ts","sourceRoot":"","sources":["../../src/vet.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,cAAc,CAAC;AAIrC,OAAO,EAAE,iBAAiB,EAAiC,MAAM,mBAAmB,CAAC;AACrF,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,eAAe,EACf,SAAS,EACT,2BAA2B,EAE3B,OAAO,EACP,YAAY,EACZ,YAAY,EAGZ,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,4BAA4B,EAC5B,oBAAoB,EACpB,wBAAwB,EAKxB,+BAA+B,EAC/B,8BAA8B,EAC/B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAS,MAAM,qBAAqB,CAAC;AAGzE,OAAO,EAAe,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE3C,OAAO,EAAiC,yBAAyB,EAAE,MAAM,OAAO,CAAC;AACjF,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,mBAAmB,EACnB,gCAAgC,EAChC,0BAA0B,EAC3B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAUxD;;;;GAIG;AACH,qBAAa,GAAI,SAAQ,QAAQ;IAC/B,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC3D,SAAS,aAAa,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAU/E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ;IAI1F;;OAEG;IACI,aAAa,IAAI,MAAM;IAIvB,QAAQ,IAAI,MAAM;IAIlB,SAAS,IAAI,MAAM;IAInB,WAAW,IAAI,MAAM;IAI5B,wBAAwB,IAAI,OAAO;IAInC,kBAAkB;IAClB,WAAW,IAAI,OAAO;IAItB,oBAAoB;IACpB,sBAAsB,IAAI,YAAY;IAItC,eAAe,IAAI,YAAY;IAI/B,2BAA2B,IAAI,OAAO;IAIhC,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC;IAsCrE,eAAe,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAS/D,gBAAgB,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqBtF;;;OAGG;IACG,kBAAkB,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC;IAU3G,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAevC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAUhC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxC,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI3E,SAAS,CAAC,mBAAmB,IAAI,yBAAyB;cAI1C,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAU3E,kBAAkB;IAClB,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAKxD;;;OAGG;IACH,eAAe,IAAI,IAAI;IAgBvB,oBAAoB,CAAC,MAAM,EAAE,2BAA2B,GAAG,4BAA4B;IA0BvF;;;;;;;OAOG;IACU,oBAAoB,CAAC,OAAO,EAAE,+BAA+B,GAAG,OAAO,CAAC,8BAA8B,CAAC;IAiBpH,kBAAkB;IACZ,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,GAAG,gCAAgC,CAAC;IAuGtG;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAWpB;;;;;OAKG;IACG,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB9F;;;;;;OAMG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,oBAAoB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAsDpF;;;;OAIG;IACU,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAsB3C;;;OAGG;IACH,cAAc,IAAI,MAAM;IAIxB;;;;;;OAMG;IACU,WAAW,CAAC,OAAO,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAsC1F;;;;;;;OAOG;YACW,wBAAwB;IAgDhC,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,GAAG,gCAAgC,CAAC;YAwG9F,6BAA6B;CAoE5C"}
|