@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.
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 +21 -6
  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 +2 -0
  30. package/cjs/services/swap-service/handler/chainflip-handler.js +25 -4
  31. package/cjs/services/swap-service/handler/hydradx-handler.js +20 -6
  32. package/cjs/services/swap-service/handler/simpleswap-handler.js +23 -3
  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 +21 -6
  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 +2 -0
  94. package/services/swap-service/handler/chainflip-handler.d.ts +2 -1
  95. package/services/swap-service/handler/chainflip-handler.js +24 -3
  96. package/services/swap-service/handler/hydradx-handler.d.ts +2 -1
  97. package/services/swap-service/handler/hydradx-handler.js +19 -5
  98. package/services/swap-service/handler/simpleswap-handler.d.ts +2 -1
  99. package/services/swap-service/handler/simpleswap-handler.js +23 -3
  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
@@ -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
- validationResponse.estimateFee = await (0, _transfer.estimateFeeForTransaction)(validationResponse, transaction, chainInfo, evmApi);
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
- withSignedTransaction: true
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";
@@ -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 = {}));
@@ -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 _fee = require("./fee");
18
- Object.keys(_fee).forEach(function (key) {
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] === _fee[key]) return;
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 _fee[key];
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;