@subwallet/extension-base 1.3.17-0 → 1.3.18-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/background/KoniTypes.d.ts +7 -2
- package/cjs/constants/index.js +6 -3
- package/cjs/core/logic-validation/request.js +26 -19
- package/cjs/core/logic-validation/transfer.js +18 -17
- package/cjs/koni/api/contract-handler/evm/web3.js +3 -3
- package/cjs/koni/background/handlers/Extension.js +269 -123
- package/cjs/koni/background/handlers/State.js +1 -8
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +1 -1
- package/cjs/services/balance-service/index.js +13 -0
- package/cjs/services/balance-service/transfer/smart-contract.js +47 -33
- package/cjs/services/balance-service/transfer/token.js +5 -4
- package/cjs/services/balance-service/transfer/xcm/availBridge.js +14 -18
- package/cjs/services/balance-service/transfer/xcm/index.js +30 -61
- package/cjs/services/balance-service/transfer/xcm/polygonBridge.js +13 -17
- package/cjs/services/balance-service/transfer/xcm/posBridge.js +20 -21
- package/cjs/services/balance-service/transfer/xcm/snowBridge.js +7 -7
- package/cjs/services/balance-service/transfer/xcm/utils.js +2 -2
- package/cjs/services/chain-service/constants.js +3 -3
- package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +7 -12
- package/cjs/services/earning-service/handlers/special.js +15 -4
- package/cjs/services/fee-service/interfaces.js +1 -0
- package/cjs/services/fee-service/service.js +111 -0
- package/cjs/services/fee-service/utils/index.js +99 -113
- package/cjs/services/storage-service/db-stores/Balance.js +3 -0
- package/cjs/services/swap-service/handler/asset-hub/handler.js +21 -6
- package/cjs/services/swap-service/handler/asset-hub/router.js +1 -1
- package/cjs/services/swap-service/handler/asset-hub/utils.js +4 -4
- package/cjs/services/swap-service/handler/base-handler.js +2 -0
- package/cjs/services/swap-service/handler/chainflip-handler.js +25 -4
- package/cjs/services/swap-service/handler/hydradx-handler.js +20 -6
- package/cjs/services/swap-service/handler/simpleswap-handler.js +23 -3
- package/cjs/services/swap-service/index.js +8 -8
- package/cjs/services/transaction-service/index.js +23 -3
- package/cjs/types/balance/transfer.js +1 -0
- package/cjs/types/fee/base.js +1 -0
- package/cjs/types/fee/evm.js +16 -1
- package/cjs/types/fee/index.js +37 -4
- package/cjs/types/fee/option.js +1 -0
- package/cjs/types/fee/subscription.js +1 -0
- package/cjs/types/fee/substrate.js +1 -0
- package/cjs/types/fee/ton.js +1 -0
- package/cjs/utils/fee/combine.js +50 -0
- package/cjs/utils/fee/index.js +27 -0
- package/cjs/utils/fee/transfer.js +374 -0
- package/cjs/utils/index.js +12 -0
- package/constants/index.d.ts +1 -0
- package/constants/index.js +1 -0
- package/core/logic-validation/request.js +17 -10
- package/core/logic-validation/transfer.d.ts +5 -5
- package/core/logic-validation/transfer.js +20 -19
- package/core/substrate/xcm-parser.d.ts +1 -1
- package/koni/api/contract-handler/evm/web3.js +3 -3
- package/koni/background/handlers/Extension.d.ts +3 -3
- package/koni/background/handlers/Extension.js +253 -107
- package/koni/background/handlers/State.js +1 -8
- package/package.json +55 -5
- package/packageInfo.js +1 -1
- package/services/balance-service/helpers/subscribe/substrate/index.js +1 -1
- package/services/balance-service/index.d.ts +1 -0
- package/services/balance-service/index.js +13 -0
- package/services/balance-service/transfer/smart-contract.d.ts +24 -4
- package/services/balance-service/transfer/smart-contract.js +45 -33
- package/services/balance-service/transfer/token.js +6 -5
- package/services/balance-service/transfer/xcm/availBridge.d.ts +3 -2
- package/services/balance-service/transfer/xcm/availBridge.js +11 -15
- package/services/balance-service/transfer/xcm/index.d.ts +12 -11
- package/services/balance-service/transfer/xcm/index.js +29 -58
- package/services/balance-service/transfer/xcm/polygonBridge.d.ts +4 -3
- package/services/balance-service/transfer/xcm/polygonBridge.js +13 -17
- package/services/balance-service/transfer/xcm/posBridge.d.ts +4 -3
- package/services/balance-service/transfer/xcm/posBridge.js +18 -19
- package/services/balance-service/transfer/xcm/snowBridge.d.ts +2 -1
- package/services/balance-service/transfer/xcm/snowBridge.js +7 -7
- package/services/balance-service/transfer/xcm/utils.js +2 -2
- package/services/chain-service/constants.js +3 -3
- package/services/earning-service/handlers/liquid-staking/stella-swap.js +7 -12
- package/services/earning-service/handlers/special.js +15 -4
- package/services/fee-service/interfaces.d.ts +5 -0
- package/services/fee-service/interfaces.js +1 -0
- package/services/fee-service/service.d.ts +4 -1
- package/services/fee-service/service.js +111 -0
- package/services/fee-service/utils/index.d.ts +8 -2
- package/services/fee-service/utils/index.js +92 -108
- package/services/storage-service/db-stores/Balance.d.ts +1 -0
- package/services/storage-service/db-stores/Balance.js +3 -0
- package/services/swap-service/handler/asset-hub/handler.d.ts +2 -1
- package/services/swap-service/handler/asset-hub/handler.js +21 -6
- package/services/swap-service/handler/asset-hub/router.js +2 -2
- package/services/swap-service/handler/asset-hub/utils.d.ts +1 -1
- package/services/swap-service/handler/asset-hub/utils.js +2 -2
- package/services/swap-service/handler/base-handler.d.ts +4 -1
- package/services/swap-service/handler/base-handler.js +2 -0
- package/services/swap-service/handler/chainflip-handler.d.ts +2 -1
- package/services/swap-service/handler/chainflip-handler.js +24 -3
- package/services/swap-service/handler/hydradx-handler.d.ts +2 -1
- package/services/swap-service/handler/hydradx-handler.js +19 -5
- package/services/swap-service/handler/simpleswap-handler.d.ts +2 -1
- package/services/swap-service/handler/simpleswap-handler.js +23 -3
- package/services/swap-service/index.js +8 -8
- package/services/transaction-service/index.js +23 -3
- package/services/transaction-service/types.d.ts +5 -4
- package/types/balance/transfer.d.ts +25 -0
- package/types/balance/transfer.js +1 -0
- package/types/fee/base.d.ts +8 -0
- package/types/fee/base.js +1 -0
- package/types/fee/evm.d.ts +46 -16
- package/types/fee/evm.js +10 -1
- package/types/fee/index.d.ts +4 -1
- package/types/fee/index.js +4 -1
- package/types/fee/option.d.ts +8 -0
- package/types/fee/option.js +1 -0
- package/types/fee/subscription.d.ts +12 -0
- package/types/fee/subscription.js +1 -0
- package/types/fee/substrate.d.ts +15 -0
- package/types/fee/substrate.js +1 -0
- package/types/fee/ton.d.ts +18 -0
- package/types/fee/ton.js +1 -0
- package/types/transaction/request.d.ts +13 -3
- package/utils/fee/combine.d.ts +12 -0
- package/utils/fee/combine.js +42 -0
- package/utils/fee/index.d.ts +2 -0
- package/utils/fee/index.js +5 -0
- package/utils/fee/transfer.d.ts +22 -0
- package/utils/fee/transfer.js +363 -0
- package/utils/index.d.ts +1 -0
- package/utils/index.js +1 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { EvmEIP1559FeeOption, EvmFeeInfo, FeeOption, SubstrateFeeInfo, SubstrateTipInfo } from '@subwallet/extension-base/types';
|
|
2
|
+
interface EvmFeeCombine {
|
|
3
|
+
gasPrice?: string;
|
|
4
|
+
maxFeePerGas?: string;
|
|
5
|
+
maxPriorityFeePerGas?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const combineEthFee: (feeInfo: EvmFeeInfo, feeOptions?: FeeOption, feeCustom?: EvmEIP1559FeeOption) => EvmFeeCombine;
|
|
8
|
+
interface SubstrateFeeCombine {
|
|
9
|
+
tip: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const combineSubstrateFee: (_fee: SubstrateFeeInfo, _feeOptions?: FeeOption, feeCustom?: SubstrateTipInfo) => SubstrateFeeCombine;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
export const combineEthFee = (feeInfo, feeOptions, feeCustom) => {
|
|
5
|
+
let maxFeePerGas;
|
|
6
|
+
let maxPriorityFeePerGas;
|
|
7
|
+
if (feeOptions && feeOptions !== 'custom') {
|
|
8
|
+
var _feeInfo$options, _feeInfo$options2;
|
|
9
|
+
maxFeePerGas = (_feeInfo$options = feeInfo.options) === null || _feeInfo$options === void 0 ? void 0 : _feeInfo$options[feeOptions].maxFeePerGas;
|
|
10
|
+
maxPriorityFeePerGas = (_feeInfo$options2 = feeInfo.options) === null || _feeInfo$options2 === void 0 ? void 0 : _feeInfo$options2[feeOptions].maxPriorityFeePerGas;
|
|
11
|
+
} else if (feeOptions === 'custom' && feeCustom) {
|
|
12
|
+
maxFeePerGas = feeCustom.maxFeePerGas;
|
|
13
|
+
maxPriorityFeePerGas = feeCustom.maxPriorityFeePerGas;
|
|
14
|
+
} else {
|
|
15
|
+
var _feeInfo$options3, _feeInfo$options4;
|
|
16
|
+
maxFeePerGas = (_feeInfo$options3 = feeInfo.options) === null || _feeInfo$options3 === void 0 ? void 0 : _feeInfo$options3[feeInfo.options.default].maxFeePerGas;
|
|
17
|
+
maxPriorityFeePerGas = (_feeInfo$options4 = feeInfo.options) === null || _feeInfo$options4 === void 0 ? void 0 : _feeInfo$options4[feeInfo.options.default].maxPriorityFeePerGas;
|
|
18
|
+
}
|
|
19
|
+
if (feeInfo.gasPrice) {
|
|
20
|
+
return {
|
|
21
|
+
gasPrice: feeInfo.gasPrice
|
|
22
|
+
};
|
|
23
|
+
} else {
|
|
24
|
+
return {
|
|
25
|
+
maxFeePerGas,
|
|
26
|
+
maxPriorityFeePerGas
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
export const combineSubstrateFee = (_fee, _feeOptions, feeCustom) => {
|
|
31
|
+
let tip;
|
|
32
|
+
if (_feeOptions && _feeOptions !== 'custom') {
|
|
33
|
+
tip = _fee.options[_feeOptions].tip;
|
|
34
|
+
} else if (_feeOptions === 'custom' && feeCustom && 'tip' in feeCustom) {
|
|
35
|
+
tip = feeCustom.tip;
|
|
36
|
+
} else {
|
|
37
|
+
tip = _fee.options[_fee.options.default].tip;
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
tip
|
|
41
|
+
};
|
|
42
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { _ChainAsset, _ChainInfo } from '@subwallet/chain-list/types';
|
|
2
|
+
import { AmountData } from '@subwallet/extension-base/background/KoniTypes';
|
|
3
|
+
import { _EvmApi, _SubstrateApi, _TonApi } from '@subwallet/extension-base/services/chain-service/types';
|
|
4
|
+
import { FeeChainType, FeeInfo, TransactionFee } from '@subwallet/extension-base/types';
|
|
5
|
+
import { ResponseSubscribeTransfer } from '@subwallet/extension-base/types/balance/transfer';
|
|
6
|
+
export interface CalculateMaxTransferable extends TransactionFee {
|
|
7
|
+
address: string;
|
|
8
|
+
srcToken: _ChainAsset;
|
|
9
|
+
destToken?: _ChainAsset;
|
|
10
|
+
srcChain: _ChainInfo;
|
|
11
|
+
destChain: _ChainInfo;
|
|
12
|
+
substrateApi: _SubstrateApi;
|
|
13
|
+
evmApi: _EvmApi;
|
|
14
|
+
tonApi: _TonApi;
|
|
15
|
+
isTransferLocalTokenAndPayThatTokenAsFee: boolean;
|
|
16
|
+
isTransferNativeTokenAndPayLocalTokenAsFee: boolean;
|
|
17
|
+
nativeToken: _ChainAsset;
|
|
18
|
+
}
|
|
19
|
+
export declare const detectTransferTxType: (srcToken: _ChainAsset, srcChain: _ChainInfo, destChain: _ChainInfo) => FeeChainType;
|
|
20
|
+
export declare const calculateMaxTransferable: (id: string, request: CalculateMaxTransferable, freeBalance: AmountData, fee: FeeInfo) => Promise<ResponseSubscribeTransfer>;
|
|
21
|
+
export declare const calculateTransferMaxTransferable: (id: string, request: CalculateMaxTransferable, freeBalance: AmountData, fee: FeeInfo) => Promise<ResponseSubscribeTransfer>;
|
|
22
|
+
export declare const calculateXCMMaxTransferable: (id: string, request: CalculateMaxTransferable, freeBalance: AmountData, fee: FeeInfo) => Promise<ResponseSubscribeTransfer>;
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { XCM_FEE_RATIO } from '@subwallet/extension-base/constants';
|
|
5
|
+
import { _isSnowBridgeXcm } from '@subwallet/extension-base/core/substrate/xcm-parser';
|
|
6
|
+
import { getERC20TransactionObject, getEVMTransactionObject } from '@subwallet/extension-base/services/balance-service/transfer/smart-contract';
|
|
7
|
+
import { createTransferExtrinsic } from '@subwallet/extension-base/services/balance-service/transfer/token';
|
|
8
|
+
import { createTonTransaction } from '@subwallet/extension-base/services/balance-service/transfer/ton-transfer';
|
|
9
|
+
import { createAvailBridgeExtrinsicFromAvail, createAvailBridgeTxFromEth, createPolygonBridgeExtrinsic, createSnowBridgeExtrinsic, createXcmExtrinsic } from '@subwallet/extension-base/services/balance-service/transfer/xcm';
|
|
10
|
+
import { isAvailChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge';
|
|
11
|
+
import { _isPolygonChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge';
|
|
12
|
+
import { _isPosChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/posBridge';
|
|
13
|
+
import { _getContractAddressOfToken, _isChainEvmCompatible, _isChainTonCompatible, _isLocalToken, _isNativeToken, _isPureEvmChain, _isTokenEvmSmartContract, _isTokenTransferredByEvm, _isTokenTransferredByTon } from '@subwallet/extension-base/services/chain-service/utils';
|
|
14
|
+
import { calculateToAmountByReservePool, FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE } from '@subwallet/extension-base/services/fee-service/utils';
|
|
15
|
+
import { isTonTransaction } from '@subwallet/extension-base/services/transaction-service/helpers';
|
|
16
|
+
import { BN_ZERO } from '@subwallet/extension-base/utils';
|
|
17
|
+
import { isTonAddress } from '@subwallet/keyring';
|
|
18
|
+
import BigN from 'bignumber.js';
|
|
19
|
+
import { u8aToHex } from '@polkadot/util';
|
|
20
|
+
import { addressToEvm, isEthereumAddress } from '@polkadot/util-crypto';
|
|
21
|
+
import { combineEthFee, combineSubstrateFee } from "./combine.js";
|
|
22
|
+
export const detectTransferTxType = (srcToken, srcChain, destChain) => {
|
|
23
|
+
const isXcmTransfer = srcChain.slug !== destChain.slug;
|
|
24
|
+
if (isXcmTransfer) {
|
|
25
|
+
const isAvailBridgeFromEvm = _isPureEvmChain(srcChain) && isAvailChainBridge(destChain.slug);
|
|
26
|
+
const isSnowBridgeEvmTransfer = _isPureEvmChain(srcChain) && _isSnowBridgeXcm(srcChain, destChain) && !isAvailBridgeFromEvm;
|
|
27
|
+
const isPolygonBridgeTransfer = _isPolygonChainBridge(srcChain.slug, destChain.slug);
|
|
28
|
+
const isPosBridgeTransfer = _isPosChainBridge(srcChain.slug, destChain.slug);
|
|
29
|
+
return isAvailBridgeFromEvm || isSnowBridgeEvmTransfer || isPolygonBridgeTransfer || isPosBridgeTransfer ? 'evm' : 'substrate';
|
|
30
|
+
} else {
|
|
31
|
+
if (_isChainEvmCompatible(srcChain) && _isTokenTransferredByEvm(srcToken)) {
|
|
32
|
+
return 'evm';
|
|
33
|
+
} else if (_isChainTonCompatible(srcChain) && _isTokenTransferredByTon(srcToken)) {
|
|
34
|
+
return 'ton';
|
|
35
|
+
} else {
|
|
36
|
+
return 'substrate';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
export const calculateMaxTransferable = async (id, request, freeBalance, fee) => {
|
|
41
|
+
const {
|
|
42
|
+
destChain,
|
|
43
|
+
srcChain
|
|
44
|
+
} = request;
|
|
45
|
+
const isXcmTransfer = srcChain.slug !== destChain.slug;
|
|
46
|
+
let maxTransferableAmount;
|
|
47
|
+
if (isXcmTransfer) {
|
|
48
|
+
maxTransferableAmount = await calculateXCMMaxTransferable(id, request, freeBalance, fee);
|
|
49
|
+
} else {
|
|
50
|
+
maxTransferableAmount = await calculateTransferMaxTransferable(id, request, freeBalance, fee);
|
|
51
|
+
}
|
|
52
|
+
maxTransferableAmount.feePercentageSpecialCase = FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE;
|
|
53
|
+
return maxTransferableAmount;
|
|
54
|
+
};
|
|
55
|
+
export const calculateTransferMaxTransferable = async (id, request, freeBalance, fee) => {
|
|
56
|
+
const {
|
|
57
|
+
address,
|
|
58
|
+
destChain,
|
|
59
|
+
evmApi,
|
|
60
|
+
feeCustom,
|
|
61
|
+
feeOption,
|
|
62
|
+
isTransferLocalTokenAndPayThatTokenAsFee,
|
|
63
|
+
isTransferNativeTokenAndPayLocalTokenAsFee,
|
|
64
|
+
nativeToken,
|
|
65
|
+
srcChain,
|
|
66
|
+
srcToken,
|
|
67
|
+
substrateApi,
|
|
68
|
+
tonApi
|
|
69
|
+
} = request;
|
|
70
|
+
const feeChainType = fee.type;
|
|
71
|
+
let estimatedFee;
|
|
72
|
+
let feeOptions;
|
|
73
|
+
let maxTransferable;
|
|
74
|
+
let error;
|
|
75
|
+
const fakeAddress = '5DRewsYzhJqZXU3SRaWy1FSt5iDr875ao91aw5fjrJmDG4Ap'; // todo: move this
|
|
76
|
+
const substrateAddress = fakeAddress; // todo: move this
|
|
77
|
+
const evmAddress = u8aToHex(addressToEvm(fakeAddress)); // todo: move this
|
|
78
|
+
|
|
79
|
+
const recipient = _isChainEvmCompatible(destChain) ? evmAddress : substrateAddress;
|
|
80
|
+
try {
|
|
81
|
+
let transaction;
|
|
82
|
+
if (isEthereumAddress(address) && isEthereumAddress(recipient) && _isTokenTransferredByEvm(srcToken)) {
|
|
83
|
+
// todo: refactor: merge getERC20TransactionObject & getEVMTransactionObject
|
|
84
|
+
// Estimate with EVM API
|
|
85
|
+
if (_isTokenEvmSmartContract(srcToken) || _isLocalToken(srcToken)) {
|
|
86
|
+
[transaction] = await getERC20TransactionObject({
|
|
87
|
+
assetAddress: _getContractAddressOfToken(srcToken),
|
|
88
|
+
chain: srcChain.slug,
|
|
89
|
+
evmApi,
|
|
90
|
+
feeCustom,
|
|
91
|
+
feeInfo: fee,
|
|
92
|
+
feeOption,
|
|
93
|
+
from: address,
|
|
94
|
+
to: recipient,
|
|
95
|
+
transferAll: false,
|
|
96
|
+
value: '0'
|
|
97
|
+
});
|
|
98
|
+
} else {
|
|
99
|
+
[transaction] = await getEVMTransactionObject({
|
|
100
|
+
chain: srcChain.slug,
|
|
101
|
+
evmApi,
|
|
102
|
+
feeCustom,
|
|
103
|
+
feeInfo: fee,
|
|
104
|
+
feeOption,
|
|
105
|
+
from: address,
|
|
106
|
+
to: recipient,
|
|
107
|
+
transferAll: false,
|
|
108
|
+
value: '0'
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
} else if (isTonAddress(address) && _isTokenTransferredByTon(srcToken)) {
|
|
112
|
+
[transaction] = await createTonTransaction({
|
|
113
|
+
tokenInfo: srcToken,
|
|
114
|
+
from: address,
|
|
115
|
+
to: address,
|
|
116
|
+
networkKey: srcChain.slug,
|
|
117
|
+
value: '0',
|
|
118
|
+
transferAll: false,
|
|
119
|
+
// currently not used
|
|
120
|
+
tonApi
|
|
121
|
+
});
|
|
122
|
+
} else {
|
|
123
|
+
[transaction] = await createTransferExtrinsic({
|
|
124
|
+
transferAll: false,
|
|
125
|
+
value: '0',
|
|
126
|
+
from: address,
|
|
127
|
+
networkKey: srcChain.slug,
|
|
128
|
+
tokenInfo: srcToken,
|
|
129
|
+
to: recipient,
|
|
130
|
+
substrateApi
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
if (feeChainType === 'evm') {
|
|
134
|
+
var _tx$gas;
|
|
135
|
+
// Calculate fee for evm transaction
|
|
136
|
+
const tx = transaction;
|
|
137
|
+
const gasLimit = ((_tx$gas = tx.gas) === null || _tx$gas === void 0 ? void 0 : _tx$gas.toString()) || (await evmApi.api.eth.estimateGas(tx)).toString();
|
|
138
|
+
const _feeCustom = feeCustom;
|
|
139
|
+
const combineFee = combineEthFee(fee, feeOption, _feeCustom);
|
|
140
|
+
if (combineFee.maxFeePerGas) {
|
|
141
|
+
estimatedFee = new BigN(combineFee.maxFeePerGas).multipliedBy(gasLimit).toFixed(0);
|
|
142
|
+
} else {
|
|
143
|
+
estimatedFee = new BigN(combineFee.gasPrice || '0').multipliedBy(gasLimit).toFixed(0);
|
|
144
|
+
}
|
|
145
|
+
feeOptions = {
|
|
146
|
+
...fee,
|
|
147
|
+
estimatedFee,
|
|
148
|
+
gasLimit: gasLimit.toString()
|
|
149
|
+
};
|
|
150
|
+
} else if (feeChainType === 'substrate') {
|
|
151
|
+
// Calculate fee for substrate transaction
|
|
152
|
+
try {
|
|
153
|
+
var _paymentInfo$partialF;
|
|
154
|
+
const mockTx = transaction;
|
|
155
|
+
const paymentInfo = await mockTx.paymentInfo(address);
|
|
156
|
+
estimatedFee = (paymentInfo === null || paymentInfo === void 0 ? void 0 : (_paymentInfo$partialF = paymentInfo.partialFee) === null || _paymentInfo$partialF === void 0 ? void 0 : _paymentInfo$partialF.toString()) || '0';
|
|
157
|
+
} catch (e) {
|
|
158
|
+
estimatedFee = '0';
|
|
159
|
+
}
|
|
160
|
+
const _feeCustom = feeCustom;
|
|
161
|
+
const tip = combineSubstrateFee(fee, feeOption, _feeCustom).tip;
|
|
162
|
+
estimatedFee = new BigN(estimatedFee).plus(tip).toFixed(0);
|
|
163
|
+
feeOptions = {
|
|
164
|
+
...fee,
|
|
165
|
+
estimatedFee
|
|
166
|
+
};
|
|
167
|
+
} else {
|
|
168
|
+
if (transaction && isTonTransaction(transaction)) {
|
|
169
|
+
estimatedFee = transaction.estimateFee;
|
|
170
|
+
feeOptions = {
|
|
171
|
+
...fee,
|
|
172
|
+
estimatedFee: estimatedFee
|
|
173
|
+
};
|
|
174
|
+
} else {
|
|
175
|
+
// Not implemented yet
|
|
176
|
+
estimatedFee = '0';
|
|
177
|
+
feeOptions = {
|
|
178
|
+
...fee,
|
|
179
|
+
estimatedFee: '0'
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
} catch (e) {
|
|
184
|
+
estimatedFee = '0';
|
|
185
|
+
if (fee.type === 'evm') {
|
|
186
|
+
feeOptions = {
|
|
187
|
+
...fee,
|
|
188
|
+
estimatedFee,
|
|
189
|
+
gasLimit: '0'
|
|
190
|
+
};
|
|
191
|
+
} else {
|
|
192
|
+
feeOptions = {
|
|
193
|
+
...fee,
|
|
194
|
+
estimatedFee
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
error = e.message || 'Unable to estimate fee';
|
|
198
|
+
console.warn('Unable to estimate fee', e);
|
|
199
|
+
}
|
|
200
|
+
if (isTransferLocalTokenAndPayThatTokenAsFee && feeChainType === 'substrate') {
|
|
201
|
+
const estimatedFeeNative = (BigInt(estimatedFee) * BigInt(FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE) / BigInt(100)).toString();
|
|
202
|
+
const estimatedFeeLocal = await calculateToAmountByReservePool(substrateApi.api, nativeToken, srcToken, estimatedFeeNative);
|
|
203
|
+
maxTransferable = BigN(freeBalance.value).minus(estimatedFeeLocal);
|
|
204
|
+
} else if (isTransferNativeTokenAndPayLocalTokenAsFee) {
|
|
205
|
+
maxTransferable = BigN(freeBalance.value);
|
|
206
|
+
} else {
|
|
207
|
+
if (!_isNativeToken(srcToken)) {
|
|
208
|
+
maxTransferable = BigN(freeBalance.value);
|
|
209
|
+
} else {
|
|
210
|
+
maxTransferable = BigN(freeBalance.value).minus(new BigN(estimatedFee));
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
maxTransferable: maxTransferable.gt(BN_ZERO) ? maxTransferable.toFixed(0) || '0' : '0',
|
|
215
|
+
feeOptions: feeOptions,
|
|
216
|
+
feeType: feeChainType,
|
|
217
|
+
id: id,
|
|
218
|
+
error
|
|
219
|
+
};
|
|
220
|
+
};
|
|
221
|
+
export const calculateXCMMaxTransferable = async (id, request, freeBalance, fee) => {
|
|
222
|
+
const {
|
|
223
|
+
address,
|
|
224
|
+
destChain,
|
|
225
|
+
destToken,
|
|
226
|
+
evmApi,
|
|
227
|
+
feeCustom,
|
|
228
|
+
feeOption,
|
|
229
|
+
isTransferLocalTokenAndPayThatTokenAsFee,
|
|
230
|
+
isTransferNativeTokenAndPayLocalTokenAsFee,
|
|
231
|
+
nativeToken,
|
|
232
|
+
srcChain,
|
|
233
|
+
srcToken,
|
|
234
|
+
substrateApi
|
|
235
|
+
} = request;
|
|
236
|
+
const feeChainType = fee.type;
|
|
237
|
+
let estimatedFee;
|
|
238
|
+
let feeOptions;
|
|
239
|
+
let maxTransferable;
|
|
240
|
+
let error;
|
|
241
|
+
const isAvailBridgeFromEvm = _isPureEvmChain(srcChain) && isAvailChainBridge(destChain.slug);
|
|
242
|
+
const isAvailBridgeFromAvail = isAvailChainBridge(srcChain.slug) && _isPureEvmChain(destChain);
|
|
243
|
+
const isSnowBridgeEvmTransfer = _isPureEvmChain(srcChain) && _isSnowBridgeXcm(srcChain, destChain) && !isAvailBridgeFromEvm;
|
|
244
|
+
const isPolygonBridgeTransfer = _isPolygonChainBridge(srcChain.slug, destChain.slug);
|
|
245
|
+
const isPosBridgeTransfer = _isPosChainBridge(srcChain.slug, destChain.slug);
|
|
246
|
+
const fakeAddress = '5DRewsYzhJqZXU3SRaWy1FSt5iDr875ao91aw5fjrJmDG4Ap'; // todo: move this
|
|
247
|
+
const substrateAddress = fakeAddress; // todo: move this
|
|
248
|
+
const evmAddress = u8aToHex(addressToEvm(fakeAddress)); // todo: move this
|
|
249
|
+
|
|
250
|
+
const recipient = _isChainEvmCompatible(destChain) ? evmAddress : substrateAddress;
|
|
251
|
+
try {
|
|
252
|
+
if (!destToken) {
|
|
253
|
+
throw Error('Destination token is not available');
|
|
254
|
+
}
|
|
255
|
+
const params = {
|
|
256
|
+
destinationTokenInfo: destToken,
|
|
257
|
+
originTokenInfo: srcToken,
|
|
258
|
+
// If value is 0, substrate will throw error when estimating fee
|
|
259
|
+
sendingValue: feeChainType === 'substrate' ? '1000000000000000000' : '0',
|
|
260
|
+
sender: address,
|
|
261
|
+
recipient,
|
|
262
|
+
destinationChain: destChain,
|
|
263
|
+
originChain: srcChain,
|
|
264
|
+
substrateApi,
|
|
265
|
+
evmApi,
|
|
266
|
+
feeCustom,
|
|
267
|
+
feeOption,
|
|
268
|
+
feeInfo: fee
|
|
269
|
+
};
|
|
270
|
+
let funcCreateExtrinsic;
|
|
271
|
+
if (isPosBridgeTransfer || isPolygonBridgeTransfer) {
|
|
272
|
+
funcCreateExtrinsic = createPolygonBridgeExtrinsic;
|
|
273
|
+
} else if (isSnowBridgeEvmTransfer) {
|
|
274
|
+
funcCreateExtrinsic = createSnowBridgeExtrinsic;
|
|
275
|
+
} else if (isAvailBridgeFromEvm) {
|
|
276
|
+
funcCreateExtrinsic = createAvailBridgeTxFromEth;
|
|
277
|
+
} else if (isAvailBridgeFromAvail) {
|
|
278
|
+
funcCreateExtrinsic = createAvailBridgeExtrinsicFromAvail;
|
|
279
|
+
} else {
|
|
280
|
+
funcCreateExtrinsic = createXcmExtrinsic;
|
|
281
|
+
}
|
|
282
|
+
const extrinsic = await funcCreateExtrinsic(params);
|
|
283
|
+
if (feeChainType === 'evm') {
|
|
284
|
+
var _tx$gas2;
|
|
285
|
+
// Calculate fee for evm transaction
|
|
286
|
+
const tx = extrinsic;
|
|
287
|
+
const gasLimit = ((_tx$gas2 = tx.gas) === null || _tx$gas2 === void 0 ? void 0 : _tx$gas2.toString()) || (await evmApi.api.eth.estimateGas(tx)).toString();
|
|
288
|
+
const _feeCustom = feeCustom;
|
|
289
|
+
const combineFee = combineEthFee(fee, feeOption, _feeCustom);
|
|
290
|
+
if (combineFee.maxFeePerGas) {
|
|
291
|
+
estimatedFee = new BigN(combineFee.maxFeePerGas).multipliedBy(gasLimit).toFixed(0);
|
|
292
|
+
} else {
|
|
293
|
+
estimatedFee = new BigN(combineFee.gasPrice || '0').multipliedBy(gasLimit).toFixed(0);
|
|
294
|
+
}
|
|
295
|
+
feeOptions = {
|
|
296
|
+
...fee,
|
|
297
|
+
estimatedFee,
|
|
298
|
+
gasLimit: gasLimit.toString()
|
|
299
|
+
};
|
|
300
|
+
} else if (feeChainType === 'substrate') {
|
|
301
|
+
// Calculate fee for substrate transaction
|
|
302
|
+
try {
|
|
303
|
+
var _paymentInfo$partialF2;
|
|
304
|
+
const paymentInfo = await extrinsic.paymentInfo(address);
|
|
305
|
+
estimatedFee = (paymentInfo === null || paymentInfo === void 0 ? void 0 : (_paymentInfo$partialF2 = paymentInfo.partialFee) === null || _paymentInfo$partialF2 === void 0 ? void 0 : _paymentInfo$partialF2.toString()) || '0';
|
|
306
|
+
} catch (e) {
|
|
307
|
+
estimatedFee = '0';
|
|
308
|
+
}
|
|
309
|
+
const _feeCustom = feeCustom;
|
|
310
|
+
const tip = combineSubstrateFee(fee, feeOption, _feeCustom).tip;
|
|
311
|
+
estimatedFee = new BigN(estimatedFee).plus(tip).toFixed(0);
|
|
312
|
+
feeOptions = {
|
|
313
|
+
...fee,
|
|
314
|
+
estimatedFee
|
|
315
|
+
};
|
|
316
|
+
} else {
|
|
317
|
+
// Not implemented yet
|
|
318
|
+
estimatedFee = '0';
|
|
319
|
+
feeOptions = {
|
|
320
|
+
...fee,
|
|
321
|
+
estimatedFee: '0'
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
} catch (e) {
|
|
325
|
+
estimatedFee = '0';
|
|
326
|
+
if (fee.type === 'evm') {
|
|
327
|
+
feeOptions = {
|
|
328
|
+
...fee,
|
|
329
|
+
estimatedFee,
|
|
330
|
+
gasLimit: '0'
|
|
331
|
+
};
|
|
332
|
+
} else {
|
|
333
|
+
feeOptions = {
|
|
334
|
+
...fee,
|
|
335
|
+
estimatedFee
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
error = e.message || 'Unable to estimate fee';
|
|
339
|
+
console.warn('Unable to estimate fee', e);
|
|
340
|
+
}
|
|
341
|
+
if (!destToken) {
|
|
342
|
+
maxTransferable = BN_ZERO;
|
|
343
|
+
} else if (isTransferLocalTokenAndPayThatTokenAsFee && feeChainType === 'substrate') {
|
|
344
|
+
const estimatedFeeNative = (BigInt(estimatedFee) * BigInt(FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE) / BigInt(100)).toString();
|
|
345
|
+
const estimatedFeeLocal = await calculateToAmountByReservePool(substrateApi.api, nativeToken, srcToken, estimatedFeeNative);
|
|
346
|
+
maxTransferable = BigN(freeBalance.value).minus(estimatedFeeLocal);
|
|
347
|
+
} else if (isTransferNativeTokenAndPayLocalTokenAsFee) {
|
|
348
|
+
maxTransferable = BigN(freeBalance.value);
|
|
349
|
+
} else {
|
|
350
|
+
if (!_isNativeToken(srcToken)) {
|
|
351
|
+
maxTransferable = BigN(freeBalance.value);
|
|
352
|
+
} else {
|
|
353
|
+
maxTransferable = BigN(freeBalance.value).minus(new BigN(estimatedFee).multipliedBy(XCM_FEE_RATIO));
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return {
|
|
357
|
+
maxTransferable: maxTransferable.gt(BN_ZERO) ? maxTransferable.toFixed(0) || '0' : '0',
|
|
358
|
+
feeOptions: feeOptions,
|
|
359
|
+
feeType: feeChainType,
|
|
360
|
+
id: id,
|
|
361
|
+
error
|
|
362
|
+
};
|
|
363
|
+
};
|
package/utils/index.d.ts
CHANGED
package/utils/index.js
CHANGED
|
@@ -330,6 +330,7 @@ export * from "./asset.js";
|
|
|
330
330
|
export * from "./auth.js";
|
|
331
331
|
export * from "./environment.js";
|
|
332
332
|
export * from "./eth.js";
|
|
333
|
+
export * from "./fee/index.js";
|
|
333
334
|
export * from "./fetchEvmChainInfo.js";
|
|
334
335
|
export * from "./fetchStaticData.js";
|
|
335
336
|
export * from "./gear/index.js";
|