@subwallet/extension-base 1.3.17-0 → 1.3.18-1

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.
Files changed (127) hide show
  1. package/background/KoniTypes.d.ts +7 -2
  2. package/cjs/constants/index.js +6 -3
  3. package/cjs/core/logic-validation/request.js +26 -19
  4. package/cjs/core/logic-validation/transfer.js +18 -17
  5. package/cjs/koni/api/contract-handler/evm/web3.js +3 -3
  6. package/cjs/koni/background/handlers/Extension.js +269 -123
  7. package/cjs/koni/background/handlers/State.js +1 -8
  8. package/cjs/packageInfo.js +1 -1
  9. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +1 -1
  10. package/cjs/services/balance-service/index.js +13 -0
  11. package/cjs/services/balance-service/transfer/smart-contract.js +47 -33
  12. package/cjs/services/balance-service/transfer/token.js +5 -4
  13. package/cjs/services/balance-service/transfer/xcm/availBridge.js +14 -18
  14. package/cjs/services/balance-service/transfer/xcm/index.js +30 -61
  15. package/cjs/services/balance-service/transfer/xcm/polygonBridge.js +13 -17
  16. package/cjs/services/balance-service/transfer/xcm/posBridge.js +20 -21
  17. package/cjs/services/balance-service/transfer/xcm/snowBridge.js +7 -7
  18. package/cjs/services/balance-service/transfer/xcm/utils.js +2 -2
  19. package/cjs/services/chain-service/constants.js +3 -3
  20. package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +7 -12
  21. package/cjs/services/earning-service/handlers/special.js +15 -4
  22. package/cjs/services/fee-service/interfaces.js +1 -0
  23. package/cjs/services/fee-service/service.js +111 -0
  24. package/cjs/services/fee-service/utils/index.js +99 -113
  25. package/cjs/services/storage-service/db-stores/Balance.js +3 -0
  26. package/cjs/services/swap-service/handler/asset-hub/handler.js +23 -7
  27. package/cjs/services/swap-service/handler/asset-hub/router.js +1 -1
  28. package/cjs/services/swap-service/handler/asset-hub/utils.js +4 -4
  29. package/cjs/services/swap-service/handler/base-handler.js +3 -1
  30. package/cjs/services/swap-service/handler/chainflip-handler.js +26 -5
  31. package/cjs/services/swap-service/handler/hydradx-handler.js +23 -8
  32. package/cjs/services/swap-service/handler/simpleswap-handler.js +24 -4
  33. package/cjs/services/swap-service/index.js +8 -8
  34. package/cjs/services/transaction-service/index.js +23 -3
  35. package/cjs/types/balance/transfer.js +1 -0
  36. package/cjs/types/fee/base.js +1 -0
  37. package/cjs/types/fee/evm.js +16 -1
  38. package/cjs/types/fee/index.js +37 -4
  39. package/cjs/types/fee/option.js +1 -0
  40. package/cjs/types/fee/subscription.js +1 -0
  41. package/cjs/types/fee/substrate.js +1 -0
  42. package/cjs/types/fee/ton.js +1 -0
  43. package/cjs/utils/fee/combine.js +50 -0
  44. package/cjs/utils/fee/index.js +27 -0
  45. package/cjs/utils/fee/transfer.js +374 -0
  46. package/cjs/utils/index.js +12 -0
  47. package/constants/index.d.ts +1 -0
  48. package/constants/index.js +1 -0
  49. package/core/logic-validation/request.js +17 -10
  50. package/core/logic-validation/transfer.d.ts +5 -5
  51. package/core/logic-validation/transfer.js +20 -19
  52. package/core/substrate/xcm-parser.d.ts +1 -1
  53. package/koni/api/contract-handler/evm/web3.js +3 -3
  54. package/koni/background/handlers/Extension.d.ts +3 -3
  55. package/koni/background/handlers/Extension.js +253 -107
  56. package/koni/background/handlers/State.js +1 -8
  57. package/package.json +55 -5
  58. package/packageInfo.js +1 -1
  59. package/services/balance-service/helpers/subscribe/substrate/index.js +1 -1
  60. package/services/balance-service/index.d.ts +1 -0
  61. package/services/balance-service/index.js +13 -0
  62. package/services/balance-service/transfer/smart-contract.d.ts +24 -4
  63. package/services/balance-service/transfer/smart-contract.js +45 -33
  64. package/services/balance-service/transfer/token.js +6 -5
  65. package/services/balance-service/transfer/xcm/availBridge.d.ts +3 -2
  66. package/services/balance-service/transfer/xcm/availBridge.js +11 -15
  67. package/services/balance-service/transfer/xcm/index.d.ts +12 -11
  68. package/services/balance-service/transfer/xcm/index.js +29 -58
  69. package/services/balance-service/transfer/xcm/polygonBridge.d.ts +4 -3
  70. package/services/balance-service/transfer/xcm/polygonBridge.js +13 -17
  71. package/services/balance-service/transfer/xcm/posBridge.d.ts +4 -3
  72. package/services/balance-service/transfer/xcm/posBridge.js +18 -19
  73. package/services/balance-service/transfer/xcm/snowBridge.d.ts +2 -1
  74. package/services/balance-service/transfer/xcm/snowBridge.js +7 -7
  75. package/services/balance-service/transfer/xcm/utils.js +2 -2
  76. package/services/chain-service/constants.js +3 -3
  77. package/services/earning-service/handlers/liquid-staking/stella-swap.js +7 -12
  78. package/services/earning-service/handlers/special.js +15 -4
  79. package/services/fee-service/interfaces.d.ts +5 -0
  80. package/services/fee-service/interfaces.js +1 -0
  81. package/services/fee-service/service.d.ts +4 -1
  82. package/services/fee-service/service.js +111 -0
  83. package/services/fee-service/utils/index.d.ts +8 -2
  84. package/services/fee-service/utils/index.js +92 -108
  85. package/services/storage-service/db-stores/Balance.d.ts +1 -0
  86. package/services/storage-service/db-stores/Balance.js +3 -0
  87. package/services/swap-service/handler/asset-hub/handler.d.ts +2 -1
  88. package/services/swap-service/handler/asset-hub/handler.js +23 -7
  89. package/services/swap-service/handler/asset-hub/router.js +2 -2
  90. package/services/swap-service/handler/asset-hub/utils.d.ts +1 -1
  91. package/services/swap-service/handler/asset-hub/utils.js +2 -2
  92. package/services/swap-service/handler/base-handler.d.ts +4 -1
  93. package/services/swap-service/handler/base-handler.js +3 -1
  94. package/services/swap-service/handler/chainflip-handler.d.ts +2 -1
  95. package/services/swap-service/handler/chainflip-handler.js +25 -4
  96. package/services/swap-service/handler/hydradx-handler.d.ts +2 -1
  97. package/services/swap-service/handler/hydradx-handler.js +22 -7
  98. package/services/swap-service/handler/simpleswap-handler.d.ts +2 -1
  99. package/services/swap-service/handler/simpleswap-handler.js +24 -4
  100. package/services/swap-service/index.js +8 -8
  101. package/services/transaction-service/index.js +23 -3
  102. package/services/transaction-service/types.d.ts +5 -4
  103. package/types/balance/transfer.d.ts +25 -0
  104. package/types/balance/transfer.js +1 -0
  105. package/types/fee/base.d.ts +8 -0
  106. package/types/fee/base.js +1 -0
  107. package/types/fee/evm.d.ts +46 -16
  108. package/types/fee/evm.js +10 -1
  109. package/types/fee/index.d.ts +4 -1
  110. package/types/fee/index.js +4 -1
  111. package/types/fee/option.d.ts +8 -0
  112. package/types/fee/option.js +1 -0
  113. package/types/fee/subscription.d.ts +12 -0
  114. package/types/fee/subscription.js +1 -0
  115. package/types/fee/substrate.d.ts +15 -0
  116. package/types/fee/substrate.js +1 -0
  117. package/types/fee/ton.d.ts +18 -0
  118. package/types/fee/ton.js +1 -0
  119. package/types/transaction/request.d.ts +13 -3
  120. package/utils/fee/combine.d.ts +12 -0
  121. package/utils/fee/combine.js +42 -0
  122. package/utils/fee/index.d.ts +2 -0
  123. package/utils/fee/index.js +5 -0
  124. package/utils/fee/transfer.d.ts +22 -0
  125. package/utils/fee/transfer.js +363 -0
  126. package/utils/index.d.ts +1 -0
  127. package/utils/index.js +1 -0
