@subwallet/extension-base 1.1.54-0 → 1.1.56-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 +30 -2
- package/background/KoniTypes.js +6 -0
- package/background/errors/SwapError.d.ts +6 -0
- package/background/errors/SwapError.js +57 -0
- package/background/errors/TransactionError.js +9 -0
- package/background/types.d.ts +2 -0
- package/cjs/background/KoniTypes.js +8 -1
- package/cjs/background/errors/SwapError.js +64 -0
- package/cjs/background/errors/TransactionError.js +9 -0
- package/cjs/koni/api/nft/{statemint_nft → assethub_nft}/index.js +5 -3
- package/cjs/koni/api/nft/{statemine_nft → assethub_unique}/index.js +5 -3
- package/cjs/koni/api/nft/index.js +13 -13
- package/cjs/koni/api/nft/nft.js +1 -1
- package/cjs/koni/api/nft/transfer.js +11 -15
- package/cjs/koni/api/staking/bonding/utils.js +35 -6
- package/cjs/koni/background/handlers/Extension.js +214 -102
- package/cjs/koni/background/handlers/State.js +5 -2
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/index.js +6 -3
- package/cjs/services/chain-service/constants.js +18 -4
- package/cjs/services/chain-service/index.js +39 -18
- package/cjs/services/chain-service/utils/index.js +15 -4
- package/cjs/services/chain-service/utils/patch.js +1 -1
- package/cjs/services/earning-service/constants/chains.js +4 -2
- package/cjs/services/earning-service/handlers/native-staking/amplitude.js +7 -9
- package/cjs/services/earning-service/handlers/native-staking/astar.js +4 -3
- package/cjs/services/earning-service/handlers/native-staking/para-chain.js +11 -8
- package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +22 -3
- package/cjs/services/earning-service/handlers/nomination-pool/index.js +19 -5
- package/cjs/services/earning-service/service.js +0 -1
- package/cjs/services/migration-service/scripts/MigrateTransactionHistoryBySymbol.js +4 -17
- package/cjs/services/migration-service/scripts/databases/MigrateAssetSetting.js +4 -17
- package/cjs/services/migration-service/scripts/index.js +3 -3
- package/cjs/services/swap-service/handler/base-handler.js +189 -0
- package/cjs/services/swap-service/handler/chainflip-handler.js +407 -0
- package/cjs/services/swap-service/handler/hydradx-handler.js +531 -0
- package/cjs/services/swap-service/index.js +250 -0
- package/cjs/services/swap-service/utils.js +126 -0
- package/cjs/services/transaction-service/index.js +20 -0
- package/cjs/services/transaction-service/utils.js +6 -0
- package/cjs/types/fee/evm.js +1 -0
- package/cjs/types/fee/fee.js +70 -0
- package/cjs/types/fee/index.js +27 -1
- package/cjs/types/service-base.js +1 -0
- package/cjs/types/swap/index.js +50 -0
- package/cjs/utils/index.js +12 -0
- package/cjs/utils/swap.js +78 -0
- package/koni/api/nft/{statemint_nft → assethub_nft}/index.d.ts +1 -1
- package/koni/api/nft/{statemint_nft → assethub_nft}/index.js +4 -2
- package/koni/api/nft/{statemine_nft → assethub_unique}/index.d.ts +1 -1
- package/koni/api/nft/{statemine_nft → assethub_unique}/index.js +4 -2
- package/koni/api/nft/index.js +13 -13
- package/koni/api/nft/nft.js +1 -1
- package/koni/api/nft/transfer.d.ts +1 -2
- package/koni/api/nft/transfer.js +10 -13
- package/koni/api/staking/bonding/utils.d.ts +3 -1
- package/koni/api/staking/bonding/utils.js +32 -6
- package/koni/background/handlers/Extension.d.ts +6 -0
- package/koni/background/handlers/Extension.js +111 -0
- package/koni/background/handlers/State.d.ts +2 -0
- package/koni/background/handlers/State.js +5 -2
- package/package.json +85 -28
- package/packageInfo.js +1 -1
- package/services/balance-service/index.js +6 -3
- package/services/base/types.d.ts +4 -0
- package/services/chain-service/constants.js +18 -4
- package/services/chain-service/index.d.ts +4 -0
- package/services/chain-service/index.js +21 -1
- package/services/chain-service/utils/index.d.ts +7 -5
- package/services/chain-service/utils/index.js +9 -2
- package/services/chain-service/utils/patch.js +1 -1
- package/services/earning-service/constants/chains.d.ts +1 -0
- package/services/earning-service/constants/chains.js +1 -0
- package/services/earning-service/handlers/native-staking/amplitude.js +7 -9
- package/services/earning-service/handlers/native-staking/astar.js +4 -3
- package/services/earning-service/handlers/native-staking/para-chain.js +12 -9
- package/services/earning-service/handlers/native-staking/relay-chain.js +24 -5
- package/services/earning-service/handlers/nomination-pool/index.js +19 -5
- package/services/earning-service/service.js +0 -1
- package/services/event-service/types.d.ts +1 -0
- package/services/migration-service/scripts/MigrateTransactionHistoryBySymbol.js +4 -17
- package/services/migration-service/scripts/databases/MigrateAssetSetting.js +4 -17
- package/services/migration-service/scripts/index.js +3 -3
- package/services/swap-service/handler/base-handler.d.ts +38 -0
- package/services/swap-service/handler/base-handler.js +180 -0
- package/services/swap-service/handler/chainflip-handler.d.ts +30 -0
- package/services/swap-service/handler/chainflip-handler.js +399 -0
- package/services/swap-service/handler/hydradx-handler.d.ts +36 -0
- package/services/swap-service/handler/hydradx-handler.js +522 -0
- package/services/swap-service/index.d.ts +32 -0
- package/services/swap-service/index.js +241 -0
- package/services/swap-service/utils.d.ts +18 -0
- package/services/swap-service/utils.js +105 -0
- package/services/transaction-service/index.js +20 -0
- package/services/transaction-service/utils.d.ts +2 -0
- package/services/transaction-service/utils.js +6 -2
- package/types/fee/evm.d.ts +49 -0
- package/types/fee/evm.js +1 -0
- package/types/fee/fee.d.ts +32 -0
- package/types/fee/fee.js +63 -0
- package/types/fee/index.d.ts +2 -49
- package/types/fee/index.js +5 -1
- package/types/service-base.d.ts +10 -0
- package/types/service-base.js +1 -0
- package/types/swap/index.d.ts +168 -0
- package/types/swap/index.js +41 -0
- package/types/yield/info/chain/target.d.ts +2 -0
- package/types/yield/info/pallet.d.ts +8 -0
- package/utils/index.d.ts +1 -0
- package/utils/index.js +2 -1
- package/utils/swap.d.ts +3 -0
- package/utils/swap.js +70 -0
|
@@ -0,0 +1,250 @@
|
|
|
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
|
+
console.log('optimalProcess', optimalProcess);
|
|
94
|
+
return {
|
|
95
|
+
process: optimalProcess,
|
|
96
|
+
quote: swapQuoteResponse
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
async getLatestQuotes(request) {
|
|
100
|
+
request.pair.metadata = this.getSwapPairMetadata(request.pair.slug); // todo: improve this
|
|
101
|
+
const quoteAskResponses = await this.askProvidersForQuote(request);
|
|
102
|
+
|
|
103
|
+
// todo: handle error to return back to UI
|
|
104
|
+
// todo: more logic to select the best quote
|
|
105
|
+
|
|
106
|
+
const availableQuotes = quoteAskResponses.filter(quote => !quote.error).map(quote => quote.quote);
|
|
107
|
+
let quoteError;
|
|
108
|
+
let selectedQuote;
|
|
109
|
+
let aliveUntil = +Date.now() + _utils.SWAP_QUOTE_TIMEOUT_MAP.default;
|
|
110
|
+
if (availableQuotes.length === 0) {
|
|
111
|
+
const preferredErrorResp = quoteAskResponses.find(quote => {
|
|
112
|
+
return !!quote.error && ![_swap.SwapErrorType.UNKNOWN, _swap.SwapErrorType.ASSET_NOT_SUPPORTED].includes(quote.error.errorType);
|
|
113
|
+
});
|
|
114
|
+
const defaultErrorResp = quoteAskResponses.find(quote => !!quote.error);
|
|
115
|
+
quoteError = (preferredErrorResp === null || preferredErrorResp === void 0 ? void 0 : preferredErrorResp.error) || (defaultErrorResp === null || defaultErrorResp === void 0 ? void 0 : defaultErrorResp.error);
|
|
116
|
+
} else {
|
|
117
|
+
var _selectedQuote;
|
|
118
|
+
selectedQuote = availableQuotes[0];
|
|
119
|
+
aliveUntil = ((_selectedQuote = selectedQuote) === null || _selectedQuote === void 0 ? void 0 : _selectedQuote.aliveUntil) || +Date.now() + _utils.SWAP_QUOTE_TIMEOUT_MAP.default;
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
optimalQuote: selectedQuote,
|
|
123
|
+
quotes: availableQuotes,
|
|
124
|
+
error: quoteError,
|
|
125
|
+
aliveUntil
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
initHandlers() {
|
|
129
|
+
_swap._SUPPORTED_SWAP_PROVIDERS.forEach(providerId => {
|
|
130
|
+
switch (providerId) {
|
|
131
|
+
case _swap.SwapProviderId.CHAIN_FLIP_TESTNET:
|
|
132
|
+
this.handlers[providerId] = new _chainflipHandler.ChainflipSwapHandler(this.chainService, this.state.balanceService);
|
|
133
|
+
break;
|
|
134
|
+
case _swap.SwapProviderId.CHAIN_FLIP_MAINNET:
|
|
135
|
+
this.handlers[providerId] = new _chainflipHandler.ChainflipSwapHandler(this.chainService, this.state.balanceService, false);
|
|
136
|
+
break;
|
|
137
|
+
case _swap.SwapProviderId.HYDRADX_TESTNET:
|
|
138
|
+
this.handlers[providerId] = new _hydradxHandler.HydradxHandler(this.chainService, this.state.balanceService);
|
|
139
|
+
break;
|
|
140
|
+
case _swap.SwapProviderId.HYDRADX_MAINNET:
|
|
141
|
+
this.handlers[providerId] = new _hydradxHandler.HydradxHandler(this.chainService, this.state.balanceService, false);
|
|
142
|
+
break;
|
|
143
|
+
default:
|
|
144
|
+
throw new Error('Unsupported provider');
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
async init() {
|
|
149
|
+
this.status = _types.ServiceStatus.INITIALIZING;
|
|
150
|
+
this.eventService.emit('swap.ready', true);
|
|
151
|
+
this.status = _types.ServiceStatus.INITIALIZED;
|
|
152
|
+
this.initHandlers();
|
|
153
|
+
await this.start();
|
|
154
|
+
}
|
|
155
|
+
async start() {
|
|
156
|
+
if (this.status === _types.ServiceStatus.STOPPING) {
|
|
157
|
+
await this.waitForStopped();
|
|
158
|
+
}
|
|
159
|
+
if (this.status === _types.ServiceStatus.STARTED || this.status === _types.ServiceStatus.STARTING) {
|
|
160
|
+
return this.waitForStarted();
|
|
161
|
+
}
|
|
162
|
+
this.status = _types.ServiceStatus.STARTING;
|
|
163
|
+
|
|
164
|
+
// todo: start the service jobs, subscribe data,...
|
|
165
|
+
|
|
166
|
+
this.swapPairSubject.next(this.getSwapPairs()); // todo: might need to change it online
|
|
167
|
+
|
|
168
|
+
// Update promise handler
|
|
169
|
+
this.startPromiseHandler.resolve();
|
|
170
|
+
this.stopPromiseHandler = (0, _utils2.createPromiseHandler)();
|
|
171
|
+
this.status = _types.ServiceStatus.STARTED;
|
|
172
|
+
}
|
|
173
|
+
async stop() {
|
|
174
|
+
if (this.status === _types.ServiceStatus.STARTING) {
|
|
175
|
+
await this.waitForStarted();
|
|
176
|
+
}
|
|
177
|
+
if (this.status === _types.ServiceStatus.STOPPED || this.status === _types.ServiceStatus.STOPPING) {
|
|
178
|
+
return this.waitForStopped();
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// todo: unsub, persist data,...
|
|
182
|
+
|
|
183
|
+
this.stopPromiseHandler.resolve();
|
|
184
|
+
this.startPromiseHandler = (0, _utils2.createPromiseHandler)();
|
|
185
|
+
this.status = _types.ServiceStatus.STOPPED;
|
|
186
|
+
}
|
|
187
|
+
waitForStarted() {
|
|
188
|
+
return this.startPromiseHandler.promise;
|
|
189
|
+
}
|
|
190
|
+
waitForStopped() {
|
|
191
|
+
return this.stopPromiseHandler.promise;
|
|
192
|
+
}
|
|
193
|
+
getSwapPairs() {
|
|
194
|
+
return Object.entries(this.chainService.swapRefMap).map(_ref => {
|
|
195
|
+
let [slug, assetRef] = _ref;
|
|
196
|
+
const fromAsset = this.chainService.getAssetBySlug(assetRef.srcAsset);
|
|
197
|
+
return {
|
|
198
|
+
slug,
|
|
199
|
+
from: assetRef.srcAsset,
|
|
200
|
+
to: assetRef.destAsset,
|
|
201
|
+
metadata: {
|
|
202
|
+
alternativeAsset: (0, _utils.getSwapAltToken)(fromAsset)
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
getSwapPairMetadata(slug) {
|
|
208
|
+
var _this$getSwapPairs$fi;
|
|
209
|
+
return (_this$getSwapPairs$fi = this.getSwapPairs().find(pair => pair.slug === slug)) === null || _this$getSwapPairs$fi === void 0 ? void 0 : _this$getSwapPairs$fi.metadata;
|
|
210
|
+
}
|
|
211
|
+
async validateSwapProcess(params) {
|
|
212
|
+
const providerId = params.selectedQuote.provider.id;
|
|
213
|
+
const handler = this.handlers[providerId];
|
|
214
|
+
if (handler) {
|
|
215
|
+
return handler.validateSwapProcess(params);
|
|
216
|
+
} else {
|
|
217
|
+
return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR)];
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
async handleSwapProcess(params) {
|
|
221
|
+
const handler = this.handlers[params.quote.provider.id];
|
|
222
|
+
if (params.process.steps.length === 1) {
|
|
223
|
+
// todo: do better to handle error generating steps
|
|
224
|
+
return Promise.reject(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR, 'Please check your network and try again'));
|
|
225
|
+
}
|
|
226
|
+
if (handler) {
|
|
227
|
+
return handler.handleSwapProcess(params);
|
|
228
|
+
} else {
|
|
229
|
+
return Promise.reject(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
subscribeSwapPairs(callback) {
|
|
233
|
+
return this.chainService.subscribeSwapRefMap().subscribe(refMap => {
|
|
234
|
+
const latestData = Object.entries(refMap).map(_ref2 => {
|
|
235
|
+
let [slug, assetRef] = _ref2;
|
|
236
|
+
const fromAsset = this.chainService.getAssetBySlug(assetRef.srcAsset);
|
|
237
|
+
return {
|
|
238
|
+
slug,
|
|
239
|
+
from: assetRef.srcAsset,
|
|
240
|
+
to: assetRef.destAsset,
|
|
241
|
+
metadata: {
|
|
242
|
+
alternativeAsset: (0, _utils.getSwapAltToken)(fromAsset)
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
});
|
|
246
|
+
callback(latestData);
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
exports.SwapService = SwapService;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.SWAP_QUOTE_TIMEOUT_MAP = exports.MOCK_SWAP_FEE = exports.DEFAULT_SWAP_FIRST_STEP = exports.CHAIN_FLIP_TESTNET_EXPLORER = exports.CHAIN_FLIP_SUPPORTED_TESTNET_MAPPING = exports.CHAIN_FLIP_SUPPORTED_TESTNET_ASSET_MAPPING = exports.CHAIN_FLIP_SUPPORTED_MAINNET_MAPPING = exports.CHAIN_FLIP_SUPPORTED_MAINNET_ASSET_MAPPING = exports.CHAIN_FLIP_MAINNET_EXPLORER = void 0;
|
|
8
|
+
exports.calculateSwapRate = calculateSwapRate;
|
|
9
|
+
exports.getChainflipEarlyValidationError = getChainflipEarlyValidationError;
|
|
10
|
+
exports.getEarlyHydradxValidationError = getEarlyHydradxValidationError;
|
|
11
|
+
exports.getSwapAltToken = getSwapAltToken;
|
|
12
|
+
exports.getSwapAlternativeAsset = getSwapAlternativeAsset;
|
|
13
|
+
var _swap = require("@chainflip/sdk/swap");
|
|
14
|
+
var _chainList = require("@subwallet/chain-list");
|
|
15
|
+
var _SwapError = require("@subwallet/extension-base/background/errors/SwapError");
|
|
16
|
+
var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
17
|
+
var _swap2 = require("@subwallet/extension-base/types/swap");
|
|
18
|
+
var _utils2 = require("@subwallet/extension-base/utils");
|
|
19
|
+
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
20
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
21
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
22
|
+
|
|
23
|
+
const CHAIN_FLIP_TESTNET_EXPLORER = 'https://blocks-perseverance.chainflip.io';
|
|
24
|
+
exports.CHAIN_FLIP_TESTNET_EXPLORER = CHAIN_FLIP_TESTNET_EXPLORER;
|
|
25
|
+
const CHAIN_FLIP_MAINNET_EXPLORER = 'https://scan.chainflip.io';
|
|
26
|
+
exports.CHAIN_FLIP_MAINNET_EXPLORER = CHAIN_FLIP_MAINNET_EXPLORER;
|
|
27
|
+
const CHAIN_FLIP_SUPPORTED_MAINNET_MAPPING = {
|
|
28
|
+
[_chainList.COMMON_CHAIN_SLUGS.POLKADOT]: _swap.Chains.Polkadot,
|
|
29
|
+
[_chainList.COMMON_CHAIN_SLUGS.ETHEREUM]: _swap.Chains.Ethereum
|
|
30
|
+
};
|
|
31
|
+
exports.CHAIN_FLIP_SUPPORTED_MAINNET_MAPPING = CHAIN_FLIP_SUPPORTED_MAINNET_MAPPING;
|
|
32
|
+
const CHAIN_FLIP_SUPPORTED_TESTNET_MAPPING = {
|
|
33
|
+
[_chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA]: _swap.Chains.Ethereum,
|
|
34
|
+
[_chainList.COMMON_CHAIN_SLUGS.CHAINFLIP_POLKADOT]: _swap.Chains.Polkadot
|
|
35
|
+
};
|
|
36
|
+
exports.CHAIN_FLIP_SUPPORTED_TESTNET_MAPPING = CHAIN_FLIP_SUPPORTED_TESTNET_MAPPING;
|
|
37
|
+
const CHAIN_FLIP_SUPPORTED_MAINNET_ASSET_MAPPING = {
|
|
38
|
+
[_chainList.COMMON_ASSETS.DOT]: _swap.Assets.DOT,
|
|
39
|
+
[_chainList.COMMON_ASSETS.ETH]: _swap.Assets.ETH,
|
|
40
|
+
[_chainList.COMMON_ASSETS.USDC_ETHEREUM]: _swap.Assets.USDC
|
|
41
|
+
};
|
|
42
|
+
exports.CHAIN_FLIP_SUPPORTED_MAINNET_ASSET_MAPPING = CHAIN_FLIP_SUPPORTED_MAINNET_ASSET_MAPPING;
|
|
43
|
+
const CHAIN_FLIP_SUPPORTED_TESTNET_ASSET_MAPPING = {
|
|
44
|
+
[_chainList.COMMON_ASSETS.PDOT]: _swap.Assets.DOT,
|
|
45
|
+
[_chainList.COMMON_ASSETS.ETH_SEPOLIA]: _swap.Assets.ETH,
|
|
46
|
+
[_chainList.COMMON_ASSETS.USDC_SEPOLIA]: _swap.Assets.USDC
|
|
47
|
+
};
|
|
48
|
+
exports.CHAIN_FLIP_SUPPORTED_TESTNET_ASSET_MAPPING = CHAIN_FLIP_SUPPORTED_TESTNET_ASSET_MAPPING;
|
|
49
|
+
const SWAP_QUOTE_TIMEOUT_MAP = {
|
|
50
|
+
// in milliseconds
|
|
51
|
+
default: 30000,
|
|
52
|
+
[_swap2.SwapProviderId.CHAIN_FLIP_TESTNET]: 30000,
|
|
53
|
+
[_swap2.SwapProviderId.CHAIN_FLIP_MAINNET]: 30000
|
|
54
|
+
};
|
|
55
|
+
exports.SWAP_QUOTE_TIMEOUT_MAP = SWAP_QUOTE_TIMEOUT_MAP;
|
|
56
|
+
const DEFAULT_SWAP_FIRST_STEP = {
|
|
57
|
+
id: 0,
|
|
58
|
+
name: 'Fill information',
|
|
59
|
+
type: _swap2.SwapStepType.DEFAULT
|
|
60
|
+
};
|
|
61
|
+
exports.DEFAULT_SWAP_FIRST_STEP = DEFAULT_SWAP_FIRST_STEP;
|
|
62
|
+
const MOCK_SWAP_FEE = {
|
|
63
|
+
feeComponent: [],
|
|
64
|
+
defaultFeeToken: '',
|
|
65
|
+
feeOptions: []
|
|
66
|
+
};
|
|
67
|
+
exports.MOCK_SWAP_FEE = MOCK_SWAP_FEE;
|
|
68
|
+
function getSwapAlternativeAsset(swapPair) {
|
|
69
|
+
var _swapPair$metadata;
|
|
70
|
+
return swapPair === null || swapPair === void 0 ? void 0 : (_swapPair$metadata = swapPair.metadata) === null || _swapPair$metadata === void 0 ? void 0 : _swapPair$metadata.alternativeAsset;
|
|
71
|
+
}
|
|
72
|
+
function getSwapAltToken(chainAsset) {
|
|
73
|
+
var _chainAsset$metadata;
|
|
74
|
+
return (_chainAsset$metadata = chainAsset.metadata) === null || _chainAsset$metadata === void 0 ? void 0 : _chainAsset$metadata.alternativeSwapAsset;
|
|
75
|
+
}
|
|
76
|
+
function calculateSwapRate(fromAmount, toAmount, fromAsset, toAsset) {
|
|
77
|
+
const bnFromAmount = new _bignumber.default(fromAmount);
|
|
78
|
+
const bnToAmount = new _bignumber.default(toAmount);
|
|
79
|
+
const decimalDiff = (0, _utils._getAssetDecimals)(toAsset) - (0, _utils._getAssetDecimals)(fromAsset);
|
|
80
|
+
const bnRate = bnFromAmount.div(bnToAmount);
|
|
81
|
+
return 1 / bnRate.times(10 ** decimalDiff).toNumber();
|
|
82
|
+
}
|
|
83
|
+
function getChainflipEarlyValidationError(error, metadata) {
|
|
84
|
+
// todo: support more providers
|
|
85
|
+
switch (error) {
|
|
86
|
+
case _swap2.SwapErrorType.NOT_MEET_MIN_SWAP:
|
|
87
|
+
{
|
|
88
|
+
const parsedMinSwapValue = (0, _utils2.formatNumber)(metadata.minSwap.value, metadata.minSwap.decimals);
|
|
89
|
+
const message = `Amount too low. Increase your amount above ${parsedMinSwapValue} ${metadata.minSwap.symbol} and try again`;
|
|
90
|
+
return new _SwapError.SwapError(error, message);
|
|
91
|
+
}
|
|
92
|
+
case _swap2.SwapErrorType.SWAP_EXCEED_ALLOWANCE:
|
|
93
|
+
{
|
|
94
|
+
if (metadata.maxSwap) {
|
|
95
|
+
const parsedMaxSwapValue = (0, _utils2.formatNumber)(metadata.maxSwap.value, metadata.maxSwap.decimals);
|
|
96
|
+
return new _SwapError.SwapError(error, `Amount too high. Lower your amount below ${parsedMaxSwapValue} ${metadata.maxSwap.symbol} and try again`);
|
|
97
|
+
} else {
|
|
98
|
+
return new _SwapError.SwapError(error, 'Amount too high. Lower your amount and try again');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
case _swap2.SwapErrorType.ASSET_NOT_SUPPORTED:
|
|
102
|
+
return new _SwapError.SwapError(error, 'This swap pair is not supported');
|
|
103
|
+
case _swap2.SwapErrorType.UNKNOWN:
|
|
104
|
+
return new _SwapError.SwapError(error, `Undefined error. Check your Internet and ${metadata.chain.slug} connection or contact support`);
|
|
105
|
+
case _swap2.SwapErrorType.ERROR_FETCHING_QUOTE:
|
|
106
|
+
return new _SwapError.SwapError(error, 'No swap quote found. Adjust your amount or try again later.');
|
|
107
|
+
default:
|
|
108
|
+
return new _SwapError.SwapError(error);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function getEarlyHydradxValidationError(error, metadata) {
|
|
112
|
+
switch (error) {
|
|
113
|
+
case _swap2.SwapErrorType.AMOUNT_CANNOT_BE_ZERO:
|
|
114
|
+
{
|
|
115
|
+
return new _SwapError.SwapError(error, 'Amount too low. Increase your amount above 0 and try again');
|
|
116
|
+
}
|
|
117
|
+
case _swap2.SwapErrorType.ASSET_NOT_SUPPORTED:
|
|
118
|
+
return new _SwapError.SwapError(error, 'This swap pair is not supported');
|
|
119
|
+
case _swap2.SwapErrorType.UNKNOWN:
|
|
120
|
+
return new _SwapError.SwapError(error, `Undefined error. Check your Internet and ${metadata.chain.slug} connection or contact support`);
|
|
121
|
+
case _swap2.SwapErrorType.ERROR_FETCHING_QUOTE:
|
|
122
|
+
return new _SwapError.SwapError(error, 'No swap quote found. Adjust your amount or try again later.');
|
|
123
|
+
default:
|
|
124
|
+
return new _SwapError.SwapError(error);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -646,6 +646,18 @@ class TransactionService {
|
|
|
646
646
|
};
|
|
647
647
|
break;
|
|
648
648
|
}
|
|
649
|
+
case _KoniTypes.ExtrinsicType.SWAP:
|
|
650
|
+
{
|
|
651
|
+
const data = (0, _utils3.parseTransactionData)(transaction.data); // TODO: switch by provider
|
|
652
|
+
const inputAsset = this.state.chainService.getAssetBySlug(data.quote.pair.from);
|
|
653
|
+
historyItem.amount = {
|
|
654
|
+
value: data.quote.fromAmount,
|
|
655
|
+
symbol: (0, _utils._getAssetSymbol)(inputAsset),
|
|
656
|
+
decimals: (0, _utils._getAssetDecimals)(inputAsset)
|
|
657
|
+
};
|
|
658
|
+
historyItem.additionalInfo = data;
|
|
659
|
+
break;
|
|
660
|
+
}
|
|
649
661
|
case _KoniTypes.ExtrinsicType.UNKNOWN:
|
|
650
662
|
break;
|
|
651
663
|
}
|
|
@@ -742,6 +754,14 @@ class TransactionService {
|
|
|
742
754
|
}
|
|
743
755
|
} else if ([_KoniTypes.ExtrinsicType.STAKING_BOND, _KoniTypes.ExtrinsicType.STAKING_UNBOND, _KoniTypes.ExtrinsicType.STAKING_WITHDRAW, _KoniTypes.ExtrinsicType.STAKING_CANCEL_UNSTAKE, _KoniTypes.ExtrinsicType.STAKING_CLAIM_REWARD, _KoniTypes.ExtrinsicType.STAKING_JOIN_POOL, _KoniTypes.ExtrinsicType.STAKING_POOL_WITHDRAW, _KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL].includes(transaction.extrinsicType)) {
|
|
744
756
|
this.state.eventService.emit('transaction.submitStaking', transaction.chain);
|
|
757
|
+
} else if (transaction.extrinsicType === _KoniTypes.ExtrinsicType.SWAP) {
|
|
758
|
+
const inputData = (0, _utils3.parseTransactionData)(transaction.data);
|
|
759
|
+
const toAssetSlug = inputData.quote.pair.to;
|
|
760
|
+
|
|
761
|
+
// todo: consider async
|
|
762
|
+
this.state.chainService.updateAssetSetting(toAssetSlug, {
|
|
763
|
+
visible: true
|
|
764
|
+
}, true).catch(console.error);
|
|
745
765
|
}
|
|
746
766
|
}
|
|
747
767
|
onSuccess(_ref4) {
|
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.getChainflipExplorerLink = getChainflipExplorerLink;
|
|
6
7
|
exports.getExplorerLink = getExplorerLink;
|
|
7
8
|
exports.parseTransactionData = parseTransactionData;
|
|
8
9
|
var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
10
|
+
var _utils2 = require("@subwallet/extension-base/services/swap-service/utils");
|
|
9
11
|
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
10
12
|
// SPDX-License-Identifier: Apache-2.0
|
|
11
13
|
|
|
@@ -53,4 +55,8 @@ function getExplorerLink(chainInfo, value, type) {
|
|
|
53
55
|
return `${explorerLink}${explorerLink.endsWith('/') ? '' : '/'}${route}/${value}`;
|
|
54
56
|
}
|
|
55
57
|
return undefined;
|
|
58
|
+
}
|
|
59
|
+
function getChainflipExplorerLink(data, chainInfo) {
|
|
60
|
+
const chainflipDomain = (0, _utils._isChainTestNet)(chainInfo) ? _utils2.CHAIN_FLIP_TESTNET_EXPLORER : _utils2.CHAIN_FLIP_MAINNET_EXPLORER;
|
|
61
|
+
return `${chainflipDomain}/channels/${data.depositChannelId}`;
|
|
56
62
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.SWFeeType = exports.SWFee = void 0;
|
|
7
|
+
var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
8
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
9
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
10
|
+
let SWFeeType;
|
|
11
|
+
exports.SWFeeType = SWFeeType;
|
|
12
|
+
(function (SWFeeType) {
|
|
13
|
+
SWFeeType["EIP_1559"] = "EIP_1559";
|
|
14
|
+
SWFeeType["LEGACY"] = "LEGACY";
|
|
15
|
+
SWFeeType["SUBSTRATE"] = "SUBSTRATE";
|
|
16
|
+
})(SWFeeType || (exports.SWFeeType = SWFeeType = {}));
|
|
17
|
+
class SWFee {
|
|
18
|
+
get transactionId() {
|
|
19
|
+
return this._transactionId;
|
|
20
|
+
}
|
|
21
|
+
get selectedFeeOption() {
|
|
22
|
+
return this._selectedFeeOption;
|
|
23
|
+
}
|
|
24
|
+
static build(feeOptions, chain, selectedFeeOption) {
|
|
25
|
+
// todo: might need to parse metadata depending on the type
|
|
26
|
+
if (selectedFeeOption) {
|
|
27
|
+
return new SWFee(feeOptions, chain, selectedFeeOption);
|
|
28
|
+
} else {
|
|
29
|
+
const defaultFeeOption = feeOptions.find(option => option.isDefault);
|
|
30
|
+
return new SWFee(feeOptions, chain, defaultFeeOption);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
static buildSimpleFee(tokenInfo, amount, type) {
|
|
34
|
+
// used for simple transaction paid in native tokens
|
|
35
|
+
const defaultOption = {
|
|
36
|
+
tokenInfo,
|
|
37
|
+
isDefault: (0, _utils._isNativeToken)(tokenInfo),
|
|
38
|
+
// if it's the native token of the chain
|
|
39
|
+
amount,
|
|
40
|
+
type
|
|
41
|
+
};
|
|
42
|
+
return new SWFee([defaultOption], tokenInfo.originChain, defaultOption);
|
|
43
|
+
}
|
|
44
|
+
static buildFeeOption(tokenInfo, amount, type) {
|
|
45
|
+
// todo: calculate totalFeeValue
|
|
46
|
+
// todo: implement more logic to handle complicated transaction process
|
|
47
|
+
return {
|
|
48
|
+
tokenInfo,
|
|
49
|
+
isDefault: (0, _utils._isNativeToken)(tokenInfo),
|
|
50
|
+
// if it's the native token of the chain
|
|
51
|
+
amount,
|
|
52
|
+
type
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
setTransactionId(transactionId) {
|
|
56
|
+
this._transactionId = transactionId;
|
|
57
|
+
}
|
|
58
|
+
setSelectedFeeOption(feeOption) {
|
|
59
|
+
this._selectedFeeOption = feeOption;
|
|
60
|
+
}
|
|
61
|
+
constructor(feeOptions, chain, selectedFeeOption) {
|
|
62
|
+
this.chain = chain;
|
|
63
|
+
this.feeOptions = feeOptions;
|
|
64
|
+
this._selectedFeeOption = selectedFeeOption;
|
|
65
|
+
}
|
|
66
|
+
getDefaultFeeOption() {
|
|
67
|
+
return this.feeOptions.find(option => option.isDefault);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.SWFee = SWFee;
|
package/cjs/types/fee/index.js
CHANGED
|
@@ -1 +1,27 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _evm = require("./evm");
|
|
7
|
+
Object.keys(_evm).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _evm[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () {
|
|
13
|
+
return _evm[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
var _fee = require("./fee");
|
|
18
|
+
Object.keys(_fee).forEach(function (key) {
|
|
19
|
+
if (key === "default" || key === "__esModule") return;
|
|
20
|
+
if (key in exports && exports[key] === _fee[key]) return;
|
|
21
|
+
Object.defineProperty(exports, key, {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () {
|
|
24
|
+
return _fee[key];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports._SUPPORTED_SWAP_PROVIDERS = exports.SwapStepType = exports.SwapProviderId = exports.SwapFeeType = exports.SwapErrorType = void 0;
|
|
7
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
8
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
9
|
+
// core
|
|
10
|
+
let SwapErrorType;
|
|
11
|
+
exports.SwapErrorType = SwapErrorType;
|
|
12
|
+
(function (SwapErrorType) {
|
|
13
|
+
SwapErrorType["ERROR_FETCHING_QUOTE"] = "ERROR_FETCHING_QUOTE";
|
|
14
|
+
SwapErrorType["NOT_MEET_MIN_SWAP"] = "NOT_MEET_MIN_SWAP";
|
|
15
|
+
SwapErrorType["UNKNOWN"] = "UNKNOWN";
|
|
16
|
+
SwapErrorType["ASSET_NOT_SUPPORTED"] = "ASSET_NOT_SUPPORTED";
|
|
17
|
+
SwapErrorType["QUOTE_TIMEOUT"] = "QUOTE_TIMEOUT";
|
|
18
|
+
SwapErrorType["INVALID_RECIPIENT"] = "INVALID_RECIPIENT";
|
|
19
|
+
SwapErrorType["SWAP_EXCEED_ALLOWANCE"] = "SWAP_EXCEED_ALLOWANCE";
|
|
20
|
+
SwapErrorType["SWAP_NOT_ENOUGH_BALANCE"] = "SWAP_NOT_ENOUGH_BALANCE";
|
|
21
|
+
SwapErrorType["NOT_ENOUGH_LIQUIDITY"] = "NOT_ENOUGH_LIQUIDITY";
|
|
22
|
+
SwapErrorType["AMOUNT_CANNOT_BE_ZERO"] = "AMOUNT_CANNOT_BE_ZERO";
|
|
23
|
+
})(SwapErrorType || (exports.SwapErrorType = SwapErrorType = {}));
|
|
24
|
+
let SwapStepType;
|
|
25
|
+
exports.SwapStepType = SwapStepType;
|
|
26
|
+
(function (SwapStepType) {
|
|
27
|
+
SwapStepType["DEFAULT"] = "DEFAULT";
|
|
28
|
+
SwapStepType["TOKEN_APPROVAL"] = "TOKEN_APPROVAL";
|
|
29
|
+
SwapStepType["SET_FEE_TOKEN"] = "SET_FEE_TOKEN";
|
|
30
|
+
SwapStepType["SWAP"] = "SWAP";
|
|
31
|
+
SwapStepType["XCM"] = "XCM";
|
|
32
|
+
})(SwapStepType || (exports.SwapStepType = SwapStepType = {}));
|
|
33
|
+
let SwapProviderId;
|
|
34
|
+
exports.SwapProviderId = SwapProviderId;
|
|
35
|
+
(function (SwapProviderId) {
|
|
36
|
+
SwapProviderId["CHAIN_FLIP_TESTNET"] = "CHAIN_FLIP_TESTNET";
|
|
37
|
+
SwapProviderId["CHAIN_FLIP_MAINNET"] = "CHAIN_FLIP_MAINNET";
|
|
38
|
+
SwapProviderId["HYDRADX_MAINNET"] = "HYDRADX_MAINNET";
|
|
39
|
+
SwapProviderId["HYDRADX_TESTNET"] = "HYDRADX_TESTNET";
|
|
40
|
+
})(SwapProviderId || (exports.SwapProviderId = SwapProviderId = {}));
|
|
41
|
+
const _SUPPORTED_SWAP_PROVIDERS = [SwapProviderId.CHAIN_FLIP_TESTNET, SwapProviderId.CHAIN_FLIP_MAINNET, SwapProviderId.HYDRADX_MAINNET, SwapProviderId.HYDRADX_TESTNET];
|
|
42
|
+
exports._SUPPORTED_SWAP_PROVIDERS = _SUPPORTED_SWAP_PROVIDERS;
|
|
43
|
+
// process handling
|
|
44
|
+
let SwapFeeType;
|
|
45
|
+
exports.SwapFeeType = SwapFeeType;
|
|
46
|
+
(function (SwapFeeType) {
|
|
47
|
+
SwapFeeType["PLATFORM_FEE"] = "PLATFORM_FEE";
|
|
48
|
+
SwapFeeType["NETWORK_FEE"] = "NETWORK_FEE";
|
|
49
|
+
SwapFeeType["WALLET_FEE"] = "WALLET_FEE";
|
|
50
|
+
})(SwapFeeType || (exports.SwapFeeType = SwapFeeType = {}));
|
package/cjs/utils/index.js
CHANGED
|
@@ -236,6 +236,18 @@ Object.keys(_fetchEvmChainInfo).forEach(function (key) {
|
|
|
236
236
|
}
|
|
237
237
|
});
|
|
238
238
|
});
|
|
239
|
+
var _swap = require("./swap");
|
|
240
|
+
Object.keys(_swap).forEach(function (key) {
|
|
241
|
+
if (key === "default" || key === "__esModule") return;
|
|
242
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
243
|
+
if (key in exports && exports[key] === _swap[key]) return;
|
|
244
|
+
Object.defineProperty(exports, key, {
|
|
245
|
+
enumerable: true,
|
|
246
|
+
get: function () {
|
|
247
|
+
return _swap[key];
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
});
|
|
239
251
|
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
240
252
|
// SPDX-License-Identifier: Apache-2.0
|
|
241
253
|
|