@subwallet/extension-base 1.3.29-0 → 1.3.30-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 (82) hide show
  1. package/background/KoniTypes.d.ts +4 -4
  2. package/background/errors/SwapError.js +1 -1
  3. package/cjs/background/errors/SwapError.js +1 -1
  4. package/cjs/constants/blocked-actions.js +2 -2
  5. package/cjs/constants/remind-notification-time.js +3 -3
  6. package/cjs/core/logic-validation/swap.js +63 -4
  7. package/cjs/core/utils.js +9 -3
  8. package/cjs/koni/background/handlers/Extension.js +5 -82
  9. package/cjs/packageInfo.js +1 -1
  10. package/cjs/services/balance-service/transfer/xcm/availBridge.js +6 -6
  11. package/cjs/services/chain-service/constants.js +1 -1
  12. package/cjs/services/earning-service/handlers/base.js +6 -3
  13. package/cjs/services/earning-service/handlers/native-staking/base.js +4 -1
  14. package/cjs/services/earning-service/handlers/native-staking/dtao.js +68 -50
  15. package/cjs/services/earning-service/handlers/native-staking/tao.js +12 -2
  16. package/cjs/services/earning-service/service.js +2 -1
  17. package/cjs/services/fee-service/utils/index.js +16 -4
  18. package/cjs/services/inapp-notification-service/index.js +19 -13
  19. package/cjs/services/swap-service/handler/asset-hub/handler.js +61 -314
  20. package/cjs/services/swap-service/handler/base-handler.js +393 -231
  21. package/cjs/services/swap-service/handler/chainflip-handler.js +18 -40
  22. package/cjs/services/swap-service/handler/hydradx-handler.js +77 -269
  23. package/cjs/services/swap-service/handler/simpleswap-handler.js +27 -48
  24. package/cjs/services/swap-service/handler/uniswap-handler.js +33 -54
  25. package/cjs/services/swap-service/index.js +154 -143
  26. package/cjs/services/swap-service/utils.js +107 -17
  27. package/cjs/services/transaction-service/index.js +1 -1
  28. package/cjs/types/swap/index.js +13 -1
  29. package/cjs/utils/swap.js +5 -1
  30. package/constants/blocked-actions.d.ts +1 -1
  31. package/constants/blocked-actions.js +1 -1
  32. package/constants/remind-notification-time.d.ts +1 -1
  33. package/constants/remind-notification-time.js +1 -1
  34. package/core/logic-validation/swap.d.ts +15 -0
  35. package/core/logic-validation/swap.js +60 -4
  36. package/core/utils.js +9 -3
  37. package/koni/background/handlers/Extension.d.ts +0 -1
  38. package/koni/background/handlers/Extension.js +6 -83
  39. package/package.json +6 -12
  40. package/packageInfo.js +1 -1
  41. package/services/balance-service/transfer/xcm/availBridge.js +6 -6
  42. package/services/base/types.d.ts +0 -4
  43. package/services/chain-service/constants.js +1 -1
  44. package/services/earning-service/handlers/base.d.ts +4 -3
  45. package/services/earning-service/handlers/base.js +6 -4
  46. package/services/earning-service/handlers/native-staking/base.js +4 -1
  47. package/services/earning-service/handlers/native-staking/dtao.d.ts +9 -6
  48. package/services/earning-service/handlers/native-staking/dtao.js +69 -48
  49. package/services/earning-service/handlers/native-staking/tao.js +12 -2
  50. package/services/earning-service/service.d.ts +2 -1
  51. package/services/earning-service/service.js +2 -1
  52. package/services/fee-service/utils/index.d.ts +1 -0
  53. package/services/fee-service/utils/index.js +14 -4
  54. package/services/inapp-notification-service/index.js +13 -7
  55. package/services/swap-service/handler/asset-hub/handler.d.ts +2 -9
  56. package/services/swap-service/handler/asset-hub/handler.js +64 -317
  57. package/services/swap-service/handler/base-handler.d.ts +6 -9
  58. package/services/swap-service/handler/base-handler.js +391 -229
  59. package/services/swap-service/handler/chainflip-handler.d.ts +2 -4
  60. package/services/swap-service/handler/chainflip-handler.js +15 -37
  61. package/services/swap-service/handler/hydradx-handler.d.ts +3 -10
  62. package/services/swap-service/handler/hydradx-handler.js +78 -270
  63. package/services/swap-service/handler/simpleswap-handler.d.ts +2 -4
  64. package/services/swap-service/handler/simpleswap-handler.js +24 -45
  65. package/services/swap-service/handler/uniswap-handler.d.ts +4 -6
  66. package/services/swap-service/handler/uniswap-handler.js +25 -46
  67. package/services/swap-service/index.d.ts +8 -14
  68. package/services/swap-service/index.js +141 -129
  69. package/services/swap-service/utils.d.ts +11 -3
  70. package/services/swap-service/utils.js +96 -15
  71. package/services/transaction-service/index.js +2 -2
  72. package/types/service-base.d.ts +2 -3
  73. package/types/swap/index.d.ts +25 -9
  74. package/types/swap/index.js +10 -0
  75. package/types/transaction/process.d.ts +19 -0
  76. package/types/yield/actions/join/submit.d.ts +4 -1
  77. package/types/yield/actions/others.d.ts +2 -0
  78. package/utils/swap.d.ts +3 -0
  79. package/utils/swap.js +3 -0
  80. package/cjs/services/swap-service/interface.js +0 -14
  81. package/services/swap-service/interface.d.ts +0 -9
  82. package/services/swap-service/interface.js +0 -8
