@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
|
@@ -145,28 +145,28 @@ class SwapService {
|
|
|
145
145
|
_swap._SUPPORTED_SWAP_PROVIDERS.forEach(providerId => {
|
|
146
146
|
switch (providerId) {
|
|
147
147
|
case _swap.SwapProviderId.CHAIN_FLIP_TESTNET:
|
|
148
|
-
this.handlers[providerId] = new _chainflipHandler.ChainflipSwapHandler(this.chainService, this.state.balanceService);
|
|
148
|
+
this.handlers[providerId] = new _chainflipHandler.ChainflipSwapHandler(this.chainService, this.state.balanceService, this.state.feeService);
|
|
149
149
|
break;
|
|
150
150
|
case _swap.SwapProviderId.CHAIN_FLIP_MAINNET:
|
|
151
|
-
this.handlers[providerId] = new _chainflipHandler.ChainflipSwapHandler(this.chainService, this.state.balanceService, false);
|
|
151
|
+
this.handlers[providerId] = new _chainflipHandler.ChainflipSwapHandler(this.chainService, this.state.balanceService, this.state.feeService, false);
|
|
152
152
|
break;
|
|
153
153
|
case _swap.SwapProviderId.HYDRADX_TESTNET:
|
|
154
|
-
this.handlers[providerId] = new _hydradxHandler.HydradxHandler(this.chainService, this.state.balanceService);
|
|
154
|
+
this.handlers[providerId] = new _hydradxHandler.HydradxHandler(this.chainService, this.state.balanceService, this.state.feeService);
|
|
155
155
|
break;
|
|
156
156
|
case _swap.SwapProviderId.HYDRADX_MAINNET:
|
|
157
|
-
this.handlers[providerId] = new _hydradxHandler.HydradxHandler(this.chainService, this.state.balanceService, false);
|
|
157
|
+
this.handlers[providerId] = new _hydradxHandler.HydradxHandler(this.chainService, this.state.balanceService, this.state.feeService, false);
|
|
158
158
|
break;
|
|
159
159
|
case _swap.SwapProviderId.POLKADOT_ASSET_HUB:
|
|
160
|
-
this.handlers[providerId] = new _assetHub.AssetHubSwapHandler(this.chainService, this.state.balanceService, 'statemint');
|
|
160
|
+
this.handlers[providerId] = new _assetHub.AssetHubSwapHandler(this.chainService, this.state.balanceService, this.state.feeService, 'statemint');
|
|
161
161
|
break;
|
|
162
162
|
case _swap.SwapProviderId.KUSAMA_ASSET_HUB:
|
|
163
|
-
this.handlers[providerId] = new _assetHub.AssetHubSwapHandler(this.chainService, this.state.balanceService, 'statemine');
|
|
163
|
+
this.handlers[providerId] = new _assetHub.AssetHubSwapHandler(this.chainService, this.state.balanceService, this.state.feeService, 'statemine');
|
|
164
164
|
break;
|
|
165
165
|
case _swap.SwapProviderId.ROCOCO_ASSET_HUB:
|
|
166
|
-
this.handlers[providerId] = new _assetHub.AssetHubSwapHandler(this.chainService, this.state.balanceService, 'rococo_assethub');
|
|
166
|
+
this.handlers[providerId] = new _assetHub.AssetHubSwapHandler(this.chainService, this.state.balanceService, this.state.feeService, 'rococo_assethub');
|
|
167
167
|
break;
|
|
168
168
|
case _swap.SwapProviderId.SIMPLE_SWAP:
|
|
169
|
-
this.handlers[providerId] = new _simpleswapHandler.SimpleSwapHandler(this.chainService, this.state.balanceService);
|
|
169
|
+
this.handlers[providerId] = new _simpleswapHandler.SimpleSwapHandler(this.chainService, this.state.balanceService, this.state.feeService);
|
|
170
170
|
break;
|
|
171
171
|
default:
|
|
172
172
|
throw new Error('Unsupported provider');
|
|
@@ -22,8 +22,10 @@ var _types = require("@subwallet/extension-base/types");
|
|
|
22
22
|
var _utils4 = require("@subwallet/extension-base/utils");
|
|
23
23
|
var _mergeTransactionAndSignature = require("@subwallet/extension-base/utils/eth/mergeTransactionAndSignature");
|
|
24
24
|
var _parseTransaction = require("@subwallet/extension-base/utils/eth/parseTransaction");
|
|
25
|
+
var _getId = require("@subwallet/extension-base/utils/getId");
|
|
25
26
|
var _number = require("@subwallet/extension-base/utils/number");
|
|
26
27
|
var _uiKeyring = _interopRequireDefault(require("@subwallet/ui-keyring"));
|
|
28
|
+
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
27
29
|
var _ethereumjsUtil = require("ethereumjs-util");
|
|
28
30
|
var _ethers = require("ethers");
|
|
29
31
|
var _eventemitter = _interopRequireDefault(require("eventemitter3"));
|
|
@@ -90,6 +92,8 @@ class TransactionService {
|
|
|
90
92
|
(0, _transfer.checkSupportForAction)(validationResponse, blockedActionsMap);
|
|
91
93
|
}
|
|
92
94
|
const transaction = transactionInput.transaction;
|
|
95
|
+
const nativeTokenInfo = this.state.chainService.getNativeTokenInfo(chain);
|
|
96
|
+
const tokenPayFeeInfo = transactionInput.nonNativeTokenPayFeeSlug ? this.chainService.getAssetBySlug(transactionInput.nonNativeTokenPayFeeSlug) : undefined;
|
|
93
97
|
|
|
94
98
|
// Check duplicated transaction
|
|
95
99
|
validationResponse.errors.push(...this.checkDuplicate(transactionInput));
|
|
@@ -99,6 +103,7 @@ class TransactionService {
|
|
|
99
103
|
if (!chainInfo) {
|
|
100
104
|
validationResponse.errors.push(new _TransactionError.TransactionError(_types.BasicTxErrorType.INTERNAL_ERROR, (0, _i18next.t)('Cannot find network')));
|
|
101
105
|
}
|
|
106
|
+
const substrateApi = this.state.chainService.getSubstrateApi(chainInfo.slug);
|
|
102
107
|
const evmApi = this.state.chainService.getEvmApi(chainInfo.slug);
|
|
103
108
|
const tonApi = this.state.chainService.getTonApi(chainInfo.slug);
|
|
104
109
|
const isNoEvmApi = transaction && !(0, _helpers.isSubstrateTransaction)(transaction) && !(0, _helpers.isTonTransaction)(transaction) && !evmApi; // todo: should split isEvmTx && isNoEvmApi. Because other chains type also has no Evm Api
|
|
@@ -108,12 +113,13 @@ class TransactionService {
|
|
|
108
113
|
}
|
|
109
114
|
|
|
110
115
|
// Estimate fee for transaction
|
|
111
|
-
|
|
116
|
+
const id = (0, _getId.getId)();
|
|
117
|
+
const feeInfo = await this.state.feeService.subscribeChainFee(id, chain, 'evm');
|
|
118
|
+
validationResponse.estimateFee = await (0, _transfer.estimateFeeForTransaction)(validationResponse, transaction, chainInfo, evmApi, substrateApi, feeInfo, nativeTokenInfo, tokenPayFeeInfo, transactionInput.isTransferLocalTokenAndPayThatTokenAsFee);
|
|
112
119
|
const chainInfoMap = this.state.chainService.getChainInfoMap();
|
|
113
120
|
|
|
114
121
|
// Check account signing transaction
|
|
115
122
|
(0, _transfer.checkSigningAccountForTransaction)(validationResponse, chainInfoMap);
|
|
116
|
-
const nativeTokenInfo = this.state.chainService.getNativeTokenInfo(chain);
|
|
117
123
|
const nativeTokenAvailable = await this.state.balanceService.getTransferableBalance(address, chain, nativeTokenInfo.slug, extrinsicType);
|
|
118
124
|
|
|
119
125
|
// Check available balance against transaction fee
|
|
@@ -912,6 +918,13 @@ class TransactionService {
|
|
|
912
918
|
if (!payload.from) {
|
|
913
919
|
payload.from = address;
|
|
914
920
|
}
|
|
921
|
+
if (!payload.estimateGas) {
|
|
922
|
+
if (payload.maxFeePerGas) {
|
|
923
|
+
payload.estimateGas = new _bignumber.default((0, _utils4.anyNumberToBN)(payload.maxFeePerGas).toNumber()).multipliedBy(payload.gas || '0').toFixed(0);
|
|
924
|
+
} else {
|
|
925
|
+
payload.estimateGas = new _bignumber.default((0, _utils4.anyNumberToBN)(payload.gasPrice).toNumber()).multipliedBy(payload.gas || '0').toFixed(0);
|
|
926
|
+
}
|
|
927
|
+
}
|
|
915
928
|
const isExternal = !!account.isExternal;
|
|
916
929
|
const isInjected = !!account.isInjected;
|
|
917
930
|
if (!hasError) {
|
|
@@ -1064,13 +1077,18 @@ class TransactionService {
|
|
|
1064
1077
|
return emitter;
|
|
1065
1078
|
}
|
|
1066
1079
|
signAndSendSubstrateTransaction(_ref10) {
|
|
1080
|
+
var _this$state$chainServ;
|
|
1067
1081
|
let {
|
|
1068
1082
|
address,
|
|
1069
1083
|
chain,
|
|
1084
|
+
feeCustom,
|
|
1070
1085
|
id,
|
|
1086
|
+
nonNativeTokenPayFeeSlug,
|
|
1071
1087
|
transaction,
|
|
1072
1088
|
url
|
|
1073
1089
|
} = _ref10;
|
|
1090
|
+
const tip = (feeCustom === null || feeCustom === void 0 ? void 0 : feeCustom.tip) || '0';
|
|
1091
|
+
const feeAssetId = nonNativeTokenPayFeeSlug ? (_this$state$chainServ = this.state.chainService.getAssetBySlug(nonNativeTokenPayFeeSlug).metadata) === null || _this$state$chainServ === void 0 ? void 0 : _this$state$chainServ.multilocation : undefined;
|
|
1074
1092
|
const emitter = new _eventemitter.default();
|
|
1075
1093
|
const eventData = {
|
|
1076
1094
|
id,
|
|
@@ -1096,7 +1114,9 @@ class TransactionService {
|
|
|
1096
1114
|
};
|
|
1097
1115
|
}
|
|
1098
1116
|
},
|
|
1099
|
-
|
|
1117
|
+
tip,
|
|
1118
|
+
withSignedTransaction: true,
|
|
1119
|
+
assetId: feeAssetId
|
|
1100
1120
|
};
|
|
1101
1121
|
|
|
1102
1122
|
// if (_isRuntimeUpdated(signedExtensions)) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
package/cjs/types/fee/evm.js
CHANGED
|
@@ -1 +1,16 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.FeeOptionKey = void 0;
|
|
7
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
8
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
9
|
+
let FeeOptionKey;
|
|
10
|
+
exports.FeeOptionKey = FeeOptionKey;
|
|
11
|
+
(function (FeeOptionKey) {
|
|
12
|
+
FeeOptionKey["SLOW"] = "slow";
|
|
13
|
+
FeeOptionKey["AVERAGE"] = "average";
|
|
14
|
+
FeeOptionKey["FAST"] = "fast";
|
|
15
|
+
FeeOptionKey["DEFAULT"] = "default";
|
|
16
|
+
})(FeeOptionKey || (exports.FeeOptionKey = FeeOptionKey = {}));
|
package/cjs/types/fee/index.js
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
var _base = require("./base");
|
|
7
|
+
Object.keys(_base).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _base[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () {
|
|
13
|
+
return _base[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
6
17
|
var _evm = require("./evm");
|
|
7
18
|
Object.keys(_evm).forEach(function (key) {
|
|
8
19
|
if (key === "default" || key === "__esModule") return;
|
|
@@ -14,14 +25,36 @@ Object.keys(_evm).forEach(function (key) {
|
|
|
14
25
|
}
|
|
15
26
|
});
|
|
16
27
|
});
|
|
17
|
-
var
|
|
18
|
-
Object.keys(
|
|
28
|
+
var _option = require("./option");
|
|
29
|
+
Object.keys(_option).forEach(function (key) {
|
|
30
|
+
if (key === "default" || key === "__esModule") return;
|
|
31
|
+
if (key in exports && exports[key] === _option[key]) return;
|
|
32
|
+
Object.defineProperty(exports, key, {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
get: function () {
|
|
35
|
+
return _option[key];
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
var _subscription = require("./subscription");
|
|
40
|
+
Object.keys(_subscription).forEach(function (key) {
|
|
41
|
+
if (key === "default" || key === "__esModule") return;
|
|
42
|
+
if (key in exports && exports[key] === _subscription[key]) return;
|
|
43
|
+
Object.defineProperty(exports, key, {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
get: function () {
|
|
46
|
+
return _subscription[key];
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
var _substrate = require("./substrate");
|
|
51
|
+
Object.keys(_substrate).forEach(function (key) {
|
|
19
52
|
if (key === "default" || key === "__esModule") return;
|
|
20
|
-
if (key in exports && exports[key] ===
|
|
53
|
+
if (key in exports && exports[key] === _substrate[key]) return;
|
|
21
54
|
Object.defineProperty(exports, key, {
|
|
22
55
|
enumerable: true,
|
|
23
56
|
get: function () {
|
|
24
|
-
return
|
|
57
|
+
return _substrate[key];
|
|
25
58
|
}
|
|
26
59
|
});
|
|
27
60
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.combineSubstrateFee = exports.combineEthFee = void 0;
|
|
7
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
8
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
9
|
+
|
|
10
|
+
const combineEthFee = (feeInfo, feeOptions, feeCustom) => {
|
|
11
|
+
let maxFeePerGas;
|
|
12
|
+
let maxPriorityFeePerGas;
|
|
13
|
+
if (feeOptions && feeOptions !== 'custom') {
|
|
14
|
+
var _feeInfo$options, _feeInfo$options2;
|
|
15
|
+
maxFeePerGas = (_feeInfo$options = feeInfo.options) === null || _feeInfo$options === void 0 ? void 0 : _feeInfo$options[feeOptions].maxFeePerGas;
|
|
16
|
+
maxPriorityFeePerGas = (_feeInfo$options2 = feeInfo.options) === null || _feeInfo$options2 === void 0 ? void 0 : _feeInfo$options2[feeOptions].maxPriorityFeePerGas;
|
|
17
|
+
} else if (feeOptions === 'custom' && feeCustom) {
|
|
18
|
+
maxFeePerGas = feeCustom.maxFeePerGas;
|
|
19
|
+
maxPriorityFeePerGas = feeCustom.maxPriorityFeePerGas;
|
|
20
|
+
} else {
|
|
21
|
+
var _feeInfo$options3, _feeInfo$options4;
|
|
22
|
+
maxFeePerGas = (_feeInfo$options3 = feeInfo.options) === null || _feeInfo$options3 === void 0 ? void 0 : _feeInfo$options3[feeInfo.options.default].maxFeePerGas;
|
|
23
|
+
maxPriorityFeePerGas = (_feeInfo$options4 = feeInfo.options) === null || _feeInfo$options4 === void 0 ? void 0 : _feeInfo$options4[feeInfo.options.default].maxPriorityFeePerGas;
|
|
24
|
+
}
|
|
25
|
+
if (feeInfo.gasPrice) {
|
|
26
|
+
return {
|
|
27
|
+
gasPrice: feeInfo.gasPrice
|
|
28
|
+
};
|
|
29
|
+
} else {
|
|
30
|
+
return {
|
|
31
|
+
maxFeePerGas,
|
|
32
|
+
maxPriorityFeePerGas
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
exports.combineEthFee = combineEthFee;
|
|
37
|
+
const combineSubstrateFee = (_fee, _feeOptions, feeCustom) => {
|
|
38
|
+
let tip;
|
|
39
|
+
if (_feeOptions && _feeOptions !== 'custom') {
|
|
40
|
+
tip = _fee.options[_feeOptions].tip;
|
|
41
|
+
} else if (_feeOptions === 'custom' && feeCustom && 'tip' in feeCustom) {
|
|
42
|
+
tip = feeCustom.tip;
|
|
43
|
+
} else {
|
|
44
|
+
tip = _fee.options[_fee.options.default].tip;
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
tip
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
exports.combineSubstrateFee = combineSubstrateFee;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _combine = require("./combine");
|
|
7
|
+
Object.keys(_combine).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _combine[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () {
|
|
13
|
+
return _combine[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
var _transfer = require("./transfer");
|
|
18
|
+
Object.keys(_transfer).forEach(function (key) {
|
|
19
|
+
if (key === "default" || key === "__esModule") return;
|
|
20
|
+
if (key in exports && exports[key] === _transfer[key]) return;
|
|
21
|
+
Object.defineProperty(exports, key, {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () {
|
|
24
|
+
return _transfer[key];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.detectTransferTxType = exports.calculateXCMMaxTransferable = exports.calculateTransferMaxTransferable = exports.calculateMaxTransferable = void 0;
|
|
8
|
+
var _constants = require("@subwallet/extension-base/constants");
|
|
9
|
+
var _xcmParser = require("@subwallet/extension-base/core/substrate/xcm-parser");
|
|
10
|
+
var _smartContract = require("@subwallet/extension-base/services/balance-service/transfer/smart-contract");
|
|
11
|
+
var _token = require("@subwallet/extension-base/services/balance-service/transfer/token");
|
|
12
|
+
var _tonTransfer = require("@subwallet/extension-base/services/balance-service/transfer/ton-transfer");
|
|
13
|
+
var _xcm = require("@subwallet/extension-base/services/balance-service/transfer/xcm");
|
|
14
|
+
var _availBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge");
|
|
15
|
+
var _polygonBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge");
|
|
16
|
+
var _posBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/posBridge");
|
|
17
|
+
var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
18
|
+
var _utils2 = require("@subwallet/extension-base/services/fee-service/utils");
|
|
19
|
+
var _helpers = require("@subwallet/extension-base/services/transaction-service/helpers");
|
|
20
|
+
var _utils3 = require("@subwallet/extension-base/utils");
|
|
21
|
+
var _keyring = require("@subwallet/keyring");
|
|
22
|
+
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
23
|
+
var _util = require("@polkadot/util");
|
|
24
|
+
var _utilCrypto = require("@polkadot/util-crypto");
|
|
25
|
+
var _combine = require("./combine");
|
|
26
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
27
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
28
|
+
|
|
29
|
+
const detectTransferTxType = (srcToken, srcChain, destChain) => {
|
|
30
|
+
const isXcmTransfer = srcChain.slug !== destChain.slug;
|
|
31
|
+
if (isXcmTransfer) {
|
|
32
|
+
const isAvailBridgeFromEvm = (0, _utils._isPureEvmChain)(srcChain) && (0, _availBridge.isAvailChainBridge)(destChain.slug);
|
|
33
|
+
const isSnowBridgeEvmTransfer = (0, _utils._isPureEvmChain)(srcChain) && (0, _xcmParser._isSnowBridgeXcm)(srcChain, destChain) && !isAvailBridgeFromEvm;
|
|
34
|
+
const isPolygonBridgeTransfer = (0, _polygonBridge._isPolygonChainBridge)(srcChain.slug, destChain.slug);
|
|
35
|
+
const isPosBridgeTransfer = (0, _posBridge._isPosChainBridge)(srcChain.slug, destChain.slug);
|
|
36
|
+
return isAvailBridgeFromEvm || isSnowBridgeEvmTransfer || isPolygonBridgeTransfer || isPosBridgeTransfer ? 'evm' : 'substrate';
|
|
37
|
+
} else {
|
|
38
|
+
if ((0, _utils._isChainEvmCompatible)(srcChain) && (0, _utils._isTokenTransferredByEvm)(srcToken)) {
|
|
39
|
+
return 'evm';
|
|
40
|
+
} else if ((0, _utils._isChainTonCompatible)(srcChain) && (0, _utils._isTokenTransferredByTon)(srcToken)) {
|
|
41
|
+
return 'ton';
|
|
42
|
+
} else {
|
|
43
|
+
return 'substrate';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
exports.detectTransferTxType = detectTransferTxType;
|
|
48
|
+
const calculateMaxTransferable = async (id, request, freeBalance, fee) => {
|
|
49
|
+
const {
|
|
50
|
+
destChain,
|
|
51
|
+
srcChain
|
|
52
|
+
} = request;
|
|
53
|
+
const isXcmTransfer = srcChain.slug !== destChain.slug;
|
|
54
|
+
let maxTransferableAmount;
|
|
55
|
+
if (isXcmTransfer) {
|
|
56
|
+
maxTransferableAmount = await calculateXCMMaxTransferable(id, request, freeBalance, fee);
|
|
57
|
+
} else {
|
|
58
|
+
maxTransferableAmount = await calculateTransferMaxTransferable(id, request, freeBalance, fee);
|
|
59
|
+
}
|
|
60
|
+
maxTransferableAmount.feePercentageSpecialCase = _utils2.FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE;
|
|
61
|
+
return maxTransferableAmount;
|
|
62
|
+
};
|
|
63
|
+
exports.calculateMaxTransferable = calculateMaxTransferable;
|
|
64
|
+
const calculateTransferMaxTransferable = async (id, request, freeBalance, fee) => {
|
|
65
|
+
const {
|
|
66
|
+
address,
|
|
67
|
+
destChain,
|
|
68
|
+
evmApi,
|
|
69
|
+
feeCustom,
|
|
70
|
+
feeOption,
|
|
71
|
+
isTransferLocalTokenAndPayThatTokenAsFee,
|
|
72
|
+
isTransferNativeTokenAndPayLocalTokenAsFee,
|
|
73
|
+
nativeToken,
|
|
74
|
+
srcChain,
|
|
75
|
+
srcToken,
|
|
76
|
+
substrateApi,
|
|
77
|
+
tonApi
|
|
78
|
+
} = request;
|
|
79
|
+
const feeChainType = fee.type;
|
|
80
|
+
let estimatedFee;
|
|
81
|
+
let feeOptions;
|
|
82
|
+
let maxTransferable;
|
|
83
|
+
let error;
|
|
84
|
+
const fakeAddress = '5DRewsYzhJqZXU3SRaWy1FSt5iDr875ao91aw5fjrJmDG4Ap'; // todo: move this
|
|
85
|
+
const substrateAddress = fakeAddress; // todo: move this
|
|
86
|
+
const evmAddress = (0, _util.u8aToHex)((0, _utilCrypto.addressToEvm)(fakeAddress)); // todo: move this
|
|
87
|
+
|
|
88
|
+
const recipient = (0, _utils._isChainEvmCompatible)(destChain) ? evmAddress : substrateAddress;
|
|
89
|
+
try {
|
|
90
|
+
let transaction;
|
|
91
|
+
if ((0, _utilCrypto.isEthereumAddress)(address) && (0, _utilCrypto.isEthereumAddress)(recipient) && (0, _utils._isTokenTransferredByEvm)(srcToken)) {
|
|
92
|
+
// todo: refactor: merge getERC20TransactionObject & getEVMTransactionObject
|
|
93
|
+
// Estimate with EVM API
|
|
94
|
+
if ((0, _utils._isTokenEvmSmartContract)(srcToken) || (0, _utils._isLocalToken)(srcToken)) {
|
|
95
|
+
[transaction] = await (0, _smartContract.getERC20TransactionObject)({
|
|
96
|
+
assetAddress: (0, _utils._getContractAddressOfToken)(srcToken),
|
|
97
|
+
chain: srcChain.slug,
|
|
98
|
+
evmApi,
|
|
99
|
+
feeCustom,
|
|
100
|
+
feeInfo: fee,
|
|
101
|
+
feeOption,
|
|
102
|
+
from: address,
|
|
103
|
+
to: recipient,
|
|
104
|
+
transferAll: false,
|
|
105
|
+
value: '0'
|
|
106
|
+
});
|
|
107
|
+
} else {
|
|
108
|
+
[transaction] = await (0, _smartContract.getEVMTransactionObject)({
|
|
109
|
+
chain: srcChain.slug,
|
|
110
|
+
evmApi,
|
|
111
|
+
feeCustom,
|
|
112
|
+
feeInfo: fee,
|
|
113
|
+
feeOption,
|
|
114
|
+
from: address,
|
|
115
|
+
to: recipient,
|
|
116
|
+
transferAll: false,
|
|
117
|
+
value: '0'
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
} else if ((0, _keyring.isTonAddress)(address) && (0, _utils._isTokenTransferredByTon)(srcToken)) {
|
|
121
|
+
[transaction] = await (0, _tonTransfer.createTonTransaction)({
|
|
122
|
+
tokenInfo: srcToken,
|
|
123
|
+
from: address,
|
|
124
|
+
to: address,
|
|
125
|
+
networkKey: srcChain.slug,
|
|
126
|
+
value: '0',
|
|
127
|
+
transferAll: false,
|
|
128
|
+
// currently not used
|
|
129
|
+
tonApi
|
|
130
|
+
});
|
|
131
|
+
} else {
|
|
132
|
+
[transaction] = await (0, _token.createTransferExtrinsic)({
|
|
133
|
+
transferAll: false,
|
|
134
|
+
value: '0',
|
|
135
|
+
from: address,
|
|
136
|
+
networkKey: srcChain.slug,
|
|
137
|
+
tokenInfo: srcToken,
|
|
138
|
+
to: recipient,
|
|
139
|
+
substrateApi
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
if (feeChainType === 'evm') {
|
|
143
|
+
var _tx$gas;
|
|
144
|
+
// Calculate fee for evm transaction
|
|
145
|
+
const tx = transaction;
|
|
146
|
+
const gasLimit = ((_tx$gas = tx.gas) === null || _tx$gas === void 0 ? void 0 : _tx$gas.toString()) || (await evmApi.api.eth.estimateGas(tx)).toString();
|
|
147
|
+
const _feeCustom = feeCustom;
|
|
148
|
+
const combineFee = (0, _combine.combineEthFee)(fee, feeOption, _feeCustom);
|
|
149
|
+
if (combineFee.maxFeePerGas) {
|
|
150
|
+
estimatedFee = new _bignumber.default(combineFee.maxFeePerGas).multipliedBy(gasLimit).toFixed(0);
|
|
151
|
+
} else {
|
|
152
|
+
estimatedFee = new _bignumber.default(combineFee.gasPrice || '0').multipliedBy(gasLimit).toFixed(0);
|
|
153
|
+
}
|
|
154
|
+
feeOptions = {
|
|
155
|
+
...fee,
|
|
156
|
+
estimatedFee,
|
|
157
|
+
gasLimit: gasLimit.toString()
|
|
158
|
+
};
|
|
159
|
+
} else if (feeChainType === 'substrate') {
|
|
160
|
+
// Calculate fee for substrate transaction
|
|
161
|
+
try {
|
|
162
|
+
var _paymentInfo$partialF;
|
|
163
|
+
const mockTx = transaction;
|
|
164
|
+
const paymentInfo = await mockTx.paymentInfo(address);
|
|
165
|
+
estimatedFee = (paymentInfo === null || paymentInfo === void 0 ? void 0 : (_paymentInfo$partialF = paymentInfo.partialFee) === null || _paymentInfo$partialF === void 0 ? void 0 : _paymentInfo$partialF.toString()) || '0';
|
|
166
|
+
} catch (e) {
|
|
167
|
+
estimatedFee = '0';
|
|
168
|
+
}
|
|
169
|
+
const _feeCustom = feeCustom;
|
|
170
|
+
const tip = (0, _combine.combineSubstrateFee)(fee, feeOption, _feeCustom).tip;
|
|
171
|
+
estimatedFee = new _bignumber.default(estimatedFee).plus(tip).toFixed(0);
|
|
172
|
+
feeOptions = {
|
|
173
|
+
...fee,
|
|
174
|
+
estimatedFee
|
|
175
|
+
};
|
|
176
|
+
} else {
|
|
177
|
+
if (transaction && (0, _helpers.isTonTransaction)(transaction)) {
|
|
178
|
+
estimatedFee = transaction.estimateFee;
|
|
179
|
+
feeOptions = {
|
|
180
|
+
...fee,
|
|
181
|
+
estimatedFee: estimatedFee
|
|
182
|
+
};
|
|
183
|
+
} else {
|
|
184
|
+
// Not implemented yet
|
|
185
|
+
estimatedFee = '0';
|
|
186
|
+
feeOptions = {
|
|
187
|
+
...fee,
|
|
188
|
+
estimatedFee: '0'
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
} catch (e) {
|
|
193
|
+
estimatedFee = '0';
|
|
194
|
+
if (fee.type === 'evm') {
|
|
195
|
+
feeOptions = {
|
|
196
|
+
...fee,
|
|
197
|
+
estimatedFee,
|
|
198
|
+
gasLimit: '0'
|
|
199
|
+
};
|
|
200
|
+
} else {
|
|
201
|
+
feeOptions = {
|
|
202
|
+
...fee,
|
|
203
|
+
estimatedFee
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
error = e.message || 'Unable to estimate fee';
|
|
207
|
+
console.warn('Unable to estimate fee', e);
|
|
208
|
+
}
|
|
209
|
+
if (isTransferLocalTokenAndPayThatTokenAsFee && feeChainType === 'substrate') {
|
|
210
|
+
const estimatedFeeNative = (BigInt(estimatedFee) * BigInt(_utils2.FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE) / BigInt(100)).toString();
|
|
211
|
+
const estimatedFeeLocal = await (0, _utils2.calculateToAmountByReservePool)(substrateApi.api, nativeToken, srcToken, estimatedFeeNative);
|
|
212
|
+
maxTransferable = (0, _bignumber.default)(freeBalance.value).minus(estimatedFeeLocal);
|
|
213
|
+
} else if (isTransferNativeTokenAndPayLocalTokenAsFee) {
|
|
214
|
+
maxTransferable = (0, _bignumber.default)(freeBalance.value);
|
|
215
|
+
} else {
|
|
216
|
+
if (!(0, _utils._isNativeToken)(srcToken)) {
|
|
217
|
+
maxTransferable = (0, _bignumber.default)(freeBalance.value);
|
|
218
|
+
} else {
|
|
219
|
+
maxTransferable = (0, _bignumber.default)(freeBalance.value).minus(new _bignumber.default(estimatedFee));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
maxTransferable: maxTransferable.gt(_utils3.BN_ZERO) ? maxTransferable.toFixed(0) || '0' : '0',
|
|
224
|
+
feeOptions: feeOptions,
|
|
225
|
+
feeType: feeChainType,
|
|
226
|
+
id: id,
|
|
227
|
+
error
|
|
228
|
+
};
|
|
229
|
+
};
|
|
230
|
+
exports.calculateTransferMaxTransferable = calculateTransferMaxTransferable;
|
|
231
|
+
const calculateXCMMaxTransferable = async (id, request, freeBalance, fee) => {
|
|
232
|
+
const {
|
|
233
|
+
address,
|
|
234
|
+
destChain,
|
|
235
|
+
destToken,
|
|
236
|
+
evmApi,
|
|
237
|
+
feeCustom,
|
|
238
|
+
feeOption,
|
|
239
|
+
isTransferLocalTokenAndPayThatTokenAsFee,
|
|
240
|
+
isTransferNativeTokenAndPayLocalTokenAsFee,
|
|
241
|
+
nativeToken,
|
|
242
|
+
srcChain,
|
|
243
|
+
srcToken,
|
|
244
|
+
substrateApi
|
|
245
|
+
} = request;
|
|
246
|
+
const feeChainType = fee.type;
|
|
247
|
+
let estimatedFee;
|
|
248
|
+
let feeOptions;
|
|
249
|
+
let maxTransferable;
|
|
250
|
+
let error;
|
|
251
|
+
const isAvailBridgeFromEvm = (0, _utils._isPureEvmChain)(srcChain) && (0, _availBridge.isAvailChainBridge)(destChain.slug);
|
|
252
|
+
const isAvailBridgeFromAvail = (0, _availBridge.isAvailChainBridge)(srcChain.slug) && (0, _utils._isPureEvmChain)(destChain);
|
|
253
|
+
const isSnowBridgeEvmTransfer = (0, _utils._isPureEvmChain)(srcChain) && (0, _xcmParser._isSnowBridgeXcm)(srcChain, destChain) && !isAvailBridgeFromEvm;
|
|
254
|
+
const isPolygonBridgeTransfer = (0, _polygonBridge._isPolygonChainBridge)(srcChain.slug, destChain.slug);
|
|
255
|
+
const isPosBridgeTransfer = (0, _posBridge._isPosChainBridge)(srcChain.slug, destChain.slug);
|
|
256
|
+
const fakeAddress = '5DRewsYzhJqZXU3SRaWy1FSt5iDr875ao91aw5fjrJmDG4Ap'; // todo: move this
|
|
257
|
+
const substrateAddress = fakeAddress; // todo: move this
|
|
258
|
+
const evmAddress = (0, _util.u8aToHex)((0, _utilCrypto.addressToEvm)(fakeAddress)); // todo: move this
|
|
259
|
+
|
|
260
|
+
const recipient = (0, _utils._isChainEvmCompatible)(destChain) ? evmAddress : substrateAddress;
|
|
261
|
+
try {
|
|
262
|
+
if (!destToken) {
|
|
263
|
+
throw Error('Destination token is not available');
|
|
264
|
+
}
|
|
265
|
+
const params = {
|
|
266
|
+
destinationTokenInfo: destToken,
|
|
267
|
+
originTokenInfo: srcToken,
|
|
268
|
+
// If value is 0, substrate will throw error when estimating fee
|
|
269
|
+
sendingValue: feeChainType === 'substrate' ? '1000000000000000000' : '0',
|
|
270
|
+
sender: address,
|
|
271
|
+
recipient,
|
|
272
|
+
destinationChain: destChain,
|
|
273
|
+
originChain: srcChain,
|
|
274
|
+
substrateApi,
|
|
275
|
+
evmApi,
|
|
276
|
+
feeCustom,
|
|
277
|
+
feeOption,
|
|
278
|
+
feeInfo: fee
|
|
279
|
+
};
|
|
280
|
+
let funcCreateExtrinsic;
|
|
281
|
+
if (isPosBridgeTransfer || isPolygonBridgeTransfer) {
|
|
282
|
+
funcCreateExtrinsic = _xcm.createPolygonBridgeExtrinsic;
|
|
283
|
+
} else if (isSnowBridgeEvmTransfer) {
|
|
284
|
+
funcCreateExtrinsic = _xcm.createSnowBridgeExtrinsic;
|
|
285
|
+
} else if (isAvailBridgeFromEvm) {
|
|
286
|
+
funcCreateExtrinsic = _xcm.createAvailBridgeTxFromEth;
|
|
287
|
+
} else if (isAvailBridgeFromAvail) {
|
|
288
|
+
funcCreateExtrinsic = _xcm.createAvailBridgeExtrinsicFromAvail;
|
|
289
|
+
} else {
|
|
290
|
+
funcCreateExtrinsic = _xcm.createXcmExtrinsic;
|
|
291
|
+
}
|
|
292
|
+
const extrinsic = await funcCreateExtrinsic(params);
|
|
293
|
+
if (feeChainType === 'evm') {
|
|
294
|
+
var _tx$gas2;
|
|
295
|
+
// Calculate fee for evm transaction
|
|
296
|
+
const tx = extrinsic;
|
|
297
|
+
const gasLimit = ((_tx$gas2 = tx.gas) === null || _tx$gas2 === void 0 ? void 0 : _tx$gas2.toString()) || (await evmApi.api.eth.estimateGas(tx)).toString();
|
|
298
|
+
const _feeCustom = feeCustom;
|
|
299
|
+
const combineFee = (0, _combine.combineEthFee)(fee, feeOption, _feeCustom);
|
|
300
|
+
if (combineFee.maxFeePerGas) {
|
|
301
|
+
estimatedFee = new _bignumber.default(combineFee.maxFeePerGas).multipliedBy(gasLimit).toFixed(0);
|
|
302
|
+
} else {
|
|
303
|
+
estimatedFee = new _bignumber.default(combineFee.gasPrice || '0').multipliedBy(gasLimit).toFixed(0);
|
|
304
|
+
}
|
|
305
|
+
feeOptions = {
|
|
306
|
+
...fee,
|
|
307
|
+
estimatedFee,
|
|
308
|
+
gasLimit: gasLimit.toString()
|
|
309
|
+
};
|
|
310
|
+
} else if (feeChainType === 'substrate') {
|
|
311
|
+
// Calculate fee for substrate transaction
|
|
312
|
+
try {
|
|
313
|
+
var _paymentInfo$partialF2;
|
|
314
|
+
const paymentInfo = await extrinsic.paymentInfo(address);
|
|
315
|
+
estimatedFee = (paymentInfo === null || paymentInfo === void 0 ? void 0 : (_paymentInfo$partialF2 = paymentInfo.partialFee) === null || _paymentInfo$partialF2 === void 0 ? void 0 : _paymentInfo$partialF2.toString()) || '0';
|
|
316
|
+
} catch (e) {
|
|
317
|
+
estimatedFee = '0';
|
|
318
|
+
}
|
|
319
|
+
const _feeCustom = feeCustom;
|
|
320
|
+
const tip = (0, _combine.combineSubstrateFee)(fee, feeOption, _feeCustom).tip;
|
|
321
|
+
estimatedFee = new _bignumber.default(estimatedFee).plus(tip).toFixed(0);
|
|
322
|
+
feeOptions = {
|
|
323
|
+
...fee,
|
|
324
|
+
estimatedFee
|
|
325
|
+
};
|
|
326
|
+
} else {
|
|
327
|
+
// Not implemented yet
|
|
328
|
+
estimatedFee = '0';
|
|
329
|
+
feeOptions = {
|
|
330
|
+
...fee,
|
|
331
|
+
estimatedFee: '0'
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
} catch (e) {
|
|
335
|
+
estimatedFee = '0';
|
|
336
|
+
if (fee.type === 'evm') {
|
|
337
|
+
feeOptions = {
|
|
338
|
+
...fee,
|
|
339
|
+
estimatedFee,
|
|
340
|
+
gasLimit: '0'
|
|
341
|
+
};
|
|
342
|
+
} else {
|
|
343
|
+
feeOptions = {
|
|
344
|
+
...fee,
|
|
345
|
+
estimatedFee
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
error = e.message || 'Unable to estimate fee';
|
|
349
|
+
console.warn('Unable to estimate fee', e);
|
|
350
|
+
}
|
|
351
|
+
if (!destToken) {
|
|
352
|
+
maxTransferable = _utils3.BN_ZERO;
|
|
353
|
+
} else if (isTransferLocalTokenAndPayThatTokenAsFee && feeChainType === 'substrate') {
|
|
354
|
+
const estimatedFeeNative = (BigInt(estimatedFee) * BigInt(_utils2.FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE) / BigInt(100)).toString();
|
|
355
|
+
const estimatedFeeLocal = await (0, _utils2.calculateToAmountByReservePool)(substrateApi.api, nativeToken, srcToken, estimatedFeeNative);
|
|
356
|
+
maxTransferable = (0, _bignumber.default)(freeBalance.value).minus(estimatedFeeLocal);
|
|
357
|
+
} else if (isTransferNativeTokenAndPayLocalTokenAsFee) {
|
|
358
|
+
maxTransferable = (0, _bignumber.default)(freeBalance.value);
|
|
359
|
+
} else {
|
|
360
|
+
if (!(0, _utils._isNativeToken)(srcToken)) {
|
|
361
|
+
maxTransferable = (0, _bignumber.default)(freeBalance.value);
|
|
362
|
+
} else {
|
|
363
|
+
maxTransferable = (0, _bignumber.default)(freeBalance.value).minus(new _bignumber.default(estimatedFee).multipliedBy(_constants.XCM_FEE_RATIO));
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
return {
|
|
367
|
+
maxTransferable: maxTransferable.gt(_utils3.BN_ZERO) ? maxTransferable.toFixed(0) || '0' : '0',
|
|
368
|
+
feeOptions: feeOptions,
|
|
369
|
+
feeType: feeChainType,
|
|
370
|
+
id: id,
|
|
371
|
+
error
|
|
372
|
+
};
|
|
373
|
+
};
|
|
374
|
+
exports.calculateXCMMaxTransferable = calculateXCMMaxTransferable;
|