@subwallet/extension-base 1.1.54-0 → 1.1.55-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 (91) hide show
  1. package/background/KoniTypes.d.ts +21 -1
  2. package/background/KoniTypes.js +1 -0
  3. package/background/errors/SwapError.d.ts +6 -0
  4. package/background/errors/SwapError.js +57 -0
  5. package/background/errors/TransactionError.js +9 -0
  6. package/background/types.d.ts +2 -0
  7. package/cjs/background/KoniTypes.js +1 -0
  8. package/cjs/background/errors/SwapError.js +64 -0
  9. package/cjs/background/errors/TransactionError.js +9 -0
  10. package/cjs/koni/api/staking/bonding/utils.js +35 -6
  11. package/cjs/koni/background/handlers/Extension.js +214 -102
  12. package/cjs/koni/background/handlers/State.js +5 -2
  13. package/cjs/packageInfo.js +1 -1
  14. package/cjs/services/balance-service/index.js +6 -3
  15. package/cjs/services/chain-service/constants.js +1 -1
  16. package/cjs/services/chain-service/index.js +39 -18
  17. package/cjs/services/chain-service/utils/index.js +15 -4
  18. package/cjs/services/chain-service/utils/patch.js +1 -1
  19. package/cjs/services/earning-service/constants/chains.js +4 -2
  20. package/cjs/services/earning-service/handlers/native-staking/astar.js +4 -3
  21. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +22 -3
  22. package/cjs/services/migration-service/scripts/MigrateTransactionHistoryBySymbol.js +4 -17
  23. package/cjs/services/migration-service/scripts/databases/MigrateAssetSetting.js +4 -17
  24. package/cjs/services/migration-service/scripts/index.js +3 -3
  25. package/cjs/services/swap-service/handler/base-handler.js +189 -0
  26. package/cjs/services/swap-service/handler/chainflip-handler.js +407 -0
  27. package/cjs/services/swap-service/handler/hydradx-handler.js +531 -0
  28. package/cjs/services/swap-service/index.js +250 -0
  29. package/cjs/services/swap-service/utils.js +126 -0
  30. package/cjs/services/transaction-service/index.js +20 -0
  31. package/cjs/services/transaction-service/utils.js +6 -0
  32. package/cjs/types/fee/evm.js +1 -0
  33. package/cjs/types/fee/fee.js +70 -0
  34. package/cjs/types/fee/index.js +27 -1
  35. package/cjs/types/service-base.js +1 -0
  36. package/cjs/types/swap/index.js +50 -0
  37. package/cjs/utils/index.js +12 -0
  38. package/cjs/utils/swap.js +78 -0
  39. package/koni/api/staking/bonding/utils.d.ts +3 -1
  40. package/koni/api/staking/bonding/utils.js +32 -6
  41. package/koni/background/handlers/Extension.d.ts +6 -0
  42. package/koni/background/handlers/Extension.js +111 -0
  43. package/koni/background/handlers/State.d.ts +2 -0
  44. package/koni/background/handlers/State.js +5 -2
  45. package/package.json +65 -8
  46. package/packageInfo.js +1 -1
  47. package/services/balance-service/index.js +6 -3
  48. package/services/base/types.d.ts +4 -0
  49. package/services/chain-service/constants.js +1 -1
  50. package/services/chain-service/index.d.ts +4 -0
  51. package/services/chain-service/index.js +21 -1
  52. package/services/chain-service/utils/index.d.ts +7 -5
  53. package/services/chain-service/utils/index.js +9 -2
  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 +1 -0
  57. package/services/earning-service/handlers/native-staking/astar.js +4 -3
  58. package/services/earning-service/handlers/native-staking/relay-chain.js +24 -5
  59. package/services/event-service/types.d.ts +1 -0
  60. package/services/migration-service/scripts/MigrateTransactionHistoryBySymbol.js +4 -17
  61. package/services/migration-service/scripts/databases/MigrateAssetSetting.js +4 -17
  62. package/services/migration-service/scripts/index.js +3 -3
  63. package/services/swap-service/handler/base-handler.d.ts +38 -0
  64. package/services/swap-service/handler/base-handler.js +180 -0
  65. package/services/swap-service/handler/chainflip-handler.d.ts +30 -0
  66. package/services/swap-service/handler/chainflip-handler.js +399 -0
  67. package/services/swap-service/handler/hydradx-handler.d.ts +36 -0
  68. package/services/swap-service/handler/hydradx-handler.js +522 -0
  69. package/services/swap-service/index.d.ts +32 -0
  70. package/services/swap-service/index.js +241 -0
  71. package/services/swap-service/utils.d.ts +18 -0
  72. package/services/swap-service/utils.js +105 -0
  73. package/services/transaction-service/index.js +20 -0
  74. package/services/transaction-service/utils.d.ts +2 -0
  75. package/services/transaction-service/utils.js +6 -2
  76. package/types/fee/evm.d.ts +49 -0
  77. package/types/fee/evm.js +1 -0
  78. package/types/fee/fee.d.ts +32 -0
  79. package/types/fee/fee.js +63 -0
  80. package/types/fee/index.d.ts +2 -49
  81. package/types/fee/index.js +5 -1
  82. package/types/service-base.d.ts +10 -0
  83. package/types/service-base.js +1 -0
  84. package/types/swap/index.d.ts +168 -0
  85. package/types/swap/index.js +41 -0
  86. package/types/yield/info/chain/target.d.ts +2 -0
  87. package/types/yield/info/pallet.d.ts +4 -0
  88. package/utils/index.d.ts +1 -0
  89. package/utils/index.js +2 -1
  90. package/utils/swap.d.ts +3 -0
  91. package/utils/swap.js +70 -0