@@ -8,11 +8,11 @@ exports.UniswapHandler = void 0;
8
8
  var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
9
9
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
10
10
  var _logicValidation = require("@subwallet/extension-base/core/logic-validation");
11
- var _interface = require("@subwallet/extension-base/services/swap-service/interface");
12
11
  var _types = require("@subwallet/extension-base/types");
12
+ var _utils = require("@subwallet/extension-base/utils");
13
13
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
14
- var _utils = require("../../chain-service/utils");
15
- var _utils2 = require("../../fee-service/utils");
14
+ var _utils2 = require("../../chain-service/utils");
15
+ var _utils3 = require("../../fee-service/utils");
16
16
  var _baseHandler = require("./base-handler");
17
17
  // Copyright 2019-2022 @subwallet/extension-base
18
18
  // SPDX-License-Identifier: Apache-2.0
@@ -65,13 +65,10 @@ class UniswapHandler {
65
65
  get providerInfo() {
66
66
  return this.swapBaseHandler.providerInfo;
67
67
  }
68
- generateOptimalProcess(params) {
69
- return this.swapBaseHandler.generateOptimalProcess(params, [this.getApprovalStep.bind(this), this.getPermitStep.bind(this), this.getSubmitStep.bind(this)]);
70
- }
71
68
  generateOptimalProcessV2(params) {
72
69
  return this.swapBaseHandler.generateOptimalProcessV2(params, [this.getApprovalStep.bind(this), this.getPermitStep.bind(this), this.getSubmitStep.bind(this)]);
73
70
  }
74
- async getApprovalStep(params) {
71
+ async getApprovalStep(params, stepIndex) {
75
72
  if (params.selectedQuote) {
76
73
  const walletAddress = params.request.address;
77
74
  const fromAmount = params.selectedQuote.fromAmount;
@@ -91,7 +88,7 @@ class UniswapHandler {
91
88
  }
92
89
  const metadata = {
93
90
  tokenApprove: inputTokenInfo.slug,
94
- contractAddress: (0, _utils._getContractAddressOfToken)(inputTokenInfo),
91
+ contractAddress: (0, _utils2._getContractAddressOfToken)(inputTokenInfo),
95
92
  spenderAddress: spender
96
93
  };
97
94
  const submitStep = {
@@ -104,7 +101,7 @@ class UniswapHandler {
104
101
  }
105
102
  return Promise.resolve(undefined);
106
103
  }
107
- async getPermitStep(params) {
104
+ async getPermitStep(params, stepIndex) {
108
105
  if (params.selectedQuote && params.selectedQuote.metadata.permitData) {
109
106
  const submitStep = {
110
107
  name: 'Permit Step',
@@ -125,47 +122,29 @@ class UniswapHandler {
125
122
  }
126
123
  return Promise.resolve(undefined);
127
124
  }
128
- async getSubmitStep(params) {
129
- if (params.selectedQuote) {
130
- const submitStep = {
131
- name: 'Swap',
132
- type: _types.SwapStepType.SWAP,
133
- metadata: {
134
- sendingValue: params.request.fromAmount.toString(),
135
- originTokenInfo: this.chainService.getAssetBySlug(params.selectedQuote.pair.from),
136
- destinationTokenInfo: this.chainService.getAssetBySlug(params.selectedQuote.pair.to)
137
- }
138
- };
139
- return Promise.resolve([submitStep, params.selectedQuote.feeInfo]);
140
- }
141
- return Promise.resolve(undefined);
142
- }
143
- async validateSwapProcess(params) {
144
- const amount = params.selectedQuote.fromAmount;
145
- const bnAmount = BigInt(amount);
146
- if (bnAmount <= BigInt(0)) {
147
- return Promise.resolve([new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, 'Amount must be greater than 0')]);
125
+ async getSubmitStep(params, stepIndex) {
126
+ if (!params.selectedQuote) {
127
+ return Promise.resolve(undefined);
148
128
  }
149
- let isXcmOk = false;
150
- for (const [index, step] of params.process.steps.entries()) {
151
- const getErrors = async () => {
152
- switch (step.type) {
153
- case _types.CommonStepType.DEFAULT:
154
- return Promise.resolve([]);
155
- case _types.CommonStepType.TOKEN_APPROVAL:
156
- return Promise.resolve([]);
157
- default:
158
- return this.swapBaseHandler.validateSwapStep(params, isXcmOk, index);
159
- }
160
- };
161
- const errors = await getErrors();
162
- if (errors.length) {
163
- return errors;
164
- } else if (step.type === _types.CommonStepType.XCM) {
165
- isXcmOk = true;
129
+ const originTokenInfo = this.chainService.getAssetBySlug(params.selectedQuote.pair.from);
130
+ const destinationTokenInfo = this.chainService.getAssetBySlug(params.selectedQuote.pair.to);
131
+ const originChain = this.chainService.getChainInfoByKey(originTokenInfo.originChain);
132
+ const destinationChain = this.chainService.getChainInfoByKey(destinationTokenInfo.originChain);
133
+ const submitStep = {
134
+ name: 'Swap',
135
+ type: _types.SwapStepType.SWAP,
136
+ // @ts-ignore
137
+ metadata: {
138
+ sendingValue: params.request.fromAmount.toString(),
139
+ expectedReceive: params.selectedQuote.toAmount,
140
+ originTokenInfo,
141
+ destinationTokenInfo,
142
+ sender: (0, _utils._reformatAddressWithChain)(params.request.address, originChain),
143
+ receiver: (0, _utils._reformatAddressWithChain)(params.request.recipient || params.request.address, destinationChain),
144
+ version: 2
166
145
  }
167
- }
168
- return [];
146
+ };
147
+ return Promise.resolve([submitStep, params.selectedQuote.feeInfo]);
169
148
  }
170
149
  async handleSwapProcess(params) {
171
150
  const {
@@ -199,7 +178,7 @@ class UniswapHandler {
199
178
  if (approval) {
200
179
  var _priority$options, _priority$options$Fee, _priority$options2;
201
180
  const evmApi = this.chainService.getEvmApi(fromAsset.originChain);
202
- const priority = await (0, _utils2.calculateGasFeeParams)(evmApi, evmApi.chainSlug);
181
+ const priority = await (0, _utils3.calculateGasFeeParams)(evmApi, evmApi.chainSlug);
203
182
  transactionConfig = {
204
183
  from: approval.from,
205
184
  to: approval.to,
@@ -286,7 +265,7 @@ class UniswapHandler {
286
265
  txChain: fromAsset.originChain,
287
266
  txData,
288
267
  extrinsic: extrinsic,
289
- transferNativeAmount: (0, _utils._isNativeToken)(fromAsset) ? params.quote.fromAmount : '0',
268
+ transferNativeAmount: (0, _utils2._isNativeToken)(fromAsset) ? params.quote.fromAmount : '0',
290
269
  extrinsicType: _KoniTypes.ExtrinsicType.SWAP,
291
270
  chainType: _KoniTypes.ChainType.EVM
292
271
  };
@@ -349,10 +328,10 @@ class UniswapHandler {
349
328
  return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, 'Amount must be greater than 0')];
350
329
  }
351
330
  const actionList = JSON.stringify(process.path.map(step => step.action));
352
- const swap = actionList === JSON.stringify([_interface.DynamicSwapType.SWAP]);
353
- const swapXcm = actionList === JSON.stringify([_interface.DynamicSwapType.SWAP, _interface.DynamicSwapType.BRIDGE]);
354
- const xcmSwap = actionList === JSON.stringify([_interface.DynamicSwapType.BRIDGE, _interface.DynamicSwapType.SWAP]);
355
- const xcmSwapXcm = actionList === JSON.stringify([_interface.DynamicSwapType.BRIDGE, _interface.DynamicSwapType.SWAP, _interface.DynamicSwapType.BRIDGE]);
331
+ const swap = actionList === JSON.stringify([_types.DynamicSwapType.SWAP]);
332
+ const swapXcm = actionList === JSON.stringify([_types.DynamicSwapType.SWAP, _types.DynamicSwapType.BRIDGE]);
333
+ const xcmSwap = actionList === JSON.stringify([_types.DynamicSwapType.BRIDGE, _types.DynamicSwapType.SWAP]);
334
+ const xcmSwapXcm = actionList === JSON.stringify([_types.DynamicSwapType.BRIDGE, _types.DynamicSwapType.SWAP, _types.DynamicSwapType.BRIDGE]);
356
335
  const swapIndex = params.process.steps.findIndex(step => step.type === _types.SwapStepType.SWAP); // todo
357
336
 
358
337
  if (swapIndex <= -1) {
@@ -4,37 +4,38 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports._isChainSupportedByProvider = exports.SwapService = void 0;
7
+ exports.SwapService = void 0;
8
+ var _chainList = require("@subwallet/chain-list");
9
+ var _types = require("@subwallet/chain-list/types");
8
10
  var _SwapError = require("@subwallet/extension-base/background/errors/SwapError");
9
11
  var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
10
- var _types = require("@subwallet/extension-base/services/base/types");
12
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
13
+ var _constants = require("@subwallet/extension-base/constants");
14
+ var _types2 = require("@subwallet/extension-base/services/base/types");
11
15
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
12
16
  var _assetHub = require("@subwallet/extension-base/services/swap-service/handler/asset-hub");
13
17
  var _chainflipHandler = require("@subwallet/extension-base/services/swap-service/handler/chainflip-handler");
14
18
  var _hydradxHandler = require("@subwallet/extension-base/services/swap-service/handler/hydradx-handler");
15
19
  var _utils2 = require("@subwallet/extension-base/services/swap-service/utils");
16
- var _types2 = require("@subwallet/extension-base/types");
20
+ var _types3 = require("@subwallet/extension-base/types");
17
21
  var _serviceBase = require("@subwallet/extension-base/types/service-base");
18
22
  var _swap = require("@subwallet/extension-base/types/swap");
19
23
  var _utils3 = require("@subwallet/extension-base/utils");
20
24
  var _subwalletApiSdk = _interopRequireDefault(require("@subwallet/subwallet-api-sdk"));
25
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
26
+ var _i18next = require("i18next");
21
27
  var _rxjs = require("rxjs");
22
28
  var _simpleswapHandler = require("./handler/simpleswap-handler");
23
29
  var _uniswapHandler = require("./handler/uniswap-handler");
24
30
  // Copyright 2019-2022 @subwallet/extension-base
25
31
  // SPDX-License-Identifier: Apache-2.0
26
32
 
27
- const _isChainSupportedByProvider = (providerSlug, chain) => {
28
- const supportedChains = _utils2._PROVIDER_TO_SUPPORTED_PAIR_MAP[providerSlug];
29
- return supportedChains ? supportedChains.includes(chain) : false;
30
- };
31
- exports._isChainSupportedByProvider = _isChainSupportedByProvider;
32
33
  class SwapService {
33
34
  swapPairSubject = new _rxjs.BehaviorSubject([]);
34
35
  handlers = {};
35
36
  startPromiseHandler = (0, _utils3.createPromiseHandler)();
36
37
  stopPromiseHandler = (0, _utils3.createPromiseHandler)();
37
- status = _types.ServiceStatus.NOT_INITIALIZED;
38
+ status = _types2.ServiceStatus.NOT_INITIALIZED;
38
39
  constructor(state) {
39
40
  this.state = state;
40
41
  this.eventService = state.eventService;
@@ -43,13 +44,6 @@ class SwapService {
43
44
  async askProvidersForQuote(request) {
44
45
  var _subwalletApiSdk$swap;
45
46
  const availableQuotes = [];
46
- await Promise.all(Object.values(this.handlers).map(async handler => {
47
- // temporary solution to reduce number of requests to providers, will work as long as there's only 1 provider for 1 chain
48
-
49
- if (handler.init && handler.isReady === false) {
50
- await handler.init();
51
- }
52
- }));
53
47
  const quotes = await ((_subwalletApiSdk$swap = _subwalletApiSdk.default.swapApi) === null || _subwalletApiSdk$swap === void 0 ? void 0 : _subwalletApiSdk$swap.fetchSwapQuoteData(request));
54
48
  if (Array.isArray(quotes)) {
55
49
  quotes.forEach(quoteData => {
@@ -69,32 +63,17 @@ class SwapService {
69
63
  }
70
64
  return availableQuotes;
71
65
  }
72
- getDefaultProcess(params) {
73
- const result = {
74
- totalFee: [_serviceBase.MOCK_STEP_FEE],
75
- steps: [_serviceBase.DEFAULT_FIRST_STEP],
76
- path: []
77
- };
78
- result.totalFee.push({
79
- feeComponent: [],
80
- feeOptions: [params.request.pair.from],
81
- defaultFeeToken: params.request.pair.from
82
- });
83
- result.steps.push({
84
- id: result.steps.length,
85
- name: 'Swap',
86
- type: _swap.SwapStepType.SWAP
87
- });
88
- return result;
89
- }
90
66
  getDefaultProcessV2(params) {
91
67
  const result = {
92
68
  totalFee: [_serviceBase.MOCK_STEP_FEE],
93
69
  steps: [_serviceBase.DEFAULT_FIRST_STEP],
94
70
  path: []
95
71
  };
96
- const swapPairInfo = params.path[0].pair; // todo: improve for Round 2
97
-
72
+ const swapPairInfo = params.path.find(action => action.action === _types3.DynamicSwapType.SWAP);
73
+ if (!swapPairInfo) {
74
+ console.error('Swap pair is not found');
75
+ return result;
76
+ }
98
77
  result.totalFee.push({
99
78
  feeComponent: [],
100
79
  feeOptions: [params.request.pair.from],
@@ -106,34 +85,18 @@ class SwapService {
106
85
  type: _swap.SwapStepType.SWAP,
107
86
  metadata: {
108
87
  sendingValue: params.request.fromAmount.toString(),
109
- originTokenInfo: this.chainService.getAssetBySlug(swapPairInfo.from),
110
- destinationTokenInfo: this.chainService.getAssetBySlug(swapPairInfo.to)
88
+ originTokenInfo: this.chainService.getAssetBySlug(swapPairInfo.pair.from),
89
+ destinationTokenInfo: this.chainService.getAssetBySlug(swapPairInfo.pair.to)
111
90
  }
112
91
  });
113
92
  return result;
114
93
  }
115
-
116
- // deprecated
117
- async generateOptimalProcess(params) {
118
- if (!params.selectedQuote) {
119
- return this.getDefaultProcess(params);
120
- } else {
121
- var _params$request$curre;
122
- const providerId = ((_params$request$curre = params.request.currentQuote) === null || _params$request$curre === void 0 ? void 0 : _params$request$curre.id) || params.selectedQuote.provider.id;
123
- const handler = this.handlers[providerId];
124
- if (handler) {
125
- return handler.generateOptimalProcess(params);
126
- } else {
127
- return this.getDefaultProcess(params);
128
- }
129
- }
130
- }
131
94
  async generateOptimalProcessV2(params) {
132
95
  if (!params.selectedQuote) {
133
96
  return this.getDefaultProcessV2(params);
134
97
  } else {
135
- var _params$request$curre2;
136
- const providerId = ((_params$request$curre2 = params.request.currentQuote) === null || _params$request$curre2 === void 0 ? void 0 : _params$request$curre2.id) || params.selectedQuote.provider.id;
98
+ var _params$request$curre;
99
+ const providerId = ((_params$request$curre = params.request.currentQuote) === null || _params$request$curre === void 0 ? void 0 : _params$request$curre.id) || params.selectedQuote.provider.id;
137
100
  const handler = this.handlers[providerId];
138
101
  if (handler) {
139
102
  return handler.generateOptimalProcessV2(params);
@@ -142,48 +105,6 @@ class SwapService {
142
105
  }
143
106
  }
144
107
  }
145
- async generateOptimalProcessWithoutPath(params) {
146
- var _params$request$curre3;
147
- if (!params.selectedQuote || params.path.length > 0) {
148
- return this.getDefaultProcessV2(params);
149
- }
150
- const [path, directSwapRequest] = this.getAvailablePath(params.request);
151
- if (!directSwapRequest) {
152
- return this.getDefaultProcessV2(params);
153
- }
154
- params.path = path;
155
- const providerId = ((_params$request$curre3 = params.request.currentQuote) === null || _params$request$curre3 === void 0 ? void 0 : _params$request$curre3.id) || params.selectedQuote.provider.id;
156
- const handler = this.handlers[providerId];
157
- if (handler) {
158
- return handler.generateOptimalProcessV2(params);
159
- } else {
160
- return this.getDefaultProcessV2(params);
161
- }
162
- }
163
-
164
- // deprecated
165
- // eslint-disable-next-line @typescript-eslint/require-await
166
- async handleSwapRequest(request) {
167
- /*
168
- * 1. Ask swap quotes from providers
169
- * 2. Select the best quote
170
- * 3. Generate optimal process for that quote
171
- * */
172
-
173
- // const swapQuoteResponse = await this.getLatestDirectQuotes(request);
174
-
175
- // const optimalProcess = await this.generateOptimalProcess({
176
- // request,
177
- // selectedQuote: swapQuoteResponse.optimalQuote
178
- // });
179
-
180
- return {
181
- // @ts-ignore
182
- process: null,
183
- // @ts-ignore
184
- quote: null
185
- };
186
- }
187
108
  async handleSwapRequestV2(request) {
188
109
  /*
189
110
  * 1. Find available path
@@ -192,14 +113,6 @@ class SwapService {
192
113
  * 4. Generate optimal process for that quote
193
114
  * */
194
115
 
195
- // todo: path will become a list of path in Round 2
196
- // const [path, directSwapRequest] = this.getAvailablePath(request);
197
- //
198
- // if (!directSwapRequest) {
199
- // throw Error('Swap pair not found');
200
- // }
201
-
202
- // const swapQuoteResponse = await this.getLatestDirectQuotes(directSwapRequest);
203
116
  const {
204
117
  path,
205
118
  swapQuoteResponse
@@ -209,63 +122,131 @@ class SwapService {
209
122
  selectedQuote: swapQuoteResponse.optimalQuote,
210
123
  path
211
124
  });
125
+ console.log('-------');
126
+ console.log('optimalProcess', optimalProcess);
127
+ console.log('-------');
128
+ if (optimalProcess.steps.length - 1 < optimalProcess.path.length) {
129
+ // minus the fill info step
130
+ throw new Error('Swap pair is not found');
131
+ }
212
132
  return {
213
133
  process: optimalProcess,
214
134
  quote: swapQuoteResponse
215
135
  };
216
136
  }
137
+
138
+ // todo: rewrite this function
217
139
  getAvailablePath(request) {
218
140
  const {
141
+ address,
219
142
  pair
220
143
  } = request;
221
144
  // todo: control provider tighter
222
- const allSupportedChainsBySwapProvider = [...new Set(Object.values(_utils2._PROVIDER_TO_SUPPORTED_PAIR_MAP).flat())];
145
+ const supportSwapChains = (0, _utils2.getSupportSwapChain)();
223
146
  const fromToken = this.chainService.getAssetBySlug(pair.from);
224
147
  const toToken = this.chainService.getAssetBySlug(pair.to);
225
148
  const fromChain = (0, _utils._getAssetOriginChain)(fromToken);
226
149
  const toChain = (0, _utils._getAssetOriginChain)(toToken);
227
150
  const toChainInfo = this.chainService.getChainInfoByKey(toChain);
228
- const process = [];
151
+ const assetRefMap = this.chainService.getAssetRefMap();
152
+ let process = [];
229
153
  if (!fromToken || !toToken) {
230
154
  throw Error('Token not found');
231
155
  }
232
156
  if (!fromChain || !toChain) {
233
157
  throw Error('Token metadata error');
234
158
  }
159
+ const directXcmRef = Object.values(assetRefMap).find(assetRef => assetRef.path === _types._AssetRefPath.XCM && assetRef.srcAsset === fromToken.slug && assetRef.destAsset === toToken.slug);
160
+ if (directXcmRef) {
161
+ return [[], undefined];
162
+ }
235
163
 
236
164
  // SWAP: 2 tokens in the same chain and chain has dex
237
165
  if ((0, _utils2.isChainsHasSameProvider)(fromChain, toChain)) {
238
166
  // there's a dex that can support direct swapping
239
- const swapStep = (0, _utils2.getSwapStep)(fromToken.slug, toToken.slug);
167
+ process.push((0, _utils2.getSwapStep)(fromToken.slug, toToken.slug));
168
+ return [process, request];
169
+ }
170
+
171
+ // ------------------------
172
+ // BRIDGE -> SWAP: Try to find a token in dest chain that can bridge from fromToken
173
+ const bridgeTransit = (0, _utils2.findBridgeTransitDestination)(assetRefMap, fromToken, toToken);
174
+ if (bridgeTransit && supportSwapChains.includes(toChain)) {
175
+ const swapStep = (0, _utils2.getSwapStep)(bridgeTransit, toToken.slug);
176
+ process.push((0, _utils2.getBridgeStep)(fromToken.slug, bridgeTransit));
240
177
  process.push(swapStep);
241
178
  return [process, {
242
179
  ...request,
180
+ address: (0, _utils3.reformatAddress)(address, (0, _utils._getChainSubstrateAddressPrefix)(toChainInfo)),
243
181
  pair: swapStep.pair
244
182
  }];
245
183
  }
246
184
 
247
- // BRIDGE -> SWAP: Try to find a token in dest chain that can bridge from fromToken
248
- const bridgeDestination = (0, _utils2.findXcmDestination)(this.chainService.getAssetRefMap(), fromToken, toChain);
249
- if (bridgeDestination && allSupportedChainsBySwapProvider.includes(toChain)) {
250
- const bridgeStep = (0, _utils2.getBridgeStep)(fromToken.slug, bridgeDestination);
251
- const swapStep = (0, _utils2.getSwapStep)(bridgeDestination, toToken.slug);
252
- process.push(bridgeStep);
185
+ // ------------------------
186
+ // SWAP -> BRIDGE: Try to find a token in from chain that can bridge to toToken
187
+ const swapTransit = (0, _utils2.findSwapTransitDestination)(assetRefMap, fromToken, toToken);
188
+ if (swapTransit && supportSwapChains.includes(fromChain)) {
189
+ const swapStep = (0, _utils2.getSwapStep)(fromToken.slug, swapTransit);
253
190
  process.push(swapStep);
191
+ process.push((0, _utils2.getBridgeStep)(swapTransit, toToken.slug));
254
192
  return [process, {
255
193
  ...request,
256
- address: (0, _utils3.reformatAddress)(request.address, (0, _utils._getChainSubstrateAddressPrefix)(toChainInfo)),
257
194
  pair: swapStep.pair
258
195
  }];
259
196
  }
260
197
 
261
- // todo: improve to support SWAP -> BRIDGE and BRIDGE -> SWAP -> BRIDGE
198
+ // ------------------------
199
+ // BRIDGE -> SWAP -> BRIDGE: Try to find a tri-step path to swap
200
+ const processList = [];
201
+ const swapPairList = [];
202
+ const allBridgeDestinations = (0, _utils2.findAllBridgeDestinations)(assetRefMap, fromToken);
203
+
204
+ // currently find first path. Todo: return all paths or best path.
205
+ for (const bridgeTransit of allBridgeDestinations) {
206
+ process = [];
207
+ const bridgeDestinationInfo = this.chainService.getAssetBySlug(bridgeTransit);
208
+ const swapTransit = (0, _utils2.findSwapTransitDestination)(assetRefMap, bridgeDestinationInfo, toToken);
209
+ if (bridgeTransit === swapTransit) {
210
+ continue;
211
+ }
212
+ if (swapTransit && supportSwapChains.includes(bridgeDestinationInfo.originChain)) {
213
+ const swapStep = (0, _utils2.getSwapStep)(bridgeTransit, swapTransit);
214
+ process.push((0, _utils2.getBridgeStep)(fromToken.slug, bridgeTransit));
215
+ process.push(swapStep);
216
+ process.push((0, _utils2.getBridgeStep)(swapTransit, toToken.slug));
217
+
218
+ // set the highest priority to hydration provider
219
+ if (bridgeDestinationInfo.originChain === _chainList.COMMON_CHAIN_SLUGS.HYDRADX) {
220
+ return [process, {
221
+ ...request,
222
+ address: (0, _utils3._reformatAddressWithChain)(address, this.chainService.getChainInfoByKey(_chainList.COMMON_CHAIN_SLUGS.HYDRADX)),
223
+ pair: swapStep.pair
224
+ }];
225
+ }
226
+ processList.push(process);
227
+ swapPairList.push(swapStep.pair);
228
+ }
229
+ }
230
+
231
+ // get first process
232
+ if (processList.length && swapPairList.length) {
233
+ const [firstProcess, firstSwapPair] = [processList[0], swapPairList[0]];
234
+ const chainSwap = this.chainService.getAssetBySlug(firstSwapPair.from).originChain;
235
+ return [firstProcess, {
236
+ ...request,
237
+ address: (0, _utils3._reformatAddressWithChain)(address, this.chainService.getChainInfoByKey(chainSwap)),
238
+ pair: firstSwapPair
239
+ }];
240
+ }
241
+
242
+ // todo: encapsulate each route type to function
262
243
 
263
244
  return [[], undefined];
264
245
  }
265
246
  async getLatestQuoteFromSwapRequest(request) {
266
247
  const [path, directSwapRequest] = this.getAvailablePath(request);
267
248
  if (!directSwapRequest) {
268
- throw Error('Swap pair not found');
249
+ throw Error('Swap pair is not found');
269
250
  }
270
251
  const swapQuoteResponse = await this.getLatestDirectQuotes(directSwapRequest);
271
252
  return {
@@ -292,12 +273,32 @@ class SwapService {
292
273
  quoteError = (preferredErrorResp === null || preferredErrorResp === void 0 ? void 0 : preferredErrorResp.error) || (defaultErrorResp === null || defaultErrorResp === void 0 ? void 0 : defaultErrorResp.error);
293
274
  } else {
294
275
  var _selectedQuote;
295
- selectedQuote = availableQuotes.find(quote => {
296
- var _request$currentQuote;
297
- return quote.provider.id === ((_request$currentQuote = request.currentQuote) === null || _request$currentQuote === void 0 ? void 0 : _request$currentQuote.id);
298
- }) || availableQuotes[0]; // todo: choose best quote based on rate
276
+ // sort quotes by largest receivable, with priority for some providers
277
+ availableQuotes.sort((a, b) => {
278
+ const bnToAmountA = (0, _bignumber.default)(a.toAmount);
279
+ const bnToAmountB = (0, _bignumber.default)(b.toAmount);
280
+ if (bnToAmountB.eq(bnToAmountA) && [_swap.SwapProviderId.CHAIN_FLIP_MAINNET, _swap.SwapProviderId.UNISWAP].includes(a.provider.id)) {
281
+ return -1;
282
+ }
283
+ if (bnToAmountA.gt(bnToAmountB)) {
284
+ return -1;
285
+ } else {
286
+ return 1;
287
+ }
288
+ });
289
+ if (request.preferredProvider) {
290
+ selectedQuote = availableQuotes.find(quote => quote.provider.id === request.preferredProvider) || availableQuotes[0];
291
+ } else {
292
+ selectedQuote = availableQuotes[0];
293
+ }
299
294
  aliveUntil = ((_selectedQuote = selectedQuote) === null || _selectedQuote === void 0 ? void 0 : _selectedQuote.aliveUntil) || +Date.now() + _utils2.SWAP_QUOTE_TIMEOUT_MAP.default;
300
295
  }
296
+ const neededProviders = availableQuotes.map(quote => quote.provider.id);
297
+ await Promise.all(Object.values(this.handlers).map(async handler => {
298
+ if (neededProviders.includes(handler.providerSlug) && handler.init && handler.isReady === false) {
299
+ await handler.init();
300
+ }
301
+ }));
301
302
  return {
302
303
  optimalQuote: selectedQuote,
303
304
  quotes: availableQuotes,
@@ -344,20 +345,20 @@ class SwapService {
344
345
  });
345
346
  }
346
347
  async init() {
347
- this.status = _types.ServiceStatus.INITIALIZING;
348
+ this.status = _types2.ServiceStatus.INITIALIZING;
348
349
  this.eventService.emit('swap.ready', true);
349
- this.status = _types.ServiceStatus.INITIALIZED;
350
+ this.status = _types2.ServiceStatus.INITIALIZED;
350
351
  this.initHandlers();
351
352
  await this.start();
352
353
  }
353
354
  async start() {
354
- if (this.status === _types.ServiceStatus.STOPPING) {
355
+ if (this.status === _types2.ServiceStatus.STOPPING) {
355
356
  await this.waitForStopped();
356
357
  }
357
- if (this.status === _types.ServiceStatus.STARTED || this.status === _types.ServiceStatus.STARTING) {
358
+ if (this.status === _types2.ServiceStatus.STARTED || this.status === _types2.ServiceStatus.STARTING) {
358
359
  return this.waitForStarted();
359
360
  }
360
- this.status = _types.ServiceStatus.STARTING;
361
+ this.status = _types2.ServiceStatus.STARTING;
361
362
 
362
363
  // todo: start the service jobs, subscribe data,...
363
364
 
@@ -366,13 +367,13 @@ class SwapService {
366
367
  // Update promise handler
367
368
  this.startPromiseHandler.resolve();
368
369
  this.stopPromiseHandler = (0, _utils3.createPromiseHandler)();
369
- this.status = _types.ServiceStatus.STARTED;
370
+ this.status = _types2.ServiceStatus.STARTED;
370
371
  }
371
372
  async stop() {
372
- if (this.status === _types.ServiceStatus.STARTING) {
373
+ if (this.status === _types2.ServiceStatus.STARTING) {
373
374
  await this.waitForStarted();
374
375
  }
375
- if (this.status === _types.ServiceStatus.STOPPED || this.status === _types.ServiceStatus.STOPPING) {
376
+ if (this.status === _types2.ServiceStatus.STOPPED || this.status === _types2.ServiceStatus.STOPPING) {
376
377
  return this.waitForStopped();
377
378
  }
378
379
 
@@ -380,7 +381,7 @@ class SwapService {
380
381
 
381
382
  this.stopPromiseHandler.resolve();
382
383
  this.startPromiseHandler = (0, _utils3.createPromiseHandler)();
383
- this.status = _types.ServiceStatus.STOPPED;
384
+ this.status = _types2.ServiceStatus.STOPPED;
384
385
  }
385
386
  waitForStarted() {
386
387
  return this.startPromiseHandler.promise;
@@ -402,35 +403,45 @@ class SwapService {
402
403
  };
403
404
  });
404
405
  }
405
-
406
- // private getSwapPairMetadata (slug: string): Record<string, any> | undefined {
407
- // return this.getSwapPairs().find((pair) => pair.slug === slug)?.metadata;
408
- // }
409
-
410
- async validateSwapProcess(params) {
406
+ async validateSwapProcessV2(params) {
411
407
  const providerId = params.selectedQuote.provider.id;
412
408
  const handler = this.handlers[providerId];
413
- if (params.currentStep > 1) {
414
- // only validate from the first step
409
+ if (params.currentStep > 0) {
415
410
  return [];
416
411
  }
412
+ const blockedConfigObjects = await (0, _constants.fetchBlockedConfigObjects)();
413
+ const currentConfig = this.state.settingService.getEnvironmentSetting();
414
+ const passBlockedConfigId = (0, _constants.getPassConfigId)(currentConfig, blockedConfigObjects);
415
+ const blockedActionsFeaturesMaps = await (0, _constants.fetchLatestBlockedActionsAndFeatures)(passBlockedConfigId);
416
+ const originSwapPairInfo = (0, _utils2.getTokenPairFromStep)(params.process.steps);
417
+ if (!originSwapPairInfo) {
418
+ return [new _TransactionError.TransactionError(_types3.BasicTxErrorType.INTERNAL_ERROR)];
419
+ }
420
+ const currentAction = `${_KoniTypes.ExtrinsicType.SWAP}___${originSwapPairInfo.slug}___${params.selectedQuote.provider.id}`;
421
+ for (const blockedActionsFeaturesMap of blockedActionsFeaturesMaps) {
422
+ const {
423
+ blockedActionsMap
424
+ } = blockedActionsFeaturesMap;
425
+ if (blockedActionsMap.swap.includes(currentAction)) {
426
+ return [new _TransactionError.TransactionError(_types3.BasicTxErrorType.UNSUPPORTED, (0, _i18next.t)('Feature under maintenance. Try again later'))];
427
+ }
428
+ }
417
429
  if (handler) {
418
430
  return handler.validateSwapProcessV2(params);
419
431
  } else {
420
- return [new _TransactionError.TransactionError(_types2.BasicTxErrorType.INTERNAL_ERROR)];
432
+ return [new _TransactionError.TransactionError(_types3.BasicTxErrorType.INTERNAL_ERROR)];
421
433
  }
422
434
  }
423
435
  async handleSwapProcess(params) {
424
436
  const handler = this.handlers[params.quote.provider.id];
425
437
  if (params.process.steps.length === 1) {
426
438
  // todo: do better to handle error generating steps
427
- return Promise.reject(new _TransactionError.TransactionError(_types2.BasicTxErrorType.INTERNAL_ERROR, 'Please check your network and try again'));
439
+ return Promise.reject(new _TransactionError.TransactionError(_types3.BasicTxErrorType.INTERNAL_ERROR, 'Please check your network and try again'));
428
440
  }
429
- console.log('handling swap process: ', params.process);
430
441
  if (handler) {
431
442
  return handler.handleSwapProcess(params);
432
443
  } else {
433
- return Promise.reject(new _TransactionError.TransactionError(_types2.BasicTxErrorType.INTERNAL_ERROR));
444
+ return Promise.reject(new _TransactionError.TransactionError(_types3.BasicTxErrorType.INTERNAL_ERROR));
434
445
  }
435
446
  }
436
447
  subscribeSwapPairs(callback) {