@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
@@ -4,9 +4,10 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.recalculateGasPrice = exports.parseInfuraFee = exports.fetchSubWalletFeeData = exports.fetchOnlineFeeData = exports.fetchInfuraFeeData = exports.calculateGasFeeParams = void 0;
7
+ exports.recalculateGasPrice = exports.parseInfuraFee = exports.getEIP1559GasFee = exports.fetchSubWalletFeeData = exports.fetchOnlineFeeData = exports.fetchInfuraFeeData = exports.calculateToAmountByReservePool = exports.calculateGasFeeParams = exports.FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE = void 0;
8
8
  var _constants = require("@subwallet/extension-base/constants");
9
- var _utils = require("@subwallet/extension-base/utils");
9
+ var _utils = require("@subwallet/extension-base/services/swap-service/handler/asset-hub/utils");
10
+ var _utils2 = require("@subwallet/extension-base/utils");
10
11
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
11
12
  var _polygonBridge = require("../../balance-service/transfer/xcm/polygonBridge");
12
13
  // Copyright 2019-2022 @subwallet/extension-base
@@ -15,60 +16,79 @@ var _polygonBridge = require("../../balance-service/transfer/xcm/polygonBridge")
15
16
  const INFURA_API_KEY = process.env.INFURA_API_KEY || '';
16
17
  const INFURA_API_KEY_SECRET = process.env.INFURA_API_KEY_SECRET || '';
17
18
  const INFURA_AUTH = 'Basic ' + Buffer.from(INFURA_API_KEY + ':' + INFURA_API_KEY_SECRET).toString('base64');
