@subwallet/extension-base 1.3.77-0 → 1.3.78-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 +2 -0
- package/cjs/core/logic-validation/index.js +1 -1
- package/cjs/core/substrate/xcm-parser.js +10 -1
- package/cjs/koni/background/handlers/Extension.js +35 -8
- package/cjs/koni/background/handlers/State.js +20 -0
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/helpers/subscribe/evm.js +85 -6
- package/cjs/services/balance-service/helpers/subscribe/index.js +2 -1
- package/cjs/services/balance-service/index.js +6 -2
- package/cjs/services/balance-service/transfer/token.js +15 -0
- package/cjs/services/balance-service/transfer/xcm/bittensorBridge/index.js +27 -0
- package/cjs/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.js +58 -0
- package/cjs/services/balance-service/transfer/xcm/bittensorBridge/utils.js +36 -0
- package/cjs/services/balance-service/transfer/xcm/index.js +61 -2
- package/cjs/services/balance-service/transfer/xcm/utils.js +94 -6
- package/cjs/services/chain-service/constants.js +4 -2
- 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/special.js +82 -65
- package/cjs/services/earning-service/service.js +1 -0
- package/cjs/services/swap-service/handler/bittensor-handler.js +197 -0
- package/cjs/services/swap-service/index.js +7 -0
- package/cjs/services/transaction-service/index.js +1 -0
- package/cjs/types/balance/index.js +1 -0
- package/cjs/types/swap/index.js +3 -1
- package/cjs/utils/fee/transfer.js +20 -5
- package/core/logic-validation/index.js +1 -1
- package/core/substrate/xcm-parser.d.ts +2 -0
- package/core/substrate/xcm-parser.js +8 -1
- package/koni/background/handlers/Extension.js +36 -9
- package/koni/background/handlers/State.d.ts +1 -0
- package/koni/background/handlers/State.js +20 -0
- package/package.json +26 -6
- package/packageInfo.js +1 -1
- package/services/balance-service/helpers/subscribe/evm.d.ts +1 -0
- package/services/balance-service/helpers/subscribe/evm.js +76 -1
- package/services/balance-service/helpers/subscribe/index.js +2 -1
- package/services/balance-service/index.js +6 -2
- package/services/balance-service/transfer/token.d.ts +2 -1
- package/services/balance-service/transfer/token.js +15 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/index.d.ts +2 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/index.js +5 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.d.ts +6 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.js +50 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/utils.d.ts +8 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/utils.js +29 -0
- package/services/balance-service/transfer/xcm/index.d.ts +5 -0
- package/services/balance-service/transfer/xcm/index.js +57 -2
- package/services/balance-service/transfer/xcm/utils.d.ts +3 -2
- package/services/balance-service/transfer/xcm/utils.js +87 -1
- package/services/chain-service/constants.d.ts +2 -0
- package/services/chain-service/constants.js +4 -2
- package/services/chain-service/utils/patch.d.ts +1 -1
- 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 +2 -1
- package/services/earning-service/handlers/special.d.ts +1 -1
- package/services/earning-service/handlers/special.js +85 -68
- package/services/earning-service/service.js +1 -0
- package/services/swap-service/handler/bittensor-handler.d.ts +21 -0
- package/services/swap-service/handler/bittensor-handler.js +189 -0
- package/services/swap-service/index.js +7 -0
- package/services/transaction-service/index.js +1 -0
- package/services/transaction-service/types.d.ts +4 -3
- package/types/balance/index.d.ts +3 -1
- package/types/balance/index.js +1 -0
- package/types/balance/transfer.d.ts +7 -0
- package/types/fee/base.d.ts +1 -0
- package/types/swap/index.d.ts +3 -1
- package/types/swap/index.js +3 -1
- package/types/yield/actions/join/step.d.ts +6 -0
- package/types/yield/actions/join/submit.d.ts +1 -0
- package/utils/fee/transfer.d.ts +1 -0
- package/utils/fee/transfer.js +21 -6
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.getXcmOriginFee = exports.dryRunXcmExtrinsicV2 = exports.createXcmExtrinsicV2 = exports.createSnowBridgeExtrinsic = exports.createPolygonBridgeExtrinsic = exports.createAvailBridgeTxFromEth = exports.createAvailBridgeExtrinsicFromAvail = exports.createAcrossBridgeExtrinsic = void 0;
|
|
7
|
+
exports.getXcmOriginFee = exports.getMinXcmTransferableAmount = exports.dryRunXcmExtrinsicV2 = exports.createXcmExtrinsicV2 = exports.createSubtensorEvmToBittensorExtrinsic = exports.createSnowBridgeExtrinsic = exports.createPolygonBridgeExtrinsic = exports.createBittensorToSubtensorEvmExtrinsic = exports.createAvailBridgeTxFromEth = exports.createAvailBridgeExtrinsicFromAvail = exports.createAcrossBridgeExtrinsic = void 0;
|
|
8
8
|
var _xcmParser = require("@subwallet/extension-base/core/substrate/xcm-parser");
|
|
9
9
|
var _availBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge");
|
|
10
10
|
var _polygonBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge");
|
|
@@ -12,6 +12,7 @@ var _snowBridge = require("@subwallet/extension-base/services/balance-service/tr
|
|
|
12
12
|
var _utils = require("@subwallet/extension-base/services/balance-service/transfer/xcm/utils");
|
|
13
13
|
var _utils2 = require("@subwallet/extension-base/utils");
|
|
14
14
|
var _subwalletServicesSdk = _interopRequireDefault(require("@subwallet-monorepos/subwallet-services-sdk"));
|
|
15
|
+
var _bittensorBridge = require("./bittensorBridge");
|
|
15
16
|
var _posBridge = require("./posBridge");
|
|
16
17
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
17
18
|
// SPDX-License-Identifier: Apache-2.0
|
|
@@ -112,6 +113,14 @@ const createXcmExtrinsicV2 = async request => {
|
|
|
112
113
|
}
|
|
113
114
|
};
|
|
114
115
|
exports.createXcmExtrinsicV2 = createXcmExtrinsicV2;
|
|
116
|
+
const getMinXcmTransferableAmount = async request => {
|
|
117
|
+
try {
|
|
118
|
+
return await (0, _utils.fetchMinXcmTransferableAmount)(request);
|
|
119
|
+
} catch (e) {
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
exports.getMinXcmTransferableAmount = getMinXcmTransferableAmount;
|
|
115
124
|
const dryRunXcmExtrinsicV2 = async function (request) {
|
|
116
125
|
let isPreview = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
117
126
|
try {
|
|
@@ -216,4 +225,54 @@ const createAcrossBridgeExtrinsic = async _ref5 => {
|
|
|
216
225
|
return Promise.reject(new Error(error === null || error === void 0 ? void 0 : error.message));
|
|
217
226
|
}
|
|
218
227
|
};
|
|
219
|
-
|
|
228
|
+
|
|
229
|
+
// Native bittensor <-> subtensor EVM bridge
|
|
230
|
+
exports.createAcrossBridgeExtrinsic = createAcrossBridgeExtrinsic;
|
|
231
|
+
const createBittensorToSubtensorEvmExtrinsic = async _ref6 => {
|
|
232
|
+
let {
|
|
233
|
+
destinationChain,
|
|
234
|
+
originChain,
|
|
235
|
+
recipient,
|
|
236
|
+
sendingValue,
|
|
237
|
+
substrateApi,
|
|
238
|
+
transferAll
|
|
239
|
+
} = _ref6;
|
|
240
|
+
if (!(0, _xcmParser._isBittensorToSubtensorEvmBridge)(originChain, destinationChain)) {
|
|
241
|
+
throw new Error('This is not a valid Bittensor bridge transfer');
|
|
242
|
+
}
|
|
243
|
+
if (!substrateApi) {
|
|
244
|
+
throw Error('Substrate API is not available');
|
|
245
|
+
}
|
|
246
|
+
const api = substrateApi.api;
|
|
247
|
+
await api.isReady;
|
|
248
|
+
const subtensorEvmAddress = (0, _bittensorBridge.evmToSs58)(recipient);
|
|
249
|
+
if (transferAll) {
|
|
250
|
+
return api.tx.balances.transferAll(subtensorEvmAddress, false);
|
|
251
|
+
}
|
|
252
|
+
return api.tx.balances.transferKeepAlive(subtensorEvmAddress, sendingValue);
|
|
253
|
+
};
|
|
254
|
+
exports.createBittensorToSubtensorEvmExtrinsic = createBittensorToSubtensorEvmExtrinsic;
|
|
255
|
+
const createSubtensorEvmToBittensorExtrinsic = async _ref7 => {
|
|
256
|
+
let {
|
|
257
|
+
destinationChain,
|
|
258
|
+
evmApi,
|
|
259
|
+
feeCustom,
|
|
260
|
+
feeInfo,
|
|
261
|
+
feeOption,
|
|
262
|
+
originChain,
|
|
263
|
+
recipient,
|
|
264
|
+
sender,
|
|
265
|
+
sendingValue
|
|
266
|
+
} = _ref7;
|
|
267
|
+
if (!(0, _xcmParser._isSubtensorEvmtoBittensorBridge)(originChain, destinationChain)) {
|
|
268
|
+
throw new Error('This is not a valid Subtensor EVM bridge transfer');
|
|
269
|
+
}
|
|
270
|
+
if (!evmApi) {
|
|
271
|
+
throw Error('Evm API is not available');
|
|
272
|
+
}
|
|
273
|
+
if (!sender) {
|
|
274
|
+
throw Error('Sender is required');
|
|
275
|
+
}
|
|
276
|
+
return (0, _bittensorBridge.getSubtensorEvmtoBittensorExtrinsic)(sender, recipient, sendingValue, evmApi, feeInfo, feeCustom, feeOption);
|
|
277
|
+
};
|
|
278
|
+
exports.createSubtensorEvmToBittensorExtrinsic = createSubtensorEvmToBittensorExtrinsic;
|
|
@@ -8,13 +8,22 @@ exports.buildXcm = buildXcm;
|
|
|
8
8
|
exports.dryRunPreviewXcm = dryRunPreviewXcm;
|
|
9
9
|
exports.dryRunXcm = dryRunXcm;
|
|
10
10
|
exports.estimateXcmFee = estimateXcmFee;
|
|
11
|
+
exports.fetchMinXcmTransferableAmount = fetchMinXcmTransferableAmount;
|
|
11
12
|
exports.isChainNotSupportDryRun = isChainNotSupportDryRun;
|
|
12
13
|
exports.isChainNotSupportPolkadotApi = isChainNotSupportPolkadotApi;
|
|
14
|
+
exports.isSubstrateCrossChain = isSubstrateCrossChain;
|
|
13
15
|
var _paraspellChainMap = require("@subwallet/extension-base/constants/paraspell-chain-map");
|
|
16
|
+
var _xcmParser = require("@subwallet/extension-base/core/substrate/xcm-parser");
|
|
17
|
+
var _acrossBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/acrossBridge");
|
|
18
|
+
var _availBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge");
|
|
19
|
+
var _polygonBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge");
|
|
20
|
+
var _posBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/posBridge");
|
|
21
|
+
var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
14
22
|
var _environment = require("@subwallet/extension-base/types/environment");
|
|
15
|
-
var
|
|
23
|
+
var _utils2 = require("@subwallet/extension-base/utils");
|
|
16
24
|
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
17
25
|
var _util = require("@polkadot/util");
|
|
26
|
+
var _bittensorBridge = require("./bittensorBridge");
|
|
18
27
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
19
28
|
// SPDX-License-Identifier: Apache-2.0
|
|
20
29
|
|
|
@@ -23,7 +32,9 @@ const paraSpellApi = {
|
|
|
23
32
|
buildXcm: `${version}/x-transfer`,
|
|
24
33
|
feeXcm: `${version}/xcm-fee`,
|
|
25
34
|
dryRunXcm: `${version}/dry-run`,
|
|
26
|
-
dryRunPreviewXcm: `${version}/dry-run-preview
|
|
35
|
+
dryRunPreviewXcm: `${version}/dry-run-preview`,
|
|
36
|
+
maxTransferable: `${version}/transferable-amount`,
|
|
37
|
+
minTransferable: `${version}/min-transferable-amount`
|
|
27
38
|
};
|
|
28
39
|
function txHexToSubmittableExtrinsic(api, hex) {
|
|
29
40
|
try {
|
|
@@ -105,7 +116,7 @@ async function buildXcm(request) {
|
|
|
105
116
|
abstractDecimals: false
|
|
106
117
|
}
|
|
107
118
|
};
|
|
108
|
-
const response = await (0,
|
|
119
|
+
const response = await (0, _utils2.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.buildXcm, {
|
|
109
120
|
method: 'POST',
|
|
110
121
|
body: JSON.stringify(bodyData),
|
|
111
122
|
headers: {
|
|
@@ -146,7 +157,7 @@ async function dryRunXcm(request) {
|
|
|
146
157
|
abstractDecimals: false
|
|
147
158
|
}
|
|
148
159
|
};
|
|
149
|
-
const response = await (0,
|
|
160
|
+
const response = await (0, _utils2.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.dryRunXcm, {
|
|
150
161
|
method: 'POST',
|
|
151
162
|
body: JSON.stringify(bodyData),
|
|
152
163
|
headers: {
|
|
@@ -191,7 +202,7 @@ async function dryRunPreviewXcm(request) {
|
|
|
191
202
|
mintFeeAssets: true
|
|
192
203
|
}
|
|
193
204
|
};
|
|
194
|
-
const response = await (0,
|
|
205
|
+
const response = await (0, _utils2.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.dryRunPreviewXcm, {
|
|
195
206
|
method: 'POST',
|
|
196
207
|
body: JSON.stringify(bodyData),
|
|
197
208
|
headers: {
|
|
@@ -238,7 +249,7 @@ async function estimateXcmFee(request) {
|
|
|
238
249
|
abstractDecimals: false
|
|
239
250
|
}
|
|
240
251
|
};
|
|
241
|
-
const response = await (0,
|
|
252
|
+
const response = await (0, _utils2.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.feeXcm, {
|
|
242
253
|
method: 'POST',
|
|
243
254
|
body: JSON.stringify(bodyData),
|
|
244
255
|
headers: {
|
|
@@ -252,6 +263,41 @@ async function estimateXcmFee(request) {
|
|
|
252
263
|
}
|
|
253
264
|
return await response.json();
|
|
254
265
|
}
|
|
266
|
+
async function fetchMinXcmTransferableAmount(request) {
|
|
267
|
+
var _originTokenInfo$meta4;
|
|
268
|
+
const {
|
|
269
|
+
fromChainInfo: originChain,
|
|
270
|
+
fromTokenInfo: originTokenInfo,
|
|
271
|
+
recipient,
|
|
272
|
+
sender,
|
|
273
|
+
toChainInfo: destinationChain,
|
|
274
|
+
value: sendingValue
|
|
275
|
+
} = request;
|
|
276
|
+
const paraSpellChainMap = await (0, _paraspellChainMap.fetchParaSpellChainMap)();
|
|
277
|
+
const paraSpellIdentifyV4 = (_originTokenInfo$meta4 = originTokenInfo.metadata) === null || _originTokenInfo$meta4 === void 0 ? void 0 : _originTokenInfo$meta4.paraSpellIdentifyV4;
|
|
278
|
+
if (!paraSpellIdentifyV4) {
|
|
279
|
+
throw new Error('Token is not support XCM at this time');
|
|
280
|
+
}
|
|
281
|
+
const bodyData = {
|
|
282
|
+
senderAddress: sender,
|
|
283
|
+
address: recipient,
|
|
284
|
+
from: paraSpellChainMap[originChain.slug],
|
|
285
|
+
to: paraSpellChainMap[destinationChain.slug],
|
|
286
|
+
currency: createParaSpellCurrency(paraSpellIdentifyV4, sendingValue),
|
|
287
|
+
options: {
|
|
288
|
+
abstractDecimals: false
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
const response = await (0, _utils2.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.minTransferable, {
|
|
292
|
+
method: 'POST',
|
|
293
|
+
body: JSON.stringify(bodyData),
|
|
294
|
+
headers: {
|
|
295
|
+
'Content-Type': 'application/json',
|
|
296
|
+
Accept: 'application/json'
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
return await response.json();
|
|
300
|
+
}
|
|
255
301
|
function createParaSpellCurrency(paraSpellIdentifyV4, amount) {
|
|
256
302
|
return {
|
|
257
303
|
...paraSpellIdentifyV4,
|
|
@@ -267,4 +313,46 @@ function isChainNotSupportDryRun(str) {
|
|
|
267
313
|
const regex = /(?=.*DryRunApi)(?=.*not available).*/i; // Example: DryRunApi is not available on node Acala
|
|
268
314
|
|
|
269
315
|
return regex.test(str);
|
|
316
|
+
}
|
|
317
|
+
function isSubstrateCrossChain(originChainInfo, destinationChainInfo) {
|
|
318
|
+
if (originChainInfo.slug === destinationChainInfo.slug) {
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// isAvailBridgeFromEvm
|
|
323
|
+
if ((0, _utils._isPureEvmChain)(originChainInfo) && (0, _availBridge.isAvailChainBridge)(destinationChainInfo.slug)) {
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// isAvailBridgeFromAvail
|
|
328
|
+
if ((0, _availBridge.isAvailChainBridge)(originChainInfo.slug) && (0, _utils._isPureEvmChain)(destinationChainInfo)) {
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// isSnowBridgeEvmTransfer
|
|
333
|
+
if ((0, _utils._isPureEvmChain)(originChainInfo) && (0, _xcmParser._isSnowBridgeXcm)(originChainInfo, destinationChainInfo)) {
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// isPolygonBridgeTransfer
|
|
338
|
+
if ((0, _polygonBridge._isPolygonChainBridge)(originChainInfo.slug, destinationChainInfo.slug)) {
|
|
339
|
+
return false;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// isPosBridgeTransfer
|
|
343
|
+
if ((0, _posBridge._isPosChainBridge)(originChainInfo.slug, destinationChainInfo.slug)) {
|
|
344
|
+
return false;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// isAcrossBridgeTransfer
|
|
348
|
+
if ((0, _acrossBridge._isAcrossChainBridge)(originChainInfo.slug, destinationChainInfo.slug)) {
|
|
349
|
+
return false;
|
|
350
|
+
}
|
|
351
|
+
if ((0, _bittensorBridge._isBittensorToSubtensorBridge)(originChainInfo.slug, destinationChainInfo.slug)) {
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
354
|
+
if ((0, _bittensorBridge._isSubtensorToBittensorBridge)(originChainInfo.slug, destinationChainInfo.slug)) {
|
|
355
|
+
return false;
|
|
356
|
+
}
|
|
357
|
+
return true;
|
|
270
358
|
}
|
|
@@ -54,7 +54,8 @@ const _BALANCE_CHAIN_GROUP = {
|
|
|
54
54
|
supportBridged: ['rococo_assethub', 'statemint', 'statemine', 'polimec'],
|
|
55
55
|
bittensor: ['bittensor', 'bittensor_testnet'],
|
|
56
56
|
moonbeam: ['moonbeam', 'moonriver', 'moonbase'],
|
|
57
|
-
notSupportGetBalanceByType: ['vara_network', 'vara_testnet', 'availTuringTest', 'avail_mainnet']
|
|
57
|
+
notSupportGetBalanceByType: ['vara_network', 'vara_testnet', 'availTuringTest', 'avail_mainnet'],
|
|
58
|
+
subtensor_evm: ['subtensor_evm']
|
|
58
59
|
};
|
|
59
60
|
exports._BALANCE_CHAIN_GROUP = _BALANCE_CHAIN_GROUP;
|
|
60
61
|
const _BALANCE_LOCKED_ID_GROUP = {
|
|
@@ -313,7 +314,8 @@ const _TRANSFER_CHAIN_GROUP = {
|
|
|
313
314
|
pendulum: ['pendulum', 'amplitude', 'amplitude_test', 'hydradx_main', 'bifrost', 'bifrost_dot', 'jamton', 'hydradx_hollarnet'],
|
|
314
315
|
centrifuge: ['centrifuge'],
|
|
315
316
|
disable_transfer: ['crab', 'pangolin'],
|
|
316
|
-
truth: ['truth_network']
|
|
317
|
+
truth: ['truth_network'],
|
|
318
|
+
bittensor: ['bittensor', 'bittensor_testnet']
|
|
317
319
|
};
|
|
318
320
|
exports._TRANSFER_CHAIN_GROUP = _TRANSFER_CHAIN_GROUP;
|
|
319
321
|
const USE_MULTILOCATION_INDEX = ['energy_web_x'];
|
|
@@ -12,7 +12,7 @@ const PRODUCTION_BRANCHES = ['master', 'webapp', 'webapp-dev'];
|
|
|
12
12
|
const branchName = process.env.BRANCH_NAME || 'subwallet-dev';
|
|
13
13
|
const fetchDomain = process.env.PATCH_CHAIN_LIST_URL || (PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'https://chain-list-assets.subwallet.app' : 'https://dev.sw-chain-list-assets.pages.dev');
|
|
14
14
|
const fetchFile = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'list.json' : 'preview.json';
|
|
15
|
-
const ChainListVersion = '0.2.
|
|
15
|
+
const ChainListVersion = '0.2.127'; // update this when build chain-list
|
|
16
16
|
|
|
17
17
|
// todo: move this interface to chainlist
|
|
18
18
|
exports.ChainListVersion = ChainListVersion;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports._STAKING_CHAIN_GROUP = exports.TON_CHAINS = exports.SUNSETTED_YIELD_POOL_SLUGS = exports.ST_LIQUID_TOKEN_ABI = exports.STAKING_IDENTITY_API_SLUG = exports.RELAY_HANDLER_DIRECT_STAKING_CHAINS = exports.MaxEraRewardPointsEras = exports.MANTA_VALIDATOR_POINTS_PER_BLOCK = exports.MANTA_MIN_DELEGATION = exports.CHANNEL_ID = void 0;
|
|
6
|
+
exports._STAKING_CHAIN_GROUP = exports.TON_CHAINS = exports.SUNSETTED_YIELD_POOL_SLUGS = exports.ST_LIQUID_TOKEN_ABI = exports.STAKING_IDENTITY_API_SLUG = exports.RELAY_HANDLER_DIRECT_STAKING_CHAINS = exports.MaxEraRewardPointsEras = exports.MIN_XCM_LIQUID_STAKING_DOT = exports.MANTA_VALIDATOR_POINTS_PER_BLOCK = exports.MANTA_MIN_DELEGATION = exports.CHANNEL_ID = void 0;
|
|
7
7
|
var _stellaSwap = require("../handlers/liquid-staking/stella-swap");
|
|
8
8
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
9
9
|
// SPDX-License-Identifier: Apache-2.0
|
|
@@ -52,4 +52,6 @@ const STAKING_IDENTITY_API_SLUG = {
|
|
|
52
52
|
statemine: 'peopleKusama',
|
|
53
53
|
statemint: 'polkadot_people'
|
|
54
54
|
};
|
|
55
|
-
exports.STAKING_IDENTITY_API_SLUG = STAKING_IDENTITY_API_SLUG;
|
|
55
|
+
exports.STAKING_IDENTITY_API_SLUG = STAKING_IDENTITY_API_SLUG;
|
|
56
|
+
const MIN_XCM_LIQUID_STAKING_DOT = '15000000000';
|
|
57
|
+
exports.MIN_XCM_LIQUID_STAKING_DOT = MIN_XCM_LIQUID_STAKING_DOT;
|
|
@@ -12,6 +12,7 @@ var _utils = require("@subwallet/extension-base/koni/api/yield/helper/utils");
|
|
|
12
12
|
var _xcm = require("@subwallet/extension-base/services/balance-service/transfer/xcm");
|
|
13
13
|
var _utils2 = require("@subwallet/extension-base/services/balance-service/transfer/xcm/utils");
|
|
14
14
|
var _utils3 = require("@subwallet/extension-base/services/chain-service/utils");
|
|
15
|
+
var _constants2 = require("@subwallet/extension-base/services/earning-service/constants");
|
|
15
16
|
var _types = require("@subwallet/extension-base/types");
|
|
16
17
|
var _utils4 = require("@subwallet/extension-base/utils");
|
|
17
18
|
var _getId = require("@subwallet/extension-base/utils/getId");
|
|
@@ -214,51 +215,51 @@ class BaseSpecialStakingPoolHandler extends _base.default {
|
|
|
214
215
|
address,
|
|
215
216
|
amount
|
|
216
217
|
} = params;
|
|
217
|
-
const
|
|
218
|
+
const bnStakeAmount = new _bignumber.default(amount);
|
|
218
219
|
const inputTokenSlug = this.inputAsset; // assume that the pool only has 1 input token, will update later
|
|
219
220
|
const inputTokenInfo = this.state.getAssetBySlug(inputTokenSlug);
|
|
220
221
|
const inputTokenBalance = await this.state.balanceService.getTransferableBalance(address, inputTokenInfo.originChain, inputTokenSlug);
|
|
221
|
-
const bnInputTokenBalance = new
|
|
222
|
-
if (!bnInputTokenBalance.gte(
|
|
222
|
+
const bnInputTokenBalance = new _bignumber.default(inputTokenBalance.value);
|
|
223
|
+
if (amount && !bnInputTokenBalance.gte(bnStakeAmount)) {
|
|
223
224
|
if (this.altInputAsset) {
|
|
224
225
|
const altInputTokenSlug = this.altInputAsset;
|
|
225
226
|
const altInputTokenInfo = this.state.getAssetBySlug(altInputTokenSlug);
|
|
226
227
|
const altInputTokenBalance = await this.state.balanceService.getTransferableBalance(address, altInputTokenInfo.originChain, altInputTokenSlug);
|
|
227
|
-
const bnAltInputTokenBalance = new
|
|
228
|
-
if (bnAltInputTokenBalance.gt(
|
|
228
|
+
const bnAltInputTokenBalance = new _bignumber.default(altInputTokenBalance.value || '0');
|
|
229
|
+
if (bnAltInputTokenBalance.gt((0, _bignumber.default)(0))) {
|
|
229
230
|
const altChainInfo = this.state.getChainInfo(altInputTokenInfo.originChain);
|
|
230
231
|
const symbol = altInputTokenInfo.symbol;
|
|
231
232
|
const networkName = altChainInfo.name;
|
|
232
|
-
|
|
233
|
-
// TODO: calculate fee for destination chain
|
|
234
|
-
const xcmFeeInfo = await (0, _utils2.estimateXcmFee)({
|
|
233
|
+
const xcmRequest = {
|
|
235
234
|
fromChainInfo: altChainInfo,
|
|
236
235
|
fromTokenInfo: altInputTokenInfo,
|
|
237
236
|
toChainInfo: this.chainInfo,
|
|
238
237
|
recipient: address,
|
|
239
238
|
sender: address,
|
|
240
|
-
value:
|
|
241
|
-
}
|
|
239
|
+
value: bnStakeAmount.toString()
|
|
240
|
+
};
|
|
241
|
+
const [xcmFeeInfo, _minXcmTransferableAmount] = await Promise.all([(0, _utils2.estimateXcmFee)(xcmRequest), (0, _xcm.getMinXcmTransferableAmount)(xcmRequest)]);
|
|
242
242
|
if (!xcmFeeInfo) {
|
|
243
243
|
throw new Error('Error estimating XCM fee');
|
|
244
244
|
}
|
|
245
|
-
const
|
|
245
|
+
const xcmOriginFee = (0, _bignumber.default)(xcmFeeInfo.origin.fee).toFixed(0, 1);
|
|
246
|
+
const xcmDestinationFee = (0, _bignumber.default)(xcmFeeInfo.destination.fee).toFixed(0, 1);
|
|
246
247
|
const fee = {
|
|
247
248
|
slug: altInputTokenSlug,
|
|
248
|
-
amount:
|
|
249
|
+
amount: xcmOriginFee
|
|
249
250
|
};
|
|
250
|
-
let
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
bnTransferAmount = bnTransferAmount.add(bnXcmFee);
|
|
251
|
+
let sendingValue = bnStakeAmount.minus(bnInputTokenBalance).plus(xcmDestinationFee).toString();
|
|
252
|
+
const minXcmTransferableAmount = _minXcmTransferableAmount || _constants2.MIN_XCM_LIQUID_STAKING_DOT;
|
|
253
|
+
if (new _bignumber.default(minXcmTransferableAmount).gt(sendingValue)) {
|
|
254
|
+
sendingValue = minXcmTransferableAmount;
|
|
255
255
|
}
|
|
256
|
+
const metadata = {
|
|
257
|
+
sendingValue,
|
|
258
|
+
originTokenInfo: altInputTokenInfo,
|
|
259
|
+
destinationTokenInfo: inputTokenInfo
|
|
260
|
+
};
|
|
256
261
|
const step = {
|
|
257
|
-
metadata:
|
|
258
|
-
sendingValue: bnTransferAmount.toString(),
|
|
259
|
-
originTokenInfo: altInputTokenInfo,
|
|
260
|
-
destinationTokenInfo: inputTokenInfo
|
|
261
|
-
},
|
|
262
|
+
metadata: metadata,
|
|
262
263
|
name: `Transfer ${symbol} from ${networkName}`,
|
|
263
264
|
type: _types.YieldStepType.XCM
|
|
264
265
|
};
|
|
@@ -301,31 +302,35 @@ class BaseSpecialStakingPoolHandler extends _base.default {
|
|
|
301
302
|
return Promise.resolve([new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED)]);
|
|
302
303
|
}
|
|
303
304
|
async validateXcmStep(params, path, bnInputTokenBalance) {
|
|
305
|
+
// todo: BN -> BigN or BigInt
|
|
304
306
|
const processValidation = {
|
|
305
307
|
ok: true,
|
|
306
308
|
status: _types.YieldValidationStatus.OK
|
|
307
309
|
};
|
|
308
|
-
const
|
|
309
|
-
const
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
const
|
|
315
|
-
const
|
|
316
|
-
|
|
310
|
+
const metadata = path.steps[1].metadata;
|
|
311
|
+
const {
|
|
312
|
+
destinationTokenInfo,
|
|
313
|
+
originTokenInfo,
|
|
314
|
+
sendingValue
|
|
315
|
+
} = metadata;
|
|
316
|
+
const originChainInfo = this.state.getChainInfo(originTokenInfo.originChain);
|
|
317
|
+
const originTokenBalance = await this.state.balanceService.getTransferableBalance(params.address, originTokenInfo.originChain, originTokenInfo.slug);
|
|
318
|
+
const bnOriginTokenBalance = new _util.BN(originTokenBalance.value || '0');
|
|
319
|
+
const bnAdjustOriginFee = new _util.BN(path.totalFee[1].amount || '0').mul(new _util.BN(_constants.XCM_MIN_AMOUNT_RATIO));
|
|
320
|
+
const bnSendingValue = new _util.BN(sendingValue);
|
|
321
|
+
if (!bnOriginTokenBalance.sub(bnSendingValue).sub(bnAdjustOriginFee).gt(_util.BN_ZERO)) {
|
|
317
322
|
processValidation.failedStep = path.steps[1];
|
|
318
323
|
processValidation.ok = false;
|
|
319
324
|
processValidation.status = _types.YieldValidationStatus.NOT_ENOUGH_BALANCE;
|
|
320
|
-
const bnMaxXCM = new _util.BN(
|
|
321
|
-
const
|
|
322
|
-
const maxBn = bnInputTokenBalance.add(
|
|
323
|
-
const maxValue = (0, _utils4.formatNumber)(maxBn.toString(),
|
|
324
|
-
const maxXCMValue = (0, _utils4.formatNumber)(bnMaxXCM.toString(),
|
|
325
|
-
const symbol = (0, _utils3._getAssetSymbol)(
|
|
325
|
+
const bnMaxXCM = new _util.BN(originTokenBalance.value).sub(bnAdjustOriginFee);
|
|
326
|
+
const destinationTokenDecimal = (0, _utils3._getAssetDecimals)(destinationTokenInfo);
|
|
327
|
+
const maxBn = bnInputTokenBalance.add(bnOriginTokenBalance.sub(bnAdjustOriginFee));
|
|
328
|
+
const maxValue = (0, _utils4.formatNumber)(maxBn.toString(), destinationTokenInfo.decimals || 0);
|
|
329
|
+
const maxXCMValue = (0, _utils4.formatNumber)(bnMaxXCM.toString(), destinationTokenDecimal);
|
|
330
|
+
const symbol = (0, _utils3._getAssetSymbol)(originTokenInfo);
|
|
326
331
|
const inputNetworkName = this.chainInfo.name;
|
|
327
|
-
const altNetworkName = (0, _utils3.
|
|
328
|
-
const currentValue = (0, _utils4.formatNumber)(bnInputTokenBalance.toString(),
|
|
332
|
+
const altNetworkName = (0, _utils3._getChainName)(originChainInfo);
|
|
333
|
+
const currentValue = (0, _utils4.formatNumber)(bnInputTokenBalance.toString(), destinationTokenDecimal);
|
|
329
334
|
processValidation.message = (0, _i18next.t)('bg.EARNING.services.service.earning.specialHandler.maximumInputExceeded', {
|
|
330
335
|
replace: {
|
|
331
336
|
symbol,
|
|
@@ -338,6 +343,24 @@ class BaseSpecialStakingPoolHandler extends _base.default {
|
|
|
338
343
|
});
|
|
339
344
|
return [new _TransactionError.TransactionError(_types.YieldValidationStatus.NOT_ENOUGH_BALANCE, processValidation.message, processValidation)];
|
|
340
345
|
}
|
|
346
|
+
const id = (0, _getId.getId)();
|
|
347
|
+
const feeInfo = await this.state.feeService.subscribeChainFee(id, originChainInfo.slug, 'substrate');
|
|
348
|
+
const substrateApi = this.state.getSubstrateApi(originChainInfo.slug);
|
|
349
|
+
const xcmRequest = {
|
|
350
|
+
destinationTokenInfo: destinationTokenInfo,
|
|
351
|
+
originTokenInfo: originTokenInfo,
|
|
352
|
+
recipient: params.address,
|
|
353
|
+
sendingValue,
|
|
354
|
+
substrateApi,
|
|
355
|
+
sender: params.address,
|
|
356
|
+
originChain: originChainInfo,
|
|
357
|
+
destinationChain: this.chainInfo,
|
|
358
|
+
feeInfo
|
|
359
|
+
};
|
|
360
|
+
const isDryRunSuccess = await (0, _xcm.dryRunXcmExtrinsicV2)(xcmRequest);
|
|
361
|
+
if (!isDryRunSuccess) {
|
|
362
|
+
return [new _TransactionError.TransactionError(_types.BasicTxErrorType.UNABLE_TO_SEND, 'Unable to perform transaction. Select another token or destination chain and try again')];
|
|
363
|
+
}
|
|
341
364
|
return [];
|
|
342
365
|
}
|
|
343
366
|
async validateJoinStep(id, params, path, bnInputTokenBalance, isXcmOk) {
|
|
@@ -357,7 +380,7 @@ class BaseSpecialStakingPoolHandler extends _base.default {
|
|
|
357
380
|
const feeTokenInfo = this.state.getAssetBySlug(feeTokenSlug);
|
|
358
381
|
const inputTokenInfo = this.state.getAssetBySlug(this.inputAsset);
|
|
359
382
|
const defaultFeeTokenSlug = this.feeAssets[0];
|
|
360
|
-
const
|
|
383
|
+
const bnStakeAmount = new _util.BN(params.amount);
|
|
361
384
|
if (this.feeAssets.length === 1 && feeTokenSlug === defaultFeeTokenSlug) {
|
|
362
385
|
var _path$totalFee$id;
|
|
363
386
|
const bnFeeAmount = new _util.BN(((_path$totalFee$id = path.totalFee[id]) === null || _path$totalFee$id === void 0 ? void 0 : _path$totalFee$id.amount) || '0');
|
|
@@ -371,13 +394,13 @@ class BaseSpecialStakingPoolHandler extends _base.default {
|
|
|
371
394
|
return [new _TransactionError.TransactionError(_types.YieldValidationStatus.NOT_ENOUGH_FEE, processValidation.message, processValidation)];
|
|
372
395
|
}
|
|
373
396
|
}
|
|
374
|
-
if (!
|
|
397
|
+
if (!bnStakeAmount.gte(new _util.BN(poolInfo.statistic.earningThreshold.join || '0'))) {
|
|
375
398
|
processValidation.failedStep = path.steps[id];
|
|
376
399
|
processValidation.ok = false;
|
|
377
400
|
processValidation.status = _types.YieldValidationStatus.NOT_ENOUGH_MIN_JOIN_POOL;
|
|
378
401
|
return [new _TransactionError.TransactionError(_types.YieldValidationStatus.NOT_ENOUGH_MIN_JOIN_POOL, processValidation.message, processValidation)];
|
|
379
402
|
}
|
|
380
|
-
if (!isXcmOk &&
|
|
403
|
+
if (!isXcmOk && bnStakeAmount.gt(bnInputTokenBalance)) {
|
|
381
404
|
processValidation.failedStep = path.steps[id];
|
|
382
405
|
processValidation.ok = false;
|
|
383
406
|
processValidation.status = _types.YieldValidationStatus.NOT_ENOUGH_BALANCE;
|
|
@@ -401,8 +424,8 @@ class BaseSpecialStakingPoolHandler extends _base.default {
|
|
|
401
424
|
const balanceService = this.state.balanceService;
|
|
402
425
|
const inputTokenBalance = await balanceService.getTransferableBalance(params.address, inputTokenInfo.originChain, inputTokenSlug);
|
|
403
426
|
const bnInputTokenBalance = new _util.BN(inputTokenBalance.value || '0');
|
|
404
|
-
const
|
|
405
|
-
if (
|
|
427
|
+
const bnStakeAmount = new _util.BN(params.amount);
|
|
428
|
+
if (bnStakeAmount.lte(_util.BN_ZERO)) {
|
|
406
429
|
return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, 'Amount must be greater than 0')];
|
|
407
430
|
}
|
|
408
431
|
let isXcmOk = false;
|
|
@@ -436,31 +459,25 @@ class BaseSpecialStakingPoolHandler extends _base.default {
|
|
|
436
459
|
async handleTokenApproveStep(data, path) {
|
|
437
460
|
return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED));
|
|
438
461
|
}
|
|
439
|
-
async handleXcmStep(data, path
|
|
462
|
+
async handleXcmStep(data, path) {
|
|
463
|
+
const metadata = path.steps[1].metadata;
|
|
464
|
+
const xcmStepFee = path.totalFee[1].amount;
|
|
465
|
+
const address = data.address;
|
|
440
466
|
const {
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
const
|
|
446
|
-
const altInputTokenInfo = this.state.getAssetBySlug(altInputTokenSlug);
|
|
447
|
-
const originChainInfo = this.state.getChainInfo(altInputTokenInfo.originChain);
|
|
467
|
+
destinationTokenInfo,
|
|
468
|
+
originTokenInfo,
|
|
469
|
+
sendingValue
|
|
470
|
+
} = metadata;
|
|
471
|
+
const originChainInfo = this.state.getChainInfo(originTokenInfo.originChain);
|
|
448
472
|
const originTokenSlug = (0, _utils3._getChainNativeTokenSlug)(originChainInfo);
|
|
449
|
-
const originTokenInfo = this.state.getAssetBySlug(originTokenSlug);
|
|
450
|
-
const destinationTokenInfo = this.state.getAssetBySlug(destinationTokenSlug);
|
|
451
473
|
const substrateApi = this.state.getSubstrateApi(originChainInfo.slug);
|
|
452
|
-
const inputTokenBalance = await this.state.balanceService.getTransferableBalance(address, destinationTokenInfo.originChain, destinationTokenSlug);
|
|
453
|
-
const bnInputTokenBalance = new _util.BN(inputTokenBalance.value);
|
|
454
|
-
const bnXcmFee = new _util.BN(xcmFee);
|
|
455
|
-
const bnAmount = new _util.BN(amount);
|
|
456
|
-
const bnTotalAmount = bnAmount.sub(bnInputTokenBalance).add(bnXcmFee);
|
|
457
474
|
const id = (0, _getId.getId)();
|
|
458
475
|
const feeInfo = await this.state.feeService.subscribeChainFee(id, originChainInfo.slug, 'substrate');
|
|
459
476
|
const xcmRequest = {
|
|
460
477
|
destinationTokenInfo,
|
|
461
478
|
originTokenInfo,
|
|
462
479
|
recipient: address,
|
|
463
|
-
sendingValue
|
|
480
|
+
sendingValue,
|
|
464
481
|
substrateApi,
|
|
465
482
|
sender: address,
|
|
466
483
|
originChain: originChainInfo,
|
|
@@ -476,7 +493,7 @@ class BaseSpecialStakingPoolHandler extends _base.default {
|
|
|
476
493
|
destinationNetworkKey: destinationTokenInfo.originChain,
|
|
477
494
|
from: address,
|
|
478
495
|
to: address,
|
|
479
|
-
value:
|
|
496
|
+
value: sendingValue,
|
|
480
497
|
tokenSlug: originTokenSlug,
|
|
481
498
|
showExtraWarning: true
|
|
482
499
|
};
|
|
@@ -485,8 +502,9 @@ class BaseSpecialStakingPoolHandler extends _base.default {
|
|
|
485
502
|
extrinsicType: _KoniTypes.ExtrinsicType.TRANSFER_XCM,
|
|
486
503
|
extrinsic,
|
|
487
504
|
txData: xcmData,
|
|
488
|
-
transferNativeAmount:
|
|
489
|
-
chainType: _KoniTypes.ChainType.SUBSTRATE
|
|
505
|
+
transferNativeAmount: sendingValue,
|
|
506
|
+
chainType: _KoniTypes.ChainType.SUBSTRATE,
|
|
507
|
+
xcmStepFee
|
|
490
508
|
};
|
|
491
509
|
}
|
|
492
510
|
handleYieldJoin(data, path, currentStep) {
|
|
@@ -498,8 +516,7 @@ class BaseSpecialStakingPoolHandler extends _base.default {
|
|
|
498
516
|
return this.handleTokenApproveStep(data, path);
|
|
499
517
|
case _types.YieldStepType.XCM:
|
|
500
518
|
{
|
|
501
|
-
|
|
502
|
-
return this.handleXcmStep(data, path, xcmFee);
|
|
519
|
+
return this.handleXcmStep(data, path);
|
|
503
520
|
}
|
|
504
521
|
default:
|
|
505
522
|
return this.handleSubmitStep(data, path);
|
|
@@ -883,6 +883,7 @@ class EarningService {
|
|
|
883
883
|
} = params;
|
|
884
884
|
const handler = this.getPoolHandler(slug);
|
|
885
885
|
if (handler) {
|
|
886
|
+
console.log('all step', await handler.generateOptimalPath(params));
|
|
886
887
|
return handler.generateOptimalPath(params);
|
|
887
888
|
} else {
|
|
888
889
|
throw new _TransactionError.TransactionError(_types2.BasicTxErrorType.INTERNAL_ERROR);
|