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