@@ -1,4 +1,4 @@
1
- import { TransactionWarningType } from '@subwallet/extension-base/types';
1
+ import { TransactionFee, TransactionWarningType } from '@subwallet/extension-base/types';
2
2
  export declare type BaseRequestSign = {
3
3
  ignoreWarnings?: TransactionWarningType[];
4
4
  };
@@ -11,14 +11,24 @@ export interface RequestBaseTransfer {
11
11
  transferAll?: boolean;
12
12
  transferBounceable?: boolean;
13
13
  }
14
- export interface RequestCheckTransfer extends RequestBaseTransfer {
14
+ export interface RequestCheckTransfer extends RequestBaseTransfer, TransactionFee {
15
15
  networkKey: string;
16
16
  }
17
17
  export declare type RequestTransfer = InternalRequestSign<RequestCheckTransfer>;
18
- export interface RequestCheckCrossChainTransfer extends RequestBaseTransfer {
18
+ export interface RequestCheckCrossChainTransfer extends RequestBaseTransfer, TransactionFee {
19
19
  value: string;
20
20
  originNetworkKey: string;
21
21
  destinationNetworkKey: string;
22
22
  showExtraWarning?: boolean;
23
23
  }
24
24
  export declare type RequestCrossChainTransfer = InternalRequestSign<RequestCheckCrossChainTransfer>;
25
+ export interface RequestGetTokensCanPayFee {
26
+ address: string;
27
+ chain: string;
28
+ feeAmount?: string;
29
+ }
30
+ export interface RequestGetAmountForPair {
31
+ nativeTokenFeeAmount: string;
32
+ nativeTokenSlug: string;
33
+ toTokenSlug: string;
34
+ }
@@ -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,2 @@
1
+ export * from './combine';
2
+ export * from './transfer';
@@ -0,0 +1,5 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export * from "./combine.js";
5
+ export * from "./transfer.js";
@@ -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
@@ -55,6 +55,7 @@ export * from './asset';
55
55
  export * from './auth';
56
56
  export * from './environment';
57
57
  export * from './eth';
58
+ export * from './fee';
58
59
  export * from './fetchEvmChainInfo';
59
60
  export * from './fetchStaticData';
60
61
  export * from './gear';
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";