@subwallet/extension-base 1.3.77-0 → 1.3.78-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 (74) hide show
  1. package/background/KoniTypes.d.ts +2 -0
  2. package/cjs/core/logic-validation/index.js +1 -1
  3. package/cjs/core/substrate/xcm-parser.js +10 -1
  4. package/cjs/koni/background/handlers/Extension.js +35 -8
  5. package/cjs/koni/background/handlers/State.js +20 -0
  6. package/cjs/packageInfo.js +1 -1
  7. package/cjs/services/balance-service/helpers/subscribe/evm.js +85 -6
  8. package/cjs/services/balance-service/helpers/subscribe/index.js +2 -1
  9. package/cjs/services/balance-service/index.js +6 -2
  10. package/cjs/services/balance-service/transfer/token.js +15 -0
  11. package/cjs/services/balance-service/transfer/xcm/bittensorBridge/index.js +27 -0
  12. package/cjs/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.js +58 -0
  13. package/cjs/services/balance-service/transfer/xcm/bittensorBridge/utils.js +36 -0
  14. package/cjs/services/balance-service/transfer/xcm/index.js +61 -2
  15. package/cjs/services/balance-service/transfer/xcm/utils.js +94 -6
  16. package/cjs/services/chain-service/constants.js +4 -2
  17. package/cjs/services/chain-service/utils/patch.js +1 -1
  18. package/cjs/services/earning-service/constants/chains.js +4 -2
  19. package/cjs/services/earning-service/handlers/special.js +82 -65
  20. package/cjs/services/earning-service/service.js +1 -0
  21. package/cjs/services/swap-service/handler/bittensor-handler.js +197 -0
  22. package/cjs/services/swap-service/index.js +7 -0
  23. package/cjs/services/transaction-service/index.js +1 -0
  24. package/cjs/types/balance/index.js +1 -0
  25. package/cjs/types/swap/index.js +3 -1
  26. package/cjs/utils/fee/transfer.js +20 -5
  27. package/core/logic-validation/index.js +1 -1
  28. package/core/substrate/xcm-parser.d.ts +2 -0
  29. package/core/substrate/xcm-parser.js +8 -1
  30. package/koni/background/handlers/Extension.js +36 -9
  31. package/koni/background/handlers/State.d.ts +1 -0
  32. package/koni/background/handlers/State.js +20 -0
  33. package/package.json +26 -6
  34. package/packageInfo.js +1 -1
  35. package/services/balance-service/helpers/subscribe/evm.d.ts +1 -0
  36. package/services/balance-service/helpers/subscribe/evm.js +76 -1
  37. package/services/balance-service/helpers/subscribe/index.js +2 -1
  38. package/services/balance-service/index.js +6 -2
  39. package/services/balance-service/transfer/token.d.ts +2 -1
  40. package/services/balance-service/transfer/token.js +15 -0
  41. package/services/balance-service/transfer/xcm/bittensorBridge/index.d.ts +2 -0
  42. package/services/balance-service/transfer/xcm/bittensorBridge/index.js +5 -0
  43. package/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.d.ts +6 -0
  44. package/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.js +50 -0
  45. package/services/balance-service/transfer/xcm/bittensorBridge/utils.d.ts +8 -0
  46. package/services/balance-service/transfer/xcm/bittensorBridge/utils.js +29 -0
  47. package/services/balance-service/transfer/xcm/index.d.ts +5 -0
  48. package/services/balance-service/transfer/xcm/index.js +57 -2
  49. package/services/balance-service/transfer/xcm/utils.d.ts +3 -2
  50. package/services/balance-service/transfer/xcm/utils.js +87 -1
  51. package/services/chain-service/constants.d.ts +2 -0
  52. package/services/chain-service/constants.js +4 -2
  53. package/services/chain-service/utils/patch.d.ts +1 -1
  54. package/services/chain-service/utils/patch.js +1 -1
  55. package/services/earning-service/constants/chains.d.ts +1 -0
  56. package/services/earning-service/constants/chains.js +2 -1
  57. package/services/earning-service/handlers/special.d.ts +1 -1
  58. package/services/earning-service/handlers/special.js +85 -68
  59. package/services/earning-service/service.js +1 -0
  60. package/services/swap-service/handler/bittensor-handler.d.ts +21 -0
  61. package/services/swap-service/handler/bittensor-handler.js +189 -0
  62. package/services/swap-service/index.js +7 -0
  63. package/services/transaction-service/index.js +1 -0
  64. package/services/transaction-service/types.d.ts +4 -3
  65. package/types/balance/index.d.ts +3 -1
  66. package/types/balance/index.js +1 -0
  67. package/types/balance/transfer.d.ts +7 -0
  68. package/types/fee/base.d.ts +1 -0
  69. package/types/swap/index.d.ts +3 -1
  70. package/types/swap/index.js +3 -1
  71. package/types/yield/actions/join/step.d.ts +6 -0
  72. package/types/yield/actions/join/submit.d.ts +1 -0
  73. package/utils/fee/transfer.d.ts +1 -0
  74. package/utils/fee/transfer.js +21 -6
