@subwallet/extension-base 1.1.53-beta.0 → 1.1.54-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 (96) hide show
  1. package/background/KoniTypes.d.ts +1 -9
  2. package/background/KoniTypes.js +0 -1
  3. package/background/errors/TransactionError.js +0 -9
  4. package/cjs/background/KoniTypes.js +0 -1
  5. package/cjs/background/errors/TransactionError.js +0 -9
  6. package/cjs/koni/api/staking/bonding/utils.js +6 -35
  7. package/cjs/koni/background/handlers/Extension.js +0 -85
  8. package/cjs/koni/background/handlers/State.js +5 -25
  9. package/cjs/packageInfo.js +1 -1
  10. package/cjs/services/balance-service/index.js +3 -6
  11. package/cjs/services/chain-service/constants.js +1 -1
  12. package/cjs/services/chain-service/index.js +18 -43
  13. package/cjs/services/chain-service/utils/index.js +2 -7
  14. package/cjs/services/chain-service/utils/patch.js +1 -1
  15. package/cjs/services/earning-service/constants/chains.js +2 -4
  16. package/cjs/services/earning-service/handlers/native-staking/astar.js +3 -4
  17. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +3 -22
  18. package/cjs/services/transaction-service/index.js +0 -20
  19. package/cjs/services/transaction-service/utils.js +0 -6
  20. package/cjs/types/fee/index.js +1 -27
  21. package/cjs/utils/index.js +0 -12
  22. package/koni/api/staking/bonding/utils.d.ts +1 -3
  23. package/koni/api/staking/bonding/utils.js +6 -32
  24. package/koni/background/handlers/Extension.d.ts +0 -5
  25. package/koni/background/handlers/Extension.js +0 -85
  26. package/koni/background/handlers/State.d.ts +0 -2
  27. package/koni/background/handlers/State.js +6 -26
  28. package/package.json +7 -64
  29. package/packageInfo.js +1 -1
  30. package/services/balance-service/index.js +3 -6
  31. package/services/base/types.d.ts +0 -4
  32. package/services/chain-service/constants.js +1 -1
  33. package/services/chain-service/index.d.ts +0 -4
  34. package/services/chain-service/index.js +0 -24
  35. package/services/chain-service/utils/index.d.ts +5 -6
  36. package/services/chain-service/utils/index.js +2 -5
  37. package/services/chain-service/utils/patch.js +1 -1
  38. package/services/earning-service/constants/chains.d.ts +0 -1
  39. package/services/earning-service/constants/chains.js +0 -1
  40. package/services/earning-service/handlers/native-staking/astar.js +3 -4
  41. package/services/earning-service/handlers/native-staking/relay-chain.js +5 -24
  42. package/services/event-service/types.d.ts +0 -1
  43. package/services/transaction-service/index.js +0 -20
  44. package/services/transaction-service/utils.d.ts +0 -2
  45. package/services/transaction-service/utils.js +2 -6
  46. package/types/fee/index.d.ts +49 -2
  47. package/types/fee/index.js +1 -5
  48. package/types/yield/info/chain/target.d.ts +0 -2
  49. package/types/yield/info/pallet.d.ts +0 -4
  50. package/utils/index.d.ts +0 -1
  51. package/utils/index.js +1 -2
  52. package/background/errors/SwapError.d.ts +0 -6
  53. package/background/errors/SwapError.js +0 -57
  54. package/cjs/background/errors/SwapError.js +0 -64
  55. package/cjs/koni/api/dotsama/balance.js +0 -464
  56. package/cjs/koni/api/nft/ordinal_nft/utils.js +0 -41
  57. package/cjs/services/balance-service/helpers/subscribe/balance.js +0 -140
  58. package/cjs/services/chain-service/utils.js +0 -506
  59. package/cjs/services/migration-service/scripts/MigrateEthProvider.js +0 -17
  60. package/cjs/services/migration-service/scripts/MigratePioneerProvider.js +0 -17
  61. package/cjs/services/migration-service/scripts/MigrateProvider.js +0 -29
  62. package/cjs/services/storage-service/index.js +0 -241
  63. package/cjs/services/swap-service/handler/base-handler.js +0 -171
  64. package/cjs/services/swap-service/handler/chainflip-handler.js +0 -407
  65. package/cjs/services/swap-service/handler/hydradx-handler.js +0 -444
  66. package/cjs/services/swap-service/index.js +0 -249
  67. package/cjs/services/swap-service/utils.js +0 -126
  68. package/cjs/types/balance.js +0 -1
  69. package/cjs/types/fee/evm.js +0 -1
  70. package/cjs/types/fee/fee.js +0 -70
  71. package/cjs/types/service-base.js +0 -1
  72. package/cjs/types/swap/index.js +0 -50
  73. package/cjs/types.js +0 -1
  74. package/cjs/utils/address.js +0 -34
  75. package/cjs/utils/keyring.js +0 -57
  76. package/cjs/utils/swap.js +0 -78
  77. package/services/swap-service/handler/base-handler.d.ts +0 -38
  78. package/services/swap-service/handler/base-handler.js +0 -162
  79. package/services/swap-service/handler/chainflip-handler.d.ts +0 -30
  80. package/services/swap-service/handler/chainflip-handler.js +0 -399
  81. package/services/swap-service/handler/hydradx-handler.d.ts +0 -36
  82. package/services/swap-service/handler/hydradx-handler.js +0 -435
  83. package/services/swap-service/index.d.ts +0 -32
  84. package/services/swap-service/index.js +0 -240
  85. package/services/swap-service/utils.d.ts +0 -18
  86. package/services/swap-service/utils.js +0 -105
  87. package/types/fee/evm.d.ts +0 -49
  88. package/types/fee/evm.js +0 -1
  89. package/types/fee/fee.d.ts +0 -32
  90. package/types/fee/fee.js +0 -63
  91. package/types/service-base.d.ts +0 -10
  92. package/types/service-base.js +0 -1
  93. package/types/swap/index.d.ts +0 -166
  94. package/types/swap/index.js +0 -41
  95. package/utils/swap.d.ts +0 -3
  96. package/utils/swap.js +0 -70
