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