@@ -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.getXcmOriginFee = exports.dryRunXcmExtrinsicV2 = exports.createXcmExtrinsicV2 = exports.createSnowBridgeExtrinsic = exports.createPolygonBridgeExtrinsic = exports.createAvailBridgeTxFromEth = exports.createAvailBridgeExtrinsicFromAvail = exports.createAcrossBridgeExtrinsic = void 0;
7
+ exports.getXcmOriginFee = exports.getMinXcmTransferableAmount = exports.dryRunXcmExtrinsicV2 = exports.createXcmExtrinsicV2 = exports.createSubtensorEvmToBittensorExtrinsic = exports.createSnowBridgeExtrinsic = exports.createPolygonBridgeExtrinsic = exports.createBittensorToSubtensorEvmExtrinsic = exports.createAvailBridgeTxFromEth = exports.createAvailBridgeExtrinsicFromAvail = exports.createAcrossBridgeExtrinsic = void 0;
8
8
  var _xcmParser = require("@subwallet/extension-base/core/substrate/xcm-parser");
9
9
  var _availBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge");
10
10
  var _polygonBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge");
@@ -12,6 +12,7 @@ var _snowBridge = require("@subwallet/extension-base/services/balance-service/tr
12
12
  var _utils = require("@subwallet/extension-base/services/balance-service/transfer/xcm/utils");
13
13
  var _utils2 = require("@subwallet/extension-base/utils");
14
14
  var _subwalletServicesSdk = _interopRequireDefault(require("@subwallet-monorepos/subwallet-services-sdk"));
15
+ var _bittensorBridge = require("./bittensorBridge");
15
16
  var _posBridge = require("./posBridge");
16
17
  // Copyright 2019-2022 @subwallet/extension-base
17
18
  // SPDX-License-Identifier: Apache-2.0
@@ -112,6 +113,14 @@ const createXcmExtrinsicV2 = async request => {
112
113
  }
113
114
  };
114
115
  exports.createXcmExtrinsicV2 = createXcmExtrinsicV2;