@@ -1,444 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.HydradxHandler = void 0;
8
- var _sdk = require("@galacticcouncil/sdk");
9
- var _chainList = require("@subwallet/chain-list");
10
- var _types = require("@subwallet/chain-list/types");
11
- var _SwapError = require("@subwallet/extension-base/background/errors/SwapError");
12
- var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
13
- var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
14
- var _xcm = require("@subwallet/extension-base/koni/api/xcm");
15
- var _utils = require("@subwallet/extension-base/services/chain-service/utils");
16
- var _baseHandler = require("@subwallet/extension-base/services/swap-service/handler/base-handler");
17
- var _utils2 = require("@subwallet/extension-base/services/swap-service/utils");
18
- var _swap = require("@subwallet/extension-base/types/swap");
19
- var _bignumber = _interopRequireDefault(require("bignumber.js"));
20
- // Copyright 2019-2022 @subwallet/extension-base
21
- // SPDX-License-Identifier: Apache-2.0
22
-
23
- const HYDRADX_LOW_LIQUIDITY_THRESHOLD = 0.15;
24
- const HYDRADX_SUBWALLET_REFERRAL_CODE = 'WALLET';
25
- const HYDRADX_SUBWALLET_REFERRAL_ACCOUNT = '7PCsCpkgsHdNaZhv79wCCQ5z97uxVbSeSCtDMUa1eZHKXy4a';
26
- const HYDRADX_TESTNET_SUBWALLET_REFERRAL_CODE = 'ASSETHUB';
27
- const HYDRADX_TESTNET_SUBWALLET_REFERRAL_ACCOUNT = '7LCt6dFqtxzdKVB2648jWW9d85doiFfLSbZJDNAMVJNxh5rJ';
28
- class HydradxHandler {
29
- isReady = false;
30
- constructor(chainService, balanceService) {
31
- let isTestnet = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
32
- // todo: pass in baseHandler from service
33
- this.swapBaseHandler = new _baseHandler.SwapBaseHandler({
34
- balanceService,
35
- chainService,
36
- providerName: isTestnet ? 'HydraDX Testnet' : 'HydraDX',
37
- providerSlug: isTestnet ? _swap.SwapProviderId.HYDRADX_TESTNET : _swap.SwapProviderId.HYDRADX_MAINNET
38
- });
39
- this.isTestnet = isTestnet;
40
- }
41
- async init() {
42
- const chainState = this.chainService.getChainStateByKey(this.chain);
43
- if (!chainState.active) {
44
- await this.chainService.enableChain(this.chain);
45
- }
46
- const substrateApi = this.chainService.getSubstrateApi(this.chain);
47
- await substrateApi.api.isReady;
48
- const poolService = new _sdk.PoolService(substrateApi.api);
49
- this.tradeRouter = new _sdk.TradeRouter(poolService);
50
- this.isReady = true;
51
- }
52
- get chain() {
53
- // TODO: check origin chain of tokens in swap pair to determine support
54
- if (!this.isTestnet) {
55
- return _chainList.COMMON_CHAIN_SLUGS.HYDRADX;
56
- } else {
57
- return _chainList.COMMON_CHAIN_SLUGS.HYDRADX_TESTNET;
58
- }
59
- }
60
- get chainService() {
61
- return this.swapBaseHandler.chainService;
62
- }
63
- get balanceService() {
64
- return this.swapBaseHandler.balanceService;
65
- }
66
- get providerInfo() {
67
- return this.swapBaseHandler.providerInfo;
68
- }
69
- get name() {
70
- return this.swapBaseHandler.name;
71
- }
72
- get slug() {
73
- return this.swapBaseHandler.slug;
74
- }
75
- async getXcmStep(params) {
76
- const bnAmount = new _bignumber.default(params.request.fromAmount);
77
- const fromAsset = this.chainService.getAssetBySlug(params.request.pair.from);
78
- const fromAssetBalance = await this.balanceService.getTokenFreeBalance(params.request.address, fromAsset.originChain, fromAsset.slug);
79
- const bnFromAssetBalance = new _bignumber.default(fromAssetBalance.value);
80
- if (bnFromAssetBalance.gte(bnAmount)) {
81
- return undefined; // enough balance, no need to xcm
82
- }
83
-
84
- const alternativeAssetSlug = (0, _utils2.getSwapAlternativeAsset)(params.request.pair);
85
- if (!alternativeAssetSlug) {
86
- return undefined;
87
- }
88
- const alternativeAsset = this.chainService.getAssetBySlug(alternativeAssetSlug);
89
- const alternativeAssetBalance = await this.balanceService.getTokenFreeBalance(params.request.address, alternativeAsset.originChain, alternativeAsset.slug);
90
- const bnAlternativeAssetBalance = new _bignumber.default(alternativeAssetBalance.value);
91
- if (bnAlternativeAssetBalance.lte(0)) {
92
- return undefined;
93
- }
94
- try {
95
- const alternativeChainInfo = this.chainService.getChainInfoByKey(alternativeAsset.originChain);
96
- const step = {
97
- metadata: {
98
- sendingValue: bnAmount.toString(),
99
- originTokenInfo: alternativeAsset,
100
- destinationTokenInfo: fromAsset
101
- },
102
- name: `Transfer ${alternativeAsset.symbol} from ${alternativeChainInfo.name}`,
103
- type: _swap.SwapStepType.XCM
104
- };
105
- const xcmOriginSubstrateApi = await this.chainService.getSubstrateApi(alternativeAsset.originChain).isReady;
106
- const xcmTransfer = await (0, _xcm.createXcmExtrinsic)({
107
- originTokenInfo: alternativeAsset,
108
- destinationTokenInfo: fromAsset,
109
- sendingValue: bnAmount.toString(),
110
- recipient: params.request.address,
111
- chainInfoMap: this.chainService.getChainInfoMap(),
112
- substrateApi: xcmOriginSubstrateApi
113
- });
114
- const _xcmFeeInfo = await xcmTransfer.paymentInfo(params.request.address);
115
- const xcmFeeInfo = _xcmFeeInfo.toPrimitive();
116
- const fee = {
117
- feeComponent: [{
118
- feeType: _swap.SwapFeeType.NETWORK_FEE,
119
- amount: Math.round(xcmFeeInfo.partialFee * 1.2).toString(),
120
- tokenSlug: (0, _utils._getChainNativeTokenSlug)(alternativeChainInfo)
121
- }],
122
- defaultFeeToken: (0, _utils._getChainNativeTokenSlug)(alternativeChainInfo),
123
- feeOptions: [(0, _utils._getChainNativeTokenSlug)(alternativeChainInfo)]
124
- };
125
- return [step, fee];
126
- } catch (e) {
127
- return undefined;
128
- }
129
- }
130
- async getFeeOptionStep(params) {
131
- return Promise.resolve(undefined);
132
- }
133
- async getSubmitStep(params) {
134
- if (params.selectedQuote) {
135
- const submitStep = {
136
- name: 'Swap',
137
- type: _swap.SwapStepType.SWAP
138
- };
139
- return Promise.resolve([submitStep, params.selectedQuote.feeInfo]);
140
- }
141
- return Promise.resolve(undefined);
142
- }
143
- generateOptimalProcess(params) {
144
- return this.swapBaseHandler.generateOptimalProcess(params, [this.getXcmStep, this.getFeeOptionStep, this.getSubmitStep]);
145
- }
146
- getSwapPathErrors(swapList) {
147
- return swapList.reduce((prev, current) => {
148
- return [...prev, ...current.errors];
149
- }, []);
150
- }
151
- parseSwapPath(swapList) {
152
- const swapAssets = this.chainService.getAssetByChainAndType(this.chain, [_types._AssetType.NATIVE, _types._AssetType.LOCAL]);
153
- const swapAssetIdMap = Object.values(swapAssets).reduce((accumulator, asset) => {
154
- return {
155
- ...accumulator,
156
- [(0, _utils._getTokenOnChainAssetId)(asset)]: asset
157
- };
158
- }, {});
159
- const path = [];
160
- swapList.forEach(swap => {
161
- var _swapAssetIdMap$swap$, _swapAssetIdMap$swap$2;
162
- const swapAssetIn = (_swapAssetIdMap$swap$ = swapAssetIdMap[swap.assetIn]) === null || _swapAssetIdMap$swap$ === void 0 ? void 0 : _swapAssetIdMap$swap$.slug;
163
- const swapAssetOut = (_swapAssetIdMap$swap$2 = swapAssetIdMap[swap.assetOut]) === null || _swapAssetIdMap$swap$2 === void 0 ? void 0 : _swapAssetIdMap$swap$2.slug;
164
- if (swapAssetIn && !path.includes(swapAssetIn)) {
165
- path.push(swapAssetIn);
166
- }
167
- if (swapAssetOut && !path.includes(swapAssetOut)) {
168
- path.push(swapAssetOut);
169
- }
170
- });
171
- return {
172
- path
173
- };
174
- }
175
- async getSwapQuote(request) {
176
- const fromAsset = this.chainService.getAssetBySlug(request.pair.from);
177
- const toAsset = this.chainService.getAssetBySlug(request.pair.to);
178
- const fromChain = this.chainService.getChainInfoByKey(fromAsset.originChain);
179
- const fromChainNativeTokenSlug = (0, _utils._getChainNativeTokenSlug)(fromChain);
180
- if (!this.isReady || !this.tradeRouter) {
181
- return new _SwapError.SwapError(_swap.SwapErrorType.UNKNOWN);
182
- }
183
- const earlyValidation = await this.validateSwapRequest(request);
184
- if (earlyValidation.error) {
185
- const metadata = earlyValidation.metadata;
186
- return (0, _utils2.getEarlyHydradxValidationError)(earlyValidation.error, metadata);
187
- }
188
- try {
189
- const fromAssetId = (0, _utils._getTokenOnChainAssetId)(fromAsset);
190
- const toAssetId = (0, _utils._getTokenOnChainAssetId)(toAsset);
191
- const parsedFromAmount = new _bignumber.default(request.fromAmount).shiftedBy(-1 * (0, _utils._getAssetDecimals)(fromAsset)).toString();
192
- const quoteResponse = await this.tradeRouter.getBestSell(fromAssetId, toAssetId, parsedFromAmount);
193
- const toAmount = quoteResponse.amountOut;
194
- const minReceive = toAmount.times(1 - request.slippage).integerValue();
195
- const txHex = quoteResponse.toTx(minReceive).hex;
196
- const substrateApi = this.chainService.getSubstrateApi(this.chain);
197
- const extrinsic = substrateApi.api.tx(txHex);
198
- const paymentInfo = await extrinsic.paymentInfo(request.address);
199
- const networkFee = {
200
- tokenSlug: fromChainNativeTokenSlug,
201
- amount: paymentInfo.partialFee.toString(),
202
- feeType: _swap.SwapFeeType.NETWORK_FEE
203
- };
204
- const tradeFee = {
205
- tokenSlug: toAsset.slug,
206
- // fee is subtracted from receiving amount
207
- amount: quoteResponse.tradeFee.toString(),
208
- feeType: _swap.SwapFeeType.PLATFORM_FEE
209
- };
210
- const swapRoute = this.parseSwapPath(quoteResponse.swaps);
211
- const swapPathErrors = this.getSwapPathErrors(quoteResponse.swaps);
212
- if (swapPathErrors.length > 0) {
213
- const defaultError = swapPathErrors[0]; // might parse more errors
214
-
215
- switch (defaultError) {
216
- case _sdk.PoolError.InsufficientTradingAmount:
217
- return new _SwapError.SwapError(_swap.SwapErrorType.SWAP_NOT_ENOUGH_BALANCE);
218
- case _sdk.PoolError.TradeNotAllowed:
219
- return new _SwapError.SwapError(_swap.SwapErrorType.ERROR_FETCHING_QUOTE);
220
- case _sdk.PoolError.MaxInRatioExceeded:
221
- return new _SwapError.SwapError(_swap.SwapErrorType.NOT_ENOUGH_LIQUIDITY);
222
- case _sdk.PoolError.UnknownError:
223
- return new _SwapError.SwapError(_swap.SwapErrorType.ERROR_FETCHING_QUOTE);
224
- case _sdk.PoolError.MaxOutRatioExceeded:
225
- return new _SwapError.SwapError(_swap.SwapErrorType.NOT_ENOUGH_LIQUIDITY);
226
- }
227
- }
228
- return {
229
- pair: request.pair,
230
- fromAmount: request.fromAmount,
231
- toAmount: toAmount.toString(),
232
- rate: (0, _utils2.calculateSwapRate)(request.fromAmount, toAmount.toString(), fromAsset, toAsset),
233
- provider: this.providerInfo,
234
- aliveUntil: +Date.now() + (_utils2.SWAP_QUOTE_TIMEOUT_MAP[this.slug] || _utils2.SWAP_QUOTE_TIMEOUT_MAP.default),
235
- feeInfo: {
236
- feeComponent: [networkFee, tradeFee],
237
- defaultFeeToken: fromChainNativeTokenSlug,
238
- feeOptions: [fromChainNativeTokenSlug] // todo: parse fee options
239
- },
240
-
241
- isLowLiquidity: Math.abs(quoteResponse.priceImpactPct) >= HYDRADX_LOW_LIQUIDITY_THRESHOLD,
242
- route: swapRoute,
243
- metadata: txHex
244
- };
245
- } catch (e) {
246
- return new _SwapError.SwapError(_swap.SwapErrorType.ERROR_FETCHING_QUOTE);
247
- }
248
- }
249
- async handleXcmStep(params) {
250
- const pair = params.quote.pair;
251
- const alternativeAssetSlug = (0, _utils2.getSwapAlternativeAsset)(pair);
252
- const originAsset = this.chainService.getAssetBySlug(alternativeAssetSlug);
253
- const destinationAsset = this.chainService.getAssetBySlug(pair.from);
254
- const substrateApi = this.chainService.getSubstrateApi(originAsset.originChain);
255
- const chainApi = await substrateApi.isReady;
256
- const destinationAssetBalance = await this.balanceService.getTokenFreeBalance(params.address, destinationAsset.originChain, destinationAsset.slug);
257
- const xcmFee = params.process.totalFee[params.currentStep];
258
- const bnAmount = new _bignumber.default(params.quote.fromAmount);
259
- const bnDestinationAssetBalance = new _bignumber.default(destinationAssetBalance.value);
260
- let bnTotalAmount = bnAmount.minus(bnDestinationAssetBalance);
261
- if ((0, _utils._isNativeToken)(originAsset)) {
262
- const bnXcmFee = new _bignumber.default(xcmFee.feeComponent[0].amount); // xcm fee is paid in native token but swap token is not always native token
263
-
264
- bnTotalAmount = bnTotalAmount.plus(bnXcmFee);
265
- }
266
- const xcmTransfer = await (0, _xcm.createXcmExtrinsic)({
267
- originTokenInfo: originAsset,
268
- destinationTokenInfo: destinationAsset,
269
- sendingValue: bnTotalAmount.toString(),
270
- recipient: params.address,
271
- chainInfoMap: this.chainService.getChainInfoMap(),
272
- substrateApi: chainApi
273
- });
274
- const xcmData = {
275
- originNetworkKey: originAsset.originChain,
276
- destinationNetworkKey: destinationAsset.originChain,
277
- from: params.address,
278
- to: params.address,
279
- value: bnTotalAmount.toString(),
280
- tokenSlug: originAsset.slug,
281
- showExtraWarning: true
282
- };
283
- return {
284
- txChain: originAsset.originChain,
285
- extrinsic: xcmTransfer,
286
- transferNativeAmount: (0, _utils._isNativeToken)(originAsset) ? bnTotalAmount.toString() : '0',
287
- extrinsicType: _KoniTypes.ExtrinsicType.TRANSFER_XCM,
288
- chainType: _KoniTypes.ChainType.SUBSTRATE,
289
- txData: xcmData
290
- };
291
- }
292
- async handleSubmitStep(params) {
293
- const txHex = params.quote.metadata;
294
- const fromAsset = this.chainService.getAssetBySlug(params.quote.pair.from);
295
- const substrateApi = this.chainService.getSubstrateApi(this.chain);
296
- const chainApi = await substrateApi.isReady;
297
- const txData = {
298
- provider: this.providerInfo,
299
- quote: params.quote,
300
- address: params.address,
301
- slippage: params.slippage,
302
- txHex,
303
- process: params.process
304
- };
305
- let extrinsic;
306
- const _referral = await chainApi.api.query.referrals.linkedAccounts(params.address);
307
- const referral = _referral === null || _referral === void 0 ? void 0 : _referral.toString();
308
- if (!referral || referral === '') {
309
- extrinsic = chainApi.api.tx.utility.batchAll([chainApi.api.tx.referrals.linkCode(this.referralCode), chainApi.api.tx(txHex)]);
310
- } else {
311
- extrinsic = chainApi.api.tx(txHex);
312
- }
313
- return {
314
- txChain: fromAsset.originChain,
315
- txData,
316
- extrinsic,
317
- transferNativeAmount: (0, _utils._isNativeToken)(fromAsset) ? params.quote.fromAmount : '0',
318
- // todo
319
- extrinsicType: _KoniTypes.ExtrinsicType.SWAP,
320
- chainType: _KoniTypes.ChainType.SUBSTRATE
321
- };
322
- }
323
- handleSwapProcess(params) {
324
- const {
325
- currentStep,
326
- process
327
- } = params;
328
- const type = process.steps[currentStep].type;
329
- switch (type) {
330
- case _swap.SwapStepType.DEFAULT:
331
- return Promise.reject(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.UNSUPPORTED));
332
- case _swap.SwapStepType.XCM:
333
- return this.handleXcmStep(params);
334
- case _swap.SwapStepType.SET_FEE_TOKEN:
335
- return Promise.reject(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.UNSUPPORTED));
336
- case _swap.SwapStepType.SWAP:
337
- return this.handleSubmitStep(params);
338
- default:
339
- return this.handleSubmitStep(params);
340
- }
341
- }
342
- async validateSwapProcess(params) {
343
- const amount = params.selectedQuote.fromAmount;
344
- const bnAmount = new _bignumber.default(amount);
345
- if (bnAmount.lte(0)) {
346
- return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INVALID_PARAMS, 'Amount must be greater than 0')];
347
- }
348
- let isXcmOk = false;
349
- for (const [index, step] of params.process.steps.entries()) {
350
- const getErrors = async () => {
351
- switch (step.type) {
352
- case _swap.SwapStepType.DEFAULT:
353
- return Promise.resolve([]);
354
- case _swap.SwapStepType.XCM:
355
- return this.swapBaseHandler.validateXcmStep(params, index);
356
- case _swap.SwapStepType.SET_FEE_TOKEN:
357
- return this.swapBaseHandler.validateSetFeeTokenStep(params, index);
358
- default:
359
- return this.swapBaseHandler.validateSwapStep(params, isXcmOk, index);
360
- }
361
- };
362
- const errors = await getErrors();
363
- if (errors.length) {
364
- return errors;
365
- } else if (step.type === _swap.SwapStepType.XCM) {
366
- isXcmOk = true;
367
- }
368
- }
369
- return [];
370
- }
371
- async validateSwapRequest(request) {
372
- const fromAsset = this.chainService.getAssetBySlug(request.pair.from);
373
- const toAsset = this.chainService.getAssetBySlug(request.pair.to);
374
- const fromAssetId = (0, _utils._getTokenOnChainAssetId)(fromAsset);
375
- const toAssetId = (0, _utils._getTokenOnChainAssetId)(toAsset);
376
- try {
377
- var _this$tradeRouter, _this$tradeRouter2;
378
- // todo: might need to optimize for performance, but prioritize safety for now
379
- const allAssets = await ((_this$tradeRouter = this.tradeRouter) === null || _this$tradeRouter === void 0 ? void 0 : _this$tradeRouter.getAllAssets());
380
- if (!allAssets) {
381
- return {
382
- error: _swap.SwapErrorType.UNKNOWN
383
- };
384
- }
385
- const supportedFromAsset = allAssets.find(asset => asset.id === fromAssetId && asset.symbol === fromAsset.symbol);
386
- const supportedToAsset = allAssets.find(asset => asset.id === toAssetId && asset.symbol === toAsset.symbol);
387
- if (!supportedFromAsset || !supportedToAsset) {
388
- return {
389
- error: _swap.SwapErrorType.ASSET_NOT_SUPPORTED
390
- };
391
- }
392
- const assetPairs = await ((_this$tradeRouter2 = this.tradeRouter) === null || _this$tradeRouter2 === void 0 ? void 0 : _this$tradeRouter2.getAssetPairs(fromAssetId));
393
- if (!assetPairs) {
394
- return {
395
- error: _swap.SwapErrorType.UNKNOWN
396
- };
397
- }
398
- const pairedToAsset = assetPairs.find(supportedToAsset => supportedToAsset.id === toAssetId && supportedToAsset.symbol === toAsset.symbol);
399
- if (!pairedToAsset) {
400
- return {
401
- error: _swap.SwapErrorType.ASSET_NOT_SUPPORTED
402
- };
403
- }
404
- if (!(fromAsset.originChain === this.chain && toAsset.originChain === this.chain)) {
405
- return {
406
- error: _swap.SwapErrorType.ASSET_NOT_SUPPORTED
407
- };
408
- }
409
- if (!fromAssetId || !toAssetId) {
410
- return {
411
- error: _swap.SwapErrorType.UNKNOWN
412
- };
413
- }
414
- const bnAmount = new _bignumber.default(request.fromAmount);
415
- if (bnAmount.lte(0)) {
416
- return {
417
- error: _swap.SwapErrorType.AMOUNT_CANNOT_BE_ZERO
418
- };
419
- }
420
- return {
421
- metadata: {
422
- chain: this.chainService.getChainInfoByKey(this.chain)
423
- }
424
- };
425
- } catch (e) {
426
- return {
427
- error: _swap.SwapErrorType.UNKNOWN
428
- };
429
- }
430
- }
431
- get referralCode() {
432
- if (this.isTestnet) {
433
- return HYDRADX_TESTNET_SUBWALLET_REFERRAL_CODE;
434
- }
435
- return HYDRADX_SUBWALLET_REFERRAL_CODE;
436
- }
437
- get referralAccount() {
438
- if (this.isTestnet) {
439
- return HYDRADX_TESTNET_SUBWALLET_REFERRAL_ACCOUNT;
440
- }
441
- return HYDRADX_SUBWALLET_REFERRAL_ACCOUNT;
442
- }
443
- }
444
- exports.HydradxHandler = HydradxHandler;
@@ -1,249 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.SwapService = void 0;
7
- var _SwapError = require("@subwallet/extension-base/background/errors/SwapError");
8
- var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
9
- var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
10
- var _types = require("@subwallet/extension-base/services/base/types");
11
- var _chainflipHandler = require("@subwallet/extension-base/services/swap-service/handler/chainflip-handler");
12
- var _hydradxHandler = require("@subwallet/extension-base/services/swap-service/handler/hydradx-handler");
13
- var _utils = require("@subwallet/extension-base/services/swap-service/utils");
14
- var _swap = require("@subwallet/extension-base/types/swap");
15
- var _utils2 = require("@subwallet/extension-base/utils");
16
- var _rxjs = require("rxjs");
17
- // Copyright 2019-2022 @subwallet/extension-base
18
- // SPDX-License-Identifier: Apache-2.0
19
-
20
- class SwapService {
21
- swapPairSubject = new _rxjs.BehaviorSubject([]);
22
- handlers = {};
23
- startPromiseHandler = (0, _utils2.createPromiseHandler)();
24
- stopPromiseHandler = (0, _utils2.createPromiseHandler)();
25
- status = _types.ServiceStatus.NOT_INITIALIZED;
26
- constructor(state) {
27
- this.state = state;
28
- this.eventService = state.eventService;
29
- this.chainService = state.chainService;
30
- }
31
- async askProvidersForQuote(request) {
32
- const availableQuotes = [];
33
- await Promise.all(Object.values(this.handlers).map(async handler => {
34
- if (handler.init && handler.isReady === false) {
35
- await handler.init();
36
- }
37
- const quote = await handler.getSwapQuote(request);
38
- if (!(quote instanceof _SwapError.SwapError)) {
39
- availableQuotes.push({
40
- quote
41
- });
42
- } else {
43
- availableQuotes.push({
44
- error: quote
45
- });
46
- }
47
- }));
48
- return availableQuotes; // todo: need to propagate error for further handling
49
- }
50
-
51
- getDefaultProcess(params) {
52
- const result = {
53
- totalFee: [_utils.MOCK_SWAP_FEE],
54
- steps: [_utils.DEFAULT_SWAP_FIRST_STEP]
55
- };
56
- result.totalFee.push({
57
- feeComponent: [],
58
- feeOptions: [params.request.pair.from],
59
- defaultFeeToken: params.request.pair.from
60
- });
61
- result.steps.push({
62
- id: result.steps.length,
63
- name: 'Swap',
64
- type: _swap.SwapStepType.SWAP
65
- });
66
- return result;
67
- }
68
- async generateOptimalProcess(params) {
69
- if (!params.selectedQuote) {
70
- return this.getDefaultProcess(params);
71
- } else {
72
- const providerId = params.selectedQuote.provider.id;
73
- const handler = this.handlers[providerId];
74
- if (handler) {
75
- return handler.generateOptimalProcess(params);
76
- } else {
77
- return this.getDefaultProcess(params);
78
- }
79
- }
80
- }
81
- async handleSwapRequest(request) {
82
- /*
83
- * 1. Ask swap quotes from providers
84
- * 2. Select the best quote
85
- * 3. Generate optimal process for that quote
86
- * */
87
-
88
- const swapQuoteResponse = await this.getLatestQuotes(request);
89
- const optimalProcess = await this.generateOptimalProcess({
90
- request,
91
- selectedQuote: swapQuoteResponse.optimalQuote
92
- });
93
- return {
94
- process: optimalProcess,
95
- quote: swapQuoteResponse
96
- };
97
- }
98
- async getLatestQuotes(request) {
99
- request.pair.metadata = this.getSwapPairMetadata(request.pair.slug); // todo: improve this
100
- const quoteAskResponses = await this.askProvidersForQuote(request);
101
-
102
- // todo: handle error to return back to UI
103
- // todo: more logic to select the best quote
104
-
105
- const availableQuotes = quoteAskResponses.filter(quote => !quote.error).map(quote => quote.quote);
106
- let quoteError;
107
- let selectedQuote;
108
- let aliveUntil = +Date.now() + _utils.SWAP_QUOTE_TIMEOUT_MAP.default;
109
- if (availableQuotes.length === 0) {
110
- const preferredErrorResp = quoteAskResponses.find(quote => {
111
- return !!quote.error && ![_swap.SwapErrorType.UNKNOWN, _swap.SwapErrorType.ASSET_NOT_SUPPORTED].includes(quote.error.errorType);
112
- });
113
- const defaultErrorResp = quoteAskResponses.find(quote => !!quote.error);
114
- quoteError = (preferredErrorResp === null || preferredErrorResp === void 0 ? void 0 : preferredErrorResp.error) || (defaultErrorResp === null || defaultErrorResp === void 0 ? void 0 : defaultErrorResp.error);
115
- } else {
116
- var _selectedQuote;
117
- selectedQuote = availableQuotes[0];
118
- aliveUntil = ((_selectedQuote = selectedQuote) === null || _selectedQuote === void 0 ? void 0 : _selectedQuote.aliveUntil) || +Date.now() + _utils.SWAP_QUOTE_TIMEOUT_MAP.default;
119
- }
120
- return {
121
- optimalQuote: selectedQuote,
122
- quotes: availableQuotes,
123
- error: quoteError,
124
- aliveUntil
125
- };
126
- }
127
- initHandlers() {
128
- _swap._SUPPORTED_SWAP_PROVIDERS.forEach(providerId => {
129
- switch (providerId) {
130
- case _swap.SwapProviderId.CHAIN_FLIP_TESTNET:
131
- this.handlers[providerId] = new _chainflipHandler.ChainflipSwapHandler(this.chainService, this.state.balanceService);
132
- break;
133
- case _swap.SwapProviderId.CHAIN_FLIP_MAINNET:
134
- this.handlers[providerId] = new _chainflipHandler.ChainflipSwapHandler(this.chainService, this.state.balanceService, false);
135
- break;
136
- case _swap.SwapProviderId.HYDRADX_TESTNET:
137
- this.handlers[providerId] = new _hydradxHandler.HydradxHandler(this.chainService, this.state.balanceService);
138
- break;
139
- case _swap.SwapProviderId.HYDRADX_MAINNET:
140
- this.handlers[providerId] = new _hydradxHandler.HydradxHandler(this.chainService, this.state.balanceService, false);
141
- break;
142
- default:
143
- throw new Error('Unsupported provider');
144
- }
145
- });
146
- }
147
- async init() {
148
- this.status = _types.ServiceStatus.INITIALIZING;
149
- this.eventService.emit('swap.ready', true);
150
- this.status = _types.ServiceStatus.INITIALIZED;
151
- this.initHandlers();
152
- await this.start();
153
- }
154
- async start() {
155
- if (this.status === _types.ServiceStatus.STOPPING) {
156
- await this.waitForStopped();
157
- }
158
- if (this.status === _types.ServiceStatus.STARTED || this.status === _types.ServiceStatus.STARTING) {
159
- return this.waitForStarted();
160
- }
161
- this.status = _types.ServiceStatus.STARTING;
162
-
163
- // todo: start the service jobs, subscribe data,...
164
-
165
- this.swapPairSubject.next(this.getSwapPairs()); // todo: might need to change it online
166
-
167
- // Update promise handler
168
- this.startPromiseHandler.resolve();
169
- this.stopPromiseHandler = (0, _utils2.createPromiseHandler)();
170
- this.status = _types.ServiceStatus.STARTED;
171
- }
172
- async stop() {
173
- if (this.status === _types.ServiceStatus.STARTING) {
174
- await this.waitForStarted();
175
- }
176
- if (this.status === _types.ServiceStatus.STOPPED || this.status === _types.ServiceStatus.STOPPING) {
177
- return this.waitForStopped();
178
- }
179
-
180
- // todo: unsub, persist data,...
181
-
182
- this.stopPromiseHandler.resolve();
183
- this.startPromiseHandler = (0, _utils2.createPromiseHandler)();
184
- this.status = _types.ServiceStatus.STOPPED;
185
- }
186
- waitForStarted() {
187
- return this.startPromiseHandler.promise;
188
- }
189
- waitForStopped() {
190
- return this.stopPromiseHandler.promise;
191
- }
192
- getSwapPairs() {
193
- return Object.entries(this.chainService.swapRefMap).map(_ref => {
194
- let [slug, assetRef] = _ref;
195
- const fromAsset = this.chainService.getAssetBySlug(assetRef.srcAsset);
196
- return {
197
- slug,
198
- from: assetRef.srcAsset,
199
- to: assetRef.destAsset,
200
- metadata: {
201
- alternativeAsset: (0, _utils.getSwapAltToken)(fromAsset)
202
- }
203
- };
204
- });
205
- }
206
- getSwapPairMetadata(slug) {
207
- var _this$getSwapPairs$fi;
208
- return (_this$getSwapPairs$fi = this.getSwapPairs().find(pair => pair.slug === slug)) === null || _this$getSwapPairs$fi === void 0 ? void 0 : _this$getSwapPairs$fi.metadata;
209
- }
210
- async validateSwapProcess(params) {
211
- const providerId = params.selectedQuote.provider.id;
212
- const handler = this.handlers[providerId];
213
- if (handler) {
214
- return handler.validateSwapProcess(params);
215
- } else {
216
- return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR)];
217
- }
218
- }
219
- async handleSwapProcess(params) {
220
- const handler = this.handlers[params.quote.provider.id];
221
- if (params.process.steps.length === 1) {
222
- // todo: do better to handle error generating steps
223
- return Promise.reject(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR, 'Please check your network and try again'));
224
- }
225
- if (handler) {
226
- return handler.handleSwapProcess(params);
227
- } else {
228
- return Promise.reject(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR));
229
- }
230
- }
231
- subscribeSwapPairs(callback) {
232
- return this.chainService.subscribeSwapRefMap().subscribe(refMap => {
233
- const latestData = Object.entries(refMap).map(_ref2 => {
234
- let [slug, assetRef] = _ref2;
235
- const fromAsset = this.chainService.getAssetBySlug(assetRef.srcAsset);
236
- return {
237
- slug,
238
- from: assetRef.srcAsset,
239
- to: assetRef.destAsset,
240
- metadata: {
241
- alternativeAsset: (0, _utils.getSwapAltToken)(fromAsset)
242
- }
243
- };
244
- });
245
- callback(latestData);
246
- });
247
- }
248
- }
249
- exports.SwapService = SwapService;