18
- const parseInfuraFee = info => {
19
- const base = new _bignumber.default(info.estimatedBaseFee).multipliedBy(_utils.BN_WEI);
20
- const low = new _bignumber.default(info.low.suggestedMaxPriorityFeePerGas).multipliedBy(_utils.BN_WEI);
21
- const busyNetwork = base.gt(_utils.BN_ZERO) ? low.dividedBy(base).gte(0.3) : false;
22
- const data = !busyNetwork ? info.low : info.medium;
19
+ const FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE = 105; // percentage
20
+ exports.FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE = FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE;
21
+ const parseInfuraFee = (info, threshold) => {
22
+ const base = new _bignumber.default(info.estimatedBaseFee).multipliedBy(_utils2.BN_WEI);
23
+ const thresholdBN = new _bignumber.default(threshold.busyThreshold).multipliedBy(_utils2.BN_WEI);
24
+ const busyNetwork = thresholdBN.gte(_utils2.BN_ZERO) ? base.gt(thresholdBN) : false;
23
25
  return {
24
26
  busyNetwork,
25
27
  gasPrice: undefined,
26
- baseGasFee: base,
27
- maxFeePerGas: new _bignumber.default(data.suggestedMaxFeePerGas).multipliedBy(_utils.BN_WEI).integerValue(_bignumber.default.ROUND_UP),
28
- maxPriorityFeePerGas: new _bignumber.default(data.suggestedMaxPriorityFeePerGas).multipliedBy(_utils.BN_WEI).integerValue(_bignumber.default.ROUND_UP)
28
+ baseGasFee: base.toFixed(0),
29
+ type: 'evm',
30
+ options: {
31
+ slow: {
32
+ maxFeePerGas: new _bignumber.default(info.low.suggestedMaxFeePerGas).multipliedBy(_utils2.BN_WEI).integerValue(_bignumber.default.ROUND_UP).toFixed(0),
33
+ maxPriorityFeePerGas: new _bignumber.default(info.low.suggestedMaxPriorityFeePerGas).multipliedBy(_utils2.BN_WEI).integerValue(_bignumber.default.ROUND_UP).toFixed(0),
34
+ maxWaitTimeEstimate: info.low.maxWaitTimeEstimate || 0,
35
+ minWaitTimeEstimate: info.low.minWaitTimeEstimate || 0
36
+ },
37
+ average: {
38
+ maxFeePerGas: new _bignumber.default(info.medium.suggestedMaxFeePerGas).multipliedBy(_utils2.BN_WEI).integerValue(_bignumber.default.ROUND_UP).toFixed(0),
39
+ maxPriorityFeePerGas: new _bignumber.default(info.medium.suggestedMaxPriorityFeePerGas).multipliedBy(_utils2.BN_WEI).integerValue(_bignumber.default.ROUND_UP).toFixed(0),
40
+ maxWaitTimeEstimate: info.medium.maxWaitTimeEstimate || 0,
41
+ minWaitTimeEstimate: info.medium.minWaitTimeEstimate || 0
42
+ },
43
+ fast: {
44
+ maxFeePerGas: new _bignumber.default(info.high.suggestedMaxFeePerGas).multipliedBy(_utils2.BN_WEI).integerValue(_bignumber.default.ROUND_UP).toFixed(0),
45
+ maxPriorityFeePerGas: new _bignumber.default(info.high.suggestedMaxPriorityFeePerGas).multipliedBy(_utils2.BN_WEI).integerValue(_bignumber.default.ROUND_UP).toFixed(0),
46
+ maxWaitTimeEstimate: info.high.maxWaitTimeEstimate || 0,
47
+ minWaitTimeEstimate: info.high.minWaitTimeEstimate || 0
48
+ },
49
+ default: busyNetwork ? 'average' : 'slow'
50
+ }
29
51
  };
30
52
  };
31
53
  exports.parseInfuraFee = parseInfuraFee;
32
54
  const fetchInfuraFeeData = async (chainId, infuraAuth) => {
33
- return await new Promise(resolve => {
34
- const baseUrl = 'https://gas.api.infura.io/networks/{{chainId}}/suggestedGasFees';
35
- const url = baseUrl.replaceAll('{{chainId}}', chainId.toString());
36
- fetch(url, {
37
- method: 'GET',
38
- headers: {
39
- Authorization: infuraAuth || INFURA_AUTH
40
- }
41
- }).then(rs => {
42
- return rs.json();
43
- }).then(info => {
44
- resolve(parseInfuraFee(info));
45
- }).catch(e => {
46
- console.warn(e);
47
- resolve(null);
48
- });
49
- });
55
+ const baseUrl = 'https://gas.api.infura.io/networks/{{chainId}}/suggestedGasFees';
56
+ const baseThressholdUrl = 'https://gas.api.infura.io/networks/{{chainId}}/busyThreshold';
57
+ // const baseFeeHistoryUrl = 'https://gas.api.infura.io/networks/{{chainId}}/baseFeeHistory';
58
+ // const baseFeePercentileUrl = 'https://gas.api.infura.io/networks/{{chainId}}/baseFeePercentile';
59
+ const feeUrl = baseUrl.replaceAll('{{chainId}}', chainId.toString());
60
+ const thressholdUrl = baseThressholdUrl.replaceAll('{{chainId}}', chainId.toString());
61
+ try {
62
+ const [feeResp, thressholdResp] = await Promise.all([feeUrl, thressholdUrl].map(url => {
63
+ return fetch(url, {
64
+ method: 'GET',
65
+ headers: {
66
+ Authorization: INFURA_AUTH
67
+ }
68
+ });
69
+ }));
70
+
71
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
72
+ const [feeInfo, thresholdInfo] = await Promise.all([feeResp.json(), thressholdResp.json()]);
73
+ return parseInfuraFee(feeInfo, thresholdInfo);
74
+ } catch (e) {
75
+ console.warn(e);
76
+ return null;
77
+ }
50
78
  };
51
79
  exports.fetchInfuraFeeData = fetchInfuraFeeData;
52
80
  const fetchSubWalletFeeData = async (chainId, networkKey) => {
53
81
  return await new Promise(resolve => {
54
82
  const baseUrl = 'https://api-cache.subwallet.app/sw-evm-gas/{{chain}}';
55
83
  const url = baseUrl.replaceAll('{{chain}}', networkKey);
84
+
85
+ // TODO: Update the logo to follow the new estimateFee format or move the logic to the backend
56
86
  fetch(url, {
57
87
  method: 'GET'
58
88
  }).then(rs => {
59
89
  return rs.json();
60
90
  }).then(info => {
61
- if (info.gasPrice !== undefined) {
62
- resolve(info);
63
- } else {
64
- resolve({
65
- busyNetwork: info.busyNetwork,
66
- gasPrice: info.gasPrice,
67
- baseGasFee: new _bignumber.default(info.baseGasFee),
68
- maxFeePerGas: new _bignumber.default(info.maxFeePerGas),
69
- maxPriorityFeePerGas: new _bignumber.default(info.maxPriorityFeePerGas)
70
- });
71
- }
91
+ resolve(info);
72
92
  }).catch(e => {
73
93
  console.warn(e);
74
94
  resolve(null);
@@ -94,9 +114,20 @@ const recalculateGasPrice = (_price, chain) => {
94
114
  return needMulti ? new _bignumber.default(_price).multipliedBy(_constants.GAS_PRICE_RATIO).toFixed(0) : _price;
95
115
  };
96
116
  exports.recalculateGasPrice = recalculateGasPrice;
117
+ const getEIP1559GasFee = (baseFee, maxPriorityFee, blockNumber, blockTime) => {
118
+ // https://www.blocknative.com/blog/eip-1559-fees
119
+ const maxFee = baseFee.multipliedBy(1.2).plus(maxPriorityFee);
120
+ return {
121
+ maxFeePerGas: maxFee.toFixed(0),
122
+ maxPriorityFeePerGas: maxPriorityFee.toFixed(0),
123
+ minWaitTimeEstimate: blockTime * (blockNumber - 2),
124
+ maxWaitTimeEstimate: blockTime * blockNumber
125
+ };
126
+ };
127
+ exports.getEIP1559GasFee = getEIP1559GasFee;
97
128
  const calculateGasFeeParams = async function (web3, networkKey) {
98
129
  let useOnline = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
99
- let useInfura = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
130
+ let useInfura = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
100
131
  if (useOnline) {
101
132
  try {
102
133
  const chainId = await web3.api.eth.getChainId();
@@ -113,19 +144,19 @@ const calculateGasFeeParams = async function (web3, networkKey) {
113
144
  const gasResponse = await fetch(`${gasDomain}`).then(res => res.json());
114
145
  const gasPriceInWei = gasResponse.standard * 1e9 + 200000;
115
146
  return {
147
+ type: 'evm',
116
148
  gasPrice: gasPriceInWei.toString(),
117
- maxFeePerGas: undefined,
118
- maxPriorityFeePerGas: undefined,
119
149
  baseGasFee: undefined,
120
- busyNetwork: false
150
+ busyNetwork: false,
151
+ options: undefined
121
152
  };
122
153
  }
123
154
  const numBlock = 20;
124
- const rewardPercent = [];
125
- for (let i = 0; i <= 100; i = i + 5) {
126
- rewardPercent.push(i);
127
- }
155
+ const rewardPercent = [25, 50, 75];
128
156
  const history = await web3.api.eth.getFeeHistory(numBlock, 'latest', rewardPercent);
157
+ const currentBlock = history.oldestBlock - 1;
158
+ const [newBlock, oldBlock] = await Promise.all([web3.api.eth.getBlock(currentBlock), web3.api.eth.getBlock(currentBlock - numBlock)]);
159
+ const blockTime = Number((BigInt(newBlock.timestamp || 0) - BigInt(oldBlock.timestamp || 0)) / BigInt(numBlock) * BigInt(1000));
129
160
  const baseGasFee = new _bignumber.default(history.baseFeePerGas[history.baseFeePerGas.length - 1]); // Last element is latest
130
161
 
131
162
  const blocksBusy = history.reward.reduce((previous, rewards, currentIndex) => {
@@ -137,87 +168,42 @@ const calculateGasFeeParams = async function (web3, networkKey) {
137
168
  /*
138
169
  * True if priority >= 0.3 * base
139
170
  * */
140
- const blockIsBusy = baseBN.gt(_utils.BN_ZERO) ? priorityBN.dividedBy(baseBN).gte(0.3) ? 1 : 0 : 0; // Special for bsc, base fee = 0
171
+ const blockIsBusy = baseBN.gt(_utils2.BN_ZERO) ? priorityBN.dividedBy(baseBN).gte(0.3) ? 1 : 0 : 0; // Special for bsc, base fee = 0
141
172
 
142
173
  return previous + blockIsBusy;
143
174
  }, 0);
144
175
  const busyNetwork = blocksBusy >= numBlock / 2; // True, if half of block is busy
145
176
 
146
- const maxPriorityFeePerGas = history.reward.reduce((previous, rewards) => {
147
- let firstBN = _utils.BN_ZERO;
148
- let firstIndex = 0;
149
-
150
- /* Get first priority which greater than 0 */
151
- for (let i = 0; i < rewards.length; i++) {
152
- firstIndex = i;
153
- const current = rewards[i];
154
- const currentBN = new _bignumber.default(current);
155
- if (currentBN.gt(_utils.BN_ZERO)) {
156
- firstBN = currentBN;
157
- break;
158
- }
159
- }
160
- let secondBN = firstBN;
161
-
162
- /* Get second priority which greater than first priority */
163
- for (let i = firstIndex; i < rewards.length; i++) {
164
- const current = rewards[i];
165
- const currentBN = new _bignumber.default(current);
166
- if (currentBN.gt(firstBN)) {
167
- secondBN = currentBN;
168
- break;
169
- }
170
- }
171
- let current;
172
- if (busyNetwork) {
173
- current = secondBN.dividedBy(2).gte(firstBN) ? firstBN : secondBN; // second too larger than first (> 2 times), use first else use second
174
- } else {
175
- current = firstBN;
176
- }
177
- if (busyNetwork) {
178
- /* Get max value */
179
- return current.gte(previous) ? current : previous; // get max priority
180
- } else {
181
- /* Get min value which greater than 0 */
182
- if (previous.eq(_utils.BN_ZERO)) {
183
- return current; // get min priority
184
- } else if (current.eq(_utils.BN_ZERO)) {
185
- return previous;
186
- }
187
- return current.lte(previous) ? current : previous; // get min priority
188
- }
189
- }, _utils.BN_ZERO);
190
- if (maxPriorityFeePerGas.eq(_utils.BN_ZERO)) {
191
- const _price = await web3.api.eth.getGasPrice();
192
- const gasPrice = recalculateGasPrice(_price, networkKey);
193
- return {
194
- gasPrice,
195
- maxFeePerGas: undefined,
196
- maxPriorityFeePerGas: undefined,
197
- baseGasFee: undefined,
198
- busyNetwork: false
199
- };
200
- }
201
-
202
- /* Max gas = (base + priority) * 1.5 (if not busy or 2 when busy); */
203
- const maxFeePerGas = baseGasFee.plus(maxPriorityFeePerGas).multipliedBy(busyNetwork ? 2 : 1.5).decimalPlaces(0);
177
+ const slowPriorityFee = history.reward.reduce((previous, rewards) => previous.plus(rewards[0]), _utils2.BN_ZERO).dividedBy(numBlock).decimalPlaces(0);
178
+ const averagePriorityFee = history.reward.reduce((previous, rewards) => previous.plus(rewards[1]), _utils2.BN_ZERO).dividedBy(numBlock).decimalPlaces(0);
179
+ const fastPriorityFee = history.reward.reduce((previous, rewards) => previous.plus(rewards[2]), _utils2.BN_ZERO).dividedBy(numBlock).decimalPlaces(0);
204
180
  return {
181
+ type: 'evm',
205
182
  gasPrice: undefined,
206
- maxFeePerGas,
207
- maxPriorityFeePerGas,
208
- baseGasFee,
209
- busyNetwork
183
+ baseGasFee: baseGasFee.toString(),
184
+ busyNetwork,
185
+ options: {
186
+ slow: getEIP1559GasFee(baseGasFee, slowPriorityFee, 10, blockTime),
187
+ average: getEIP1559GasFee(baseGasFee, averagePriorityFee, 5, blockTime),
188
+ fast: getEIP1559GasFee(baseGasFee, fastPriorityFee, 3, blockTime),
189
+ default: busyNetwork ? 'average' : 'slow'
190
+ }
210
191
  };
211
192
  } catch (e) {
212
193
  const _price = await web3.api.eth.getGasPrice();
213
194
  const gasPrice = recalculateGasPrice(_price, networkKey);
214
195
  return {
196
+ type: 'evm',
197
+ busyNetwork: false,
215
198
  gasPrice,
216
- maxFeePerGas: undefined,
217
- maxPriorityFeePerGas: undefined,
218
199
  baseGasFee: undefined,
219
- busyNetwork: false
200
+ options: undefined
220
201
  };
221
202
  }
222
203
  };
223
- exports.calculateGasFeeParams = calculateGasFeeParams;
204
+ exports.calculateGasFeeParams = calculateGasFeeParams;
205
+ const calculateToAmountByReservePool = async (api, fromToken, toToken, fromAmount) => {
206
+ const reserve = await (0, _utils.getReserveForPool)(api, fromToken, toToken);
207
+ return (0, _utils.estimateTokensForPool)(fromAmount, reserve);
208
+ };
209
+ exports.calculateToAmountByReservePool = calculateToAmountByReservePool;
@@ -13,6 +13,9 @@ class BalanceStore extends _BaseStoreWithAddress.default {
13
13
  async getBalanceMapByAddresses(addresses) {
14
14
  return this.table.where('address').anyOf(addresses).toArray();
15
15
  }
16
+ async getBalanceHasAmount(address, chain) {
17
+ return this.table.filter(item => item.address === address && item.free !== '0' && item.tokenSlug.startsWith(chain)).toArray();
18
+ }
16
19
  async removeBySlugs(tokenSlugs) {
17
20
  return this.table.where('tokenSlug').anyOfIgnoreCase(tokenSlugs).delete();
18
21
  }
@@ -15,6 +15,7 @@ var _utils2 = require("@subwallet/extension-base/services/swap-service/utils");
15
15
  var _types = require("@subwallet/extension-base/types");
16
16
  var _serviceBase = require("@subwallet/extension-base/types/service-base");
17
17
  var _swap2 = require("@subwallet/extension-base/types/swap");
18
+ var _getId = require("@subwallet/extension-base/utils/getId");
18
19
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
19
20
  var _baseHandler = require("../base-handler");
20
21
  var _router = require("./router");
@@ -24,14 +25,15 @@ var _router = require("./router");
24
25
  const PAH_LOW_LIQUIDITY_THRESHOLD = 0.15;
25
26
  class AssetHubSwapHandler {
26
27
  isReady = false;
27
- constructor(chainService, balanceService, chain) {
28
+ constructor(chainService, balanceService, feeService, chain) {
28
29
  const chainInfo = chainService.getChainInfoByKey(chain);
29
30
  const providerSlug = chain === 'statemint' ? _swap2.SwapProviderId.POLKADOT_ASSET_HUB : chain === 'statemine' ? _swap2.SwapProviderId.KUSAMA_ASSET_HUB : _swap2.SwapProviderId.ROCOCO_ASSET_HUB;
30
31
  this.swapBaseHandler = new _baseHandler.SwapBaseHandler({
31
32
  balanceService,
32
33
  chainService,
33
34
  providerName: chainInfo.name,
34
- providerSlug
35
+ providerSlug,
36
+ feeService
35
37
  });
36
38
  this.providerSlug = providerSlug;
37
39
  this.chain = chain;
@@ -82,6 +84,7 @@ class AssetHubSwapHandler {
82
84
  }
83
85
  try {
84
86
  const alternativeChainInfo = this.chainService.getChainInfoByKey(alternativeAsset.originChain);
87
+ const originalChainInfo = this.chainService.getChainInfoByKey(this.chain);
85
88
  const step = {
86
89
  metadata: {
87
90
  sendingValue: bnAmount.toString(),
@@ -92,13 +95,18 @@ class AssetHubSwapHandler {
92
95
  type: _serviceBase.CommonStepType.XCM
93
96
  };
94
97
  const xcmOriginSubstrateApi = await this.chainService.getSubstrateApi(alternativeAsset.originChain).isReady;
98
+ const id = (0, _getId.getId)();
99
+ const feeInfo = await this.swapBaseHandler.feeService.subscribeChainFee(id, alternativeChainInfo.slug, 'substrate');
95
100
  const xcmTransfer = await (0, _xcm.createXcmExtrinsic)({
96
101
  originTokenInfo: alternativeAsset,
97
102
  destinationTokenInfo: fromAsset,
98
103
  sendingValue: bnAmount.toString(),
99
104
  recipient: params.request.address,
100
- chainInfoMap: this.chainService.getChainInfoMap(),
101
- substrateApi: xcmOriginSubstrateApi
105
+ sender: params.request.address,
106
+ feeInfo: feeInfo,
107
+ substrateApi: xcmOriginSubstrateApi,
108
+ destinationChain: originalChainInfo,
109
+ originChain: alternativeChainInfo
102
110
  });
103
111
  const _xcmFeeInfo = await xcmTransfer.paymentInfo(params.request.address);
104
112
  const xcmFeeInfo = _xcmFeeInfo.toPrimitive();
@@ -185,12 +193,16 @@ class AssetHubSwapHandler {
185
193
  const alternativeAssetSlug = (0, _utils2.getSwapAlternativeAsset)(pair);
186
194
  const originAsset = this.chainService.getAssetBySlug(alternativeAssetSlug);
187
195
  const destinationAsset = this.chainService.getAssetBySlug(pair.from);
196
+ const originChain = this.chainService.getChainInfoByKey(originAsset.originChain);
197
+ const destinationChain = this.chainService.getChainInfoByKey(destinationAsset.originChain);
188
198
  const substrateApi = this.chainService.getSubstrateApi(originAsset.originChain);
189
199
  const chainApi = await substrateApi.isReady;
190
200
  const destinationAssetBalance = await this.balanceService.getTransferableBalance(params.address, destinationAsset.originChain, destinationAsset.slug);
191
201
  const xcmFee = params.process.totalFee[params.currentStep];
192
202
  const bnAmount = new _bignumber.default(params.quote.fromAmount);
193
203
  const bnDestinationAssetBalance = new _bignumber.default(destinationAssetBalance.value);
204
+ const id = (0, _getId.getId)();
205
+ const feeInfo = await this.swapBaseHandler.feeService.subscribeChainFee(id, originChain.slug, 'substrate');
194
206
  let bnTotalAmount = bnAmount.minus(bnDestinationAssetBalance);
195
207
  if ((0, _utils._isNativeToken)(originAsset)) {
196
208
  const bnXcmFee = new _bignumber.default(xcmFee.feeComponent[0].amount); // xcm fee is paid in native token but swap token is not always native token
@@ -202,8 +214,11 @@ class AssetHubSwapHandler {
202
214
  destinationTokenInfo: destinationAsset,
203
215
  sendingValue: bnTotalAmount.toString(),
204
216
  recipient: params.address,
205
- chainInfoMap: this.chainService.getChainInfoMap(),
206
- substrateApi: chainApi
217
+ substrateApi: chainApi,
218
+ sender: params.address,
219
+ originChain: originChain,
220
+ destinationChain: destinationChain,
221
+ feeInfo
207
222
  });
208
223
  const xcmData = {
209
224
  originNetworkKey: originAsset.originChain,
@@ -45,7 +45,7 @@ class AssetHubRouter {
45
45
  const reserves = await (0, _utils2.getReserveForPath)(api, paths);
46
46
  const amounts = (0, _utils2.estimateTokensForPath)(amount, reserves);
47
47
  const marketRate = (0, _utils2.estimateRateForPath)(reserves);
48
- const marketRateAfter = (0, _utils2.estimateRateAfter)(amount, reserves);
48
+ const marketRateAfter = (0, _utils2.estimateRateAfterForPath)(amount, reserves);
49
49
  const priceImpactPct = (0, _utils2.estimatePriceImpactPct)(marketRate, marketRateAfter);
50
50
  const errors = [];
51
51
 
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.getReserveForPool = exports.getReserveForPath = exports.estimateTokensForPool = exports.estimateTokensForPath = exports.estimateRateForPath = exports.estimateRateAfter = exports.estimatePriceImpactPct = exports.estimateActualRate = exports.checkMinAmountForPool = exports.checkMinAmountForPath = exports.checkLiquidityForPool = exports.checkLiquidityForPath = exports.buildSwapExtrinsic = exports._getPoolInfo = void 0;
7
+ exports.getReserveForPool = exports.getReserveForPath = exports.estimateTokensForPool = exports.estimateTokensForPath = exports.estimateRateForPath = exports.estimateRateAfterForPath = exports.estimatePriceImpactPct = exports.estimateActualRate = exports.checkMinAmountForPool = exports.checkMinAmountForPath = exports.checkLiquidityForPool = exports.checkLiquidityForPath = exports.buildSwapExtrinsic = exports._getPoolInfo = void 0;
8
8
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
9
9
  var _swap = require("@subwallet/extension-base/types/swap");
10
10
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
@@ -47,7 +47,7 @@ const getReserveForPath = async (api, paths) => {
47
47
  };
48
48
  exports.getReserveForPath = getReserveForPath;
49
49
  const estimateTokensForPool = (amount, reserves) => {
50
- if (amount === '0') {
50
+ if (!amount || amount === '0') {
51
51
  return '0';
52
52
  }
53
53
  return new _bignumber.default(amount).times(reserves[1]).div(reserves[0]).integerValue(_bignumber.default.ROUND_DOWN).toString();
@@ -85,7 +85,7 @@ const estimateActualRate = (amount, reserves) => {
85
85
  return result.toString();
86
86
  };
87
87
  exports.estimateActualRate = estimateActualRate;
88
- const estimateRateAfter = (amount, reserves) => {
88
+ const estimateRateAfterForPath = (amount, reserves) => {
89
89
  const m = new _bignumber.default(amount);
90
90
  const reserve = reserves[0];
91
91
  const x = new _bignumber.default(reserve[0]);
@@ -94,7 +94,7 @@ const estimateRateAfter = (amount, reserves) => {
94
94
  const result = x.plus(m).div(y.minus(n));
95
95
  return result.toString();
96
96
  };
97
- exports.estimateRateAfter = estimateRateAfter;
97
+ exports.estimateRateAfterForPath = estimateRateAfterForPath;
98
98
  const estimatePriceImpactPct = (marketRate, marketRateAfter) => {
99
99
  const bnMarketRate = new _bignumber.default(marketRate);
100
100
  const bnActualRate = new _bignumber.default(marketRateAfter);
@@ -23,6 +23,7 @@ class SwapBaseHandler {
23
23
  let {
24
24
  balanceService,
25
25
  chainService,
26
+ feeService,
26
27
  providerName,
27
28
  providerSlug
28
29
  } = _ref;
@@ -30,6 +31,7 @@ class SwapBaseHandler {
30
31
  this.providerSlug = providerSlug;
31
32
  this.chainService = chainService;
32
33
  this.balanceService = balanceService;
34
+ this.feeService = feeService;
33
35
  }
34
36
 
35
37
  // public abstract getSwapQuote(request: SwapRequest): Promise<SwapQuote | SwapError>;
@@ -19,6 +19,7 @@ var _utils2 = require("@subwallet/extension-base/services/swap-service/utils");
19
19
  var _types = require("@subwallet/extension-base/types");
20
20
  var _serviceBase = require("@subwallet/extension-base/types/service-base");
21
21
  var _swap3 = require("@subwallet/extension-base/types/swap");
22
+ var _getId = require("@subwallet/extension-base/utils/getId");
22
23
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
23
24
  // Copyright 2019-2022 @subwallet/extension-base
24
25
  // SPDX-License-Identifier: Apache-2.0
@@ -41,11 +42,12 @@ var CHAINFLIP_QUOTE_ERROR;
41
42
  CHAINFLIP_QUOTE_ERROR["InsufficientIngress"] = "amount is lower than estimated ingress fee";
42
43
  })(CHAINFLIP_QUOTE_ERROR || (CHAINFLIP_QUOTE_ERROR = {}));
43
44
  class ChainflipSwapHandler {
44
- constructor(chainService, balanceService) {
45
- let isTestnet = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
45
+ constructor(chainService, balanceService, feeService) {
46
+ let isTestnet = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
46
47
  this.swapBaseHandler = new _baseHandler.SwapBaseHandler({
47
48
  chainService,
48
49
  balanceService,
50
+ feeService,
49
51
  providerName: isTestnet ? 'Chainflip Testnet' : 'Chainflip',
50
52
  providerSlug: isTestnet ? _swap3.SwapProviderId.CHAIN_FLIP_TESTNET : _swap3.SwapProviderId.CHAIN_FLIP_MAINNET
51
53
  });
@@ -396,11 +398,30 @@ class ChainflipSwapHandler {
396
398
  });
397
399
  extrinsic = submittableExtrinsic;
398
400
  } else {
401
+ const id = (0, _getId.getId)();
402
+ const feeInfo = await this.swapBaseHandler.feeService.subscribeChainFee(id, chainInfo.slug, 'evm');
399
403
  if ((0, _utils._isNativeToken)(fromAsset)) {
400
- const [transactionConfig] = await (0, _smartContract.getEVMTransactionObject)(chainInfo, address, depositAddressResponse.depositAddress, quote.fromAmount, false, this.chainService.getEvmApi(chainInfo.slug));
404
+ const [transactionConfig] = await (0, _smartContract.getEVMTransactionObject)({
405
+ chain: chainInfo.slug,
406
+ evmApi: this.chainService.getEvmApi(chainInfo.slug),
407
+ from: address,
408
+ to: depositAddressResponse.depositAddress,
409
+ value: quote.fromAmount,
410
+ feeInfo,
411
+ transferAll: false
412
+ });
401
413
  extrinsic = transactionConfig;
402
414
  } else {
403
- const [transactionConfig] = await (0, _smartContract.getERC20TransactionObject)((0, _utils._getContractAddressOfToken)(fromAsset), chainInfo, address, depositAddressResponse.depositAddress, quote.fromAmount, false, this.chainService.getEvmApi(chainInfo.slug));
415
+ const [transactionConfig] = await (0, _smartContract.getERC20TransactionObject)({
416
+ assetAddress: (0, _utils._getContractAddressOfToken)(fromAsset),
417
+ chain: chainInfo.slug,
418
+ evmApi: this.chainService.getEvmApi(chainInfo.slug),
419
+ from: address,
420
+ to: depositAddressResponse.depositAddress,
421
+ value: quote.fromAmount,
422
+ feeInfo,
423
+ transferAll: false
424
+ });
404
425
  extrinsic = transactionConfig;
405
426
  }
406
427
  }
@@ -19,6 +19,7 @@ var _utils2 = require("@subwallet/extension-base/services/swap-service/utils");
19
19
  var _types2 = require("@subwallet/extension-base/types");
20
20
  var _serviceBase = require("@subwallet/extension-base/types/service-base");
21
21
  var _swap2 = require("@subwallet/extension-base/types/swap");
22
+ var _getId = require("@subwallet/extension-base/utils/getId");
22
23
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
23
24
  // Copyright 2019-2022 @subwallet/extension-base
24
25
  // SPDX-License-Identifier: Apache-2.0
@@ -31,11 +32,12 @@ const HYDRADX_TESTNET_SUBWALLET_REFERRAL_ACCOUNT = '7LCt6dFqtxzdKVB2648jWW9d85do
31
32
  class HydradxHandler {
32
33
  isTestnet = true;
33
34
  isReady = false;
34
- constructor(chainService, balanceService) {
35
- let isTestnet = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
35
+ constructor(chainService, balanceService, feeService) {
36
+ let isTestnet = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
36
37
  this.swapBaseHandler = new _baseHandler.SwapBaseHandler({
37
38
  balanceService,
38
39
  chainService,
40
+ feeService,
39
41
  providerName: isTestnet ? 'Hydration Testnet' : 'Hydration',
40
42
  providerSlug: isTestnet ? _swap2.SwapProviderId.HYDRADX_TESTNET : _swap2.SwapProviderId.HYDRADX_MAINNET
41
43
  });
@@ -97,6 +99,7 @@ class HydradxHandler {
97
99
  }
98
100
  try {
99
101
  const alternativeChainInfo = this.chainService.getChainInfoByKey(alternativeAsset.originChain);
102
+ const destChainInfo = this.chainService.getChainInfoByKey(this.chain());
100
103
  const step = {
101
104
  metadata: {
102
105
  sendingValue: bnAmount.toString(),
@@ -107,13 +110,18 @@ class HydradxHandler {
107
110
  type: _serviceBase.CommonStepType.XCM
108
111
  };
109
112
  const xcmOriginSubstrateApi = await this.chainService.getSubstrateApi(alternativeAsset.originChain).isReady;
113
+ const id = (0, _getId.getId)();
114
+ const feeInfo = await this.swapBaseHandler.feeService.subscribeChainFee(id, alternativeAsset.originChain, 'substrate');
110
115
  const xcmTransfer = await (0, _xcm.createXcmExtrinsic)({
111
116
  originTokenInfo: alternativeAsset,
112
117
  destinationTokenInfo: fromAsset,
113
118
  sendingValue: bnAmount.toString(),
114
119
  recipient: params.request.address,
115
- chainInfoMap: this.chainService.getChainInfoMap(),
116
- substrateApi: xcmOriginSubstrateApi
120
+ substrateApi: xcmOriginSubstrateApi,
121
+ sender: params.request.address,
122
+ destinationChain: destChainInfo,
123
+ originChain: alternativeChainInfo,
124
+ feeInfo
117
125
  });
118
126
  const _xcmFeeInfo = await xcmTransfer.paymentInfo(params.request.address);
119
127
  const xcmFeeInfo = _xcmFeeInfo.toPrimitive();
@@ -305,6 +313,8 @@ class HydradxHandler {
305
313
  const alternativeAssetSlug = (0, _utils2.getSwapAlternativeAsset)(pair);
306
314
  const originAsset = this.chainService.getAssetBySlug(alternativeAssetSlug);
307
315
  const destinationAsset = this.chainService.getAssetBySlug(pair.from);
316
+ const originChain = this.chainService.getChainInfoByKey(originAsset.originChain);
317
+ const destinationChain = this.chainService.getChainInfoByKey(destinationAsset.originChain);
308
318
  const substrateApi = this.chainService.getSubstrateApi(originAsset.originChain);
309
319
  const chainApi = await substrateApi.isReady;
310
320
  const destinationAssetBalance = await this.balanceService.getTransferableBalance(params.address, destinationAsset.originChain, destinationAsset.slug);
@@ -317,13 +327,17 @@ class HydradxHandler {
317
327
 
318
328
  bnTotalAmount = bnTotalAmount.plus(bnXcmFee);
319
329
  }
330
+ const feeInfo = await this.swapBaseHandler.feeService.subscribeChainFee((0, _getId.getId)(), originAsset.originChain, 'substrate');
320
331
  const xcmTransfer = await (0, _xcm.createXcmExtrinsic)({
321
332
  originTokenInfo: originAsset,
322
333
  destinationTokenInfo: destinationAsset,
323
334
  sendingValue: bnTotalAmount.toString(),
324
335
  recipient: params.address,
325
- chainInfoMap: this.chainService.getChainInfoMap(),
326
- substrateApi: chainApi
336
+ substrateApi: chainApi,
337
+ sender: params.address,
338
+ destinationChain,
339
+ originChain,
340
+ feeInfo
327
341
  });
328
342
  const xcmData = {
329
343
  originNetworkKey: originAsset.originChain,
@@ -11,6 +11,7 @@ var _swap = require("@subwallet/extension-base/core/logic-validation/swap");
11
11
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
12
12
  var _types = require("@subwallet/extension-base/types");
13
13
  var _utils2 = require("@subwallet/extension-base/utils");
14
+ var _getId = require("@subwallet/extension-base/utils/getId");
14
15
  var _bignumber = _interopRequireWildcard(require("bignumber.js"));
15
16
  var _smartContract = require("../../balance-service/transfer/smart-contract");
16
17
  var _token = require("../../balance-service/transfer/token");
@@ -125,10 +126,11 @@ const createSwapRequest = async params => {
125
126
  };
126
127
  };
127
128
  class SimpleSwapHandler {
128
- constructor(chainService, balanceService) {
129
+ constructor(chainService, balanceService, feeService) {
129
130
  this.swapBaseHandler = new _baseHandler.SwapBaseHandler({
130
131
  chainService,
131
132
  balanceService,
133
+ feeService,
132
134
  providerName: 'SimpleSwap',
133
135
  providerSlug: _types.SwapProviderId.SIMPLE_SWAP
134
136
  });
@@ -423,11 +425,29 @@ class SimpleSwapHandler {
423
425
  });
424
426
  extrinsic = submittableExtrinsic;
425
427
  } else {
428
+ const feeInfo = await this.swapBaseHandler.feeService.subscribeChainFee((0, _getId.getId)(), chainInfo.slug, 'evm');
426
429
  if ((0, _utils._isNativeToken)(fromAsset)) {
427
- const [transactionConfig] = await (0, _smartContract.getEVMTransactionObject)(chainInfo, address, addressFrom, quote.fromAmount, false, this.chainService.getEvmApi(chainInfo.slug));
430
+ const [transactionConfig] = await (0, _smartContract.getEVMTransactionObject)({
431
+ evmApi: this.chainService.getEvmApi(chainInfo.slug),
432
+ transferAll: false,
433
+ value: quote.fromAmount,
434
+ from: address,
435
+ to: addressFrom,
436
+ chain: chainInfo.slug,
437
+ feeInfo
438
+ });
428
439
  extrinsic = transactionConfig;
429
440
  } else {
430
- const [transactionConfig] = await (0, _smartContract.getERC20TransactionObject)((0, _utils._getContractAddressOfToken)(fromAsset), chainInfo, address, addressFrom, quote.fromAmount, false, this.chainService.getEvmApi(chainInfo.slug));
441
+ const [transactionConfig] = await (0, _smartContract.getERC20TransactionObject)({
442
+ assetAddress: (0, _utils._getContractAddressOfToken)(fromAsset),
443
+ chain: chainInfo.slug,
444
+ evmApi: this.chainService.getEvmApi(chainInfo.slug),
445
+ feeInfo,
446
+ from: address,
447
+ to: addressFrom,
448
+ value: quote.fromAmount,
449
+ transferAll: false
450
+ });
431
451
  extrinsic = transactionConfig;
432
452
  }
433
453
  }