116
+ const getMinXcmTransferableAmount = async request => {
117
+ try {
118
+ return await (0, _utils.fetchMinXcmTransferableAmount)(request);
119
+ } catch (e) {
120
+ return undefined;
121
+ }
122
+ };
123
+ exports.getMinXcmTransferableAmount = getMinXcmTransferableAmount;
115
124
  const dryRunXcmExtrinsicV2 = async function (request) {
116
125
  let isPreview = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
117
126
  try {
@@ -216,4 +225,54 @@ const createAcrossBridgeExtrinsic = async _ref5 => {
216
225
  return Promise.reject(new Error(error === null || error === void 0 ? void 0 : error.message));
217
226
  }
218
227
  };
219
- exports.createAcrossBridgeExtrinsic = createAcrossBridgeExtrinsic;
228
+
229
+ // Native bittensor <-> subtensor EVM bridge
230
+ exports.createAcrossBridgeExtrinsic = createAcrossBridgeExtrinsic;
231
+ const createBittensorToSubtensorEvmExtrinsic = async _ref6 => {
232
+ let {
233
+ destinationChain,
234
+ originChain,
235
+ recipient,
236
+ sendingValue,
237
+ substrateApi,
238
+ transferAll
239
+ } = _ref6;
240
+ if (!(0, _xcmParser._isBittensorToSubtensorEvmBridge)(originChain, destinationChain)) {
241
+ throw new Error('This is not a valid Bittensor bridge transfer');
242
+ }
243
+ if (!substrateApi) {
244
+ throw Error('Substrate API is not available');
245
+ }
246
+ const api = substrateApi.api;
247
+ await api.isReady;
248
+ const subtensorEvmAddress = (0, _bittensorBridge.evmToSs58)(recipient);
249
+ if (transferAll) {
250
+ return api.tx.balances.transferAll(subtensorEvmAddress, false);
251
+ }
252
+ return api.tx.balances.transferKeepAlive(subtensorEvmAddress, sendingValue);
253
+ };
254
+ exports.createBittensorToSubtensorEvmExtrinsic = createBittensorToSubtensorEvmExtrinsic;
255
+ const createSubtensorEvmToBittensorExtrinsic = async _ref7 => {
256
+ let {
257
+ destinationChain,
258
+ evmApi,
259
+ feeCustom,
260
+ feeInfo,
261
+ feeOption,
262
+ originChain,
263
+ recipient,
264
+ sender,
265
+ sendingValue
266
+ } = _ref7;
267
+ if (!(0, _xcmParser._isSubtensorEvmtoBittensorBridge)(originChain, destinationChain)) {
268
+ throw new Error('This is not a valid Subtensor EVM bridge transfer');
269
+ }
270
+ if (!evmApi) {
271
+ throw Error('Evm API is not available');
272
+ }
273
+ if (!sender) {
274
+ throw Error('Sender is required');
275
+ }
276
+ return (0, _bittensorBridge.getSubtensorEvmtoBittensorExtrinsic)(sender, recipient, sendingValue, evmApi, feeInfo, feeCustom, feeOption);
277
+ };
278
+ exports.createSubtensorEvmToBittensorExtrinsic = createSubtensorEvmToBittensorExtrinsic;
@@ -8,13 +8,22 @@ exports.buildXcm = buildXcm;
8
8
  exports.dryRunPreviewXcm = dryRunPreviewXcm;
9
9
  exports.dryRunXcm = dryRunXcm;
10
10
  exports.estimateXcmFee = estimateXcmFee;
11
+ exports.fetchMinXcmTransferableAmount = fetchMinXcmTransferableAmount;
11
12
  exports.isChainNotSupportDryRun = isChainNotSupportDryRun;
12
13
  exports.isChainNotSupportPolkadotApi = isChainNotSupportPolkadotApi;
14
+ exports.isSubstrateCrossChain = isSubstrateCrossChain;
13
15
  var _paraspellChainMap = require("@subwallet/extension-base/constants/paraspell-chain-map");
16
+ var _xcmParser = require("@subwallet/extension-base/core/substrate/xcm-parser");
17
+ var _acrossBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/acrossBridge");
18
+ var _availBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge");
19
+ var _polygonBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge");
20
+ var _posBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/posBridge");
21
+ var _utils = require("@subwallet/extension-base/services/chain-service/utils");
14
22
  var _environment = require("@subwallet/extension-base/types/environment");
15
- var _utils = require("@subwallet/extension-base/utils");
23
+ var _utils2 = require("@subwallet/extension-base/utils");
16
24
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
17
25
  var _util = require("@polkadot/util");
26
+ var _bittensorBridge = require("./bittensorBridge");
18
27
  // Copyright 2019-2022 @subwallet/extension-base
19
28
  // SPDX-License-Identifier: Apache-2.0
20
29
 
@@ -23,7 +32,9 @@ const paraSpellApi = {
23
32
  buildXcm: `${version}/x-transfer`,
24
33
  feeXcm: `${version}/xcm-fee`,
25
34
  dryRunXcm: `${version}/dry-run`,
26
- dryRunPreviewXcm: `${version}/dry-run-preview`
35
+ dryRunPreviewXcm: `${version}/dry-run-preview`,
36
+ maxTransferable: `${version}/transferable-amount`,
37
+ minTransferable: `${version}/min-transferable-amount`
27
38
  };
28
39
  function txHexToSubmittableExtrinsic(api, hex) {
29
40
  try {
@@ -105,7 +116,7 @@ async function buildXcm(request) {
105
116
  abstractDecimals: false
106
117
  }
107
118
  };
108
- const response = await (0, _utils.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.buildXcm, {
119
+ const response = await (0, _utils2.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.buildXcm, {
109
120
  method: 'POST',
110
121
  body: JSON.stringify(bodyData),
111
122
  headers: {
@@ -146,7 +157,7 @@ async function dryRunXcm(request) {
146
157
  abstractDecimals: false
147
158
  }
148
159
  };
149
- const response = await (0, _utils.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.dryRunXcm, {
160
+ const response = await (0, _utils2.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.dryRunXcm, {
150
161
  method: 'POST',
151
162
  body: JSON.stringify(bodyData),
152
163
  headers: {
@@ -191,7 +202,7 @@ async function dryRunPreviewXcm(request) {
191
202
  mintFeeAssets: true
192
203
  }
193
204
  };
194
- const response = await (0, _utils.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.dryRunPreviewXcm, {
205
+ const response = await (0, _utils2.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.dryRunPreviewXcm, {
195
206
  method: 'POST',
196
207
  body: JSON.stringify(bodyData),
197
208
  headers: {
@@ -238,7 +249,7 @@ async function estimateXcmFee(request) {
238
249
  abstractDecimals: false
239
250
  }
240
251
  };
241
- const response = await (0, _utils.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.feeXcm, {
252
+ const response = await (0, _utils2.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.feeXcm, {
242
253
  method: 'POST',
243
254
  body: JSON.stringify(bodyData),
244
255
  headers: {
@@ -252,6 +263,41 @@ async function estimateXcmFee(request) {
252
263
  }
253
264
  return await response.json();
254
265
  }
266
+ async function fetchMinXcmTransferableAmount(request) {
267
+ var _originTokenInfo$meta4;
268
+ const {
269
+ fromChainInfo: originChain,
270
+ fromTokenInfo: originTokenInfo,
271
+ recipient,
272
+ sender,
273
+ toChainInfo: destinationChain,
274
+ value: sendingValue
275
+ } = request;
276
+ const paraSpellChainMap = await (0, _paraspellChainMap.fetchParaSpellChainMap)();
277
+ const paraSpellIdentifyV4 = (_originTokenInfo$meta4 = originTokenInfo.metadata) === null || _originTokenInfo$meta4 === void 0 ? void 0 : _originTokenInfo$meta4.paraSpellIdentifyV4;
278
+ if (!paraSpellIdentifyV4) {
279
+ throw new Error('Token is not support XCM at this time');
280
+ }
281
+ const bodyData = {
282
+ senderAddress: sender,
283
+ address: recipient,
284
+ from: paraSpellChainMap[originChain.slug],
285
+ to: paraSpellChainMap[destinationChain.slug],
286
+ currency: createParaSpellCurrency(paraSpellIdentifyV4, sendingValue),
287
+ options: {
288
+ abstractDecimals: false
289
+ }
290
+ };
291
+ const response = await (0, _utils2.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.minTransferable, {
292
+ method: 'POST',
293
+ body: JSON.stringify(bodyData),
294
+ headers: {
295
+ 'Content-Type': 'application/json',
296
+ Accept: 'application/json'
297
+ }
298
+ });
299
+ return await response.json();
300
+ }
255
301
  function createParaSpellCurrency(paraSpellIdentifyV4, amount) {
256
302
  return {
257
303
  ...paraSpellIdentifyV4,
@@ -267,4 +313,46 @@ function isChainNotSupportDryRun(str) {
267
313
  const regex = /(?=.*DryRunApi)(?=.*not available).*/i; // Example: DryRunApi is not available on node Acala
268
314
 
269
315
  return regex.test(str);
316
+ }
317
+ function isSubstrateCrossChain(originChainInfo, destinationChainInfo) {
318
+ if (originChainInfo.slug === destinationChainInfo.slug) {
319
+ return false;
320
+ }
321
+
322
+ // isAvailBridgeFromEvm
323
+ if ((0, _utils._isPureEvmChain)(originChainInfo) && (0, _availBridge.isAvailChainBridge)(destinationChainInfo.slug)) {
324
+ return false;
325
+ }
326
+
327
+ // isAvailBridgeFromAvail
328
+ if ((0, _availBridge.isAvailChainBridge)(originChainInfo.slug) && (0, _utils._isPureEvmChain)(destinationChainInfo)) {
329
+ return false;
330
+ }
331
+
332
+ // isSnowBridgeEvmTransfer
333
+ if ((0, _utils._isPureEvmChain)(originChainInfo) && (0, _xcmParser._isSnowBridgeXcm)(originChainInfo, destinationChainInfo)) {
334
+ return false;
335
+ }
336
+
337
+ // isPolygonBridgeTransfer
338
+ if ((0, _polygonBridge._isPolygonChainBridge)(originChainInfo.slug, destinationChainInfo.slug)) {
339
+ return false;
340
+ }
341
+
342
+ // isPosBridgeTransfer
343
+ if ((0, _posBridge._isPosChainBridge)(originChainInfo.slug, destinationChainInfo.slug)) {
344
+ return false;
345
+ }
346
+
347
+ // isAcrossBridgeTransfer
348
+ if ((0, _acrossBridge._isAcrossChainBridge)(originChainInfo.slug, destinationChainInfo.slug)) {
349
+ return false;
350
+ }
351
+ if ((0, _bittensorBridge._isBittensorToSubtensorBridge)(originChainInfo.slug, destinationChainInfo.slug)) {
352
+ return false;
353
+ }
354
+ if ((0, _bittensorBridge._isSubtensorToBittensorBridge)(originChainInfo.slug, destinationChainInfo.slug)) {
355
+ return false;
356
+ }
357
+ return true;
270
358
  }
@@ -54,7 +54,8 @@ const _BALANCE_CHAIN_GROUP = {
54
54
  supportBridged: ['rococo_assethub', 'statemint', 'statemine', 'polimec'],
55
55
  bittensor: ['bittensor', 'bittensor_testnet'],
56
56
  moonbeam: ['moonbeam', 'moonriver', 'moonbase'],
57
- notSupportGetBalanceByType: ['vara_network', 'vara_testnet', 'availTuringTest', 'avail_mainnet']
57
+ notSupportGetBalanceByType: ['vara_network', 'vara_testnet', 'availTuringTest', 'avail_mainnet'],
58
+ subtensor_evm: ['subtensor_evm']
58
59
  };
59
60
  exports._BALANCE_CHAIN_GROUP = _BALANCE_CHAIN_GROUP;
60
61
  const _BALANCE_LOCKED_ID_GROUP = {
@@ -313,7 +314,8 @@ const _TRANSFER_CHAIN_GROUP = {
313
314
  pendulum: ['pendulum', 'amplitude', 'amplitude_test', 'hydradx_main', 'bifrost', 'bifrost_dot', 'jamton', 'hydradx_hollarnet'],
314
315
  centrifuge: ['centrifuge'],
315
316
  disable_transfer: ['crab', 'pangolin'],
316
- truth: ['truth_network']
317
+ truth: ['truth_network'],
318
+ bittensor: ['bittensor', 'bittensor_testnet']
317
319
  };
318
320
  exports._TRANSFER_CHAIN_GROUP = _TRANSFER_CHAIN_GROUP;
319
321
  const USE_MULTILOCATION_INDEX = ['energy_web_x'];
@@ -12,7 +12,7 @@ const PRODUCTION_BRANCHES = ['master', 'webapp', 'webapp-dev'];
12
12
  const branchName = process.env.BRANCH_NAME || 'subwallet-dev';
13
13
  const fetchDomain = process.env.PATCH_CHAIN_LIST_URL || (PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'https://chain-list-assets.subwallet.app' : 'https://dev.sw-chain-list-assets.pages.dev');
14
14
  const fetchFile = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'list.json' : 'preview.json';
15
- const ChainListVersion = '0.2.126'; // update this when build chain-list
15
+ const ChainListVersion = '0.2.127'; // update this when build chain-list
16
16
 
17
17
  // todo: move this interface to chainlist
18
18
  exports.ChainListVersion = ChainListVersion;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports._STAKING_CHAIN_GROUP = exports.TON_CHAINS = exports.SUNSETTED_YIELD_POOL_SLUGS = exports.ST_LIQUID_TOKEN_ABI = exports.STAKING_IDENTITY_API_SLUG = exports.RELAY_HANDLER_DIRECT_STAKING_CHAINS = exports.MaxEraRewardPointsEras = exports.MANTA_VALIDATOR_POINTS_PER_BLOCK = exports.MANTA_MIN_DELEGATION = exports.CHANNEL_ID = void 0;
6
+ exports._STAKING_CHAIN_GROUP = exports.TON_CHAINS = exports.SUNSETTED_YIELD_POOL_SLUGS = exports.ST_LIQUID_TOKEN_ABI = exports.STAKING_IDENTITY_API_SLUG = exports.RELAY_HANDLER_DIRECT_STAKING_CHAINS = exports.MaxEraRewardPointsEras = exports.MIN_XCM_LIQUID_STAKING_DOT = exports.MANTA_VALIDATOR_POINTS_PER_BLOCK = exports.MANTA_MIN_DELEGATION = exports.CHANNEL_ID = void 0;
7
7
  var _stellaSwap = require("../handlers/liquid-staking/stella-swap");
8
8
  // Copyright 2019-2022 @subwallet/extension-base
9
9
  // SPDX-License-Identifier: Apache-2.0
@@ -52,4 +52,6 @@ const STAKING_IDENTITY_API_SLUG = {
52
52
  statemine: 'peopleKusama',
53
53
  statemint: 'polkadot_people'
54
54
  };
55
- exports.STAKING_IDENTITY_API_SLUG = STAKING_IDENTITY_API_SLUG;
55
+ exports.STAKING_IDENTITY_API_SLUG = STAKING_IDENTITY_API_SLUG;
56
+ const MIN_XCM_LIQUID_STAKING_DOT = '15000000000';
57
+ exports.MIN_XCM_LIQUID_STAKING_DOT = MIN_XCM_LIQUID_STAKING_DOT;
@@ -12,6 +12,7 @@ var _utils = require("@subwallet/extension-base/koni/api/yield/helper/utils");
12
12
  var _xcm = require("@subwallet/extension-base/services/balance-service/transfer/xcm");
13
13
  var _utils2 = require("@subwallet/extension-base/services/balance-service/transfer/xcm/utils");
14
14
  var _utils3 = require("@subwallet/extension-base/services/chain-service/utils");
15
+ var _constants2 = require("@subwallet/extension-base/services/earning-service/constants");
15
16
  var _types = require("@subwallet/extension-base/types");
16
17
  var _utils4 = require("@subwallet/extension-base/utils");
17
18
  var _getId = require("@subwallet/extension-base/utils/getId");
@@ -214,51 +215,51 @@ class BaseSpecialStakingPoolHandler extends _base.default {
214
215
  address,
215
216
  amount
216
217
  } = params;
217
- const bnAmount = new _util.BN(amount);
218
+ const bnStakeAmount = new _bignumber.default(amount);
218
219
  const inputTokenSlug = this.inputAsset; // assume that the pool only has 1 input token, will update later
219
220
  const inputTokenInfo = this.state.getAssetBySlug(inputTokenSlug);
220
221
  const inputTokenBalance = await this.state.balanceService.getTransferableBalance(address, inputTokenInfo.originChain, inputTokenSlug);
221
- const bnInputTokenBalance = new _util.BN(inputTokenBalance.value);
222
- if (!bnInputTokenBalance.gte(bnAmount)) {
222
+ const bnInputTokenBalance = new _bignumber.default(inputTokenBalance.value);
223
+ if (amount && !bnInputTokenBalance.gte(bnStakeAmount)) {
223
224
  if (this.altInputAsset) {
224
225
  const altInputTokenSlug = this.altInputAsset;
225
226
  const altInputTokenInfo = this.state.getAssetBySlug(altInputTokenSlug);
226
227
  const altInputTokenBalance = await this.state.balanceService.getTransferableBalance(address, altInputTokenInfo.originChain, altInputTokenSlug);
227
- const bnAltInputTokenBalance = new _util.BN(altInputTokenBalance.value || '0');
228
- if (bnAltInputTokenBalance.gt(_util.BN_ZERO)) {
228
+ const bnAltInputTokenBalance = new _bignumber.default(altInputTokenBalance.value || '0');
229
+ if (bnAltInputTokenBalance.gt((0, _bignumber.default)(0))) {
229
230
  const altChainInfo = this.state.getChainInfo(altInputTokenInfo.originChain);
230
231
  const symbol = altInputTokenInfo.symbol;
231
232
  const networkName = altChainInfo.name;
232
-
233
- // TODO: calculate fee for destination chain
234
- const xcmFeeInfo = await (0, _utils2.estimateXcmFee)({
233
+ const xcmRequest = {
235
234
  fromChainInfo: altChainInfo,
236
235
  fromTokenInfo: altInputTokenInfo,
237
236
  toChainInfo: this.chainInfo,
238
237
  recipient: address,
239
238
  sender: address,
240
- value: bnAmount.toString()
241
- });
239
+ value: bnStakeAmount.toString()
240
+ };
241
+ const [xcmFeeInfo, _minXcmTransferableAmount] = await Promise.all([(0, _utils2.estimateXcmFee)(xcmRequest), (0, _xcm.getMinXcmTransferableAmount)(xcmRequest)]);
242
242
  if (!xcmFeeInfo) {
243
243
  throw new Error('Error estimating XCM fee');
244
244
  }
245
- const xcmFee = (0, _bignumber.default)(xcmFeeInfo.origin.fee).multipliedBy(_constants.XCM_MIN_AMOUNT_RATIO).toFixed(0, 1);
245
+ const xcmOriginFee = (0, _bignumber.default)(xcmFeeInfo.origin.fee).toFixed(0, 1);
246
+ const xcmDestinationFee = (0, _bignumber.default)(xcmFeeInfo.destination.fee).toFixed(0, 1);
246
247
  const fee = {
247
248
  slug: altInputTokenSlug,
248
- amount: xcmFee
249
+ amount: xcmOriginFee
249
250
  };
250
- let bnTransferAmount = bnAmount.sub(bnInputTokenBalance);
251
- if ((0, _utils3._isNativeToken)(altInputTokenInfo)) {
252
- const bnXcmFee = new _util.BN(fee.amount || 0); // xcm fee is paid in native token but swap token is not always native token
253
-
254
- bnTransferAmount = bnTransferAmount.add(bnXcmFee);
251
+ let sendingValue = bnStakeAmount.minus(bnInputTokenBalance).plus(xcmDestinationFee).toString();
252
+ const minXcmTransferableAmount = _minXcmTransferableAmount || _constants2.MIN_XCM_LIQUID_STAKING_DOT;
253
+ if (new _bignumber.default(minXcmTransferableAmount).gt(sendingValue)) {
254
+ sendingValue = minXcmTransferableAmount;
255
255
  }
256
+ const metadata = {
257
+ sendingValue,
258
+ originTokenInfo: altInputTokenInfo,
259
+ destinationTokenInfo: inputTokenInfo
260
+ };
256
261
  const step = {
257
- metadata: {
258
- sendingValue: bnTransferAmount.toString(),
259
- originTokenInfo: altInputTokenInfo,
260
- destinationTokenInfo: inputTokenInfo
261
- },
262
+ metadata: metadata,
262
263
  name: `Transfer ${symbol} from ${networkName}`,
263
264
  type: _types.YieldStepType.XCM
264
265
  };
@@ -301,31 +302,35 @@ class BaseSpecialStakingPoolHandler extends _base.default {
301
302
  return Promise.resolve([new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED)]);
302
303
  }
303
304
  async validateXcmStep(params, path, bnInputTokenBalance) {
305
+ // todo: BN -> BigN or BigInt
304
306
  const processValidation = {
305
307
  ok: true,
306
308
  status: _types.YieldValidationStatus.OK
307
309
  };
308
- const bnAmount = new _util.BN(params.amount);
309
- const altInputTokenSlug = this.altInputAsset || '';
310
- const altInputTokenInfo = this.state.getAssetBySlug(altInputTokenSlug);
311
- const inputTokenInfo = this.state.getAssetBySlug(this.inputAsset);
312
- const altInputTokenBalance = await this.state.balanceService.getTransferableBalance(params.address, altInputTokenInfo.originChain, altInputTokenSlug);
313
- const missingAmount = bnAmount.sub(bnInputTokenBalance); // TODO: what if input token is not LOCAL ??
314
- const xcmFeeValidate = new _util.BN(path.totalFee[1].amount || '0').mul(new _util.BN(_constants.XCM_FEE_RATIO));
315
- const bnAltInputTokenBalance = new _util.BN(altInputTokenBalance.value || '0');
316
- if (!bnAltInputTokenBalance.sub(missingAmount).sub(xcmFeeValidate).gt(_util.BN_ZERO)) {
310
+ const metadata = path.steps[1].metadata;
311
+ const {
312
+ destinationTokenInfo,
313
+ originTokenInfo,
314
+ sendingValue
315
+ } = metadata;
316
+ const originChainInfo = this.state.getChainInfo(originTokenInfo.originChain);
317
+ const originTokenBalance = await this.state.balanceService.getTransferableBalance(params.address, originTokenInfo.originChain, originTokenInfo.slug);
318
+ const bnOriginTokenBalance = new _util.BN(originTokenBalance.value || '0');
319
+ const bnAdjustOriginFee = new _util.BN(path.totalFee[1].amount || '0').mul(new _util.BN(_constants.XCM_MIN_AMOUNT_RATIO));
320
+ const bnSendingValue = new _util.BN(sendingValue);
321
+ if (!bnOriginTokenBalance.sub(bnSendingValue).sub(bnAdjustOriginFee).gt(_util.BN_ZERO)) {
317
322
  processValidation.failedStep = path.steps[1];
318
323
  processValidation.ok = false;
319
324
  processValidation.status = _types.YieldValidationStatus.NOT_ENOUGH_BALANCE;
320
- const bnMaxXCM = new _util.BN(altInputTokenBalance.value).sub(xcmFeeValidate);
321
- const inputTokenDecimal = (0, _utils3._getAssetDecimals)(inputTokenInfo);
322
- const maxBn = bnInputTokenBalance.add(bnAltInputTokenBalance.sub(xcmFeeValidate));
323
- const maxValue = (0, _utils4.formatNumber)(maxBn.toString(), inputTokenInfo.decimals || 0);
324
- const maxXCMValue = (0, _utils4.formatNumber)(bnMaxXCM.toString(), inputTokenDecimal);
325
- const symbol = (0, _utils3._getAssetSymbol)(altInputTokenInfo);
325
+ const bnMaxXCM = new _util.BN(originTokenBalance.value).sub(bnAdjustOriginFee);
326
+ const destinationTokenDecimal = (0, _utils3._getAssetDecimals)(destinationTokenInfo);
327
+ const maxBn = bnInputTokenBalance.add(bnOriginTokenBalance.sub(bnAdjustOriginFee));
328
+ const maxValue = (0, _utils4.formatNumber)(maxBn.toString(), destinationTokenInfo.decimals || 0);
329
+ const maxXCMValue = (0, _utils4.formatNumber)(bnMaxXCM.toString(), destinationTokenDecimal);
330
+ const symbol = (0, _utils3._getAssetSymbol)(originTokenInfo);
326
331
  const inputNetworkName = this.chainInfo.name;
327
- const altNetworkName = (0, _utils3._getAssetName)(altInputTokenInfo);
328
- const currentValue = (0, _utils4.formatNumber)(bnInputTokenBalance.toString(), inputTokenDecimal);
332
+ const altNetworkName = (0, _utils3._getChainName)(originChainInfo);
333
+ const currentValue = (0, _utils4.formatNumber)(bnInputTokenBalance.toString(), destinationTokenDecimal);
329
334
  processValidation.message = (0, _i18next.t)('bg.EARNING.services.service.earning.specialHandler.maximumInputExceeded', {
330
335
  replace: {
331
336
  symbol,
@@ -338,6 +343,24 @@ class BaseSpecialStakingPoolHandler extends _base.default {
338
343
  });
339
344
  return [new _TransactionError.TransactionError(_types.YieldValidationStatus.NOT_ENOUGH_BALANCE, processValidation.message, processValidation)];
340
345
  }
346
+ const id = (0, _getId.getId)();
347
+ const feeInfo = await this.state.feeService.subscribeChainFee(id, originChainInfo.slug, 'substrate');
348
+ const substrateApi = this.state.getSubstrateApi(originChainInfo.slug);
349
+ const xcmRequest = {
350
+ destinationTokenInfo: destinationTokenInfo,
351
+ originTokenInfo: originTokenInfo,
352
+ recipient: params.address,
353
+ sendingValue,
354
+ substrateApi,
355
+ sender: params.address,
356
+ originChain: originChainInfo,
357
+ destinationChain: this.chainInfo,
358
+ feeInfo
359
+ };
360
+ const isDryRunSuccess = await (0, _xcm.dryRunXcmExtrinsicV2)(xcmRequest);
361
+ if (!isDryRunSuccess) {
362
+ return [new _TransactionError.TransactionError(_types.BasicTxErrorType.UNABLE_TO_SEND, 'Unable to perform transaction. Select another token or destination chain and try again')];
363
+ }
341
364
  return [];
342
365
  }
343
366
  async validateJoinStep(id, params, path, bnInputTokenBalance, isXcmOk) {
@@ -357,7 +380,7 @@ class BaseSpecialStakingPoolHandler extends _base.default {
357
380
  const feeTokenInfo = this.state.getAssetBySlug(feeTokenSlug);
358
381
  const inputTokenInfo = this.state.getAssetBySlug(this.inputAsset);
359
382
  const defaultFeeTokenSlug = this.feeAssets[0];
360
- const bnAmount = new _util.BN(params.amount);
383
+ const bnStakeAmount = new _util.BN(params.amount);
361
384
  if (this.feeAssets.length === 1 && feeTokenSlug === defaultFeeTokenSlug) {
362
385
  var _path$totalFee$id;
363
386
  const bnFeeAmount = new _util.BN(((_path$totalFee$id = path.totalFee[id]) === null || _path$totalFee$id === void 0 ? void 0 : _path$totalFee$id.amount) || '0');
@@ -371,13 +394,13 @@ class BaseSpecialStakingPoolHandler extends _base.default {
371
394
  return [new _TransactionError.TransactionError(_types.YieldValidationStatus.NOT_ENOUGH_FEE, processValidation.message, processValidation)];
372
395
  }
373
396
  }
374
- if (!bnAmount.gte(new _util.BN(poolInfo.statistic.earningThreshold.join || '0'))) {
397
+ if (!bnStakeAmount.gte(new _util.BN(poolInfo.statistic.earningThreshold.join || '0'))) {
375
398
  processValidation.failedStep = path.steps[id];
376
399
  processValidation.ok = false;
377
400
  processValidation.status = _types.YieldValidationStatus.NOT_ENOUGH_MIN_JOIN_POOL;
378
401
  return [new _TransactionError.TransactionError(_types.YieldValidationStatus.NOT_ENOUGH_MIN_JOIN_POOL, processValidation.message, processValidation)];
379
402
  }
380
- if (!isXcmOk && bnAmount.gt(bnInputTokenBalance)) {
403
+ if (!isXcmOk && bnStakeAmount.gt(bnInputTokenBalance)) {
381
404
  processValidation.failedStep = path.steps[id];
382
405
  processValidation.ok = false;
383
406
  processValidation.status = _types.YieldValidationStatus.NOT_ENOUGH_BALANCE;
@@ -401,8 +424,8 @@ class BaseSpecialStakingPoolHandler extends _base.default {
401
424
  const balanceService = this.state.balanceService;
402
425
  const inputTokenBalance = await balanceService.getTransferableBalance(params.address, inputTokenInfo.originChain, inputTokenSlug);
403
426
  const bnInputTokenBalance = new _util.BN(inputTokenBalance.value || '0');
404
- const bnAmount = new _util.BN(params.amount);
405
- if (bnAmount.lte(_util.BN_ZERO)) {
427
+ const bnStakeAmount = new _util.BN(params.amount);
428
+ if (bnStakeAmount.lte(_util.BN_ZERO)) {
406
429
  return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, 'Amount must be greater than 0')];
407
430
  }
408
431
  let isXcmOk = false;
@@ -436,31 +459,25 @@ class BaseSpecialStakingPoolHandler extends _base.default {
436
459
  async handleTokenApproveStep(data, path) {
437
460
  return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED));
438
461
  }
439
- async handleXcmStep(data, path, xcmFee) {
462
+ async handleXcmStep(data, path) {
463
+ const metadata = path.steps[1].metadata;
464
+ const xcmStepFee = path.totalFee[1].amount;
465
+ const address = data.address;
440
466
  const {
441
- address,
442
- amount
443
- } = data;
444
- const destinationTokenSlug = this.inputAsset;
445
- const altInputTokenSlug = this.altInputAsset || '';
446
- const altInputTokenInfo = this.state.getAssetBySlug(altInputTokenSlug);
447
- const originChainInfo = this.state.getChainInfo(altInputTokenInfo.originChain);
467
+ destinationTokenInfo,
468
+ originTokenInfo,
469
+ sendingValue
470
+ } = metadata;
471
+ const originChainInfo = this.state.getChainInfo(originTokenInfo.originChain);
448
472
  const originTokenSlug = (0, _utils3._getChainNativeTokenSlug)(originChainInfo);
449
- const originTokenInfo = this.state.getAssetBySlug(originTokenSlug);
450
- const destinationTokenInfo = this.state.getAssetBySlug(destinationTokenSlug);
451
473
  const substrateApi = this.state.getSubstrateApi(originChainInfo.slug);
452
- const inputTokenBalance = await this.state.balanceService.getTransferableBalance(address, destinationTokenInfo.originChain, destinationTokenSlug);
453
- const bnInputTokenBalance = new _util.BN(inputTokenBalance.value);
454
- const bnXcmFee = new _util.BN(xcmFee);
455
- const bnAmount = new _util.BN(amount);
456
- const bnTotalAmount = bnAmount.sub(bnInputTokenBalance).add(bnXcmFee);
457
474
  const id = (0, _getId.getId)();
458
475
  const feeInfo = await this.state.feeService.subscribeChainFee(id, originChainInfo.slug, 'substrate');
459
476
  const xcmRequest = {
460
477
  destinationTokenInfo,
461
478
  originTokenInfo,
462
479
  recipient: address,
463
- sendingValue: bnTotalAmount.toString(),
480
+ sendingValue,
464
481
  substrateApi,
465
482
  sender: address,
466
483
  originChain: originChainInfo,
@@ -476,7 +493,7 @@ class BaseSpecialStakingPoolHandler extends _base.default {
476
493
  destinationNetworkKey: destinationTokenInfo.originChain,
477
494
  from: address,
478
495
  to: address,
479
- value: bnTotalAmount.toString(),
496
+ value: sendingValue,
480
497
  tokenSlug: originTokenSlug,
481
498
  showExtraWarning: true
482
499
  };
@@ -485,8 +502,9 @@ class BaseSpecialStakingPoolHandler extends _base.default {
485
502
  extrinsicType: _KoniTypes.ExtrinsicType.TRANSFER_XCM,
486
503
  extrinsic,
487
504
  txData: xcmData,
488
- transferNativeAmount: bnTotalAmount.toString(),
489
- chainType: _KoniTypes.ChainType.SUBSTRATE
505
+ transferNativeAmount: sendingValue,
506
+ chainType: _KoniTypes.ChainType.SUBSTRATE,
507
+ xcmStepFee
490
508
  };
491
509
  }
492
510
  handleYieldJoin(data, path, currentStep) {
@@ -498,8 +516,7 @@ class BaseSpecialStakingPoolHandler extends _base.default {
498
516
  return this.handleTokenApproveStep(data, path);
499
517
  case _types.YieldStepType.XCM:
500
518
  {
501
- const xcmFee = path.totalFee[currentStep].amount || '0';
502
- return this.handleXcmStep(data, path, xcmFee);
519
+ return this.handleXcmStep(data, path);
503
520
  }
504
521
  default:
505
522
  return this.handleSubmitStep(data, path);
@@ -883,6 +883,7 @@ class EarningService {
883
883
  } = params;
884
884
  const handler = this.getPoolHandler(slug);
885
885
  if (handler) {
886
+ console.log('all step', await handler.generateOptimalPath(params));
886
887
  return handler.generateOptimalPath(params);
887
888
  } else {
888
889
  throw new _TransactionError.TransactionError(_types2.BasicTxErrorType.INTERNAL_ERROR);