@vultisig/core-chain 5.1.0 → 5.3.0
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/CHANGELOG.md +67 -0
- package/dist/chains/solana/spl/verification.d.ts +38 -0
- package/dist/chains/solana/spl/verification.d.ts.map +1 -0
- package/dist/chains/solana/spl/verification.js +45 -0
- package/dist/chains/solana/spl/verification.js.map +1 -0
- package/dist/chains/solana/spl/verifiedRegistry.d.ts +34 -0
- package/dist/chains/solana/spl/verifiedRegistry.d.ts.map +1 -0
- package/dist/chains/solana/spl/verifiedRegistry.js +65 -0
- package/dist/chains/solana/spl/verifiedRegistry.js.map +1 -0
- package/dist/chains/ton/failure.d.ts +70 -0
- package/dist/chains/ton/failure.d.ts.map +1 -0
- package/dist/chains/ton/failure.js +170 -0
- package/dist/chains/ton/failure.js.map +1 -0
- package/dist/chains/ton/jetton/symbol.d.ts +3 -5
- package/dist/chains/ton/jetton/symbol.d.ts.map +1 -1
- package/dist/chains/ton/jetton/symbol.js +5 -58
- package/dist/chains/ton/jetton/symbol.js.map +1 -1
- package/dist/chains/ton/jetton/verification.d.ts +1 -1
- package/dist/chains/ton/jetton/verification.d.ts.map +1 -1
- package/dist/chains/ton/jetton/verification.js +3 -3
- package/dist/chains/ton/jetton/verification.js.map +1 -1
- package/dist/chains/ton/jetton/verifiedRegistry.d.ts +1 -1
- package/dist/chains/ton/jetton/verifiedRegistry.d.ts.map +1 -1
- package/dist/chains/ton/jetton/verifiedRegistry.js +3 -3
- package/dist/chains/ton/jetton/verifiedRegistry.js.map +1 -1
- package/dist/chains/ton/wallet.d.ts +50 -0
- package/dist/chains/ton/wallet.d.ts.map +1 -0
- package/dist/chains/ton/wallet.js +54 -0
- package/dist/chains/ton/wallet.js.map +1 -0
- package/dist/chains/ton/walletV5R1.d.ts +27 -0
- package/dist/chains/ton/walletV5R1.d.ts.map +1 -0
- package/dist/chains/ton/walletV5R1.js +53 -0
- package/dist/chains/ton/walletV5R1.js.map +1 -0
- package/dist/coin/coingecko/coingeckoToken.d.ts +11 -0
- package/dist/coin/coingecko/coingeckoToken.d.ts.map +1 -1
- package/dist/coin/coingecko/getCoingeckoId.d.ts +10 -0
- package/dist/coin/coingecko/getCoingeckoId.d.ts.map +1 -1
- package/dist/coin/coingecko/getCoingeckoId.js +30 -1
- package/dist/coin/coingecko/getCoingeckoId.js.map +1 -1
- package/dist/coin/find/resolvers/solana/index.d.ts +22 -1
- package/dist/coin/find/resolvers/solana/index.d.ts.map +1 -1
- package/dist/coin/find/resolvers/solana/index.js +79 -11
- package/dist/coin/find/resolvers/solana/index.js.map +1 -1
- package/dist/coin/jupiter/api.d.ts +18 -0
- package/dist/coin/jupiter/api.d.ts.map +1 -0
- package/dist/coin/jupiter/api.js +52 -0
- package/dist/coin/jupiter/api.js.map +1 -0
- package/dist/coin/jupiter/token.d.ts +4 -0
- package/dist/coin/jupiter/token.d.ts.map +1 -1
- package/dist/coin/jupiter/token.js.map +1 -1
- package/dist/coin/token/metadata/resolvers/solana.d.ts +3 -1
- package/dist/coin/token/metadata/resolvers/solana.d.ts.map +1 -1
- package/dist/coin/token/metadata/resolvers/solana.js +10 -6
- package/dist/coin/token/metadata/resolvers/solana.js.map +1 -1
- package/dist/coin/tokenSymbol.d.ts +10 -0
- package/dist/coin/tokenSymbol.d.ts.map +1 -0
- package/dist/coin/tokenSymbol.js +62 -0
- package/dist/coin/tokenSymbol.js.map +1 -0
- package/dist/publicKey/address/deriveAddress.d.ts +8 -1
- package/dist/publicKey/address/deriveAddress.d.ts.map +1 -1
- package/dist/publicKey/address/deriveAddress.js +5 -1
- package/dist/publicKey/address/deriveAddress.js.map +1 -1
- package/dist/publicKey/address/getChainAddress.d.ts +4 -1
- package/dist/publicKey/address/getChainAddress.d.ts.map +1 -1
- package/dist/publicKey/address/getChainAddress.js +2 -2
- package/dist/publicKey/address/getChainAddress.js.map +1 -1
- package/dist/security/blockaid/tx/simulation/api/core.d.ts +17 -0
- package/dist/security/blockaid/tx/simulation/api/core.d.ts.map +1 -1
- package/dist/security/blockaid/tx/simulation/api/core.js +58 -41
- package/dist/security/blockaid/tx/simulation/api/core.js.map +1 -1
- package/dist/swap/general/GeneralSwapQuote.d.ts +10 -0
- package/dist/swap/general/GeneralSwapQuote.d.ts.map +1 -1
- package/dist/swap/general/swapkit/api/getSwapKitQuote.d.ts.map +1 -1
- package/dist/swap/general/swapkit/api/getSwapKitQuote.js +40 -14
- package/dist/swap/general/swapkit/api/getSwapKitQuote.js.map +1 -1
- package/dist/swap/native/NativeSwapQuote.d.ts +6 -1
- package/dist/swap/native/NativeSwapQuote.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/ton.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/ton.js +8 -0
- package/dist/tx/broadcast/resolvers/ton.js.map +1 -1
- package/dist/tx/fee/evm/clampEvmPriorityFee.d.ts +10 -4
- package/dist/tx/fee/evm/clampEvmPriorityFee.d.ts.map +1 -1
- package/dist/tx/fee/evm/clampEvmPriorityFee.js +35 -14
- package/dist/tx/fee/evm/clampEvmPriorityFee.js.map +1 -1
- package/dist/tx/fee/evm/evmGasLimit.d.ts +29 -0
- package/dist/tx/fee/evm/evmGasLimit.d.ts.map +1 -1
- package/dist/tx/fee/evm/evmGasLimit.js +47 -17
- package/dist/tx/fee/evm/evmGasLimit.js.map +1 -1
- package/dist/tx/fee/evm/gasPrice.d.ts +4 -0
- package/dist/tx/fee/evm/gasPrice.d.ts.map +1 -0
- package/dist/tx/fee/evm/gasPrice.js +4 -0
- package/dist/tx/fee/evm/gasPrice.js.map +1 -0
- package/dist/tx/fee/evm/maxPriorityFeePerGas.d.ts +8 -0
- package/dist/tx/fee/evm/maxPriorityFeePerGas.d.ts.map +1 -1
- package/dist/tx/fee/evm/maxPriorityFeePerGas.js +30 -1
- package/dist/tx/fee/evm/maxPriorityFeePerGas.js.map +1 -1
- package/dist/tx/status/index.d.ts +2 -2
- package/dist/tx/status/index.d.ts.map +1 -1
- package/dist/tx/status/resolver.d.ts +15 -0
- package/dist/tx/status/resolver.d.ts.map +1 -1
- package/dist/tx/status/resolvers/ton.d.ts +5 -1
- package/dist/tx/status/resolvers/ton.d.ts.map +1 -1
- package/dist/tx/status/resolvers/ton.js +8 -29
- package/dist/tx/status/resolvers/ton.js.map +1 -1
- package/package.json +41 -1
|
@@ -42,29 +42,50 @@ const priorityFeeCeilingWeiByChain = {
|
|
|
42
42
|
[EvmChain.Sei]: defaultPriorityFeeCeilingWei,
|
|
43
43
|
};
|
|
44
44
|
/**
|
|
45
|
-
* Minimum tip (wei) to sign
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* in the
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
* rollups deliberately have no floor.
|
|
45
|
+
* Minimum tip (wei) to sign with, per chain. In quiet fee markets the
|
|
46
|
+
* RPC-suggested maxPriorityFeePerGas collapses to near zero (~0.0004 gwei
|
|
47
|
+
* observed on Ethereum L1); on a chain where inclusion is a public tip auction
|
|
48
|
+
* that gives block builders no incentive to include the transaction, so it
|
|
49
|
+
* sits in the mempool until evicted and shows up as "pending then disappeared"
|
|
50
|
+
* on explorers. Tip-auction chains take 1 gwei, Polygon 30 gwei (its
|
|
51
|
+
* validators enforce a ~25 gwei minimum), and OP-stack rollups a nominal
|
|
52
|
+
* 20 wei so the signed field is never literally zero. Chains absent here
|
|
53
|
+
* (Avalanche, Zksync) sign whatever the RPC suggests.
|
|
55
54
|
*/
|
|
56
55
|
const priorityFeeFloorWeiByChain = {
|
|
57
56
|
[EvmChain.Ethereum]: 1n * GWEI,
|
|
57
|
+
[EvmChain.BSC]: 1n * GWEI,
|
|
58
|
+
[EvmChain.CronosChain]: 1n * GWEI,
|
|
59
|
+
[EvmChain.Hyperliquid]: 1n * GWEI,
|
|
60
|
+
[EvmChain.Sei]: 1n * GWEI,
|
|
58
61
|
[EvmChain.Polygon]: 30n * GWEI,
|
|
62
|
+
[EvmChain.Base]: 20n,
|
|
63
|
+
[EvmChain.Blast]: 20n,
|
|
64
|
+
[EvmChain.Optimism]: 20n,
|
|
59
65
|
};
|
|
66
|
+
/**
|
|
67
|
+
* Chains whose sequencer admits transactions first-come-first-served without a
|
|
68
|
+
* tip auction, so any priority fee is money paid for nothing. Signed with a
|
|
69
|
+
* zero tip regardless of what the RPC suggests.
|
|
70
|
+
*/
|
|
71
|
+
const zeroPriorityFeeChains = [EvmChain.Arbitrum, EvmChain.Mantle, EvmChain.Robinhood];
|
|
72
|
+
/**
|
|
73
|
+
* True on a chain whose tip `clampEvmPriorityFee` pins to zero, so a caller can
|
|
74
|
+
* skip asking the network for a suggestion it would discard anyway.
|
|
75
|
+
*/
|
|
76
|
+
export const isZeroPriorityFeeChain = (chain) => zeroPriorityFeeChains.includes(chain);
|
|
60
77
|
/**
|
|
61
78
|
* Clamps an RPC-reported EVM maxPriorityFeePerGas into a per-chain sane
|
|
62
|
-
* range:
|
|
63
|
-
* a floor (tip-auction chains
|
|
64
|
-
* too low to ever be mined. Never throws — a
|
|
65
|
-
* through at a safe fee, whereas rejecting it would
|
|
79
|
+
* range: zero on chains that ignore the tip, a generous ceiling against a
|
|
80
|
+
* compromised RPC inflating the fee, and a floor (tip-auction chains) against
|
|
81
|
+
* an honest RPC suggesting a tip too low to ever be mined. Never throws — a
|
|
82
|
+
* clamp still lets the tx go through at a safe fee, whereas rejecting it would
|
|
83
|
+
* strand the user mid-flow.
|
|
66
84
|
*/
|
|
67
85
|
export const clampEvmPriorityFee = (chain, rpcPriorityFeeWei) => {
|
|
86
|
+
if (zeroPriorityFeeChains.includes(chain)) {
|
|
87
|
+
return 0n;
|
|
88
|
+
}
|
|
68
89
|
const ceiling = priorityFeeCeilingWeiByChain[chain];
|
|
69
90
|
if (rpcPriorityFeeWei > ceiling) {
|
|
70
91
|
console.warn(`[evm] RPC-reported maxPriorityFeePerGas for ${chain} (${rpcPriorityFeeWei} wei) exceeds the sanity ceiling (${ceiling} wei); clamping to the ceiling.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clampEvmPriorityFee.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/fee/evm/clampEvmPriorityFee.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAErD,MAAM,IAAI,GAAG,WAAc,CAAA;AAC3B,MAAM,4BAA4B,GAAG,IAAI,GAAG,IAAI,CAAA;AAEhD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,4BAA4B,GAA6B;IAC7D,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IAC/B,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAC3B,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI;IAC5B,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IAC/B,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,IAAI;IAC7B,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,IAAI;IAC7B,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,GAAG,GAAG,IAAI;IAChC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,4BAA4B;IAClD,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,4BAA4B;IACpD,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,4BAA4B;IAC5C,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI;IAChC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAM,GAAG,IAAI;IACjC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,4BAA4B;IACpD,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,4BAA4B;CAC7C,CAAA;AAED
|
|
1
|
+
{"version":3,"file":"clampEvmPriorityFee.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/fee/evm/clampEvmPriorityFee.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,38 @@
|
|
|
1
1
|
import { EvmChain } from '@vultisig/core-chain/Chain';
|
|
2
2
|
import { CoinKey } from '../../../coin/Coin.js';
|
|
3
|
+
/**
|
|
4
|
+
* Lowest gas limit a plain transfer of `coin` is signed with. A live
|
|
5
|
+
* `eth_estimateGas` result is preferred and only raised to this when it comes
|
|
6
|
+
* in lower or cannot be obtained.
|
|
7
|
+
*/
|
|
8
|
+
export declare const getEvmTransferGasLimit: ({ id, chain }: CoinKey<EvmChain>) => bigint;
|
|
9
|
+
/**
|
|
10
|
+
* Intrinsic gas the calldata of a plain transfer adds to the base cost. Sizes
|
|
11
|
+
* the fallback for a memo-carrying send that could not be simulated, since a
|
|
12
|
+
* node refuses a limit below the intrinsic cost outright.
|
|
13
|
+
*/
|
|
14
|
+
export declare const getEvmCalldataGas: (data: `0x${string}`) => bigint;
|
|
15
|
+
/**
|
|
16
|
+
* Gas limit a contract call (aggregator swap, dApp transaction) falls back to
|
|
17
|
+
* when it cannot be simulated, e.g. a swap quoted before its token allowance
|
|
18
|
+
* exists. Mantle meters gas in far larger units than other chains.
|
|
19
|
+
*/
|
|
20
|
+
export declare const getEvmContractCallGasLimit: (chain: EvmChain) => bigint;
|
|
21
|
+
/**
|
|
22
|
+
* Gas limit signed for a THORChain or Maya deposit leaving an EVM chain: a
|
|
23
|
+
* memo-carrying transfer to the inbound vault for the fee coin, a router
|
|
24
|
+
* `depositWithExpiry` call for a token. Sized like an ERC-20 transfer, which
|
|
25
|
+
* comfortably covers both.
|
|
26
|
+
*/
|
|
27
|
+
export declare const evmRouterDepositGasLimit = 120000n;
|
|
3
28
|
type DeriveEvmGasLimitInput = {
|
|
4
29
|
coin: CoinKey<EvmChain>;
|
|
5
30
|
data?: string;
|
|
6
31
|
};
|
|
32
|
+
/**
|
|
33
|
+
* Fallback gas limit for a transaction that could not be simulated: the
|
|
34
|
+
* contract-call default when it carries calldata, the transfer default otherwise.
|
|
35
|
+
*/
|
|
7
36
|
export declare const deriveEvmGasLimit: ({ coin, data }: DeriveEvmGasLimitInput) => bigint;
|
|
8
37
|
export {};
|
|
9
38
|
//# sourceMappingURL=evmGasLimit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evmGasLimit.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/fee/evm/evmGasLimit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"evmGasLimit.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/fee/evm/evmGasLimit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAGrD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAwC5C;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,eAAe,OAAO,CAAC,QAAQ,CAAC,KAAG,MACX,CAAA;AAU/D;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,KAAK,MAAM,EAAE,KAAG,MAC6D,CAAA;AAErH;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,GAAI,OAAO,QAAQ,KAAG,MACN,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,UAAW,CAAA;AAEhD,KAAK,sBAAsB,GAAG;IAC5B,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,gBAAgB,sBAAsB,KAAG,MACG,CAAA"}
|
|
@@ -1,44 +1,74 @@
|
|
|
1
1
|
import { EvmChain } from '@vultisig/core-chain/Chain';
|
|
2
|
+
import { hexToBytes } from 'viem';
|
|
2
3
|
const zkSyncTransferGasLimit = 200000n;
|
|
3
|
-
const mantleTransferGasLimit = 90000000n;
|
|
4
4
|
const feeCoinTransferGasLimit = {
|
|
5
5
|
[EvmChain.Ethereum]: 23000n,
|
|
6
|
-
[EvmChain.Base]:
|
|
6
|
+
[EvmChain.Base]: 50000n,
|
|
7
7
|
[EvmChain.Arbitrum]: 120000n,
|
|
8
|
-
[EvmChain.Polygon]:
|
|
8
|
+
[EvmChain.Polygon]: 40000n,
|
|
9
9
|
[EvmChain.Optimism]: 40000n,
|
|
10
10
|
[EvmChain.CronosChain]: 40000n,
|
|
11
|
-
[EvmChain.Blast]:
|
|
12
|
-
[EvmChain.BSC]:
|
|
11
|
+
[EvmChain.Blast]: 200000n,
|
|
12
|
+
[EvmChain.BSC]: 23000n,
|
|
13
13
|
[EvmChain.Avalanche]: 23000n,
|
|
14
14
|
[EvmChain.Zksync]: zkSyncTransferGasLimit,
|
|
15
|
-
[EvmChain.Mantle]:
|
|
15
|
+
[EvmChain.Mantle]: 23000n,
|
|
16
16
|
[EvmChain.Hyperliquid]: 23000n,
|
|
17
|
-
[EvmChain.Sei]:
|
|
17
|
+
[EvmChain.Sei]: 23000n,
|
|
18
18
|
[EvmChain.Robinhood]: 120000n,
|
|
19
19
|
};
|
|
20
20
|
const defaultErc20TransferGasLimit = 120000n;
|
|
21
21
|
const erc20TransferGasLimit = {
|
|
22
22
|
[EvmChain.Ethereum]: defaultErc20TransferGasLimit,
|
|
23
|
-
[EvmChain.Base]:
|
|
23
|
+
[EvmChain.Base]: 150000n,
|
|
24
24
|
[EvmChain.Arbitrum]: defaultErc20TransferGasLimit,
|
|
25
25
|
[EvmChain.Polygon]: defaultErc20TransferGasLimit,
|
|
26
26
|
[EvmChain.Optimism]: defaultErc20TransferGasLimit,
|
|
27
27
|
[EvmChain.CronosChain]: defaultErc20TransferGasLimit,
|
|
28
|
-
[EvmChain.Blast]:
|
|
28
|
+
[EvmChain.Blast]: 200000n,
|
|
29
29
|
[EvmChain.BSC]: defaultErc20TransferGasLimit,
|
|
30
30
|
[EvmChain.Avalanche]: defaultErc20TransferGasLimit,
|
|
31
31
|
[EvmChain.Zksync]: zkSyncTransferGasLimit,
|
|
32
|
-
[EvmChain.Mantle]:
|
|
32
|
+
[EvmChain.Mantle]: defaultErc20TransferGasLimit,
|
|
33
33
|
[EvmChain.Hyperliquid]: defaultErc20TransferGasLimit,
|
|
34
34
|
[EvmChain.Sei]: defaultErc20TransferGasLimit,
|
|
35
35
|
[EvmChain.Robinhood]: defaultErc20TransferGasLimit,
|
|
36
36
|
};
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Lowest gas limit a plain transfer of `coin` is signed with. A live
|
|
39
|
+
* `eth_estimateGas` result is preferred and only raised to this when it comes
|
|
40
|
+
* in lower or cannot be obtained.
|
|
41
|
+
*/
|
|
42
|
+
export const getEvmTransferGasLimit = ({ id, chain }) => (id ? erc20TransferGasLimit : feeCoinTransferGasLimit)[chain];
|
|
43
|
+
// Calldata is priced per byte at the higher of the execution rate (16 gas for a
|
|
44
|
+
// non-zero byte, 4 for a zero byte) and the floor introduced with EIP-7623
|
|
45
|
+
// (10 gas per token, where a zero byte is one token and a non-zero byte four).
|
|
46
|
+
// A plain transfer runs no code, so the floor is what it pays wherever that EIP
|
|
47
|
+
// is active, and it exceeds the execution rate everywhere else.
|
|
48
|
+
const calldataGasPerZeroByte = 10n;
|
|
49
|
+
const calldataGasPerNonZeroByte = 40n;
|
|
50
|
+
/**
|
|
51
|
+
* Intrinsic gas the calldata of a plain transfer adds to the base cost. Sizes
|
|
52
|
+
* the fallback for a memo-carrying send that could not be simulated, since a
|
|
53
|
+
* node refuses a limit below the intrinsic cost outright.
|
|
54
|
+
*/
|
|
55
|
+
export const getEvmCalldataGas = (data) => hexToBytes(data).reduce((gas, byte) => gas + (byte === 0 ? calldataGasPerZeroByte : calldataGasPerNonZeroByte), 0n);
|
|
56
|
+
/**
|
|
57
|
+
* Gas limit a contract call (aggregator swap, dApp transaction) falls back to
|
|
58
|
+
* when it cannot be simulated, e.g. a swap quoted before its token allowance
|
|
59
|
+
* exists. Mantle meters gas in far larger units than other chains.
|
|
60
|
+
*/
|
|
61
|
+
export const getEvmContractCallGasLimit = (chain) => chain === EvmChain.Mantle ? 3000000000n : 600000n;
|
|
62
|
+
/**
|
|
63
|
+
* Gas limit signed for a THORChain or Maya deposit leaving an EVM chain: a
|
|
64
|
+
* memo-carrying transfer to the inbound vault for the fee coin, a router
|
|
65
|
+
* `depositWithExpiry` call for a token. Sized like an ERC-20 transfer, which
|
|
66
|
+
* comfortably covers both.
|
|
67
|
+
*/
|
|
68
|
+
export const evmRouterDepositGasLimit = 120000n;
|
|
69
|
+
/**
|
|
70
|
+
* Fallback gas limit for a transaction that could not be simulated: the
|
|
71
|
+
* contract-call default when it carries calldata, the transfer default otherwise.
|
|
72
|
+
*/
|
|
73
|
+
export const deriveEvmGasLimit = ({ coin, data }) => data ? getEvmContractCallGasLimit(coin.chain) : getEvmTransferGasLimit(coin);
|
|
44
74
|
//# sourceMappingURL=evmGasLimit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evmGasLimit.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/fee/evm/evmGasLimit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"evmGasLimit.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/fee/evm/evmGasLimit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gasPrice.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/fee/evm/gasPrice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAGrD,oEAAoE;AACpE,eAAO,MAAM,cAAc,GAAU,OAAO,QAAQ,KAAG,OAAO,CAAC,MAAM,CAAsC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gasPrice.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/fee/evm/gasPrice.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AAErE,oEAAoE;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,KAAe,EAAmB,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA"}
|
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
import { EvmChain } from '@vultisig/core-chain/Chain';
|
|
2
|
+
/**
|
|
3
|
+
* Priority fee to sign with: the highest 5th-percentile tip paid in any of the
|
|
4
|
+
* last ten blocks, so the transaction clears even a busy block, falling back to
|
|
5
|
+
* the node's own suggestion when no history is available. Capped at the current
|
|
6
|
+
* gas price when that lookup succeeds; a failed lookup just leaves the tip
|
|
7
|
+
* uncapped rather than failing the quote, since an EIP-1559 tip stands on its
|
|
8
|
+
* own without it.
|
|
9
|
+
*/
|
|
2
10
|
export declare const getEvmMaxPriorityFeePerGas: (chain: EvmChain) => Promise<bigint>;
|
|
3
11
|
//# sourceMappingURL=maxPriorityFeePerGas.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maxPriorityFeePerGas.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/fee/evm/maxPriorityFeePerGas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"maxPriorityFeePerGas.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/fee/evm/maxPriorityFeePerGas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAQrD;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,GAAU,OAAO,QAAQ,KAAG,OAAO,CAAC,MAAM,CAyBhF,CAAA"}
|
|
@@ -1,3 +1,32 @@
|
|
|
1
1
|
import { getEvmClient } from '@vultisig/core-chain/chains/evm/client';
|
|
2
|
-
|
|
2
|
+
import { attempt } from '@vultisig/lib-utils/attempt';
|
|
3
|
+
import { bigIntMax } from '@vultisig/lib-utils/bigint/bigIntMax';
|
|
4
|
+
const feeHistoryBlockCount = 10;
|
|
5
|
+
const feeHistoryRewardPercentile = 5;
|
|
6
|
+
/**
|
|
7
|
+
* Priority fee to sign with: the highest 5th-percentile tip paid in any of the
|
|
8
|
+
* last ten blocks, so the transaction clears even a busy block, falling back to
|
|
9
|
+
* the node's own suggestion when no history is available. Capped at the current
|
|
10
|
+
* gas price when that lookup succeeds; a failed lookup just leaves the tip
|
|
11
|
+
* uncapped rather than failing the quote, since an EIP-1559 tip stands on its
|
|
12
|
+
* own without it.
|
|
13
|
+
*/
|
|
14
|
+
export const getEvmMaxPriorityFeePerGas = async (chain) => {
|
|
15
|
+
const client = getEvmClient(chain);
|
|
16
|
+
const [feeHistory, gasPrice] = await Promise.all([
|
|
17
|
+
attempt(client.getFeeHistory({
|
|
18
|
+
blockCount: feeHistoryBlockCount,
|
|
19
|
+
rewardPercentiles: [feeHistoryRewardPercentile],
|
|
20
|
+
})),
|
|
21
|
+
attempt(client.getGasPrice()),
|
|
22
|
+
]);
|
|
23
|
+
const rewards = 'error' in feeHistory
|
|
24
|
+
? []
|
|
25
|
+
: (feeHistory.data.reward ?? []).flatMap(([reward]) => (reward === undefined ? [] : [reward]));
|
|
26
|
+
const priorityFee = rewards.length > 0 ? bigIntMax(...rewards) : await client.estimateMaxPriorityFeePerGas();
|
|
27
|
+
if ('error' in gasPrice) {
|
|
28
|
+
return priorityFee;
|
|
29
|
+
}
|
|
30
|
+
return priorityFee > gasPrice.data ? gasPrice.data : priorityFee;
|
|
31
|
+
};
|
|
3
32
|
//# sourceMappingURL=maxPriorityFeePerGas.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maxPriorityFeePerGas.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/fee/evm/maxPriorityFeePerGas.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;
|
|
1
|
+
{"version":3,"file":"maxPriorityFeePerGas.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/fee/evm/maxPriorityFeePerGas.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAA;AAEhE,MAAM,oBAAoB,GAAG,EAAE,CAAA;AAC/B,MAAM,0BAA0B,GAAG,CAAC,CAAA;AAEpC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,EAAE,KAAe,EAAmB,EAAE;IACnF,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IAElC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/C,OAAO,CACL,MAAM,CAAC,aAAa,CAAC;YACnB,UAAU,EAAE,oBAAoB;YAChC,iBAAiB,EAAE,CAAC,0BAA0B,CAAC;SAChD,CAAC,CACH;QACD,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;KAC9B,CAAC,CAAA;IAEF,MAAM,OAAO,GACX,OAAO,IAAI,UAAU;QACnB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAElG,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,4BAA4B,EAAE,CAAA;IAE5G,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;QACxB,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,OAAO,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAA;AAClE,CAAC,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TxReceiptInfo, TxStatusInput } from './resolver.js';
|
|
1
|
+
import { TxFailureInfo, TxReceiptInfo, TxStatusInput } from './resolver.js';
|
|
2
2
|
export declare const getTxStatus: (input: TxStatusInput) => Promise<import("./resolver.js").TxStatusResult>;
|
|
3
|
-
export type { TxReceiptInfo, TxStatusInput };
|
|
3
|
+
export type { TxFailureInfo, TxReceiptInfo, TxStatusInput };
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/tx/status/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAoB,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/tx/status/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAoB,MAAM,YAAY,CAAA;AA6B1F,eAAO,MAAM,WAAW,GAAI,OAAO,aAAa,iDAO/C,CAAA;AAED,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,CAAA"}
|
|
@@ -14,10 +14,25 @@ export type TxReceiptInfo = {
|
|
|
14
14
|
/** Present only for a multi-purpose-token delivery. */
|
|
15
15
|
deliveredMptIssuanceId?: string;
|
|
16
16
|
};
|
|
17
|
+
/**
|
|
18
|
+
* Why a transaction ended in `error`, when the chain exposes a reason. `reason`
|
|
19
|
+
* is a stable, chain-specific identifier (see `TonTxFailureReason`) a UI can
|
|
20
|
+
* translate; `message` is the English explanation with the remedy for consumers
|
|
21
|
+
* that only print text; `exitCode` is the raw contract/VM code when there is
|
|
22
|
+
* one, and `phase` names the execution phase that produced it (TON: `compute`
|
|
23
|
+
* or `action` — the same number means different things in each).
|
|
24
|
+
*/
|
|
25
|
+
export type TxFailureInfo = {
|
|
26
|
+
reason: string;
|
|
27
|
+
message: string;
|
|
28
|
+
exitCode?: number;
|
|
29
|
+
phase?: string;
|
|
30
|
+
};
|
|
17
31
|
export type TxStatusResult = {
|
|
18
32
|
status: TxStatus;
|
|
19
33
|
isKnown?: boolean;
|
|
20
34
|
receipt?: TxReceiptInfo;
|
|
35
|
+
failure?: TxFailureInfo;
|
|
21
36
|
};
|
|
22
37
|
export type TxStatusInput<T extends Chain = Chain> = {
|
|
23
38
|
chain: T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/tx/status/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAOnC,KAAK,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,CAAA;AAEzE,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,0GAA0G;IAC1G,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,uDAAuD;IACvD,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAChC,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,QAAQ,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,IAAI;IACnD,KAAK,EAAE,CAAC,CAAA;IACR,IAAI,EAAE,MAAM,CAAA;IACZ,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,IAAI,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/tx/status/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAOnC,KAAK,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,CAAA;AAEzE,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,0GAA0G;IAC1G,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,uDAAuD;IACvD,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAChC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,QAAQ,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,IAAI;IACnD,KAAK,EAAE,CAAC,CAAA;IACR,IAAI,EAAE,MAAM,CAAA;IACZ,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,IAAI,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAA"}
|
|
@@ -4,7 +4,11 @@ import { TxStatusResolver } from '../resolver.js';
|
|
|
4
4
|
* Resolves a TON transaction by the hash of the external message that carried it.
|
|
5
5
|
* Success requires the transaction to be un-aborted *and* to have cleared both the
|
|
6
6
|
* compute and the action phase; a transaction the indexer knows but hasn't fully
|
|
7
|
-
* described yet stays pending.
|
|
7
|
+
* described yet stays pending. The action phase matters because it is where the
|
|
8
|
+
* wallet actually emits the transfer: a transaction can pass compute and land
|
|
9
|
+
* un-aborted while moving nothing, with the seqno consumed either way. A failure
|
|
10
|
+
* comes back explained (`failure`) so the UI can say what went wrong and how to
|
|
11
|
+
* fix it.
|
|
8
12
|
*/
|
|
9
13
|
export declare const getTonTxStatus: TxStatusResolver<OtherChain.Ton>;
|
|
10
14
|
//# sourceMappingURL=ton.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ton.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/status/resolvers/ton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,UAAU,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"ton.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/status/resolvers/ton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAO9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AA8B9C;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,EAAE,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAgC3D,CAAA"}
|
|
@@ -1,37 +1,18 @@
|
|
|
1
1
|
import { Chain } from '@vultisig/core-chain/Chain';
|
|
2
|
+
import { getTonTxFailure } from '@vultisig/core-chain/chains/ton/failure';
|
|
2
3
|
import { chainFeeCoin } from '@vultisig/core-chain/coin/chainFeeCoin';
|
|
3
4
|
import { rootApiUrl } from '@vultisig/core-config';
|
|
4
5
|
import { attempt } from '@vultisig/lib-utils/attempt';
|
|
5
6
|
import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
|
|
6
|
-
/**
|
|
7
|
-
* TVM exit codes 0 and 1 are the success conventions; any other code is a revert.
|
|
8
|
-
* An absent code means the message had no compute phase (a plain transfer to a
|
|
9
|
-
* wallet), which is not a failure.
|
|
10
|
-
*/
|
|
11
|
-
const hasComputePhaseFailed = (computePhase) => {
|
|
12
|
-
const exitCode = computePhase?.exit_code;
|
|
13
|
-
return exitCode !== undefined && exitCode !== 0 && exitCode !== 1;
|
|
14
|
-
};
|
|
15
|
-
/**
|
|
16
|
-
* The action phase is where the wallet contract actually emits the outgoing
|
|
17
|
-
* transfer, so it is where the money moves. A transaction can pass its compute
|
|
18
|
-
* phase and land un-aborted while its action phase moved nothing — the seqno is
|
|
19
|
-
* consumed either way — so this is what separates a real send from a silent
|
|
20
|
-
* no-op. `result_code` is checked alongside `success` because indexers do not
|
|
21
|
-
* always populate both.
|
|
22
|
-
*/
|
|
23
|
-
const hasActionPhaseFailed = (actionPhase) => {
|
|
24
|
-
if (!actionPhase) {
|
|
25
|
-
return false;
|
|
26
|
-
}
|
|
27
|
-
const { success, no_funds, result_code, skipped_actions } = actionPhase;
|
|
28
|
-
return success === false || no_funds === true || (result_code ?? 0) !== 0 || (skipped_actions ?? 0) > 0;
|
|
29
|
-
};
|
|
30
7
|
/**
|
|
31
8
|
* Resolves a TON transaction by the hash of the external message that carried it.
|
|
32
9
|
* Success requires the transaction to be un-aborted *and* to have cleared both the
|
|
33
10
|
* compute and the action phase; a transaction the indexer knows but hasn't fully
|
|
34
|
-
* described yet stays pending.
|
|
11
|
+
* described yet stays pending. The action phase matters because it is where the
|
|
12
|
+
* wallet actually emits the transfer: a transaction can pass compute and land
|
|
13
|
+
* un-aborted while moving nothing, with the seqno consumed either way. A failure
|
|
14
|
+
* comes back explained (`failure`) so the UI can say what went wrong and how to
|
|
15
|
+
* fix it.
|
|
35
16
|
*/
|
|
36
17
|
export const getTonTxStatus = async ({ hash }) => {
|
|
37
18
|
const url = `${rootApiUrl}/ton/v3/transactionsByMessage?msg_hash=${hash}&direction=in&limit=1`;
|
|
@@ -55,9 +36,7 @@ export const getTonTxStatus = async ({ hash }) => {
|
|
|
55
36
|
feeTicker: feeCoin.ticker,
|
|
56
37
|
}
|
|
57
38
|
: undefined;
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
hasActionPhaseFailed(description.action);
|
|
61
|
-
return { status: failed ? 'error' : 'success', receipt };
|
|
39
|
+
const failure = getTonTxFailure(description);
|
|
40
|
+
return failure ? { status: 'error', receipt, failure } : { status: 'success', receipt };
|
|
62
41
|
};
|
|
63
42
|
//# sourceMappingURL=ton.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ton.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/status/resolvers/ton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ton.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/status/resolvers/ton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAgC7D;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,cAAc,GAAqC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;IACjF,MAAM,GAAG,GAAG,GAAG,UAAU,0CAA0C,IAAI,uBAAuB,CAAA;IAE9F,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,QAAQ,CAA0B,GAAG,CAAC,CAAC,CAAA;IAEvF,IAAI,KAAK,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IAC9C,CAAC;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACnC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,CAAA;IAE1B,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,6EAA6E;QAC7E,8CAA8C;QAC9C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC7C,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACvC,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAA;IAC5B,MAAM,OAAO,GACX,MAAM,IAAI,IAAI,IAAI,MAAM,KAAK,EAAE;QAC7B,CAAC,CAAC;YACE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;YACzB,WAAW,EAAE,OAAO,CAAC,QAAQ;YAC7B,SAAS,EAAE,OAAO,CAAC,MAAM;SAC1B;QACH,CAAC,CAAC,SAAS,CAAA;IAEf,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,CAAA;IAE5C,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;AACzF,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vultisig/core-chain",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.3.0",
|
|
4
4
|
"description": "Blockchain chain logic shared across Vultisig clients",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -880,6 +880,16 @@
|
|
|
880
880
|
"import": "./dist/chains/solana/spl/getSplAssociatedAccount.js",
|
|
881
881
|
"default": "./dist/chains/solana/spl/getSplAssociatedAccount.js"
|
|
882
882
|
},
|
|
883
|
+
"./chains/solana/spl/verification": {
|
|
884
|
+
"types": "./dist/chains/solana/spl/verification.d.ts",
|
|
885
|
+
"import": "./dist/chains/solana/spl/verification.js",
|
|
886
|
+
"default": "./dist/chains/solana/spl/verification.js"
|
|
887
|
+
},
|
|
888
|
+
"./chains/solana/spl/verifiedRegistry": {
|
|
889
|
+
"types": "./dist/chains/solana/spl/verifiedRegistry.d.ts",
|
|
890
|
+
"import": "./dist/chains/solana/spl/verifiedRegistry.js",
|
|
891
|
+
"default": "./dist/chains/solana/spl/verifiedRegistry.js"
|
|
892
|
+
},
|
|
883
893
|
"./chains/solana/staking/apyResolver": {
|
|
884
894
|
"types": "./dist/chains/solana/staking/apyResolver.d.ts",
|
|
885
895
|
"import": "./dist/chains/solana/staking/apyResolver.js",
|
|
@@ -1010,6 +1020,11 @@
|
|
|
1010
1020
|
"import": "./dist/chains/ton/config.js",
|
|
1011
1021
|
"default": "./dist/chains/ton/config.js"
|
|
1012
1022
|
},
|
|
1023
|
+
"./chains/ton/failure": {
|
|
1024
|
+
"types": "./dist/chains/ton/failure.d.ts",
|
|
1025
|
+
"import": "./dist/chains/ton/failure.js",
|
|
1026
|
+
"default": "./dist/chains/ton/failure.js"
|
|
1027
|
+
},
|
|
1013
1028
|
"./chains/ton/jetton/symbol": {
|
|
1014
1029
|
"types": "./dist/chains/ton/jetton/symbol.d.ts",
|
|
1015
1030
|
"import": "./dist/chains/ton/jetton/symbol.js",
|
|
@@ -1055,6 +1070,16 @@
|
|
|
1055
1070
|
"import": "./dist/chains/ton/staking.js",
|
|
1056
1071
|
"default": "./dist/chains/ton/staking.js"
|
|
1057
1072
|
},
|
|
1073
|
+
"./chains/ton/wallet": {
|
|
1074
|
+
"types": "./dist/chains/ton/wallet.d.ts",
|
|
1075
|
+
"import": "./dist/chains/ton/wallet.js",
|
|
1076
|
+
"default": "./dist/chains/ton/wallet.js"
|
|
1077
|
+
},
|
|
1078
|
+
"./chains/ton/walletV5R1": {
|
|
1079
|
+
"types": "./dist/chains/ton/walletV5R1.d.ts",
|
|
1080
|
+
"import": "./dist/chains/ton/walletV5R1.js",
|
|
1081
|
+
"default": "./dist/chains/ton/walletV5R1.js"
|
|
1082
|
+
},
|
|
1058
1083
|
"./chains/tron/config": {
|
|
1059
1084
|
"types": "./dist/chains/tron/config.d.ts",
|
|
1060
1085
|
"import": "./dist/chains/tron/config.js",
|
|
@@ -1320,6 +1345,11 @@
|
|
|
1320
1345
|
"import": "./dist/coin/find/resolvers/ton.js",
|
|
1321
1346
|
"default": "./dist/coin/find/resolvers/ton.js"
|
|
1322
1347
|
},
|
|
1348
|
+
"./coin/jupiter/api": {
|
|
1349
|
+
"types": "./dist/coin/jupiter/api.d.ts",
|
|
1350
|
+
"import": "./dist/coin/jupiter/api.js",
|
|
1351
|
+
"default": "./dist/coin/jupiter/api.js"
|
|
1352
|
+
},
|
|
1323
1353
|
"./coin/jupiter/token": {
|
|
1324
1354
|
"types": "./dist/coin/jupiter/token.d.ts",
|
|
1325
1355
|
"import": "./dist/coin/jupiter/token.js",
|
|
@@ -1450,6 +1480,11 @@
|
|
|
1450
1480
|
"import": "./dist/coin/token/metadata/resolvers/tron.js",
|
|
1451
1481
|
"default": "./dist/coin/token/metadata/resolvers/tron.js"
|
|
1452
1482
|
},
|
|
1483
|
+
"./coin/tokenSymbol": {
|
|
1484
|
+
"types": "./dist/coin/tokenSymbol.d.ts",
|
|
1485
|
+
"import": "./dist/coin/tokenSymbol.js",
|
|
1486
|
+
"default": "./dist/coin/tokenSymbol.js"
|
|
1487
|
+
},
|
|
1453
1488
|
"./coin/tokenVerification": {
|
|
1454
1489
|
"types": "./dist/coin/tokenVerification.d.ts",
|
|
1455
1490
|
"import": "./dist/coin/tokenVerification.js",
|
|
@@ -2233,6 +2268,11 @@
|
|
|
2233
2268
|
"import": "./dist/tx/fee/evm/evmGasLimit.js",
|
|
2234
2269
|
"default": "./dist/tx/fee/evm/evmGasLimit.js"
|
|
2235
2270
|
},
|
|
2271
|
+
"./tx/fee/evm/gasPrice": {
|
|
2272
|
+
"types": "./dist/tx/fee/evm/gasPrice.d.ts",
|
|
2273
|
+
"import": "./dist/tx/fee/evm/gasPrice.js",
|
|
2274
|
+
"default": "./dist/tx/fee/evm/gasPrice.js"
|
|
2275
|
+
},
|
|
2236
2276
|
"./tx/fee/evm/gwei": {
|
|
2237
2277
|
"types": "./dist/tx/fee/evm/gwei.d.ts",
|
|
2238
2278
|
"import": "./dist/tx/fee/evm/gwei.js",
|