@@ -0,0 +1,531 @@
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
+ isTestnet = true;
30
+ isReady = false;
31
+ constructor(chainService, balanceService) {
32
+ let isTestnet = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
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
+ 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
+ if (!params.selectedQuote) {
132
+ return Promise.resolve(undefined);
133
+ }
134
+ const selectedFeeToken = params.selectedQuote.feeInfo.selectedFeeToken;
135
+ if (!selectedFeeToken) {
136
+ return undefined;
137
+ }
138
+ const feeStep = {
139
+ name: 'Set fee token',
140
+ type: _swap.SwapStepType.SET_FEE_TOKEN
141
+ };
142
+ try {
143
+ const substrateApi = this.chainService.getSubstrateApi(this.chain());
144
+ const chainApi = await substrateApi.isReady;
145
+ const _currentFeeAssetId = await chainApi.api.query.multiTransactionPayment.accountCurrencyMap(params.request.address);
146
+ const currentFeeAssetId = _currentFeeAssetId.toString();
147
+ const selectedFeeAsset = this.chainService.getAssetBySlug(selectedFeeToken);
148
+ const assetId = (0, _utils._getTokenOnChainAssetId)(selectedFeeAsset);
149
+ if (currentFeeAssetId === assetId) {
150
+ return;
151
+ }
152
+ const setFeeTx = chainApi.api.tx.multiTransactionPayment.setCurrency(assetId);
153
+ const _txFee = await setFeeTx.paymentInfo(params.request.address);
154
+ const txFee = _txFee.toPrimitive();
155
+ const fee = {
156
+ feeComponent: [{
157
+ feeType: _swap.SwapFeeType.NETWORK_FEE,
158
+ amount: Math.round(txFee.partialFee).toString(),
159
+ tokenSlug: selectedFeeAsset.slug
160
+ }],
161
+ selectedFeeToken: selectedFeeAsset.slug,
162
+ defaultFeeToken: selectedFeeAsset.slug,
163
+ feeOptions: [selectedFeeAsset.slug]
164
+ };
165
+ return [feeStep, fee];
166
+ } catch (e) {
167
+ return undefined;
168
+ }
169
+ }
170
+ async getSubmitStep(params) {
171
+ if (params.selectedQuote) {
172
+ const submitStep = {
173
+ name: 'Swap',
174
+ type: _swap.SwapStepType.SWAP
175
+ };
176
+ return Promise.resolve([submitStep, params.selectedQuote.feeInfo]);
177
+ }
178
+ return Promise.resolve(undefined);
179
+ }
180
+ generateOptimalProcess(params) {
181
+ return this.swapBaseHandler.generateOptimalProcess(params, [this.getXcmStep,
182
+ // this.getFeeOptionStep.bind(this),
183
+ this.getSubmitStep]);
184
+ }
185
+ getSwapPathErrors(swapList) {
186
+ return swapList.reduce((prev, current) => {
187
+ return [...prev, ...current.errors];
188
+ }, []);
189
+ }
190
+ parseSwapPath(swapList) {
191
+ const swapAssets = this.chainService.getAssetByChainAndType(this.chain(), [_types._AssetType.NATIVE, _types._AssetType.LOCAL]);
192
+ const swapAssetIdMap = Object.values(swapAssets).reduce((accumulator, asset) => {
193
+ return {
194
+ ...accumulator,
195
+ [(0, _utils._getTokenOnChainAssetId)(asset)]: asset
196
+ };
197
+ }, {});
198
+ const path = [];
199
+ swapList.forEach(swap => {
200
+ var _swapAssetIdMap$swap$, _swapAssetIdMap$swap$2;
201
+ const swapAssetIn = (_swapAssetIdMap$swap$ = swapAssetIdMap[swap.assetIn]) === null || _swapAssetIdMap$swap$ === void 0 ? void 0 : _swapAssetIdMap$swap$.slug;
202
+ const swapAssetOut = (_swapAssetIdMap$swap$2 = swapAssetIdMap[swap.assetOut]) === null || _swapAssetIdMap$swap$2 === void 0 ? void 0 : _swapAssetIdMap$swap$2.slug;
203
+ if (swapAssetIn && !path.includes(swapAssetIn)) {
204
+ path.push(swapAssetIn);
205
+ }
206
+ if (swapAssetOut && !path.includes(swapAssetOut)) {
207
+ path.push(swapAssetOut);
208
+ }
209
+ });
210
+ return {
211
+ path
212
+ };
213
+ }
214
+ async getSwapQuote(request) {
215
+ const fromAsset = this.chainService.getAssetBySlug(request.pair.from);
216
+ const toAsset = this.chainService.getAssetBySlug(request.pair.to);
217
+ const fromChain = this.chainService.getChainInfoByKey(fromAsset.originChain);
218
+ const fromChainNativeTokenSlug = (0, _utils._getChainNativeTokenSlug)(fromChain);
219
+ if (!this.isReady || !this.tradeRouter) {
220
+ return new _SwapError.SwapError(_swap.SwapErrorType.UNKNOWN);
221
+ }
222
+ const earlyValidation = await this.validateSwapRequest(request);
223
+ if (earlyValidation.error) {
224
+ const metadata = earlyValidation.metadata;
225
+ return (0, _utils2.getEarlyHydradxValidationError)(earlyValidation.error, metadata);
226
+ }
227
+ try {
228
+ const fromAssetId = (0, _utils._getTokenOnChainAssetId)(fromAsset);
229
+ const toAssetId = (0, _utils._getTokenOnChainAssetId)(toAsset);
230
+ const parsedFromAmount = new _bignumber.default(request.fromAmount).shiftedBy(-1 * (0, _utils._getAssetDecimals)(fromAsset)).toString();
231
+ const quoteResponse = await this.tradeRouter.getBestSell(fromAssetId, toAssetId, parsedFromAmount);
232
+ const toAmount = quoteResponse.amountOut;
233
+ const minReceive = toAmount.times(1 - request.slippage).integerValue();
234
+ const txHex = quoteResponse.toTx(minReceive).hex;
235
+ const substrateApi = this.chainService.getSubstrateApi(this.chain());
236
+ const extrinsic = substrateApi.api.tx(txHex);
237
+ const paymentInfo = await extrinsic.paymentInfo(request.address);
238
+ const networkFee = {
239
+ tokenSlug: fromChainNativeTokenSlug,
240
+ amount: paymentInfo.partialFee.toString(),
241
+ feeType: _swap.SwapFeeType.NETWORK_FEE
242
+ };
243
+ const tradeFee = {
244
+ tokenSlug: toAsset.slug,
245
+ // fee is subtracted from receiving amount
246
+ amount: quoteResponse.tradeFee.toString(),
247
+ feeType: _swap.SwapFeeType.PLATFORM_FEE
248
+ };
249
+ const swapRoute = this.parseSwapPath(quoteResponse.swaps);
250
+ const swapPathErrors = this.getSwapPathErrors(quoteResponse.swaps);
251
+ if (swapPathErrors.length > 0) {
252
+ const defaultError = swapPathErrors[0]; // might parse more errors
253
+
254
+ switch (defaultError) {
255
+ case _sdk.PoolError.InsufficientTradingAmount:
256
+ return new _SwapError.SwapError(_swap.SwapErrorType.SWAP_NOT_ENOUGH_BALANCE);
257
+ case _sdk.PoolError.TradeNotAllowed:
258
+ return new _SwapError.SwapError(_swap.SwapErrorType.ERROR_FETCHING_QUOTE);
259
+ case _sdk.PoolError.MaxInRatioExceeded:
260
+ return new _SwapError.SwapError(_swap.SwapErrorType.NOT_ENOUGH_LIQUIDITY);
261
+ case _sdk.PoolError.UnknownError:
262
+ return new _SwapError.SwapError(_swap.SwapErrorType.ERROR_FETCHING_QUOTE);
263
+ case _sdk.PoolError.MaxOutRatioExceeded:
264
+ return new _SwapError.SwapError(_swap.SwapErrorType.NOT_ENOUGH_LIQUIDITY);
265
+ }
266
+ }
267
+
268
+ // const feeTokenOptions = this.chainService.getFeeTokensByChain(this.chain());
269
+ const feeTokenOptions = [fromChainNativeTokenSlug];
270
+
271
+ // if (request.feeToken && !feeTokenOptions.includes(request.feeToken)) {
272
+ // return new SwapError(SwapErrorType.UNKNOWN);
273
+ // }
274
+
275
+ // const selectedFeeToken = request.feeToken || fromChainNativeTokenSlug;
276
+ const selectedFeeToken = fromChainNativeTokenSlug;
277
+ return {
278
+ pair: request.pair,
279
+ fromAmount: request.fromAmount,
280
+ toAmount: toAmount.toString(),
281
+ rate: (0, _utils2.calculateSwapRate)(request.fromAmount, toAmount.toString(), fromAsset, toAsset),
282
+ provider: this.providerInfo,
283
+ aliveUntil: +Date.now() + (_utils2.SWAP_QUOTE_TIMEOUT_MAP[this.slug] || _utils2.SWAP_QUOTE_TIMEOUT_MAP.default),
284
+ feeInfo: {
285
+ feeComponent: [networkFee, tradeFee],
286
+ defaultFeeToken: fromChainNativeTokenSlug,
287
+ feeOptions: feeTokenOptions,
288
+ // TODO: enable fee options
289
+ selectedFeeToken
290
+ },
291
+ isLowLiquidity: Math.abs(quoteResponse.priceImpactPct) >= HYDRADX_LOW_LIQUIDITY_THRESHOLD,
292
+ route: swapRoute,
293
+ metadata: txHex
294
+ };
295
+ } catch (e) {
296
+ return new _SwapError.SwapError(_swap.SwapErrorType.ERROR_FETCHING_QUOTE);
297
+ }
298
+ }
299
+ async handleXcmStep(params) {
300
+ const pair = params.quote.pair;
301
+ const alternativeAssetSlug = (0, _utils2.getSwapAlternativeAsset)(pair);
302
+ const originAsset = this.chainService.getAssetBySlug(alternativeAssetSlug);
303
+ const destinationAsset = this.chainService.getAssetBySlug(pair.from);
304
+ const substrateApi = this.chainService.getSubstrateApi(originAsset.originChain);
305
+ const chainApi = await substrateApi.isReady;
306
+ const destinationAssetBalance = await this.balanceService.getTokenFreeBalance(params.address, destinationAsset.originChain, destinationAsset.slug);
307
+ const xcmFee = params.process.totalFee[params.currentStep];
308
+ const bnAmount = new _bignumber.default(params.quote.fromAmount);
309
+ const bnDestinationAssetBalance = new _bignumber.default(destinationAssetBalance.value);
310
+ let bnTotalAmount = bnAmount.minus(bnDestinationAssetBalance);
311
+ if ((0, _utils._isNativeToken)(originAsset)) {
312
+ const bnXcmFee = new _bignumber.default(xcmFee.feeComponent[0].amount); // xcm fee is paid in native token but swap token is not always native token
313
+
314
+ bnTotalAmount = bnTotalAmount.plus(bnXcmFee);
315
+ }
316
+ const xcmTransfer = await (0, _xcm.createXcmExtrinsic)({
317
+ originTokenInfo: originAsset,
318
+ destinationTokenInfo: destinationAsset,
319
+ sendingValue: bnTotalAmount.toString(),
320
+ recipient: params.address,
321
+ chainInfoMap: this.chainService.getChainInfoMap(),
322
+ substrateApi: chainApi
323
+ });
324
+ const xcmData = {
325
+ originNetworkKey: originAsset.originChain,
326
+ destinationNetworkKey: destinationAsset.originChain,
327
+ from: params.address,
328
+ to: params.address,
329
+ value: bnTotalAmount.toString(),
330
+ tokenSlug: originAsset.slug,
331
+ showExtraWarning: true
332
+ };
333
+ return {
334
+ txChain: originAsset.originChain,
335
+ extrinsic: xcmTransfer,
336
+ transferNativeAmount: (0, _utils._isNativeToken)(originAsset) ? bnTotalAmount.toString() : '0',
337
+ extrinsicType: _KoniTypes.ExtrinsicType.TRANSFER_XCM,
338
+ chainType: _KoniTypes.ChainType.SUBSTRATE,
339
+ txData: xcmData
340
+ };
341
+ }
342
+ async handleSetFeeStep(params) {
343
+ var _swapFeeInfo$selected;
344
+ const substrateApi = this.chainService.getSubstrateApi(this.chain());
345
+ const chainApi = await substrateApi.isReady;
346
+ const swapStepIndex = params.process.steps.findIndex(step => step.type === _swap.SwapStepType.SWAP);
347
+ if (swapStepIndex <= -1) {
348
+ return Promise.reject(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR));
349
+ }
350
+ const swapFeeInfo = params.process.totalFee[swapStepIndex];
351
+ const selectedFeeTokenSlug = (_swapFeeInfo$selected = swapFeeInfo.selectedFeeToken) !== null && _swapFeeInfo$selected !== void 0 ? _swapFeeInfo$selected : swapFeeInfo.defaultFeeToken;
352
+ const selectedFeeAsset = this.chainService.getAssetBySlug(selectedFeeTokenSlug);
353
+ const extrinsic = chainApi.api.tx.multiTransactionPayment.setCurrency((0, _utils._getTokenOnChainAssetId)(selectedFeeAsset));
354
+ const txData = {
355
+ selectedFeeToken: selectedFeeTokenSlug
356
+ };
357
+ return {
358
+ txChain: this.chain(),
359
+ extrinsic,
360
+ // extrinsicType: ExtrinsicType.SET_FEE_TOKEN,
361
+ extrinsicType: _KoniTypes.ExtrinsicType.SWAP,
362
+ chainType: _KoniTypes.ChainType.SUBSTRATE,
363
+ txData
364
+ };
365
+ }
366
+ async handleSubmitStep(params) {
367
+ const txHex = params.quote.metadata;
368
+ const fromAsset = this.chainService.getAssetBySlug(params.quote.pair.from);
369
+ const substrateApi = this.chainService.getSubstrateApi(this.chain());
370
+ const chainApi = await substrateApi.isReady;
371
+ const txData = {
372
+ provider: this.providerInfo,
373
+ quote: params.quote,
374
+ address: params.address,
375
+ slippage: params.slippage,
376
+ txHex,
377
+ process: params.process
378
+ };
379
+ let extrinsic;
380
+ const txList = [];
381
+ const swapTx = chainApi.api.tx(txHex);
382
+ const _referral = await chainApi.api.query.referrals.linkedAccounts(params.address);
383
+ const referral = _referral === null || _referral === void 0 ? void 0 : _referral.toString();
384
+ const needSetReferral = !referral || referral === '';
385
+ const steps = params.process.steps.map(step => step.type);
386
+ const needSetFeeToken = steps.includes(_swap.SwapStepType.SET_FEE_TOKEN);
387
+ if (!needSetReferral && !needSetFeeToken) {
388
+ extrinsic = swapTx;
389
+ } else {
390
+ if (needSetReferral) {
391
+ txList.push(chainApi.api.tx.referrals.linkCode(this.referralCode));
392
+ }
393
+ if (needSetFeeToken) {
394
+ const nativeTokenInfo = this.chainService.getNativeTokenInfo(this.chain());
395
+ txList.push(chainApi.api.tx.multiTransactionPayment.setCurrency((0, _utils._getTokenOnChainAssetId)(nativeTokenInfo)));
396
+ }
397
+ txList.push(swapTx);
398
+ extrinsic = chainApi.api.tx.utility.batchAll(txList);
399
+ }
400
+ return {
401
+ txChain: fromAsset.originChain,
402
+ txData,
403
+ extrinsic,
404
+ transferNativeAmount: (0, _utils._isNativeToken)(fromAsset) ? params.quote.fromAmount : '0',
405
+ // todo
406
+ extrinsicType: _KoniTypes.ExtrinsicType.SWAP,
407
+ chainType: _KoniTypes.ChainType.SUBSTRATE
408
+ };
409
+ }
410
+ handleSwapProcess(params) {
411
+ const {
412
+ currentStep,
413
+ process
414
+ } = params;
415
+ const type = process.steps[currentStep].type;
416
+ switch (type) {
417
+ case _swap.SwapStepType.DEFAULT:
418
+ return Promise.reject(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.UNSUPPORTED));
419
+ case _swap.SwapStepType.XCM:
420
+ return this.handleXcmStep(params);
421
+ case _swap.SwapStepType.SET_FEE_TOKEN:
422
+ return this.handleSetFeeStep(params);
423
+ case _swap.SwapStepType.SWAP:
424
+ return this.handleSubmitStep(params);
425
+ default:
426
+ return this.handleSubmitStep(params);
427
+ }
428
+ }
429
+ async validateSwapProcess(params) {
430
+ const amount = params.selectedQuote.fromAmount;
431
+ const bnAmount = new _bignumber.default(amount);
432
+ if (bnAmount.lte(0)) {
433
+ return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INVALID_PARAMS, 'Amount must be greater than 0')];
434
+ }
435
+ let isXcmOk = false;
436
+ for (const [index, step] of params.process.steps.entries()) {
437
+ const getErrors = async () => {
438
+ switch (step.type) {
439
+ case _swap.SwapStepType.DEFAULT:
440
+ return Promise.resolve([]);
441
+ case _swap.SwapStepType.XCM:
442
+ return this.swapBaseHandler.validateXcmStep(params, index);
443
+ case _swap.SwapStepType.SET_FEE_TOKEN:
444
+ return this.swapBaseHandler.validateSetFeeTokenStep(params, index);
445
+ default:
446
+ return this.swapBaseHandler.validateSwapStep(params, isXcmOk, index);
447
+ }
448
+ };
449
+ const errors = await getErrors();
450
+ if (errors.length) {
451
+ return errors;
452
+ } else if (step.type === _swap.SwapStepType.XCM) {
453
+ isXcmOk = true;
454
+ }
455
+ }
456
+ return [];
457
+ }
458
+ async validateSwapRequest(request) {
459
+ const fromAsset = this.chainService.getAssetBySlug(request.pair.from);
460
+ const toAsset = this.chainService.getAssetBySlug(request.pair.to);
461
+ const fromAssetId = (0, _utils._getTokenOnChainAssetId)(fromAsset);
462
+ const toAssetId = (0, _utils._getTokenOnChainAssetId)(toAsset);
463
+ try {
464
+ var _this$tradeRouter, _this$tradeRouter2;
465
+ // todo: might need to optimize for performance, but prioritize safety for now
466
+ const allAssets = await ((_this$tradeRouter = this.tradeRouter) === null || _this$tradeRouter === void 0 ? void 0 : _this$tradeRouter.getAllAssets());
467
+ if (!allAssets) {
468
+ return {
469
+ error: _swap.SwapErrorType.UNKNOWN
470
+ };
471
+ }
472
+ const supportedFromAsset = allAssets.find(asset => asset.id === fromAssetId && asset.symbol === fromAsset.symbol);
473
+ const supportedToAsset = allAssets.find(asset => asset.id === toAssetId && asset.symbol === toAsset.symbol);
474
+ if (!supportedFromAsset || !supportedToAsset) {
475
+ return {
476
+ error: _swap.SwapErrorType.ASSET_NOT_SUPPORTED
477
+ };
478
+ }
479
+ const assetPairs = await ((_this$tradeRouter2 = this.tradeRouter) === null || _this$tradeRouter2 === void 0 ? void 0 : _this$tradeRouter2.getAssetPairs(fromAssetId));
480
+ if (!assetPairs) {
481
+ return {
482
+ error: _swap.SwapErrorType.UNKNOWN
483
+ };
484
+ }
485
+ const pairedToAsset = assetPairs.find(supportedToAsset => supportedToAsset.id === toAssetId && supportedToAsset.symbol === toAsset.symbol);
486
+ if (!pairedToAsset) {
487
+ return {
488
+ error: _swap.SwapErrorType.ASSET_NOT_SUPPORTED
489
+ };
490
+ }
491
+ if (!(fromAsset.originChain === this.chain() && toAsset.originChain === this.chain())) {
492
+ return {
493
+ error: _swap.SwapErrorType.ASSET_NOT_SUPPORTED
494
+ };
495
+ }
496
+ if (!fromAssetId || !toAssetId) {
497
+ return {
498
+ error: _swap.SwapErrorType.UNKNOWN
499
+ };
500
+ }
501
+ const bnAmount = new _bignumber.default(request.fromAmount);
502
+ if (bnAmount.lte(0)) {
503
+ return {
504
+ error: _swap.SwapErrorType.AMOUNT_CANNOT_BE_ZERO
505
+ };
506
+ }
507
+ return {
508
+ metadata: {
509
+ chain: this.chainService.getChainInfoByKey(this.chain())
510
+ }
511
+ };
512
+ } catch (e) {
513
+ return {
514
+ error: _swap.SwapErrorType.UNKNOWN
515
+ };
516
+ }
517
+ }
518
+ get referralCode() {
519
+ if (this.isTestnet) {
520
+ return HYDRADX_TESTNET_SUBWALLET_REFERRAL_CODE;
521
+ }
522
+ return HYDRADX_SUBWALLET_REFERRAL_CODE;
523
+ }
524
+ get referralAccount() {
525
+ if (this.isTestnet) {
526
+ return HYDRADX_TESTNET_SUBWALLET_REFERRAL_ACCOUNT;
527
+ }
528
+ return HYDRADX_SUBWALLET_REFERRAL_ACCOUNT;
529
+ }
530
+ }
531
+ exports.HydradxHandler = HydradxHandler;