@subwallet/extension-base 1.3.29-1 → 1.3.31-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/background/KoniTypes.d.ts +16 -4
- package/background/errors/SwapError.js +1 -1
- package/cjs/background/errors/SwapError.js +1 -1
- package/cjs/constants/blocked-actions.js +2 -2
- package/cjs/constants/paraspell-chain-map.js +13 -0
- package/cjs/constants/remind-notification-time.js +3 -3
- package/cjs/core/logic-validation/swap.js +63 -4
- package/cjs/core/logic-validation/transfer.js +13 -1
- package/cjs/core/substrate/xcm-parser.js +5 -1
- package/cjs/core/utils.js +36 -15
- package/cjs/koni/background/handlers/Extension.js +141 -172
- package/cjs/koni/background/handlers/State.js +8 -1
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/helpers/process.js +27 -0
- package/cjs/services/balance-service/index.js +9 -0
- package/cjs/services/balance-service/transfer/xcm/acrossBridge/index.js +229 -0
- package/cjs/services/balance-service/transfer/xcm/availBridge.js +6 -6
- package/cjs/services/balance-service/transfer/xcm/index.js +96 -7
- package/cjs/services/balance-service/transfer/xcm/utils.js +213 -0
- package/cjs/services/chain-service/constants.js +2 -4
- package/cjs/services/chain-service/index.js +71 -17
- package/cjs/services/chain-service/utils/patch.js +1 -1
- package/cjs/services/earning-service/handlers/base.js +6 -3
- package/cjs/services/earning-service/handlers/native-staking/base.js +4 -1
- package/cjs/services/earning-service/handlers/native-staking/dtao.js +68 -50
- package/cjs/services/earning-service/handlers/native-staking/tao.js +12 -2
- package/cjs/services/earning-service/handlers/special.js +18 -9
- package/cjs/services/earning-service/service.js +2 -1
- package/cjs/services/fee-service/utils/index.js +16 -4
- package/cjs/services/inapp-notification-service/index.js +19 -13
- package/cjs/services/keyring-service/context/handlers/Ledger.js +1 -1
- package/cjs/services/keyring-service/context/state.js +3 -0
- package/cjs/services/migration-service/scripts/DisableZeroBalanceTokens.js +60 -0
- package/cjs/services/migration-service/scripts/EnableChain.js +1 -1
- package/cjs/services/migration-service/scripts/index.js +3 -2
- package/cjs/services/swap-service/handler/asset-hub/handler.js +61 -314
- package/cjs/services/swap-service/handler/base-handler.js +406 -231
- package/cjs/services/swap-service/handler/chainflip-handler.js +18 -40
- package/cjs/services/swap-service/handler/hydradx-handler.js +77 -269
- package/cjs/services/swap-service/handler/simpleswap-handler.js +27 -48
- package/cjs/services/swap-service/handler/uniswap-handler.js +33 -54
- package/cjs/services/swap-service/index.js +154 -143
- package/cjs/services/swap-service/utils.js +107 -17
- package/cjs/services/transaction-service/index.js +1 -1
- package/cjs/services/transaction-service/utils.js +38 -14
- package/cjs/types/swap/index.js +13 -1
- package/cjs/utils/fee/transfer.js +52 -28
- package/cjs/utils/staticData/index.js +7 -2
- package/cjs/utils/swap.js +5 -1
- package/constants/blocked-actions.d.ts +1 -1
- package/constants/blocked-actions.js +1 -1
- package/constants/paraspell-chain-map.d.ts +1 -0
- package/constants/paraspell-chain-map.js +7 -0
- package/constants/remind-notification-time.d.ts +1 -1
- package/constants/remind-notification-time.js +1 -1
- package/core/logic-validation/swap.d.ts +15 -0
- package/core/logic-validation/swap.js +60 -4
- package/core/logic-validation/transfer.d.ts +1 -0
- package/core/logic-validation/transfer.js +12 -1
- package/core/substrate/xcm-parser.d.ts +1 -0
- package/core/substrate/xcm-parser.js +4 -1
- package/core/utils.d.ts +2 -2
- package/core/utils.js +36 -15
- package/koni/background/handlers/Extension.d.ts +1 -1
- package/koni/background/handlers/Extension.js +66 -98
- package/koni/background/handlers/State.d.ts +1 -0
- package/koni/background/handlers/State.js +7 -1
- package/package.json +23 -13
- package/packageInfo.js +1 -1
- package/services/balance-service/helpers/process.d.ts +2 -1
- package/services/balance-service/helpers/process.js +26 -0
- package/services/balance-service/index.js +11 -2
- package/services/balance-service/transfer/xcm/acrossBridge/index.d.ts +15 -0
- package/services/balance-service/transfer/xcm/acrossBridge/index.js +216 -0
- package/services/balance-service/transfer/xcm/availBridge.js +6 -6
- package/services/balance-service/transfer/xcm/index.d.ts +5 -1
- package/services/balance-service/transfer/xcm/index.js +85 -1
- package/services/balance-service/transfer/xcm/utils.d.ts +11 -0
- package/services/balance-service/transfer/xcm/utils.js +208 -0
- package/services/base/types.d.ts +0 -4
- package/services/chain-service/constants.d.ts +0 -1
- package/services/chain-service/constants.js +1 -2
- package/services/chain-service/index.d.ts +9 -2
- package/services/chain-service/index.js +72 -18
- package/services/chain-service/utils/patch.js +1 -1
- package/services/earning-service/handlers/base.d.ts +4 -3
- package/services/earning-service/handlers/base.js +6 -4
- package/services/earning-service/handlers/native-staking/base.js +4 -1
- package/services/earning-service/handlers/native-staking/dtao.d.ts +9 -6
- package/services/earning-service/handlers/native-staking/dtao.js +69 -48
- package/services/earning-service/handlers/native-staking/tao.js +12 -2
- package/services/earning-service/handlers/special.js +19 -10
- package/services/earning-service/service.d.ts +2 -1
- package/services/earning-service/service.js +2 -1
- package/services/fee-service/utils/index.d.ts +1 -0
- package/services/fee-service/utils/index.js +14 -4
- package/services/inapp-notification-service/index.js +13 -7
- package/services/keyring-service/context/handlers/Ledger.js +1 -1
- package/services/keyring-service/context/state.d.ts +1 -0
- package/services/keyring-service/context/state.js +3 -0
- package/services/migration-service/scripts/DisableZeroBalanceTokens.d.ts +4 -0
- package/services/migration-service/scripts/DisableZeroBalanceTokens.js +51 -0
- package/services/migration-service/scripts/EnableChain.js +1 -1
- package/services/migration-service/scripts/index.js +3 -2
- package/services/swap-service/handler/asset-hub/handler.d.ts +2 -9
- package/services/swap-service/handler/asset-hub/handler.js +64 -317
- package/services/swap-service/handler/base-handler.d.ts +6 -9
- package/services/swap-service/handler/base-handler.js +405 -230
- package/services/swap-service/handler/chainflip-handler.d.ts +2 -4
- package/services/swap-service/handler/chainflip-handler.js +15 -37
- package/services/swap-service/handler/hydradx-handler.d.ts +3 -10
- package/services/swap-service/handler/hydradx-handler.js +78 -270
- package/services/swap-service/handler/simpleswap-handler.d.ts +2 -4
- package/services/swap-service/handler/simpleswap-handler.js +24 -45
- package/services/swap-service/handler/uniswap-handler.d.ts +4 -6
- package/services/swap-service/handler/uniswap-handler.js +25 -46
- package/services/swap-service/index.d.ts +8 -14
- package/services/swap-service/index.js +141 -129
- package/services/swap-service/utils.d.ts +11 -3
- package/services/swap-service/utils.js +96 -15
- package/services/transaction-service/index.js +2 -2
- package/services/transaction-service/types.d.ts +3 -2
- package/services/transaction-service/utils.d.ts +1 -0
- package/services/transaction-service/utils.js +38 -15
- package/types/balance/transfer.d.ts +1 -0
- package/types/service-base.d.ts +2 -3
- package/types/swap/index.d.ts +25 -9
- package/types/swap/index.js +10 -0
- package/types/transaction/process.d.ts +19 -0
- package/types/transaction/request.d.ts +7 -0
- package/types/yield/actions/join/submit.d.ts +4 -1
- package/types/yield/actions/others.d.ts +2 -0
- package/utils/fee/transfer.d.ts +1 -0
- package/utils/fee/transfer.js +54 -30
- package/utils/staticData/index.d.ts +4 -1
- package/utils/staticData/index.js +5 -1
- package/utils/staticData/paraSpellChainMap.json +1 -0
- package/utils/swap.d.ts +3 -0
- package/utils/swap.js +3 -0
- package/cjs/services/swap-service/interface.js +0 -14
- package/services/swap-service/interface.d.ts +0 -9
- package/services/swap-service/interface.js +0 -8
|
@@ -4,11 +4,224 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.STABLE_XCM_VERSION = void 0;
|
|
7
|
+
exports.buildXcm = buildXcm;
|
|
8
|
+
exports.dryRunXcm = dryRunXcm;
|
|
9
|
+
exports.dryRunXcmV2 = dryRunXcmV2;
|
|
10
|
+
exports.isChainNotSupportDryRun = isChainNotSupportDryRun;
|
|
11
|
+
exports.isChainNotSupportPolkadotApi = isChainNotSupportPolkadotApi;
|
|
7
12
|
exports.isUseTeleportProtocol = isUseTeleportProtocol;
|
|
13
|
+
var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
|
|
14
|
+
var _paraspellChainMap = require("@subwallet/extension-base/constants/paraspell-chain-map");
|
|
15
|
+
var _types = require("@subwallet/extension-base/types");
|
|
16
|
+
var _util = require("@polkadot/util");
|
|
8
17
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
9
18
|
// SPDX-License-Identifier: Apache-2.0
|
|
10
19
|
|
|
20
|
+
const paraSpellEndpoint = 'https://api.lightspell.xyz';
|
|
21
|
+
const paraSpellApi = {
|
|
22
|
+
buildXcm: `${paraSpellEndpoint}/x-transfer`,
|
|
23
|
+
dryRunXcm: `${paraSpellEndpoint}/dry-run`
|
|
24
|
+
};
|
|
25
|
+
const paraSpellKey = process.env.PARASPELL_API_KEY || '';
|
|
26
|
+
function txHexToSubmittableExtrinsic(api, hex) {
|
|
27
|
+
try {
|
|
28
|
+
(0, _util.assert)((0, _util.isHex)(hex), 'Expected a hex-encoded call');
|
|
29
|
+
let extrinsicCall;
|
|
30
|
+
let extrinsicPayload = null;
|
|
31
|
+
let decoded = null;
|
|
32
|
+
try {
|
|
33
|
+
// attempt to decode with api.tx
|
|
34
|
+
const tx = api.tx(hex);
|
|
35
|
+
|
|
36
|
+
// ensure that the full data matches here
|
|
37
|
+
(0, _util.assert)(tx.toHex() === hex, 'Cannot decode data as extrinsic, length mismatch');
|
|
38
|
+
decoded = tx;
|
|
39
|
+
extrinsicCall = api.createType('Call', decoded.method);
|
|
40
|
+
} catch {
|
|
41
|
+
try {
|
|
42
|
+
// attempt to decode as Call
|
|
43
|
+
extrinsicCall = api.createType('Call', hex);
|
|
44
|
+
const callHex = extrinsicCall.toHex();
|
|
45
|
+
if (callHex === hex) {
|
|
46
|
+
// ok
|
|
47
|
+
} else if (hex.startsWith(callHex)) {
|
|
48
|
+
// this could be an un-prefixed payload...
|
|
49
|
+
const prefixed = (0, _util.u8aConcat)((0, _util.compactToU8a)(extrinsicCall.encodedLength), hex);
|
|
50
|
+
extrinsicPayload = api.createType('ExtrinsicPayload', prefixed);
|
|
51
|
+
(0, _util.assert)((0, _util.u8aEq)(extrinsicPayload.toU8a(), prefixed), 'Unable to decode data as un-prefixed ExtrinsicPayload');
|
|
52
|
+
extrinsicCall = api.createType('Call', extrinsicPayload.method.toHex());
|
|
53
|
+
} else {
|
|
54
|
+
console.error('Unable to decode data as Call, length mismatch in supplied data');
|
|
55
|
+
}
|
|
56
|
+
} catch {
|
|
57
|
+
// final attempt, we try this as-is as a (prefixed) payload
|
|
58
|
+
extrinsicPayload = api.createType('ExtrinsicPayload', hex);
|
|
59
|
+
(0, _util.assert)(extrinsicPayload.toHex() === hex, 'Unable to decode input data as Call, Extrinsic or ExtrinsicPayload');
|
|
60
|
+
extrinsicCall = api.createType('Call', extrinsicPayload.method.toHex());
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const {
|
|
64
|
+
method,
|
|
65
|
+
section
|
|
66
|
+
} = api.registry.findMetaCall(extrinsicCall.callIndex);
|
|
67
|
+
const extrinsicFn = api.tx[section][method];
|
|
68
|
+
if (!decoded) {
|
|
69
|
+
decoded = extrinsicFn(...extrinsicCall.args);
|
|
70
|
+
}
|
|
71
|
+
return decoded;
|
|
72
|
+
} catch (e) {
|
|
73
|
+
console.error('Failed to decode extrinsic hex', e);
|
|
74
|
+
throw new Error('Failed to decode extrinsic hex');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function buildXcm(request) {
|
|
78
|
+
var _originTokenInfo$meta, _originTokenInfo$meta2;
|
|
79
|
+
const {
|
|
80
|
+
destinationChain,
|
|
81
|
+
originChain,
|
|
82
|
+
originTokenInfo,
|
|
83
|
+
recipient,
|
|
84
|
+
sendingValue,
|
|
85
|
+
substrateApi
|
|
86
|
+
} = request;
|
|
87
|
+
if (!substrateApi) {
|
|
88
|
+
return Promise.reject(new Error('Substrate API is not available'));
|
|
89
|
+
}
|
|
90
|
+
const psAssetType = (_originTokenInfo$meta = originTokenInfo.metadata) === null || _originTokenInfo$meta === void 0 ? void 0 : _originTokenInfo$meta.paraSpellAssetType;
|
|
91
|
+
const psAssetValue = (_originTokenInfo$meta2 = originTokenInfo.metadata) === null || _originTokenInfo$meta2 === void 0 ? void 0 : _originTokenInfo$meta2.paraSpellValue;
|
|
92
|
+
if (!psAssetType || !psAssetValue) {
|
|
93
|
+
throw new Error('Token is not support XCM at this time');
|
|
94
|
+
}
|
|
95
|
+
const paraSpellChainMap = await (0, _paraspellChainMap.fetchParaSpellChainMap)();
|
|
96
|
+
const bodyData = {
|
|
97
|
+
address: recipient,
|
|
98
|
+
from: paraSpellChainMap[originChain.slug],
|
|
99
|
+
to: paraSpellChainMap[destinationChain.slug],
|
|
100
|
+
currency: createParaSpellCurrency(psAssetType, psAssetValue, sendingValue)
|
|
101
|
+
};
|
|
102
|
+
const response = await fetch(paraSpellApi.buildXcm, {
|
|
103
|
+
method: 'POST',
|
|
104
|
+
body: JSON.stringify(bodyData),
|
|
105
|
+
headers: {
|
|
106
|
+
'Content-Type': 'application/json',
|
|
107
|
+
Accept: 'application/json',
|
|
108
|
+
'X-API-KEY': paraSpellKey
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
if (!response.ok) {
|
|
112
|
+
const error = await response.json();
|
|
113
|
+
throw new Error(error.message);
|
|
114
|
+
}
|
|
115
|
+
const extrinsicHex = await response.text();
|
|
116
|
+
const chainApi = await substrateApi.isReady;
|
|
117
|
+
return txHexToSubmittableExtrinsic(chainApi.api, extrinsicHex);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// dry run can fail due to sender address & amount token
|
|
121
|
+
async function dryRunXcm(request) {
|
|
122
|
+
var _originTokenInfo$meta3, _originTokenInfo$meta4;
|
|
123
|
+
const {
|
|
124
|
+
destinationChain,
|
|
125
|
+
originChain,
|
|
126
|
+
originTokenInfo,
|
|
127
|
+
recipient,
|
|
128
|
+
sender,
|
|
129
|
+
sendingValue
|
|
130
|
+
} = request;
|
|
131
|
+
const paraSpellChainMap = await (0, _paraspellChainMap.fetchParaSpellChainMap)();
|
|
132
|
+
const psAssetType = (_originTokenInfo$meta3 = originTokenInfo.metadata) === null || _originTokenInfo$meta3 === void 0 ? void 0 : _originTokenInfo$meta3.paraSpellAssetType;
|
|
133
|
+
const psAssetValue = (_originTokenInfo$meta4 = originTokenInfo.metadata) === null || _originTokenInfo$meta4 === void 0 ? void 0 : _originTokenInfo$meta4.paraSpellValue;
|
|
134
|
+
if (!psAssetType || !psAssetValue) {
|
|
135
|
+
throw new Error('Token is not support XCM at this time'); // todo: content
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
let dryRunInfo;
|
|
139
|
+
try {
|
|
140
|
+
const bodyData = {
|
|
141
|
+
senderAddress: sender,
|
|
142
|
+
address: recipient,
|
|
143
|
+
from: paraSpellChainMap[originChain.slug],
|
|
144
|
+
to: paraSpellChainMap[destinationChain.slug],
|
|
145
|
+
currency: createParaSpellCurrency(psAssetType, psAssetValue, sendingValue)
|
|
146
|
+
};
|
|
147
|
+
const response = await fetch(paraSpellApi.dryRunXcm, {
|
|
148
|
+
method: 'POST',
|
|
149
|
+
body: JSON.stringify(bodyData),
|
|
150
|
+
headers: {
|
|
151
|
+
'Content-Type': 'application/json',
|
|
152
|
+
Accept: 'application/json',
|
|
153
|
+
'X-API-KEY': paraSpellKey
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
dryRunInfo = await response.json();
|
|
157
|
+
} catch (e) {
|
|
158
|
+
console.error('Unable to dry run', e);
|
|
159
|
+
}
|
|
160
|
+
if (!dryRunInfo || !dryRunInfo.success) {
|
|
161
|
+
throw new _TransactionError.TransactionError(_types.BasicTxErrorType.UNABLE_TO_SEND, 'Unable to perform transaction. Select another token or destination chain and try again');
|
|
162
|
+
}
|
|
163
|
+
return dryRunInfo;
|
|
164
|
+
}
|
|
165
|
+
async function dryRunXcmV2(request) {
|
|
166
|
+
var _originTokenInfo$meta5, _originTokenInfo$meta6;
|
|
167
|
+
const {
|
|
168
|
+
destinationChain,
|
|
169
|
+
originChain,
|
|
170
|
+
originTokenInfo,
|
|
171
|
+
recipient,
|
|
172
|
+
sender,
|
|
173
|
+
sendingValue
|
|
174
|
+
} = request;
|
|
175
|
+
const paraSpellChainMap = await (0, _paraspellChainMap.fetchParaSpellChainMap)();
|
|
176
|
+
const psAssetType = (_originTokenInfo$meta5 = originTokenInfo.metadata) === null || _originTokenInfo$meta5 === void 0 ? void 0 : _originTokenInfo$meta5.paraSpellAssetType;
|
|
177
|
+
const psAssetValue = (_originTokenInfo$meta6 = originTokenInfo.metadata) === null || _originTokenInfo$meta6 === void 0 ? void 0 : _originTokenInfo$meta6.paraSpellValue;
|
|
178
|
+
if (!psAssetType || !psAssetValue) {
|
|
179
|
+
throw new Error('Token is not support XCM at this time');
|
|
180
|
+
}
|
|
181
|
+
const bodyData = {
|
|
182
|
+
senderAddress: sender,
|
|
183
|
+
address: recipient,
|
|
184
|
+
from: paraSpellChainMap[originChain.slug],
|
|
185
|
+
to: paraSpellChainMap[destinationChain.slug],
|
|
186
|
+
currency: createParaSpellCurrency(psAssetType, psAssetValue, sendingValue)
|
|
187
|
+
};
|
|
188
|
+
const response = await fetch(paraSpellApi.dryRunXcm, {
|
|
189
|
+
method: 'POST',
|
|
190
|
+
body: JSON.stringify(bodyData),
|
|
191
|
+
headers: {
|
|
192
|
+
'Content-Type': 'application/json',
|
|
193
|
+
Accept: 'application/json',
|
|
194
|
+
'X-API-KEY': paraSpellKey
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
if (!response.ok) {
|
|
198
|
+
const error = await response.json();
|
|
199
|
+
throw new Error(error.message);
|
|
200
|
+
}
|
|
201
|
+
return await response.json();
|
|
202
|
+
}
|
|
203
|
+
function createParaSpellCurrency(assetType, assetValue, amount) {
|
|
204
|
+
// todo: handle complex conditions for asset has same symbol in a chain: Id, Multi-location, ...
|
|
205
|
+
return {
|
|
206
|
+
[assetType]: assetValue,
|
|
207
|
+
amount
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function isChainNotSupportPolkadotApi(str) {
|
|
211
|
+
const regex = /(?=.*not yet supported)(?=.*Polkadot API).*/i; // Example: The node Interlay is not yet supported by the Polkadot API.
|
|
212
|
+
|
|
213
|
+
return regex.test(str);
|
|
214
|
+
}
|
|
215
|
+
function isChainNotSupportDryRun(str) {
|
|
216
|
+
const regex = /(?=.*DryRunApi)(?=.*not available).*/i; // Example: DryRunApi is not available on node Acala
|
|
217
|
+
|
|
218
|
+
return regex.test(str);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// todo: remove
|
|
11
222
|
const STABLE_XCM_VERSION = 3;
|
|
223
|
+
|
|
224
|
+
// todo: remove
|
|
12
225
|
exports.STABLE_XCM_VERSION = STABLE_XCM_VERSION;
|
|
13
226
|
function isUseTeleportProtocol(originChainInfo, destChainInfo, tokenSlug) {
|
|
14
227
|
const relayChainToSystemChain = ['polkadot'].includes(originChainInfo.slug) && ['statemint'].includes(destChainInfo.slug) || ['kusama'].includes(originChainInfo.slug) && ['statemine'].includes(destChainInfo.slug) || ['rococo'].includes(originChainInfo.slug) && ['rococo_assethub'].includes(destChainInfo.slug) || ['westend'].includes(originChainInfo.slug) && ['westend_assethub'].includes(destChainInfo.slug);
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports._ZK_ASSET_PREFIX = exports._XCM_TYPE = exports._XCM_CHAIN_GROUP = exports._TRANSFER_NOT_SUPPORTED_CHAINS = exports._TRANSFER_CHAIN_GROUP = exports._SUBSTRATE_DEFAULT_INFLATION_PARAMS = exports._STAKING_ERA_LENGTH_MAP = exports._PURE_EVM_CHAINS = exports._PREDEFINED_SINGLE_MODES = exports._PARACHAIN_INFLATION_DISTRIBUTION = exports._NFT_CHAIN_GROUP = exports._MULTI_CHAIN_ASSET_SRC = exports._MANTA_ZK_CHAIN_GROUP = exports._KNOWN_CHAIN_INFLATION_PARAMS = exports._EXPECTED_BLOCK_TIME = exports._DEFAULT_MANTA_ZK_CHAIN = exports._DEFAULT_ACTIVE_CHAINS = exports._CHAIN_LOGO_MAP_SRC = exports._CHAIN_INFO_SRC = exports._CHAIN_ASSET_SRC = exports._BALANCE_TOKEN_GROUP = exports._BALANCE_PARSING_CHAIN_GROUP = exports._BALANCE_CHAIN_GROUP = exports._ASSET_REF_SRC = exports._ASSET_LOGO_MAP_SRC = exports._API_OPTIONS_CHAIN_GROUP = exports.
|
|
6
|
+
exports._ZK_ASSET_PREFIX = exports._XCM_TYPE = exports._XCM_CHAIN_GROUP = exports._TRANSFER_NOT_SUPPORTED_CHAINS = exports._TRANSFER_CHAIN_GROUP = exports._SUBSTRATE_DEFAULT_INFLATION_PARAMS = exports._STAKING_ERA_LENGTH_MAP = exports._PURE_EVM_CHAINS = exports._PREDEFINED_SINGLE_MODES = exports._PARACHAIN_INFLATION_DISTRIBUTION = exports._NFT_CHAIN_GROUP = exports._MULTI_CHAIN_ASSET_SRC = exports._MANTA_ZK_CHAIN_GROUP = exports._KNOWN_CHAIN_INFLATION_PARAMS = exports._EXPECTED_BLOCK_TIME = exports._DEFAULT_MANTA_ZK_CHAIN = exports._DEFAULT_ACTIVE_CHAINS = exports._CHAIN_LOGO_MAP_SRC = exports._CHAIN_INFO_SRC = exports._CHAIN_ASSET_SRC = exports._BALANCE_TOKEN_GROUP = exports._BALANCE_PARSING_CHAIN_GROUP = exports._BALANCE_CHAIN_GROUP = exports._ASSET_REF_SRC = exports._ASSET_LOGO_MAP_SRC = exports._API_OPTIONS_CHAIN_GROUP = exports.LATEST_CHAIN_DATA_FETCHING_INTERVAL = exports.EVM_REFORMAT_DECIMALS = exports.EVM_PASS_CONNECT_STATUS = exports.API_MAX_RETRY = exports.API_CONNECT_TIMEOUT = exports.API_AUTO_CONNECT_MS = void 0;
|
|
7
7
|
var _chainList = require("@subwallet/chain-list");
|
|
8
8
|
var _types = require("@subwallet/chain-list/types");
|
|
9
9
|
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
@@ -40,7 +40,7 @@ const _BALANCE_CHAIN_GROUP = {
|
|
|
40
40
|
kintsugi: ['kintsugi', 'interlay', 'kintsugi_test', 'mangatax_para'],
|
|
41
41
|
genshiro: ['genshiro_testnet', 'genshiro'],
|
|
42
42
|
equilibrium_parachain: ['equilibrium_parachain'],
|
|
43
|
-
bifrost: ['bifrost', 'acala', 'karura', 'acala_testnet', 'pioneer', 'bitcountry', 'bifrost_dot', 'hydradx_main', 'hydradx_rococo', 'pendulum', 'amplitude', 'continuum_network'],
|
|
43
|
+
bifrost: ['bifrost', 'acala', 'karura', 'acala_testnet', 'pioneer', 'bitcountry', 'bifrost_dot', 'hydradx_main', 'hydradx_rococo', 'pendulum', 'amplitude', 'continuum_network', 'truth_network'],
|
|
44
44
|
statemine: ['statemine', 'astar', 'shiden', 'statemint', 'moonbeam', 'moonbase', 'moonriver', 'crabParachain', 'darwinia2', 'parallel', 'calamari', 'manta_network', 'rococo_assethub', 'liberlandTest', 'liberland', 'dentnet', 'pangolin', 'crust', 'phala', 'shibuya', 'dbcchain', 'westend_assethub'],
|
|
45
45
|
kusama: ['kusama', 'kintsugi', 'kintsugi_test', 'interlay', 'acala', 'statemint', 'karura', 'bifrost'],
|
|
46
46
|
// perhaps there are some runtime updates
|
|
@@ -300,8 +300,6 @@ const _XCM_CHAIN_GROUP = {
|
|
|
300
300
|
// default is xTokens pallet
|
|
301
301
|
};
|
|
302
302
|
exports._XCM_CHAIN_GROUP = _XCM_CHAIN_GROUP;
|
|
303
|
-
const SUFFICIENT_CHAIN = ['astar', 'calamari', 'parallel', 'darwinia2', 'crabParachain', 'pangolin', 'statemint', 'moonriver', 'shiden', 'moonbeam', 'statemine', 'liberland', 'dentnet', 'phala', 'crust', 'dbcchain', 'rococo_assethub'];
|
|
304
|
-
exports.SUFFICIENT_CHAIN = SUFFICIENT_CHAIN;
|
|
305
303
|
const _XCM_TYPE = {
|
|
306
304
|
RP: `${_types._SubstrateChainType.RELAYCHAIN}-${_types._SubstrateChainType.PARACHAIN}`,
|
|
307
305
|
// DMP
|
|
@@ -64,6 +64,7 @@ class ChainService {
|
|
|
64
64
|
chainLogoMapSubject = new _rxjs.BehaviorSubject(_chainList.ChainLogoMap);
|
|
65
65
|
ledgerGenericAllowChainsSubject = new _rxjs.BehaviorSubject([]);
|
|
66
66
|
priorityTokensSubject = new _rxjs.BehaviorSubject({});
|
|
67
|
+
sufficientChainsSubject = new _rxjs.BehaviorSubject({});
|
|
67
68
|
|
|
68
69
|
// Todo: Update to new store indexed DB
|
|
69
70
|
store = new _AssetSetting.default();
|
|
@@ -89,24 +90,32 @@ class ChainService {
|
|
|
89
90
|
get value() {
|
|
90
91
|
const ledgerGenericAllowChains = this.ledgerGenericAllowChainsSubject;
|
|
91
92
|
const priorityTokens = this.priorityTokensSubject;
|
|
93
|
+
const sufficientChains = this.sufficientChainsSubject;
|
|
92
94
|
return {
|
|
93
95
|
get ledgerGenericAllowChains() {
|
|
94
96
|
return ledgerGenericAllowChains.value;
|
|
95
97
|
},
|
|
96
98
|
get priorityTokens() {
|
|
97
99
|
return priorityTokens.value;
|
|
100
|
+
},
|
|
101
|
+
get sufficientChains() {
|
|
102
|
+
return sufficientChains.value;
|
|
98
103
|
}
|
|
99
104
|
};
|
|
100
105
|
}
|
|
101
106
|
get observable() {
|
|
102
107
|
const ledgerGenericAllowChains = this.ledgerGenericAllowChainsSubject;
|
|
103
108
|
const priorityTokens = this.priorityTokensSubject;
|
|
109
|
+
const sufficientChains = this.sufficientChainsSubject;
|
|
104
110
|
return {
|
|
105
111
|
get ledgerGenericAllowChains() {
|
|
106
112
|
return ledgerGenericAllowChains.asObservable();
|
|
107
113
|
},
|
|
108
114
|
get priorityTokens() {
|
|
109
115
|
return priorityTokens.asObservable();
|
|
116
|
+
},
|
|
117
|
+
get sufficientChains() {
|
|
118
|
+
return sufficientChains.asObservable();
|
|
110
119
|
}
|
|
111
120
|
};
|
|
112
121
|
}
|
|
@@ -550,7 +559,7 @@ class ChainService {
|
|
|
550
559
|
this.initAssetRefMap();
|
|
551
560
|
this.xcmRefMapSubject.next(this.xcmRefMap);
|
|
552
561
|
await this.initApis();
|
|
553
|
-
|
|
562
|
+
this.initAssetSettings();
|
|
554
563
|
await this.autoEnableTokens();
|
|
555
564
|
}
|
|
556
565
|
initAssetRefMap() {
|
|
@@ -629,14 +638,47 @@ class ChainService {
|
|
|
629
638
|
}
|
|
630
639
|
}
|
|
631
640
|
}
|
|
641
|
+
async enablePopularTokens() {
|
|
642
|
+
const assetSettings = this.assetSettingSubject.value;
|
|
643
|
+
const chainStateMap = this.getChainStateMap();
|
|
644
|
+
const priorityTokensMap = this.priorityTokensSubject.value || {};
|
|
645
|
+
const priorityTokensList = priorityTokensMap.token && typeof priorityTokensMap.token === 'object' ? Object.keys(priorityTokensMap.token) : [];
|
|
646
|
+
for (const assetSlug of priorityTokensList) {
|
|
647
|
+
const assetState = assetSettings[assetSlug];
|
|
648
|
+
const assetInfo = this.getAssetBySlug(assetSlug);
|
|
649
|
+
const chainState = chainStateMap[assetInfo.originChain];
|
|
650
|
+
if (!assetState) {
|
|
651
|
+
// If this asset not has asset setting, this token is not enabled before (not turned off before)
|
|
652
|
+
if (!chainState || !chainState.manualTurnOff) {
|
|
653
|
+
await this.updateAssetSetting(assetSlug, {
|
|
654
|
+
visible: true
|
|
655
|
+
}, true);
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
}
|
|
632
660
|
handleLatestLedgerGenericAllowChains(latestledgerGenericAllowChains) {
|
|
633
661
|
this.ledgerGenericAllowChainsSubject.next(latestledgerGenericAllowChains);
|
|
634
662
|
this.eventService.emit('ledger.ready', true);
|
|
635
663
|
this.logger.log('Finished updating latest ledger generic allow chains');
|
|
636
664
|
}
|
|
637
665
|
handleLatestPriorityTokens(latestPriorityTokens) {
|
|
666
|
+
const currentTokens = this.priorityTokensSubject.value || {};
|
|
638
667
|
this.priorityTokensSubject.next(latestPriorityTokens);
|
|
639
668
|
this.logger.log('Finished updating latest popular tokens');
|
|
669
|
+
const currentTokenKeys = Object.keys(currentTokens.token || {}); // Extract keys from current tokens
|
|
670
|
+
const newTokenKeys = Object.keys(latestPriorityTokens.token || {}); // Extract keys from new tokens
|
|
671
|
+
|
|
672
|
+
if (JSON.stringify(currentTokenKeys) !== JSON.stringify(newTokenKeys)) {
|
|
673
|
+
// Check if token keys have changed
|
|
674
|
+
this.enablePopularTokens().then(() => this.logger.log('Popular tokens enabled due to priority tokens change')) // Log success after enabling tokens
|
|
675
|
+
.catch(e => console.error('Error enabling popular tokens:', e)); // Log error if enabling fails
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
handleLatestSufficientChains(latestSufficientChains) {
|
|
680
|
+
this.sufficientChainsSubject.next(latestSufficientChains);
|
|
681
|
+
this.logger.log('Finished updating latest supported sufficient chains');
|
|
640
682
|
}
|
|
641
683
|
handleLatestData() {
|
|
642
684
|
this.fetchLatestChainData().then(latestChainInfo => {
|
|
@@ -658,6 +700,9 @@ class ChainService {
|
|
|
658
700
|
this.fetchLatestPriorityTokens().then(latestPriorityTokens => {
|
|
659
701
|
this.handleLatestPriorityTokens(latestPriorityTokens);
|
|
660
702
|
}).catch(console.error);
|
|
703
|
+
this.fetchLatestSufficientChains().then(latestSufficientChains => {
|
|
704
|
+
this.handleLatestSufficientChains(latestSufficientChains);
|
|
705
|
+
}).catch(console.error);
|
|
661
706
|
}
|
|
662
707
|
async initApis() {
|
|
663
708
|
const chainInfoMap = this.getChainInfoMap();
|
|
@@ -940,6 +985,9 @@ class ChainService {
|
|
|
940
985
|
token: {}
|
|
941
986
|
};
|
|
942
987
|
}
|
|
988
|
+
async fetchLatestSufficientChains() {
|
|
989
|
+
return (await (0, _utils2.fetchStaticData)('chains/supported-sufficient-chains')) || [];
|
|
990
|
+
}
|
|
943
991
|
async initChains() {
|
|
944
992
|
const storedChainSettings = await this.dbService.getAllChainStore();
|
|
945
993
|
const defaultChainInfoMap = filterChainInfoMap(_chainList.ChainInfoMap, ignoredList);
|
|
@@ -1646,22 +1694,7 @@ class ChainService {
|
|
|
1646
1694
|
await Promise.all([this.substrateChainHandler.wakeUp(), this.evmChainHandler.wakeUp(), this.tonChainHandler.wakeUp(), this.cardanoChainHandler.wakeUp()]);
|
|
1647
1695
|
this.checkLatestData();
|
|
1648
1696
|
}
|
|
1649
|
-
|
|
1650
|
-
const assetSettings = await this.getAssetSettings();
|
|
1651
|
-
const activeChainSlugs = this.getActiveChainSlugs();
|
|
1652
|
-
const assetRegistry = this.getAssetRegistry();
|
|
1653
|
-
Object.values(assetRegistry).forEach(assetInfo => {
|
|
1654
|
-
const isSettingExisted = (assetInfo.slug in assetSettings);
|
|
1655
|
-
|
|
1656
|
-
// Set visible for every enabled chains
|
|
1657
|
-
if (activeChainSlugs.includes(assetInfo.originChain) && !isSettingExisted) {
|
|
1658
|
-
// Setting only exist when set either by chain settings or user
|
|
1659
|
-
assetSettings[assetInfo.slug] = {
|
|
1660
|
-
visible: true
|
|
1661
|
-
};
|
|
1662
|
-
}
|
|
1663
|
-
});
|
|
1664
|
-
this.setAssetSettings(assetSettings, false);
|
|
1697
|
+
initAssetSettings() {
|
|
1665
1698
|
this.eventService.emit('asset.ready', true);
|
|
1666
1699
|
}
|
|
1667
1700
|
setAssetSettings(assetSettings) {
|
|
@@ -1750,6 +1783,27 @@ class ChainService {
|
|
|
1750
1783
|
});
|
|
1751
1784
|
this.setAssetSettings(assetSettings);
|
|
1752
1785
|
}
|
|
1786
|
+
async updatePriorityAssetsByChain(chainSlug, visible) {
|
|
1787
|
+
const currentAssetSettings = await this.getAssetSettings();
|
|
1788
|
+
const assetsByChain = this.getFungibleTokensByChain(chainSlug);
|
|
1789
|
+
const priorityTokensMap = this.priorityTokensSubject.value || {};
|
|
1790
|
+
const priorityTokensList = priorityTokensMap.token && typeof priorityTokensMap.token === 'object' ? Object.keys(priorityTokensMap.token) : [];
|
|
1791
|
+
for (const asset of Object.values(assetsByChain)) {
|
|
1792
|
+
if (visible) {
|
|
1793
|
+
const isPriorityToken = priorityTokensList.includes(asset.slug);
|
|
1794
|
+
if (isPriorityToken || (0, _utils._isNativeToken)(asset)) {
|
|
1795
|
+
currentAssetSettings[asset.slug] = {
|
|
1796
|
+
visible: true
|
|
1797
|
+
};
|
|
1798
|
+
}
|
|
1799
|
+
} else {
|
|
1800
|
+
currentAssetSettings[asset.slug] = {
|
|
1801
|
+
visible: false
|
|
1802
|
+
};
|
|
1803
|
+
}
|
|
1804
|
+
}
|
|
1805
|
+
this.setAssetSettings(currentAssetSettings);
|
|
1806
|
+
}
|
|
1753
1807
|
subscribeAssetSettings() {
|
|
1754
1808
|
return this.assetSettingSubject;
|
|
1755
1809
|
}
|
|
@@ -11,7 +11,7 @@ const PRODUCTION_BRANCHES = ['master', 'webapp', 'webapp-dev'];
|
|
|
11
11
|
const branchName = process.env.BRANCH_NAME || 'subwallet-dev';
|
|
12
12
|
const fetchDomain = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'https://chain-list-assets.subwallet.app' : 'https://dev.sw-chain-list-assets.pages.dev';
|
|
13
13
|
const fetchFile = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'list.json' : 'preview.json';
|
|
14
|
-
const ChainListVersion = '0.2.
|
|
14
|
+
const ChainListVersion = '0.2.103'; // update this when build chainlist
|
|
15
15
|
|
|
16
16
|
// todo: move this interface to chainlist
|
|
17
17
|
|
|
@@ -256,11 +256,11 @@ class BasePoolHandler {
|
|
|
256
256
|
/** Validate param to join the pool */
|
|
257
257
|
|
|
258
258
|
/** Create `transaction` to leave the pool */
|
|
259
|
-
async handleYieldLeave(fastLeave, amount, address, selectedTarget, netuid) {
|
|
259
|
+
async handleYieldLeave(fastLeave, amount, address, selectedTarget, netuid, slippage) {
|
|
260
260
|
if (fastLeave) {
|
|
261
261
|
return this.handleYieldRedeem(amount, address, selectedTarget);
|
|
262
262
|
} else {
|
|
263
|
-
return this.handleYieldUnstake(amount, address, selectedTarget, netuid);
|
|
263
|
+
return this.handleYieldUnstake(amount, address, selectedTarget, netuid, slippage);
|
|
264
264
|
}
|
|
265
265
|
}
|
|
266
266
|
|
|
@@ -275,7 +275,10 @@ class BasePoolHandler {
|
|
|
275
275
|
return this.slug === slug;
|
|
276
276
|
}
|
|
277
277
|
getEarningSlippage(params) {
|
|
278
|
-
return Promise.resolve(
|
|
278
|
+
return Promise.resolve({
|
|
279
|
+
slippage: 0,
|
|
280
|
+
rate: 1
|
|
281
|
+
});
|
|
279
282
|
}
|
|
280
283
|
/* Other actions */
|
|
281
284
|
}
|
|
@@ -110,7 +110,10 @@ class BaseNativeStakingPoolHandler extends _base.default {
|
|
|
110
110
|
address,
|
|
111
111
|
slug,
|
|
112
112
|
selectedValidators,
|
|
113
|
-
|
|
113
|
+
subnetData: {
|
|
114
|
+
netuid: netuid || 0,
|
|
115
|
+
slippage: 0
|
|
116
|
+
}
|
|
114
117
|
};
|
|
115
118
|
const positionInfo = await this.getPoolPosition(address);
|
|
116
119
|
const [, fee] = await this.createJoinExtrinsic(data, positionInfo);
|