@subwallet/extension-base 1.2.3-0 → 1.2.3-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/background/KoniTypes.d.ts +4 -0
  2. package/cjs/core/logic-validation/earning.js +47 -0
  3. package/cjs/core/logic-validation/swap.js +99 -0
  4. package/cjs/core/logic-validation/transfer.js +219 -0
  5. package/cjs/core/substrate/nominationpools-pallet.js +12 -0
  6. package/cjs/core/substrate/system-pallet.js +78 -0
  7. package/cjs/koni/api/dotsama/transfer.js +49 -4
  8. package/cjs/koni/api/staking/bonding/utils.js +1 -1
  9. package/cjs/koni/api/xcm/index.js +30 -2
  10. package/cjs/koni/background/handlers/Extension.js +135 -245
  11. package/cjs/packageInfo.js +1 -1
  12. package/cjs/services/balance-service/helpers/group.js +4 -27
  13. package/cjs/services/balance-service/helpers/subscribe/index.js +2 -30
  14. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +41 -80
  15. package/cjs/services/balance-service/index.js +11 -9
  16. package/cjs/services/chain-service/index.js +0 -1
  17. package/cjs/services/chain-service/utils/index.js +6 -0
  18. package/cjs/services/earning-service/handlers/base.js +1 -1
  19. package/cjs/services/earning-service/handlers/special.js +11 -12
  20. package/cjs/services/swap-service/handler/base-handler.js +28 -44
  21. package/cjs/services/swap-service/handler/chainflip-handler.js +23 -21
  22. package/cjs/services/swap-service/handler/hydradx-handler.js +40 -38
  23. package/cjs/services/swap-service/index.js +6 -0
  24. package/cjs/services/swap-service/utils.js +8 -49
  25. package/cjs/services/transaction-service/index.js +66 -155
  26. package/core/logic-validation/earning.d.ts +10 -0
  27. package/core/logic-validation/earning.js +37 -0
  28. package/core/logic-validation/swap.d.ts +8 -0
  29. package/core/logic-validation/swap.js +89 -0
  30. package/core/logic-validation/transfer.d.ts +16 -0
  31. package/core/logic-validation/transfer.js +206 -0
  32. package/core/substrate/nominationpools-pallet.d.ts +7 -0
  33. package/core/substrate/nominationpools-pallet.js +6 -0
  34. package/core/substrate/system-pallet.d.ts +27 -0
  35. package/core/substrate/system-pallet.js +71 -0
  36. package/koni/api/dotsama/transfer.d.ts +3 -1
  37. package/koni/api/dotsama/transfer.js +44 -1
  38. package/koni/api/staking/bonding/relayChain.d.ts +2 -1
  39. package/koni/api/staking/bonding/utils.js +1 -1
  40. package/koni/api/xcm/index.d.ts +2 -0
  41. package/koni/api/xcm/index.js +27 -1
  42. package/koni/background/handlers/Extension.d.ts +5 -5
  43. package/koni/background/handlers/Extension.js +111 -221
  44. package/package.json +34 -9
  45. package/packageInfo.js +1 -1
  46. package/services/balance-service/helpers/group.js +4 -27
  47. package/services/balance-service/helpers/subscribe/index.d.ts +2 -1
  48. package/services/balance-service/helpers/subscribe/index.js +2 -30
  49. package/services/balance-service/helpers/subscribe/substrate/index.d.ts +2 -1
  50. package/services/balance-service/helpers/subscribe/substrate/index.js +26 -64
  51. package/services/balance-service/index.d.ts +7 -6
  52. package/services/balance-service/index.js +12 -10
  53. package/services/chain-service/index.js +0 -1
  54. package/services/chain-service/utils/index.d.ts +1 -0
  55. package/services/chain-service/utils/index.js +4 -0
  56. package/services/earning-service/handlers/base.js +1 -1
  57. package/services/earning-service/handlers/nomination-pool/index.d.ts +2 -1
  58. package/services/earning-service/handlers/special.js +11 -12
  59. package/services/swap-service/handler/base-handler.d.ts +3 -2
  60. package/services/swap-service/handler/base-handler.js +26 -42
  61. package/services/swap-service/handler/chainflip-handler.d.ts +2 -1
  62. package/services/swap-service/handler/chainflip-handler.js +4 -2
  63. package/services/swap-service/handler/hydradx-handler.d.ts +2 -1
  64. package/services/swap-service/handler/hydradx-handler.js +7 -5
  65. package/services/swap-service/index.js +7 -1
  66. package/services/swap-service/utils.d.ts +2 -4
  67. package/services/swap-service/utils.js +7 -47
  68. package/services/transaction-service/index.d.ts +1 -1
  69. package/services/transaction-service/index.js +30 -119
  70. package/services/transaction-service/types.d.ts +1 -0
  71. package/types/balance/index.d.ts +6 -10
  72. package/types/yield/info/pallet.d.ts +0 -6
@@ -7,13 +7,13 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.SwapBaseHandler = void 0;
8
8
  var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
9
9
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
10
+ var _swap = require("@subwallet/extension-base/core/logic-validation/swap");
10
11
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
11
12
  var _utils2 = require("@subwallet/extension-base/services/swap-service/utils");
12
- var _swap = require("@subwallet/extension-base/types/swap");
13
+ var _swap2 = require("@subwallet/extension-base/types/swap");
13
14
  var _utils3 = require("@subwallet/extension-base/utils");
14
15
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
15
16
  var _i18next = require("i18next");
16
- var _utilCrypto = require("@polkadot/util-crypto");
17
17
  // Copyright 2019-2022 @subwallet/extension-base
18
18
  // SPDX-License-Identifier: Apache-2.0
19
19
 
