@subwallet/extension-base 1.3.29-1 → 1.3.31-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.
- package/background/KoniTypes.d.ts +16 -4
- package/background/errors/SwapError.js +1 -1
- package/cjs/background/errors/SwapError.js +1 -1
- package/cjs/constants/blocked-actions.js +2 -2
- package/cjs/constants/paraspell-chain-map.js +13 -0
- package/cjs/constants/remind-notification-time.js +3 -3
- package/cjs/core/logic-validation/swap.js +63 -4
- package/cjs/core/logic-validation/transfer.js +13 -1
- package/cjs/core/substrate/xcm-parser.js +5 -1
- package/cjs/core/utils.js +36 -15
- package/cjs/koni/background/handlers/Extension.js +141 -172
- package/cjs/koni/background/handlers/State.js +8 -1
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/helpers/process.js +27 -0
- package/cjs/services/balance-service/index.js +9 -0
- package/cjs/services/balance-service/transfer/xcm/acrossBridge/index.js +229 -0
- package/cjs/services/balance-service/transfer/xcm/availBridge.js +6 -6
- package/cjs/services/balance-service/transfer/xcm/index.js +96 -7
- package/cjs/services/balance-service/transfer/xcm/utils.js +213 -0
- package/cjs/services/chain-service/constants.js +2 -4
- package/cjs/services/chain-service/index.js +71 -17
- package/cjs/services/chain-service/utils/patch.js +1 -1
- package/cjs/services/earning-service/handlers/base.js +6 -3
- package/cjs/services/earning-service/handlers/native-staking/base.js +4 -1
- package/cjs/services/earning-service/handlers/native-staking/dtao.js +68 -50
- package/cjs/services/earning-service/handlers/native-staking/tao.js +12 -2
- package/cjs/services/earning-service/handlers/special.js +18 -9
- package/cjs/services/earning-service/service.js +2 -1
- package/cjs/services/fee-service/utils/index.js +16 -4
- package/cjs/services/inapp-notification-service/index.js +19 -13
- package/cjs/services/keyring-service/context/handlers/Ledger.js +1 -1
- package/cjs/services/keyring-service/context/state.js +3 -0
- package/cjs/services/migration-service/scripts/DisableZeroBalanceTokens.js +60 -0
- package/cjs/services/migration-service/scripts/EnableChain.js +1 -1
- package/cjs/services/migration-service/scripts/index.js +3 -2
- package/cjs/services/swap-service/handler/asset-hub/handler.js +61 -314
- package/cjs/services/swap-service/handler/base-handler.js +406 -231
- package/cjs/services/swap-service/handler/chainflip-handler.js +18 -40
- package/cjs/services/swap-service/handler/hydradx-handler.js +77 -269
- package/cjs/services/swap-service/handler/simpleswap-handler.js +27 -48
- package/cjs/services/swap-service/handler/uniswap-handler.js +33 -54
- package/cjs/services/swap-service/index.js +154 -143
- package/cjs/services/swap-service/utils.js +107 -17
- package/cjs/services/transaction-service/index.js +1 -1
- package/cjs/services/transaction-service/utils.js +38 -14
- package/cjs/types/swap/index.js +13 -1
- package/cjs/utils/fee/transfer.js +52 -28
- package/cjs/utils/staticData/index.js +7 -2
- package/cjs/utils/swap.js +5 -1
- package/constants/blocked-actions.d.ts +1 -1
- package/constants/blocked-actions.js +1 -1
- package/constants/paraspell-chain-map.d.ts +1 -0
- package/constants/paraspell-chain-map.js +7 -0
- package/constants/remind-notification-time.d.ts +1 -1
- package/constants/remind-notification-time.js +1 -1
- package/core/logic-validation/swap.d.ts +15 -0
- package/core/logic-validation/swap.js +60 -4
- package/core/logic-validation/transfer.d.ts +1 -0
- package/core/logic-validation/transfer.js +12 -1
- package/core/substrate/xcm-parser.d.ts +1 -0
- package/core/substrate/xcm-parser.js +4 -1
- package/core/utils.d.ts +2 -2
- package/core/utils.js +36 -15
- package/koni/background/handlers/Extension.d.ts +1 -1
- package/koni/background/handlers/Extension.js +66 -98
- package/koni/background/handlers/State.d.ts +1 -0
- package/koni/background/handlers/State.js +7 -1
- package/package.json +23 -13
- package/packageInfo.js +1 -1
- package/services/balance-service/helpers/process.d.ts +2 -1
- package/services/balance-service/helpers/process.js +26 -0
- package/services/balance-service/index.js +11 -2
- package/services/balance-service/transfer/xcm/acrossBridge/index.d.ts +15 -0
- package/services/balance-service/transfer/xcm/acrossBridge/index.js +216 -0
- package/services/balance-service/transfer/xcm/availBridge.js +6 -6
- package/services/balance-service/transfer/xcm/index.d.ts +5 -1
- package/services/balance-service/transfer/xcm/index.js +85 -1
- package/services/balance-service/transfer/xcm/utils.d.ts +11 -0
- package/services/balance-service/transfer/xcm/utils.js +208 -0
- package/services/base/types.d.ts +0 -4
- package/services/chain-service/constants.d.ts +0 -1
- package/services/chain-service/constants.js +1 -2
- package/services/chain-service/index.d.ts +9 -2
- package/services/chain-service/index.js +72 -18
- package/services/chain-service/utils/patch.js +1 -1
- package/services/earning-service/handlers/base.d.ts +4 -3
- package/services/earning-service/handlers/base.js +6 -4
- package/services/earning-service/handlers/native-staking/base.js +4 -1
- package/services/earning-service/handlers/native-staking/dtao.d.ts +9 -6
- package/services/earning-service/handlers/native-staking/dtao.js +69 -48
- package/services/earning-service/handlers/native-staking/tao.js +12 -2
- package/services/earning-service/handlers/special.js +19 -10
- package/services/earning-service/service.d.ts +2 -1
- package/services/earning-service/service.js +2 -1
- package/services/fee-service/utils/index.d.ts +1 -0
- package/services/fee-service/utils/index.js +14 -4
- package/services/inapp-notification-service/index.js +13 -7
- package/services/keyring-service/context/handlers/Ledger.js +1 -1
- package/services/keyring-service/context/state.d.ts +1 -0
- package/services/keyring-service/context/state.js +3 -0
- package/services/migration-service/scripts/DisableZeroBalanceTokens.d.ts +4 -0
- package/services/migration-service/scripts/DisableZeroBalanceTokens.js +51 -0
- package/services/migration-service/scripts/EnableChain.js +1 -1
- package/services/migration-service/scripts/index.js +3 -2
- package/services/swap-service/handler/asset-hub/handler.d.ts +2 -9
- package/services/swap-service/handler/asset-hub/handler.js +64 -317
- package/services/swap-service/handler/base-handler.d.ts +6 -9
- package/services/swap-service/handler/base-handler.js +405 -230
- package/services/swap-service/handler/chainflip-handler.d.ts +2 -4
- package/services/swap-service/handler/chainflip-handler.js +15 -37
- package/services/swap-service/handler/hydradx-handler.d.ts +3 -10
- package/services/swap-service/handler/hydradx-handler.js +78 -270
- package/services/swap-service/handler/simpleswap-handler.d.ts +2 -4
- package/services/swap-service/handler/simpleswap-handler.js +24 -45
- package/services/swap-service/handler/uniswap-handler.d.ts +4 -6
- package/services/swap-service/handler/uniswap-handler.js +25 -46
- package/services/swap-service/index.d.ts +8 -14
- package/services/swap-service/index.js +141 -129
- package/services/swap-service/utils.d.ts +11 -3
- package/services/swap-service/utils.js +96 -15
- package/services/transaction-service/index.js +2 -2
- package/services/transaction-service/types.d.ts +3 -2
- package/services/transaction-service/utils.d.ts +1 -0
- package/services/transaction-service/utils.js +38 -15
- package/types/balance/transfer.d.ts +1 -0
- package/types/service-base.d.ts +2 -3
- package/types/swap/index.d.ts +25 -9
- package/types/swap/index.js +10 -0
- package/types/transaction/process.d.ts +19 -0
- package/types/transaction/request.d.ts +7 -0
- package/types/yield/actions/join/submit.d.ts +4 -1
- package/types/yield/actions/others.d.ts +2 -0
- package/utils/fee/transfer.d.ts +1 -0
- package/utils/fee/transfer.js +54 -30
- package/utils/staticData/index.d.ts +4 -1
- package/utils/staticData/index.js +5 -1
- package/utils/staticData/paraSpellChainMap.json +1 -0
- package/utils/swap.d.ts +3 -0
- package/utils/swap.js +3 -0
- package/cjs/services/swap-service/interface.js +0 -14
- package/services/swap-service/interface.d.ts +0 -9
- 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
|
|
15
|
-
var
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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,
|
|
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,
|
|
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([
|
|
353
|
-
const swapXcm = actionList === JSON.stringify([
|
|
354
|
-
const xcmSwap = actionList === JSON.stringify([
|
|
355
|
-
const xcmSwapXcm = actionList === JSON.stringify([
|
|
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.
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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$
|
|
136
|
-
const providerId = ((_params$request$
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
//
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
const swapStep = (0, _utils2.getSwapStep)(
|
|
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
|
-
//
|
|
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
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
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 =
|
|
348
|
+
this.status = _types2.ServiceStatus.INITIALIZING;
|
|
348
349
|
this.eventService.emit('swap.ready', true);
|
|
349
|
-
this.status =
|
|
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 ===
|
|
355
|
+
if (this.status === _types2.ServiceStatus.STOPPING) {
|
|
355
356
|
await this.waitForStopped();
|
|
356
357
|
}
|
|
357
|
-
if (this.status ===
|
|
358
|
+
if (this.status === _types2.ServiceStatus.STARTED || this.status === _types2.ServiceStatus.STARTING) {
|
|
358
359
|
return this.waitForStarted();
|
|
359
360
|
}
|
|
360
|
-
this.status =
|
|
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 =
|
|
370
|
+
this.status = _types2.ServiceStatus.STARTED;
|
|
370
371
|
}
|
|
371
372
|
async stop() {
|
|
372
|
-
if (this.status ===
|
|
373
|
+
if (this.status === _types2.ServiceStatus.STARTING) {
|
|
373
374
|
await this.waitForStarted();
|
|
374
375
|
}
|
|
375
|
-
if (this.status ===
|
|
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 =
|
|
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 >
|
|
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(
|
|
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(
|
|
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(
|
|
444
|
+
return Promise.reject(new _TransactionError.TransactionError(_types3.BasicTxErrorType.INTERNAL_ERROR));
|
|
434
445
|
}
|
|
435
446
|
}
|
|
436
447
|
subscribeSwapPairs(callback) {
|