@@ -62,7 +62,7 @@ class SwapBaseHandler {
62
62
  }
63
63
  const alternativeAsset = this.chainService.getAssetBySlug(alternativeAssetSlug);
64
64
  const fromAsset = this.chainService.getAssetBySlug(swapPair.from);
65
- const [alternativeAssetBalance, fromAssetBalance] = await Promise.all([this.balanceService.getTokenFreeBalance(params.address, alternativeAsset.originChain, alternativeAssetSlug), this.balanceService.getTokenFreeBalance(params.address, fromAsset.originChain, fromAsset.slug)]);
65
+ const [alternativeAssetBalance, fromAssetBalance] = await Promise.all([this.balanceService.getTransferableBalance(params.address, alternativeAsset.originChain, alternativeAssetSlug), this.balanceService.getTransferableBalance(params.address, fromAsset.originChain, fromAsset.slug)]);
66
66
  const bnAlternativeAssetBalance = new _bignumber.default(alternativeAssetBalance.value);
67
67
  const bnFromAssetBalance = new _bignumber.default(fromAssetBalance.value);
68
68
  const xcmFeeComponent = params.process.totalFee[stepIndex].feeComponent[0]; // todo: can do better than indexing
@@ -71,9 +71,8 @@ class SwapBaseHandler {
71
71
  if ((0, _utils._isNativeToken)(alternativeAsset)) {
72
72
  xcmAmount = xcmAmount.plus(xcmFee);
73
73
  }
74
- const alternativeTokenMinAmount = new _bignumber.default(alternativeAsset.minAmount || '0');
75
- if (!bnAlternativeAssetBalance.minus(xcmAmount).gte(alternativeTokenMinAmount)) {
76
- const maxBn = bnFromAssetBalance.plus(new _bignumber.default(alternativeAssetBalance.value)).minus(xcmFee).minus(alternativeTokenMinAmount);
74
+ if (!bnAlternativeAssetBalance.minus(xcmAmount).gt(0)) {
75
+ const maxBn = bnFromAssetBalance.plus(new _bignumber.default(alternativeAssetBalance.value)).minus(xcmFee);
77
76
  const maxValue = (0, _utils3.formatNumber)(maxBn.toString(), fromAsset.decimals || 0);
78
77
  const altInputTokenInfo = this.chainService.getAssetBySlug(alternativeAssetSlug);
79
78
  const symbol = altInputTokenInfo.symbol;
@@ -82,7 +81,7 @@ class SwapBaseHandler {
82
81
  const inputNetworkName = chain.name;
83
82
  const altNetworkName = alternativeChain.name;
84
83
  const currentValue = (0, _utils3.formatNumber)(bnFromAssetBalance.toString(), fromAsset.decimals || 0);
85
- const bnMaxXCM = new _bignumber.default(alternativeAssetBalance.value).minus(xcmFee).minus(alternativeTokenMinAmount);
84
+ const bnMaxXCM = new _bignumber.default(alternativeAssetBalance.value).minus(xcmFee);
86
85
  const maxXCMValue = (0, _utils3.formatNumber)(bnMaxXCM.toString(), fromAsset.decimals || 0);
87
86
  if (maxBn.lte(0) || bnFromAssetBalance.lte(0) || bnMaxXCM.lte(0)) {
88
87
  return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_BALANCE, (0, _i18next.t)(`Insufficient balance. Deposit ${fromAsset.symbol} and try again.`))];
@@ -110,7 +109,7 @@ class SwapBaseHandler {
110
109
  const feeInfo = params.process.totalFee[stepIndex];
111
110
  const feeAmount = feeInfo.feeComponent[0];
112
111
  const feeTokenInfo = this.chainService.getAssetBySlug(feeInfo.defaultFeeToken);
113
- const feeTokenBalance = await this.balanceService.getTokenFreeBalance(params.address, feeTokenInfo.originChain, feeTokenInfo.slug);
112
+ const feeTokenBalance = await this.balanceService.getTransferableBalance(params.address, feeTokenInfo.originChain, feeTokenInfo.slug);
114
113
  const bnFeeTokenBalance = new _bignumber.default(feeTokenBalance.value);
115
114
  const bnFeeAmount = new _bignumber.default(feeAmount.amount);
116
115
  if (bnFeeAmount.gte(bnFeeTokenBalance)) {
@@ -119,57 +118,42 @@ class SwapBaseHandler {
119
118
  return [];
120
119
  }
121
120
  async validateSwapStep(params, isXcmOk, stepIndex) {
121
+ // check swap quote timestamp
122
+ // check balance to pay transaction fee
123
+ // check balance against spending amount
122
124
  if (!params.selectedQuote) {
123
125
  return Promise.resolve([new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR)]);
124
126
  }
125
127
  const selectedQuote = params.selectedQuote;
126
128
  const currentTimestamp = +Date.now();
127
129
  if (selectedQuote.aliveUntil <= currentTimestamp) {
128
- return Promise.resolve([new _TransactionError.TransactionError(_swap.SwapErrorType.QUOTE_TIMEOUT)]);
130
+ return Promise.resolve([new _TransactionError.TransactionError(_swap2.SwapErrorType.QUOTE_TIMEOUT)]);
129
131
  }
130
- const bnAmount = new _bignumber.default(params.selectedQuote.fromAmount);
131
- const fromAsset = this.chainService.getAssetBySlug(params.selectedQuote.pair.from);
132
132
  const stepFee = params.process.totalFee[stepIndex].feeComponent;
133
- const networkFee = stepFee.find(fee => fee.feeType === _swap.SwapFeeType.NETWORK_FEE);
133
+ const networkFee = stepFee.find(fee => fee.feeType === _swap2.SwapFeeType.NETWORK_FEE);
134
134
  if (!networkFee) {
135
135
  return Promise.resolve([new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR)]);
136
136
  }
137
+ const fromAsset = this.chainService.getAssetBySlug(params.selectedQuote.pair.from);
137
138
  const feeTokenInfo = this.chainService.getAssetBySlug(networkFee.tokenSlug);
138
139
  const feeTokenChain = this.chainService.getChainInfoByKey(feeTokenInfo.originChain);
139
- const [feeTokenBalance, fromAssetBalance] = await Promise.all([this.balanceService.getTokenFreeBalance(params.address, feeTokenInfo.originChain, feeTokenInfo.slug), this.balanceService.getTokenFreeBalance(params.address, fromAsset.originChain, fromAsset.slug)]);
140
- const bnFeeTokenBalance = new _bignumber.default(feeTokenBalance.value);
141
- const bnFromAssetBalance = new _bignumber.default(fromAssetBalance.value);
142
- const bnFeeAmount = new _bignumber.default(networkFee.amount);
143
- if (bnFeeTokenBalance.lte(bnFeeAmount)) {
144
- return Promise.resolve([new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_BALANCE, `You don't have enough ${feeTokenInfo.symbol} (${feeTokenChain.name}) to pay transaction fee`)]);
140
+ const {
141
+ fromAmount,
142
+ minSwap
143
+ } = params.selectedQuote;
144
+ const [feeTokenBalance, fromAssetBalance] = await Promise.all([this.balanceService.getTransferableBalance(params.address, feeTokenInfo.originChain, feeTokenInfo.slug), this.balanceService.getTransferableBalance(params.address, fromAsset.originChain, fromAsset.slug)]);
145
+ const balanceError = (0, _swap._validateBalanceToSwap)(fromAsset, feeTokenInfo, feeTokenChain, networkFee.amount, fromAssetBalance.value, feeTokenBalance.value, fromAmount, isXcmOk, minSwap);
146
+ if (balanceError) {
147
+ return Promise.resolve([balanceError]);
145
148
  }
146
- if (fromAsset.slug === feeTokenInfo.slug) {
147
- if (bnFromAssetBalance.lte(bnFeeAmount.plus(bnAmount))) {
148
- return Promise.resolve([new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_BALANCE, `Insufficient balance. Deposit ${fromAsset.symbol} and try again.`)]);
149
- }
149
+ if (!params.recipient) {
150
+ return Promise.resolve([]);
150
151
  }
151
- if (params.selectedQuote.minSwap) {
152
- const minProtocolSwap = new _bignumber.default(params.selectedQuote.minSwap);
153
- if (!isXcmOk && bnFromAssetBalance.lte(minProtocolSwap)) {
154
- const parsedMinSwapValue = (0, _utils3.formatNumber)(minProtocolSwap, (0, _utils._getAssetDecimals)(fromAsset));
155
- return Promise.resolve([new _TransactionError.TransactionError(_swap.SwapErrorType.SWAP_NOT_ENOUGH_BALANCE, `Insufficient balance. You need more than ${parsedMinSwapValue} ${fromAsset.symbol} to start swapping. Deposit ${fromAsset.symbol} and try again.`)]); // todo: min swap or amount?
156
- }
157
- }
158
-
159
- const bnSrcAssetMinAmount = new _bignumber.default((0, _utils._getTokenMinAmount)(fromAsset));
160
- const bnMaxBalanceSwap = bnFromAssetBalance.minus(bnSrcAssetMinAmount);
161
- if (!isXcmOk && bnAmount.gte(bnMaxBalanceSwap)) {
162
- const parsedMaxBalanceSwap = (0, _utils3.formatNumber)(bnMaxBalanceSwap, (0, _utils._getAssetDecimals)(fromAsset));
163
- return Promise.resolve([new _TransactionError.TransactionError(_swap.SwapErrorType.SWAP_EXCEED_ALLOWANCE, `Amount too high. Lower your amount ${bnMaxBalanceSwap.gt(0) ? `below ${parsedMaxBalanceSwap} ${fromAsset.symbol}` : ''} and try again`)]);
164
- }
165
- if (params.recipient) {
166
- const toAsset = this.chainService.getAssetBySlug(params.selectedQuote.pair.to);
167
- const destChainInfo = this.chainService.getChainInfoByKey(toAsset.originChain);
168
- const isEvmAddress = (0, _utilCrypto.isEthereumAddress)(params.recipient);
169
- const isEvmDestChain = (0, _utils._isChainEvmCompatible)(destChainInfo);
170
- if (isEvmAddress && !isEvmDestChain || !isEvmAddress && isEvmDestChain) {
171
- return Promise.resolve([new _TransactionError.TransactionError(_swap.SwapErrorType.INVALID_RECIPIENT)]);
172
- }
152
+ const toAsset = this.chainService.getAssetBySlug(params.selectedQuote.pair.to);
153
+ const toAssetChain = this.chainService.getChainInfoByKey(toAsset.originChain);
154
+ const recipientError = (0, _swap._validateSwapRecipient)(toAssetChain, params.recipient);
155
+ if (recipientError) {
156
+ return Promise.resolve([recipientError]);
173
157
  }
174
158
  return Promise.resolve([]);
175
159
  }
@@ -10,12 +10,13 @@ var _chainList = require("@subwallet/chain-list");
10
10
  var _SwapError = require("@subwallet/extension-base/background/errors/SwapError");
11
11
  var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
12
12
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
13
+ var _swap2 = require("@subwallet/extension-base/core/logic-validation/swap");
13
14
  var _transfer = require("@subwallet/extension-base/koni/api/dotsama/transfer");
14
15
  var _transfer2 = require("@subwallet/extension-base/koni/api/tokens/evm/transfer");
15
16
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
16
17
  var _baseHandler = require("@subwallet/extension-base/services/swap-service/handler/base-handler");
17
18
  var _utils2 = require("@subwallet/extension-base/services/swap-service/utils");
18
- var _swap2 = require("@subwallet/extension-base/types/swap");
19
+ var _swap3 = require("@subwallet/extension-base/types/swap");
19
20
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
20
21
  // Copyright 2019-2022 @subwallet/extension-base
21
22
  // SPDX-License-Identifier: Apache-2.0
@@ -41,9 +42,10 @@ class ChainflipSwapHandler {
41
42
  chainService,
42
43
  balanceService,
43
44
  providerName: isTestnet ? 'Chainflip Testnet' : 'Chainflip',
44
- providerSlug: isTestnet ? _swap2.SwapProviderId.CHAIN_FLIP_TESTNET : _swap2.SwapProviderId.CHAIN_FLIP_MAINNET
45
+ providerSlug: isTestnet ? _swap3.SwapProviderId.CHAIN_FLIP_TESTNET : _swap3.SwapProviderId.CHAIN_FLIP_MAINNET
45
46
  });
46
47
  this.isTestnet = isTestnet;
48
+ this.providerSlug = isTestnet ? _swap3.SwapProviderId.CHAIN_FLIP_TESTNET : _swap3.SwapProviderId.CHAIN_FLIP_MAINNET;
47
49
  this.swapSdk = new _swap.SwapSDK({
48
50
  network: isTestnet ? 'perseverance' : 'mainnet'
49
51
  });
@@ -99,7 +101,7 @@ class ChainflipSwapHandler {
99
101
  const toAssetId = this.assetMapping[toAsset.slug];
100
102
  if (!srcChainId || !destChainId || !fromAssetId || !toAssetId) {
101
103
  return {
102
- error: _swap2.SwapErrorType.ASSET_NOT_SUPPORTED
104
+ error: _swap3.SwapErrorType.ASSET_NOT_SUPPORTED
103
105
  };
104
106
  }
105
107
  const [supportedDestChains, srcAssets, destAssets] = await Promise.all([this.swapSdk.getChains(srcChainId), this.swapSdk.getAssets(srcChainId), this.swapSdk.getAssets(destChainId)]);
@@ -108,7 +110,7 @@ class ChainflipSwapHandler {
108
110
  const destAssetData = destAssets.find(a => a.asset === toAssetId);
109
111
  if (!destAssetData || !srcAssetData || !supportedDestChainId) {
110
112
  return {
111
- error: _swap2.SwapErrorType.UNKNOWN
113
+ error: _swap3.SwapErrorType.UNKNOWN
112
114
  };
113
115
  }
114
116
  const bnAmount = new _bignumber.default(request.fromAmount);
@@ -117,12 +119,12 @@ class ChainflipSwapHandler {
117
119
  const bnMaxProtocolSwap = new _bignumber.default(srcAssetData.maximumSwapAmount);
118
120
  if (bnMinSwap.gte(bnMaxProtocolSwap)) {
119
121
  return {
120
- error: _swap2.SwapErrorType.UNKNOWN
122
+ error: _swap3.SwapErrorType.UNKNOWN
121
123
  };
122
124
  }
123
125
  if (bnAmount.gte(bnMaxProtocolSwap)) {
124
126
  return {
125
- error: _swap2.SwapErrorType.SWAP_EXCEED_ALLOWANCE,
127
+ error: _swap3.SwapErrorType.SWAP_EXCEED_ALLOWANCE,
126
128
  metadata: {
127
129
  minSwap: {
128
130
  value: srcAssetData.minimumSwapAmount,
@@ -142,7 +144,7 @@ class ChainflipSwapHandler {
142
144
  if (bnAmount.lt(bnMinSwap)) {
143
145
  // might miss case when minSwap is 0
144
146
  return {
145
- error: _swap2.SwapErrorType.NOT_MEET_MIN_SWAP,
147
+ error: _swap3.SwapErrorType.NOT_MEET_MIN_SWAP,
146
148
  metadata: {
147
149
  minSwap: {
148
150
  value: srcAssetData.minimumSwapAmount,
@@ -175,7 +177,7 @@ class ChainflipSwapHandler {
175
177
  };
176
178
  } catch (e) {
177
179
  return {
178
- error: _swap2.SwapErrorType.UNKNOWN
180
+ error: _swap3.SwapErrorType.UNKNOWN
179
181
  };
180
182
  }
181
183
  }
@@ -193,12 +195,12 @@ class ChainflipSwapHandler {
193
195
  const fromChain = this.chainService.getChainInfoByKey(fromAsset.originChain);
194
196
  const fromChainNativeTokenSlug = (0, _utils._getChainNativeTokenSlug)(fromChain);
195
197
  if (!fromAsset || !toAsset) {
196
- return new _SwapError.SwapError(_swap2.SwapErrorType.UNKNOWN);
198
+ return new _SwapError.SwapError(_swap3.SwapErrorType.UNKNOWN);
197
199
  }
198
200
  const earlyValidation = await this.validateSwapRequest(request);
199
201
  const metadata = earlyValidation.metadata;
200
202
  if (earlyValidation.error) {
201
- return (0, _utils2.getChainflipEarlyValidationError)(earlyValidation.error, metadata);
203
+ return (0, _swap2._getChainflipEarlyValidationError)(earlyValidation.error, metadata);
202
204
  }
203
205
  const srcChainId = this.chainMapping[fromAsset.originChain];
204
206
  const destChainId = this.chainMapping[toAsset.originChain];
@@ -225,7 +227,7 @@ class ChainflipSwapHandler {
225
227
  feeComponent.push({
226
228
  tokenSlug,
227
229
  amount: fee.amount,
228
- feeType: _swap2.SwapFeeType.NETWORK_FEE
230
+ feeType: _swap3.SwapFeeType.NETWORK_FEE
229
231
  });
230
232
  break;
231
233
  }
@@ -238,7 +240,7 @@ class ChainflipSwapHandler {
238
240
  feeComponent.push({
239
241
  tokenSlug,
240
242
  amount: fee.amount,
241
- feeType: _swap2.SwapFeeType.PLATFORM_FEE
243
+ feeType: _swap3.SwapFeeType.PLATFORM_FEE
242
244
  });
243
245
  break;
244
246
  }
@@ -272,12 +274,12 @@ class ChainflipSwapHandler {
272
274
  const errorObj = error === null || error === void 0 ? void 0 : (_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.data;
273
275
  if (errorObj && errorObj.error && errorObj.error.includes(CHAINFLIP_QUOTE_ERROR.InsufficientLiquidity)) {
274
276
  // todo: Chainflip will improve this
275
- return new _SwapError.SwapError(_swap2.SwapErrorType.NOT_ENOUGH_LIQUIDITY);
277
+ return new _SwapError.SwapError(_swap3.SwapErrorType.NOT_ENOUGH_LIQUIDITY);
276
278
  }
277
279
  if (errorObj && errorObj.message && errorObj.message.includes(CHAINFLIP_QUOTE_ERROR.InsufficientLiquidity)) {
278
- return new _SwapError.SwapError(_swap2.SwapErrorType.NOT_ENOUGH_LIQUIDITY);
280
+ return new _SwapError.SwapError(_swap3.SwapErrorType.NOT_ENOUGH_LIQUIDITY);
279
281
  }
280
- return new _SwapError.SwapError(_swap2.SwapErrorType.ERROR_FETCHING_QUOTE);
282
+ return new _SwapError.SwapError(_swap3.SwapErrorType.ERROR_FETCHING_QUOTE);
281
283
  }
282
284
  }
283
285
  async validateSwapProcess(params) {
@@ -290,9 +292,9 @@ class ChainflipSwapHandler {
290
292
  for (const [index, step] of params.process.steps.entries()) {
291
293
  const getErrors = async () => {
292
294
  switch (step.type) {
293
- case _swap2.SwapStepType.DEFAULT:
295
+ case _swap3.SwapStepType.DEFAULT:
294
296
  return Promise.resolve([]);
295
- case _swap2.SwapStepType.TOKEN_APPROVAL:
297
+ case _swap3.SwapStepType.TOKEN_APPROVAL:
296
298
  return Promise.reject(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.UNSUPPORTED));
297
299
  default:
298
300
  return this.swapBaseHandler.validateSwapStep(params, isXcmOk, index);
@@ -301,7 +303,7 @@ class ChainflipSwapHandler {
301
303
  const errors = await getErrors();
302
304
  if (errors.length) {
303
305
  return errors;
304
- } else if (step.type === _swap2.SwapStepType.XCM) {
306
+ } else if (step.type === _swap3.SwapStepType.XCM) {
305
307
  isXcmOk = true;
306
308
  }
307
309
  }
@@ -382,9 +384,9 @@ class ChainflipSwapHandler {
382
384
  } = params;
383
385
  const type = process.steps[currentStep].type;
384
386
  switch (type) {
385
- case _swap2.SwapStepType.DEFAULT:
387
+ case _swap3.SwapStepType.DEFAULT:
386
388
  return Promise.reject(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.UNSUPPORTED));
387
- case _swap2.SwapStepType.SWAP:
389
+ case _swap3.SwapStepType.SWAP:
388
390
  return this.handleSubmitStep(params);
389
391
  default:
390
392
  return this.handleSubmitStep(params);
@@ -394,7 +396,7 @@ class ChainflipSwapHandler {
394
396
  if (params.selectedQuote) {
395
397
  const submitStep = {
396
398
  name: 'Swap',
397
- type: _swap2.SwapStepType.SWAP
399
+ type: _swap3.SwapStepType.SWAP
398
400
  };
399
401
  return Promise.resolve([submitStep, params.selectedQuote.feeInfo]);
400
402
  }
@@ -11,11 +11,12 @@ var _types = require("@subwallet/chain-list/types");
11
11
  var _SwapError = require("@subwallet/extension-base/background/errors/SwapError");
12
12
  var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
13
13
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
14
+ var _swap = require("@subwallet/extension-base/core/logic-validation/swap");
14
15
  var _xcm = require("@subwallet/extension-base/koni/api/xcm");
15
16
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
16
17
  var _baseHandler = require("@subwallet/extension-base/services/swap-service/handler/base-handler");
17
18
  var _utils2 = require("@subwallet/extension-base/services/swap-service/utils");
18
- var _swap = require("@subwallet/extension-base/types/swap");
19
+ var _swap2 = require("@subwallet/extension-base/types/swap");
19
20
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
20
21
  // Copyright 2019-2022 @subwallet/extension-base
21
22
  // SPDX-License-Identifier: Apache-2.0
@@ -34,8 +35,9 @@ class HydradxHandler {
34
35
  balanceService,
35
36
  chainService,
36
37
  providerName: isTestnet ? 'HydraDX Testnet' : 'HydraDX',
37
- providerSlug: isTestnet ? _swap.SwapProviderId.HYDRADX_TESTNET : _swap.SwapProviderId.HYDRADX_MAINNET
38
+ providerSlug: isTestnet ? _swap2.SwapProviderId.HYDRADX_TESTNET : _swap2.SwapProviderId.HYDRADX_MAINNET
38
39
  });
40
+ this.providerSlug = isTestnet ? _swap2.SwapProviderId.HYDRADX_TESTNET : _swap2.SwapProviderId.HYDRADX_MAINNET;
39
41
  this.isTestnet = isTestnet;
40
42
  }
41
43
  async init() {
@@ -75,7 +77,7 @@ class HydradxHandler {
75
77
  async getXcmStep(params) {
76
78
  const bnAmount = new _bignumber.default(params.request.fromAmount);
77
79
  const fromAsset = this.chainService.getAssetBySlug(params.request.pair.from);
78
- const fromAssetBalance = await this.balanceService.getTokenFreeBalance(params.request.address, fromAsset.originChain, fromAsset.slug);
80
+ const fromAssetBalance = await this.balanceService.getTransferableBalance(params.request.address, fromAsset.originChain, fromAsset.slug);
79
81
  const bnFromAssetBalance = new _bignumber.default(fromAssetBalance.value);
80
82
  if (bnFromAssetBalance.gte(bnAmount)) {
81
83
  return undefined; // enough balance, no need to xcm
@@ -86,7 +88,7 @@ class HydradxHandler {
86
88
  return undefined;
87
89
  }
88
90
  const alternativeAsset = this.chainService.getAssetBySlug(alternativeAssetSlug);
89
- const alternativeAssetBalance = await this.balanceService.getTokenFreeBalance(params.request.address, alternativeAsset.originChain, alternativeAsset.slug);
91
+ const alternativeAssetBalance = await this.balanceService.getTransferableBalance(params.request.address, alternativeAsset.originChain, alternativeAsset.slug);
90
92
  const bnAlternativeAssetBalance = new _bignumber.default(alternativeAssetBalance.value);
91
93
  if (bnAlternativeAssetBalance.lte(0)) {
92
94
  return undefined;
@@ -100,7 +102,7 @@ class HydradxHandler {
100
102
  destinationTokenInfo: fromAsset
101
103
  },
102
104
  name: `Transfer ${alternativeAsset.symbol} from ${alternativeChainInfo.name}`,
103
- type: _swap.SwapStepType.XCM
105
+ type: _swap2.SwapStepType.XCM
104
106
  };
105
107
  const xcmOriginSubstrateApi = await this.chainService.getSubstrateApi(alternativeAsset.originChain).isReady;
106
108
  const xcmTransfer = await (0, _xcm.createXcmExtrinsic)({
@@ -115,7 +117,7 @@ class HydradxHandler {
115
117
  const xcmFeeInfo = _xcmFeeInfo.toPrimitive();
116
118
  const fee = {
117
119
  feeComponent: [{
118
- feeType: _swap.SwapFeeType.NETWORK_FEE,
120
+ feeType: _swap2.SwapFeeType.NETWORK_FEE,
119
121
  amount: Math.round(xcmFeeInfo.partialFee * 1.2).toString(),
120
122
  tokenSlug: (0, _utils._getChainNativeTokenSlug)(alternativeChainInfo)
121
123
  }],
@@ -137,7 +139,7 @@ class HydradxHandler {
137
139
  }
138
140
  const feeStep = {
139
141
  name: 'Set fee token',
140
- type: _swap.SwapStepType.SET_FEE_TOKEN
142
+ type: _swap2.SwapStepType.SET_FEE_TOKEN
141
143
  };
142
144
  try {
143
145
  const substrateApi = this.chainService.getSubstrateApi(this.chain());
@@ -154,7 +156,7 @@ class HydradxHandler {
154
156
  const txFee = _txFee.toPrimitive();
155
157
  const fee = {
156
158
  feeComponent: [{
157
- feeType: _swap.SwapFeeType.NETWORK_FEE,
159
+ feeType: _swap2.SwapFeeType.NETWORK_FEE,
158
160
  amount: Math.round(txFee.partialFee).toString(),
159
161
  tokenSlug: selectedFeeAsset.slug
160
162
  }],
@@ -171,7 +173,7 @@ class HydradxHandler {
171
173
  if (params.selectedQuote) {
172
174
  const submitStep = {
173
175
  name: 'Swap',
174
- type: _swap.SwapStepType.SWAP
176
+ type: _swap2.SwapStepType.SWAP
175
177
  };
176
178
  return Promise.resolve([submitStep, params.selectedQuote.feeInfo]);
177
179
  }
@@ -217,12 +219,12 @@ class HydradxHandler {
217
219
  const fromChain = this.chainService.getChainInfoByKey(fromAsset.originChain);
218
220
  const fromChainNativeTokenSlug = (0, _utils._getChainNativeTokenSlug)(fromChain);
219
221
  if (!this.isReady || !this.tradeRouter) {
220
- return new _SwapError.SwapError(_swap.SwapErrorType.UNKNOWN);
222
+ return new _SwapError.SwapError(_swap2.SwapErrorType.UNKNOWN);
221
223
  }
222
224
  const earlyValidation = await this.validateSwapRequest(request);
223
225
  if (earlyValidation.error) {
224
226
  const metadata = earlyValidation.metadata;
225
- return (0, _utils2.getEarlyHydradxValidationError)(earlyValidation.error, metadata);
227
+ return (0, _swap._getEarlyHydradxValidationError)(earlyValidation.error, metadata);
226
228
  }
227
229
  try {
228
230
  const fromAssetId = (0, _utils._getTokenOnChainAssetId)(fromAsset);
@@ -238,13 +240,13 @@ class HydradxHandler {
238
240
  const networkFee = {
239
241
  tokenSlug: fromChainNativeTokenSlug,
240
242
  amount: paymentInfo.partialFee.toString(),
241
- feeType: _swap.SwapFeeType.NETWORK_FEE
243
+ feeType: _swap2.SwapFeeType.NETWORK_FEE
242
244
  };
243
245
  const tradeFee = {
244
246
  tokenSlug: toAsset.slug,
245
247
  // fee is subtracted from receiving amount
246
248
  amount: quoteResponse.tradeFee.toString(),
247
- feeType: _swap.SwapFeeType.PLATFORM_FEE
249
+ feeType: _swap2.SwapFeeType.PLATFORM_FEE
248
250
  };
249
251
  const swapRoute = this.parseSwapPath(quoteResponse.swaps);
250
252
  const swapPathErrors = this.getSwapPathErrors(quoteResponse.swaps);
@@ -253,15 +255,15 @@ class HydradxHandler {
253
255
 
254
256
  switch (defaultError) {
255
257
  case _sdk.PoolError.InsufficientTradingAmount:
256
- return new _SwapError.SwapError(_swap.SwapErrorType.SWAP_NOT_ENOUGH_BALANCE);
258
+ return new _SwapError.SwapError(_swap2.SwapErrorType.SWAP_NOT_ENOUGH_BALANCE);
257
259
  case _sdk.PoolError.TradeNotAllowed:
258
- return new _SwapError.SwapError(_swap.SwapErrorType.ERROR_FETCHING_QUOTE);
260
+ return new _SwapError.SwapError(_swap2.SwapErrorType.ERROR_FETCHING_QUOTE);
259
261
  case _sdk.PoolError.MaxInRatioExceeded:
260
- return new _SwapError.SwapError(_swap.SwapErrorType.NOT_ENOUGH_LIQUIDITY);
262
+ return new _SwapError.SwapError(_swap2.SwapErrorType.NOT_ENOUGH_LIQUIDITY);
261
263
  case _sdk.PoolError.UnknownError:
262
- return new _SwapError.SwapError(_swap.SwapErrorType.ERROR_FETCHING_QUOTE);
264
+ return new _SwapError.SwapError(_swap2.SwapErrorType.ERROR_FETCHING_QUOTE);
263
265
  case _sdk.PoolError.MaxOutRatioExceeded:
264
- return new _SwapError.SwapError(_swap.SwapErrorType.NOT_ENOUGH_LIQUIDITY);
266
+ return new _SwapError.SwapError(_swap2.SwapErrorType.NOT_ENOUGH_LIQUIDITY);
265
267
  }
266
268
  }
267
269
 
@@ -293,7 +295,7 @@ class HydradxHandler {
293
295
  metadata: txHex
294
296
  };
295
297
  } catch (e) {
296
- return new _SwapError.SwapError(_swap.SwapErrorType.ERROR_FETCHING_QUOTE);
298
+ return new _SwapError.SwapError(_swap2.SwapErrorType.ERROR_FETCHING_QUOTE);
297
299
  }
298
300
  }
299
301
  async handleXcmStep(params) {
@@ -303,7 +305,7 @@ class HydradxHandler {
303
305
  const destinationAsset = this.chainService.getAssetBySlug(pair.from);
304
306
  const substrateApi = this.chainService.getSubstrateApi(originAsset.originChain);
305
307
  const chainApi = await substrateApi.isReady;
306
- const destinationAssetBalance = await this.balanceService.getTokenFreeBalance(params.address, destinationAsset.originChain, destinationAsset.slug);
308
+ const destinationAssetBalance = await this.balanceService.getTransferableBalance(params.address, destinationAsset.originChain, destinationAsset.slug);
307
309
  const xcmFee = params.process.totalFee[params.currentStep];
308
310
  const bnAmount = new _bignumber.default(params.quote.fromAmount);
309
311
  const bnDestinationAssetBalance = new _bignumber.default(destinationAssetBalance.value);
@@ -343,7 +345,7 @@ class HydradxHandler {
343
345
  var _swapFeeInfo$selected;
344
346
  const substrateApi = this.chainService.getSubstrateApi(this.chain());
345
347
  const chainApi = await substrateApi.isReady;
346
- const swapStepIndex = params.process.steps.findIndex(step => step.type === _swap.SwapStepType.SWAP);
348
+ const swapStepIndex = params.process.steps.findIndex(step => step.type === _swap2.SwapStepType.SWAP);
347
349
  if (swapStepIndex <= -1) {
348
350
  return Promise.reject(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR));
349
351
  }
@@ -383,7 +385,7 @@ class HydradxHandler {
383
385
  const referral = _referral === null || _referral === void 0 ? void 0 : _referral.toString();
384
386
  const needSetReferral = !referral || referral === '';
385
387
  const steps = params.process.steps.map(step => step.type);
386
- const needSetFeeToken = steps.includes(_swap.SwapStepType.SET_FEE_TOKEN);
388
+ const needSetFeeToken = steps.includes(_swap2.SwapStepType.SET_FEE_TOKEN);
387
389
  if (!needSetReferral && !needSetFeeToken) {
388
390
  extrinsic = swapTx;
389
391
  } else {
@@ -414,13 +416,13 @@ class HydradxHandler {
414
416
  } = params;
415
417
  const type = process.steps[currentStep].type;
416
418
  switch (type) {
417
- case _swap.SwapStepType.DEFAULT:
419
+ case _swap2.SwapStepType.DEFAULT:
418
420
  return Promise.reject(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.UNSUPPORTED));
419
- case _swap.SwapStepType.XCM:
421
+ case _swap2.SwapStepType.XCM:
420
422
  return this.handleXcmStep(params);
421
- case _swap.SwapStepType.SET_FEE_TOKEN:
423
+ case _swap2.SwapStepType.SET_FEE_TOKEN:
422
424
  return this.handleSetFeeStep(params);
423
- case _swap.SwapStepType.SWAP:
425
+ case _swap2.SwapStepType.SWAP:
424
426
  return this.handleSubmitStep(params);
425
427
  default:
426
428
  return this.handleSubmitStep(params);
@@ -436,11 +438,11 @@ class HydradxHandler {
436
438
  for (const [index, step] of params.process.steps.entries()) {
437
439
  const getErrors = async () => {
438
440
  switch (step.type) {
439
- case _swap.SwapStepType.DEFAULT:
441
+ case _swap2.SwapStepType.DEFAULT:
440
442
  return Promise.resolve([]);
441
- case _swap.SwapStepType.XCM:
443
+ case _swap2.SwapStepType.XCM:
442
444
  return this.swapBaseHandler.validateXcmStep(params, index);
443
- case _swap.SwapStepType.SET_FEE_TOKEN:
445
+ case _swap2.SwapStepType.SET_FEE_TOKEN:
444
446
  return this.swapBaseHandler.validateSetFeeTokenStep(params, index);
445
447
  default:
446
448
  return this.swapBaseHandler.validateSwapStep(params, isXcmOk, index);
@@ -449,7 +451,7 @@ class HydradxHandler {
449
451
  const errors = await getErrors();
450
452
  if (errors.length) {
451
453
  return errors;
452
- } else if (step.type === _swap.SwapStepType.XCM) {
454
+ } else if (step.type === _swap2.SwapStepType.XCM) {
453
455
  isXcmOk = true;
454
456
  }
455
457
  }
@@ -466,42 +468,42 @@ class HydradxHandler {
466
468
  const allAssets = await ((_this$tradeRouter = this.tradeRouter) === null || _this$tradeRouter === void 0 ? void 0 : _this$tradeRouter.getAllAssets());
467
469
  if (!allAssets) {
468
470
  return {
469
- error: _swap.SwapErrorType.UNKNOWN
471
+ error: _swap2.SwapErrorType.UNKNOWN
470
472
  };
471
473
  }
472
474
  const supportedFromAsset = allAssets.find(asset => asset.id === fromAssetId && asset.symbol === fromAsset.symbol);
473
475
  const supportedToAsset = allAssets.find(asset => asset.id === toAssetId && asset.symbol === toAsset.symbol);
474
476
  if (!supportedFromAsset || !supportedToAsset) {
475
477
  return {
476
- error: _swap.SwapErrorType.ASSET_NOT_SUPPORTED
478
+ error: _swap2.SwapErrorType.ASSET_NOT_SUPPORTED
477
479
  };
478
480
  }
479
481
  const assetPairs = await ((_this$tradeRouter2 = this.tradeRouter) === null || _this$tradeRouter2 === void 0 ? void 0 : _this$tradeRouter2.getAssetPairs(fromAssetId));
480
482
  if (!assetPairs) {
481
483
  return {
482
- error: _swap.SwapErrorType.UNKNOWN
484
+ error: _swap2.SwapErrorType.UNKNOWN
483
485
  };
484
486
  }
485
487
  const pairedToAsset = assetPairs.find(supportedToAsset => supportedToAsset.id === toAssetId && supportedToAsset.symbol === toAsset.symbol);
486
488
  if (!pairedToAsset) {
487
489
  return {
488
- error: _swap.SwapErrorType.ASSET_NOT_SUPPORTED
490
+ error: _swap2.SwapErrorType.ASSET_NOT_SUPPORTED
489
491
  };
490
492
  }
491
493
  if (!(fromAsset.originChain === this.chain() && toAsset.originChain === this.chain())) {
492
494
  return {
493
- error: _swap.SwapErrorType.ASSET_NOT_SUPPORTED
495
+ error: _swap2.SwapErrorType.ASSET_NOT_SUPPORTED
494
496
  };
495
497
  }
496
498
  if (!fromAssetId || !toAssetId) {
497
499
  return {
498
- error: _swap.SwapErrorType.UNKNOWN
500
+ error: _swap2.SwapErrorType.UNKNOWN
499
501
  };
500
502
  }
501
503
  const bnAmount = new _bignumber.default(request.fromAmount);
502
504
  if (bnAmount.lte(0)) {
503
505
  return {
504
- error: _swap.SwapErrorType.AMOUNT_CANNOT_BE_ZERO
506
+ error: _swap2.SwapErrorType.AMOUNT_CANNOT_BE_ZERO
505
507
  };
506
508
  }
507
509
  return {
@@ -511,7 +513,7 @@ class HydradxHandler {
511
513
  };
512
514
  } catch (e) {
513
515
  return {
514
- error: _swap.SwapErrorType.UNKNOWN
516
+ error: _swap2.SwapErrorType.UNKNOWN
515
517
  };
516
518
  }
517
519
  }
@@ -30,12 +30,18 @@ class SwapService {
30
30
  }
31
31
  async askProvidersForQuote(request) {
32
32
  const availableQuotes = [];
33
+ const swappingSrcChain = this.chainService.getAssetBySlug(request.pair.from).originChain;
33
34
  await Promise.all(Object.values(this.handlers).map(async handler => {
35
+ // temporary solution to reduce number of requests to providers, will work as long as there's only 1 provider for 1 chain
36
+ if (!_utils._PROVIDER_TO_SUPPORTED_PAIR_MAP[handler.providerSlug].includes(swappingSrcChain)) {
37
+ return;
38
+ }
34
39
  if (handler.init && handler.isReady === false) {
35
40
  await handler.init();
36
41
  }
37
42
  const quote = await handler.getSwapQuote(request);
38
43
  if (!(quote instanceof _SwapError.SwapError)) {
44
+ // todo: can do better
39
45
  availableQuotes.push({
40
46
  quote
41
47
  });