@subwallet/extension-base 1.2.14-0 → 1.2.16-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 +6 -1
- package/cjs/core/substrate/nominationpools-pallet.js +2 -1
- package/cjs/koni/api/nft/config.js +9 -5
- package/cjs/koni/api/nft/index.js +9 -1
- package/cjs/koni/api/nft/unique_network_nft/index.js +12 -20
- package/cjs/koni/background/handlers/Extension.js +45 -7
- package/cjs/koni/background/handlers/State.js +11 -1
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/helpers/subscribe/index.js +1 -1
- package/cjs/services/balance-service/helpers/subscribe/substrate/gear.js +135 -0
- package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +9 -62
- package/cjs/services/balance-service/transfer/token.js +4 -3
- package/cjs/services/chain-service/constants.js +1 -0
- package/cjs/services/chain-service/handler/SubstrateApi.js +3 -1
- package/cjs/services/chain-service/handler/SubstrateChainHandler.js +21 -26
- package/cjs/services/chain-service/health-check/constants/index.js +4 -4
- package/cjs/services/chain-service/health-check/utils/asset-info.js +23 -6
- package/cjs/services/chain-service/health-check/utils/chain-info.js +25 -2
- package/cjs/services/chain-service/health-check/utils/new-utils/asset-asset-validate.js +160 -0
- package/cjs/services/chain-service/health-check/utils/new-utils/asset-validate.js +45 -0
- package/cjs/services/chain-service/health-check/utils/new-utils/chain-asset-validate.js +73 -0
- package/cjs/services/chain-service/health-check/utils/new-utils/chain-validate.js +34 -0
- package/cjs/services/chain-service/index.js +77 -3
- package/cjs/services/chain-service/types.js +1 -1
- package/cjs/services/chain-service/utils/index.js +18 -12
- package/cjs/services/earning-service/handlers/liquid-staking/acala.js +49 -19
- package/cjs/services/earning-service/service.js +3 -0
- package/cjs/services/migration-service/scripts/databases/ClearMetadataDatabase.js +16 -0
- package/cjs/services/migration-service/scripts/index.js +7 -7
- package/cjs/services/price-service/coingecko.js +57 -32
- package/cjs/services/price-service/index.js +30 -11
- package/cjs/services/transaction-service/index.js +12 -7
- package/cjs/utils/gear/combine.js +28 -0
- package/cjs/utils/gear/grc20.js +56 -49
- package/cjs/utils/gear/index.js +22 -0
- package/cjs/utils/gear/vft.js +173 -0
- package/cjs/utils/metadata.js +45 -34
- package/core/substrate/nominationpools-pallet.js +2 -1
- package/koni/api/nft/config.d.ts +1 -0
- package/koni/api/nft/config.js +3 -1
- package/koni/api/nft/index.js +9 -1
- package/koni/api/nft/unique_network_nft/index.js +12 -20
- package/koni/background/handlers/Extension.d.ts +2 -0
- package/koni/background/handlers/Extension.js +37 -1
- package/koni/background/handlers/State.d.ts +2 -0
- package/koni/background/handlers/State.js +11 -1
- package/package.json +44 -8
- package/packageInfo.js +1 -1
- package/services/balance-service/helpers/subscribe/index.js +1 -1
- package/services/balance-service/helpers/subscribe/substrate/gear.d.ts +4 -0
- package/services/balance-service/helpers/subscribe/substrate/gear.js +123 -0
- package/services/balance-service/helpers/subscribe/substrate/index.js +10 -61
- package/services/balance-service/transfer/token.js +5 -4
- package/services/chain-service/constants.d.ts +1 -0
- package/services/chain-service/constants.js +1 -0
- package/services/chain-service/handler/SubstrateApi.d.ts +1 -1
- package/services/chain-service/handler/SubstrateApi.js +3 -1
- package/services/chain-service/handler/SubstrateChainHandler.d.ts +1 -0
- package/services/chain-service/handler/SubstrateChainHandler.js +22 -27
- package/services/chain-service/health-check/constants/index.js +4 -4
- package/services/chain-service/health-check/utils/asset-info.d.ts +1 -0
- package/services/chain-service/health-check/utils/asset-info.js +20 -4
- package/services/chain-service/health-check/utils/chain-info.d.ts +4 -2
- package/services/chain-service/health-check/utils/chain-info.js +20 -0
- package/services/chain-service/health-check/utils/new-utils/asset-asset-validate.d.ts +10 -0
- package/services/chain-service/health-check/utils/new-utils/asset-asset-validate.js +146 -0
- package/services/chain-service/health-check/utils/new-utils/asset-validate.d.ts +3 -0
- package/services/chain-service/health-check/utils/new-utils/asset-validate.js +38 -0
- package/services/chain-service/health-check/utils/new-utils/chain-asset-validate.d.ts +5 -0
- package/services/chain-service/health-check/utils/new-utils/chain-asset-validate.js +64 -0
- package/services/chain-service/health-check/utils/new-utils/chain-validate.d.ts +4 -0
- package/services/chain-service/health-check/utils/new-utils/chain-validate.js +26 -0
- package/services/chain-service/index.d.ts +4 -0
- package/services/chain-service/index.js +78 -4
- package/services/chain-service/types.d.ts +6 -0
- package/services/chain-service/types.js +1 -1
- package/services/chain-service/utils/index.d.ts +1 -0
- package/services/chain-service/utils/index.js +16 -12
- package/services/earning-service/handlers/liquid-staking/acala.js +46 -17
- package/services/earning-service/service.js +3 -0
- package/services/migration-service/scripts/databases/ClearMetadataDatabase.js +16 -0
- package/services/migration-service/scripts/index.js +7 -7
- package/services/price-service/coingecko.js +54 -32
- package/services/price-service/index.js +29 -11
- package/services/transaction-service/index.js +13 -8
- package/types/metadata.d.ts +9 -2
- package/utils/gear/combine.d.ts +10 -0
- package/utils/gear/combine.js +18 -0
- package/utils/gear/grc20.d.ts +18 -20
- package/utils/gear/grc20.js +53 -45
- package/utils/gear/index.d.ts +2 -0
- package/utils/gear/index.js +3 -1
- package/utils/gear/vft.d.ts +36 -0
- package/utils/gear/vft.js +162 -0
- package/utils/metadata.d.ts +7 -2
- package/utils/metadata.js +41 -31
|
@@ -11,7 +11,6 @@ var _AbstractChainHandler = require("@subwallet/extension-base/services/chain-se
|
|
|
11
11
|
var _SubstrateApi2 = require("@subwallet/extension-base/services/chain-service/handler/SubstrateApi");
|
|
12
12
|
var _utils2 = require("@subwallet/extension-base/utils");
|
|
13
13
|
var _apiContract = require("@polkadot/api-contract");
|
|
14
|
-
var _typesKnown = require("@polkadot/types-known");
|
|
15
14
|
var _util = require("@polkadot/util");
|
|
16
15
|
var _logger = require("@polkadot/util/logger");
|
|
17
16
|
var _utils3 = require("../../../koni/api/contract-handler/utils");
|
|
@@ -144,12 +143,26 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
|
|
|
144
143
|
}
|
|
145
144
|
async getGrc20TokenInfo(apiPromise, contractAddress) {
|
|
146
145
|
if (!(apiPromise instanceof _api.GearApi)) {
|
|
147
|
-
console.warn('Cannot subscribe
|
|
146
|
+
console.warn('Cannot subscribe GRC20 balance without GearApi instance');
|
|
148
147
|
return ['', -1, '', true];
|
|
149
148
|
}
|
|
150
149
|
let contractError = false;
|
|
151
150
|
const tokenContract = (0, _utils2.getGRC20ContractPromise)(apiPromise, contractAddress);
|
|
152
|
-
const [nameRes, symbolRes, decimalsRes] = await Promise.all([tokenContract.name(_utils2.
|
|
151
|
+
const [nameRes, symbolRes, decimalsRes] = await Promise.all([tokenContract.service.name(_utils2.GEAR_DEFAULT_ADDRESS), tokenContract.service.symbol(_utils2.GEAR_DEFAULT_ADDRESS), tokenContract.service.decimals(_utils2.GEAR_DEFAULT_ADDRESS)]);
|
|
152
|
+
const decimals = typeof decimalsRes === 'string' ? parseInt(decimalsRes) : decimalsRes;
|
|
153
|
+
if (!nameRes || !symbolRes) {
|
|
154
|
+
contractError = true;
|
|
155
|
+
}
|
|
156
|
+
return [nameRes, decimals, symbolRes, contractError];
|
|
157
|
+
}
|
|
158
|
+
async getVftTokenInfo(apiPromise, contractAddress) {
|
|
159
|
+
if (!(apiPromise instanceof _api.GearApi)) {
|
|
160
|
+
console.warn('Cannot subscribe VFT balance without GearApi instance');
|
|
161
|
+
return ['', -1, '', true];
|
|
162
|
+
}
|
|
163
|
+
let contractError = false;
|
|
164
|
+
const tokenContract = (0, _utils2.getVFTContractPromise)(apiPromise, contractAddress);
|
|
165
|
+
const [nameRes, symbolRes, decimalsRes] = await Promise.all([tokenContract.service.name(_utils2.GEAR_DEFAULT_ADDRESS), tokenContract.service.symbol(_utils2.GEAR_DEFAULT_ADDRESS), tokenContract.service.decimals(_utils2.GEAR_DEFAULT_ADDRESS)]);
|
|
153
166
|
const decimals = typeof decimalsRes === 'string' ? parseInt(decimalsRes) : decimalsRes;
|
|
154
167
|
if (!nameRes || !symbolRes) {
|
|
155
168
|
contractError = true;
|
|
@@ -175,6 +188,9 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
|
|
|
175
188
|
case _types._AssetType.GRC20:
|
|
176
189
|
[name, decimals, symbol, contractError] = await this.getGrc20TokenInfo(apiPromise, contractAddress);
|
|
177
190
|
break;
|
|
191
|
+
case _types._AssetType.VFT:
|
|
192
|
+
[name, decimals, symbol, contractError] = await this.getVftTokenInfo(apiPromise, contractAddress);
|
|
193
|
+
break;
|
|
178
194
|
}
|
|
179
195
|
return {
|
|
180
196
|
name,
|
|
@@ -207,31 +223,9 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
|
|
|
207
223
|
providerName
|
|
208
224
|
} = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
209
225
|
const existed = this.substrateApiMap[chainSlug];
|
|
210
|
-
const metadata = await ((_this$parent2 = this.parent) === null || _this$parent2 === void 0 ? void 0 : _this$parent2.getMetadata(chainSlug));
|
|
211
226
|
const updateMetadata = substrateApi => {
|
|
212
227
|
// Update metadata to database with async methods
|
|
213
|
-
|
|
214
|
-
var _this$parent3;
|
|
215
|
-
const currentSpecVersion = api.runtimeVersion.specVersion.toString();
|
|
216
|
-
const genesisHash = api.genesisHash.toHex();
|
|
217
|
-
|
|
218
|
-
// Avoid date existed metadata
|
|
219
|
-
if (metadata && metadata.specVersion === currentSpecVersion && metadata.genesisHash === genesisHash) {
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
const systemChain = await api.rpc.system.chain();
|
|
223
|
-
// const _metadata: Option<OpaqueMetadata> = await api.call.metadata.metadataAtVersion(15);
|
|
224
|
-
// const metadataHex = _metadata.isSome ? _metadata.unwrap().toHex().slice(2) : ''; // Need unwrap to create metadata object
|
|
225
|
-
|
|
226
|
-
(_this$parent3 = this.parent) === null || _this$parent3 === void 0 ? void 0 : _this$parent3.upsertMetadata(chainSlug, {
|
|
227
|
-
chain: chainSlug,
|
|
228
|
-
genesisHash: genesisHash,
|
|
229
|
-
specVersion: currentSpecVersion,
|
|
230
|
-
hexValue: api.runtimeMetadata.toHex(),
|
|
231
|
-
types: (0, _typesKnown.getSpecTypes)(api.registry, systemChain, api.runtimeVersion.specName, api.runtimeVersion.specVersion),
|
|
232
|
-
userExtensions: (0, _typesKnown.getSpecExtensions)(api.registry, systemChain, api.runtimeVersion.specName)
|
|
233
|
-
}).catch(console.error);
|
|
234
|
-
}).catch(console.error);
|
|
228
|
+
(0, _utils2.cacheMetadata)(chainSlug, substrateApi, this.parent);
|
|
235
229
|
};
|
|
236
230
|
|
|
237
231
|
// Return existed to avoid re-init metadata
|
|
@@ -245,6 +239,7 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
|
|
|
245
239
|
updateMetadata(existed);
|
|
246
240
|
return existed;
|
|
247
241
|
}
|
|
242
|
+
const metadata = await ((_this$parent2 = this.parent) === null || _this$parent2 === void 0 ? void 0 : _this$parent2.getMetadata(chainSlug));
|
|
248
243
|
const apiObject = new _SubstrateApi2.SubstrateApi(chainSlug, apiUrl, {
|
|
249
244
|
providerName,
|
|
250
245
|
metadata,
|
|
@@ -11,11 +11,11 @@ var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
|
11
11
|
|
|
12
12
|
const chainProvider = {
|
|
13
13
|
default: 0,
|
|
14
|
-
ethereum:
|
|
14
|
+
ethereum: 0,
|
|
15
15
|
polygon: 2,
|
|
16
|
-
shidenEvm:
|
|
17
|
-
shiden:
|
|
18
|
-
ajunaPolkadot:
|
|
16
|
+
shidenEvm: 1,
|
|
17
|
+
shiden: 1,
|
|
18
|
+
ajunaPolkadot: 0,
|
|
19
19
|
crabParachain: 1,
|
|
20
20
|
astarEvm: 1,
|
|
21
21
|
shibuya: 1,
|
|
@@ -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.getSubstrateNativeInfo = exports.getPsp22AssetInfo = exports.getLocalAssetInfo = exports.getEvmNativeInfo = exports.getErc20AssetInfo = exports.compareAsset = void 0;
|
|
7
|
+
exports.validateAsset = exports.getSubstrateNativeInfo = exports.getPsp22AssetInfo = exports.getLocalAssetInfo = exports.getEvmNativeInfo = exports.getErc20AssetInfo = exports.compareAsset = void 0;
|
|
8
8
|
var _web = require("@subwallet/extension-base/koni/api/contract-handler/evm/web3");
|
|
9
9
|
var _utils = require("@subwallet/extension-base/koni/api/contract-handler/utils");
|
|
10
10
|
var _utils2 = require("@subwallet/extension-base/koni/api/contract-handler/wasm/utils");
|
|
@@ -116,13 +116,12 @@ const getByAssetManagerWithAssetIdPallet = async (asset, api) => {
|
|
|
116
116
|
};
|
|
117
117
|
};
|
|
118
118
|
const getByAssetRegistryWithAssetIdPallet = async (asset, api) => {
|
|
119
|
-
const [_info
|
|
119
|
+
const [_info] = await api.queryMulti([[api.query.assetRegistry.assets, (0, _utils3._getTokenOnChainAssetId)(asset)]]);
|
|
120
120
|
const info = _info.toPrimitive();
|
|
121
|
-
const metadata = _metadata.toPrimitive();
|
|
122
121
|
return {
|
|
123
|
-
decimals:
|
|
122
|
+
decimals: info.decimals,
|
|
124
123
|
minAmount: info.existentialDeposit.toString(),
|
|
125
|
-
symbol:
|
|
124
|
+
symbol: info.symbol
|
|
126
125
|
};
|
|
127
126
|
};
|
|
128
127
|
const getLocalAssetInfo = async (chain, asset, api) => {
|
|
@@ -277,4 +276,22 @@ const compareAsset = (assetInfo, asset, errors) => {
|
|
|
277
276
|
errors.push(`Wrong decimals: current - ${(_asset$decimals = asset.decimals) !== null && _asset$decimals !== void 0 ? _asset$decimals : 'null'}, onChain - ${decimals}`);
|
|
278
277
|
}
|
|
279
278
|
};
|
|
280
|
-
exports.compareAsset = compareAsset;
|
|
279
|
+
exports.compareAsset = compareAsset;
|
|
280
|
+
const validateAsset = (onchainAsset, chainlistAsset) => {
|
|
281
|
+
const {
|
|
282
|
+
decimals,
|
|
283
|
+
minAmount,
|
|
284
|
+
symbol
|
|
285
|
+
} = onchainAsset;
|
|
286
|
+
const chainlistMinAmount = chainlistAsset.minAmount || '0';
|
|
287
|
+
const chainlistDecimals = chainlistAsset.decimals || 0;
|
|
288
|
+
const chainlistSymbol = chainlistAsset.symbol;
|
|
289
|
+
console.log(`[i] minAmount: current - ${chainlistMinAmount}, onchain - ${minAmount}`);
|
|
290
|
+
console.log(`[i] decimals: current - ${chainlistDecimals}, onchain - ${decimals}`);
|
|
291
|
+
console.log(`[i] symbol: current - ${chainlistSymbol}, onchain - ${symbol}`);
|
|
292
|
+
const isValidSymbol = symbol === chainlistSymbol ? true : 'zk' + symbol === chainlistSymbol;
|
|
293
|
+
const isValidMinAmount = minAmount === chainlistMinAmount;
|
|
294
|
+
const isValidDecimal = decimals === chainlistDecimals;
|
|
295
|
+
return isValidSymbol && isValidMinAmount && isValidDecimal;
|
|
296
|
+
};
|
|
297
|
+
exports.validateAsset = validateAsset;
|
|
@@ -4,12 +4,13 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.compareNativeAsset = void 0;
|
|
7
|
+
exports.compareNativeAsset = exports.checkSs58Prefix = exports.checkParachainId = exports.checkNativeAsset = void 0;
|
|
8
8
|
var _constants = require("@subwallet/extension-base/services/chain-service/health-check/constants");
|
|
9
9
|
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
10
10
|
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
11
11
|
// SPDX-License-Identifier: Apache-2.0
|
|
12
12
|
|
|
13
|
+
// function for old health-check chain
|
|
13
14
|
const compareNativeAsset = (assetInfo, nativeAsset, errors) => {
|
|
14
15
|
const {
|
|
15
16
|
decimals: _decimals,
|
|
@@ -33,4 +34,26 @@ const compareNativeAsset = (assetInfo, nativeAsset, errors) => {
|
|
|
33
34
|
errors.push(`Wrong decimals: current - ${_decimals}, onChain - ${decimals}`);
|
|
34
35
|
}
|
|
35
36
|
};
|
|
36
|
-
exports.compareNativeAsset = compareNativeAsset;
|
|
37
|
+
exports.compareNativeAsset = compareNativeAsset;
|
|
38
|
+
const checkNativeAsset = (assetInfo, nativeAsset) => {
|
|
39
|
+
const {
|
|
40
|
+
decimals: _decimals,
|
|
41
|
+
existentialDeposit: _minAmount,
|
|
42
|
+
symbol: _symbol
|
|
43
|
+
} = nativeAsset;
|
|
44
|
+
const {
|
|
45
|
+
decimals,
|
|
46
|
+
minAmount,
|
|
47
|
+
symbol
|
|
48
|
+
} = assetInfo;
|
|
49
|
+
return minAmount === _minAmount && symbol === _symbol && decimals === _decimals;
|
|
50
|
+
};
|
|
51
|
+
exports.checkNativeAsset = checkNativeAsset;
|
|
52
|
+
const checkSs58Prefix = (onchainPrefix, chainlistPrefix) => {
|
|
53
|
+
return onchainPrefix === chainlistPrefix;
|
|
54
|
+
};
|
|
55
|
+
exports.checkSs58Prefix = checkSs58Prefix;
|
|
56
|
+
const checkParachainId = (onchainPrefix, chainlistPrefix) => {
|
|
57
|
+
return onchainPrefix === chainlistPrefix;
|
|
58
|
+
};
|
|
59
|
+
exports.checkParachainId = checkParachainId;
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.checkMultichainAssetValid = checkMultichainAssetValid;
|
|
7
|
+
exports.checkSwapAssetRef = checkSwapAssetRef;
|
|
8
|
+
exports.checkValidSupportStaking = checkValidSupportStaking;
|
|
9
|
+
exports.validateAssetGroupPrice = validateAssetGroupPrice;
|
|
10
|
+
exports.validateAssetsGroupPrice = validateAssetsGroupPrice;
|
|
11
|
+
exports.validateNativeLocalTransferMetadata = validateNativeLocalTransferMetadata;
|
|
12
|
+
exports.validateNotDuplicateSmartcontract = validateNotDuplicateSmartcontract;
|
|
13
|
+
exports.validateSwapAlterAsset = validateSwapAlterAsset;
|
|
14
|
+
exports.validateXcmMetadata = validateXcmMetadata;
|
|
15
|
+
var _chainList = require("@subwallet/chain-list");
|
|
16
|
+
var _constants = require("@subwallet/extension-base/services/chain-service/constants");
|
|
17
|
+
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
18
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
19
|
+
|
|
20
|
+
// Check priceId valid in group asset
|
|
21
|
+
|
|
22
|
+
function validateAssetGroupPrice(multiChainAsset, chainAsset) {
|
|
23
|
+
if (chainAsset.multiChainAsset !== multiChainAsset.slug) {
|
|
24
|
+
throw new Error(`Asset ${chainAsset.slug} are not in ${multiChainAsset.slug} group asset`);
|
|
25
|
+
}
|
|
26
|
+
return multiChainAsset.priceId === chainAsset.priceId;
|
|
27
|
+
}
|
|
28
|
+
function validateAssetsGroupPrice(chainAsset1, chainAsset2) {
|
|
29
|
+
if (chainAsset1.multiChainAsset !== chainAsset2.multiChainAsset) {
|
|
30
|
+
throw new Error(`Asset ${chainAsset1.slug} and asset ${chainAsset2.slug} are not in a group asset`);
|
|
31
|
+
}
|
|
32
|
+
return chainAsset1.priceId === chainAsset2.priceId;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Check priceId valid in group asset
|
|
36
|
+
|
|
37
|
+
// Check multichainAsset valid
|
|
38
|
+
|
|
39
|
+
function checkMultichainAssetValid(chainAsset) {
|
|
40
|
+
if (!chainAsset.multiChainAsset) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return Object.keys(_chainList.MultiChainAssetMap).includes(chainAsset.multiChainAsset);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Check multichainAsset valid
|
|
47
|
+
|
|
48
|
+
// Check slug asset ref
|
|
49
|
+
|
|
50
|
+
function checkSwapAssetRef(slug, assetRef) {
|
|
51
|
+
return slug === `${assetRef.srcAsset}___${assetRef.destAsset}`;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Check slug asset ref
|
|
55
|
+
|
|
56
|
+
// Check duplicate smartcontract
|
|
57
|
+
|
|
58
|
+
function validateNotDuplicateSmartcontract(chainAsset) {
|
|
59
|
+
if (!['ERC20', 'ERC721', 'PSP22', 'PSP34', 'GRC20', 'GRC721'].includes(chainAsset.assetType)) {
|
|
60
|
+
throw new Error(`${chainAsset.slug} is not smart contract asset`);
|
|
61
|
+
}
|
|
62
|
+
const slug = chainAsset.slug;
|
|
63
|
+
const isDuplicate = Object.entries(_chainList.ChainAssetMap).some(_ref => {
|
|
64
|
+
var _chainAsset$metadata, _tokenInfo$metadata;
|
|
65
|
+
let [key, tokenInfo] = _ref;
|
|
66
|
+
return slug !== key && (chainAsset === null || chainAsset === void 0 ? void 0 : (_chainAsset$metadata = chainAsset.metadata) === null || _chainAsset$metadata === void 0 ? void 0 : _chainAsset$metadata.contractAddress) === (tokenInfo === null || tokenInfo === void 0 ? void 0 : (_tokenInfo$metadata = tokenInfo.metadata) === null || _tokenInfo$metadata === void 0 ? void 0 : _tokenInfo$metadata.contractAddress);
|
|
67
|
+
});
|
|
68
|
+
return !isDuplicate;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Check duplicate smartcontract
|
|
72
|
+
|
|
73
|
+
// ---------------------
|
|
74
|
+
|
|
75
|
+
// TRANSFER
|
|
76
|
+
|
|
77
|
+
function validateNativeLocalTransferMetadata(chainAsset) {
|
|
78
|
+
if (!chainAsset.metadata) {
|
|
79
|
+
// recheck this
|
|
80
|
+
throw new Error(`Asset ${chainAsset.slug} is lack of metadata`);
|
|
81
|
+
}
|
|
82
|
+
const moonbeamGroup = ['moonbeam, moonbase, moonriver'];
|
|
83
|
+
const onChainInfoLocalGroup = [_constants._TRANSFER_CHAIN_GROUP.centrifuge, ..._constants._TRANSFER_CHAIN_GROUP.bitcountry, ..._constants._TRANSFER_CHAIN_GROUP.acala, ..._constants._TRANSFER_CHAIN_GROUP.kintsugi, 'pendulum', 'amplitude'];
|
|
84
|
+
const onChainInfoNativeGroup = [_constants._TRANSFER_CHAIN_GROUP.centrifuge, ..._constants._TRANSFER_CHAIN_GROUP.acala, ..._constants._TRANSFER_CHAIN_GROUP.kintsugi];
|
|
85
|
+
const assetIdLocalGroup = [..._constants._TRANSFER_CHAIN_GROUP.statemine, ..._constants._TRANSFER_CHAIN_GROUP.genshiro, ...moonbeamGroup, 'hydradx'];
|
|
86
|
+
const assetIdNativeGroup = [..._constants._TRANSFER_CHAIN_GROUP.sora_substrate, 'hydradx'];
|
|
87
|
+
const chain = chainAsset.originChain;
|
|
88
|
+
const isLocal = chainAsset.assetType === 'LOCAL';
|
|
89
|
+
const isNative = chainAsset.assetType === 'NATIVE';
|
|
90
|
+
if (isLocal && onChainInfoLocalGroup.includes(chain)) {
|
|
91
|
+
return !!chainAsset.metadata.onChainInfo;
|
|
92
|
+
}
|
|
93
|
+
if (isNative && onChainInfoNativeGroup.includes(chain)) {
|
|
94
|
+
return !!chainAsset.metadata.onChainInfo;
|
|
95
|
+
}
|
|
96
|
+
if (isLocal && assetIdLocalGroup.includes(chain)) {
|
|
97
|
+
return !!chainAsset.metadata.assetId;
|
|
98
|
+
}
|
|
99
|
+
if (isNative && assetIdNativeGroup.includes(chain)) {
|
|
100
|
+
return !!chainAsset.metadata.assetId;
|
|
101
|
+
}
|
|
102
|
+
throw new Error(`${chainAsset.slug} is not local or native asset`);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// TRANSFER
|
|
106
|
+
|
|
107
|
+
// SWAP
|
|
108
|
+
|
|
109
|
+
function validateSwapAlterAsset(assetRef) {
|
|
110
|
+
var _assetRef$metadata;
|
|
111
|
+
if (assetRef.path !== 'SWAP') {
|
|
112
|
+
throw new Error(`${assetRef.srcAsset}___${assetRef.destAsset} is not SWAP`);
|
|
113
|
+
}
|
|
114
|
+
const srcAsset = assetRef.srcAsset;
|
|
115
|
+
const alterAsset = (_assetRef$metadata = assetRef.metadata) === null || _assetRef$metadata === void 0 ? void 0 : _assetRef$metadata.alternativeAsset;
|
|
116
|
+
if (!alterAsset) {
|
|
117
|
+
throw new Error(`${assetRef.srcAsset}___${assetRef.destAsset} does not has alternativeAsset`);
|
|
118
|
+
}
|
|
119
|
+
if (!_chainList.ChainAssetMap[srcAsset] || !_chainList.ChainAssetMap[alterAsset]) {
|
|
120
|
+
throw new Error(`${srcAsset} or ${alterAsset} do not exist`);
|
|
121
|
+
}
|
|
122
|
+
return _chainList.ChainAssetMap[srcAsset].multiChainAsset === _chainList.ChainAssetMap[alterAsset].multiChainAsset;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// SWAP
|
|
126
|
+
|
|
127
|
+
// XCM
|
|
128
|
+
|
|
129
|
+
function validateXcmMetadata(assetRef) {
|
|
130
|
+
var _ChainAssetMap$srcAss, _ChainAssetMap$destAs;
|
|
131
|
+
if (assetRef.path !== 'XCM') {
|
|
132
|
+
throw new Error(`${assetRef.srcAsset}___${assetRef.destAsset} is not XCM`);
|
|
133
|
+
}
|
|
134
|
+
const srcAsset = assetRef.srcAsset;
|
|
135
|
+
const destAsset = assetRef.destAsset;
|
|
136
|
+
if (!_chainList.ChainAssetMap[srcAsset] || !_chainList.ChainAssetMap[destAsset]) {
|
|
137
|
+
throw new Error(`${srcAsset} or ${destAsset} do not exist`);
|
|
138
|
+
}
|
|
139
|
+
return ((_ChainAssetMap$srcAss = _chainList.ChainAssetMap[srcAsset].metadata) === null || _ChainAssetMap$srcAss === void 0 ? void 0 : _ChainAssetMap$srcAss.multilocation) && ((_ChainAssetMap$destAs = _chainList.ChainAssetMap[destAsset].metadata) === null || _ChainAssetMap$destAs === void 0 ? void 0 : _ChainAssetMap$destAs.multilocation) || false;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// XCM
|
|
143
|
+
|
|
144
|
+
// EARNING
|
|
145
|
+
|
|
146
|
+
// @ts-ignore
|
|
147
|
+
function checkValidSupportStaking(chainInfo) {
|
|
148
|
+
if (!chainInfo.substrateInfo) {
|
|
149
|
+
throw new Error(`chain ${chainInfo.slug} is not substrate chain`);
|
|
150
|
+
}
|
|
151
|
+
if (!chainInfo.substrateInfo.supportStaking) {
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// todo: check has related pallet staking
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// todo: check alternativeAsset
|
|
159
|
+
|
|
160
|
+
// EARNING
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.validateAssetSlug = validateAssetSlug;
|
|
7
|
+
exports.validateBrigeToken = validateBrigeToken;
|
|
8
|
+
var _types = require("@subwallet/chain-list/types");
|
|
9
|
+
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
10
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
11
|
+
|
|
12
|
+
function validateAssetSlug(chainAsset) {
|
|
13
|
+
const slug = chainAsset.slug;
|
|
14
|
+
const originChain = chainAsset.originChain;
|
|
15
|
+
const assetType = chainAsset.assetType;
|
|
16
|
+
const symbol = chainAsset.symbol;
|
|
17
|
+
if ([_types._AssetType.LOCAL, _types._AssetType.NATIVE, _types._AssetType.BRC20].includes(assetType)) {
|
|
18
|
+
return slug === `${originChain}-${assetType}-${symbol}`;
|
|
19
|
+
}
|
|
20
|
+
if ([_types._AssetType.RUNE].includes(assetType)) {
|
|
21
|
+
var _chainAsset$metadata;
|
|
22
|
+
const runeId = (_chainAsset$metadata = chainAsset.metadata) === null || _chainAsset$metadata === void 0 ? void 0 : _chainAsset$metadata.runeId;
|
|
23
|
+
if (!runeId) {
|
|
24
|
+
throw new Error(`${slug} is ${assetType} but lack of runeId metadata`);
|
|
25
|
+
}
|
|
26
|
+
return slug === `${originChain}-${assetType}-${symbol}-${runeId}`;
|
|
27
|
+
}
|
|
28
|
+
if ([_types._AssetType.ERC20, _types._AssetType.ERC721, _types._AssetType.PSP22, _types._AssetType.PSP34, _types._AssetType.GRC20, _types._AssetType.GRC721].includes(assetType)) {
|
|
29
|
+
var _chainAsset$metadata2;
|
|
30
|
+
const contractAddress = (_chainAsset$metadata2 = chainAsset.metadata) === null || _chainAsset$metadata2 === void 0 ? void 0 : _chainAsset$metadata2.contractAddress;
|
|
31
|
+
if (!contractAddress) {
|
|
32
|
+
throw new Error(`${slug} is ${assetType} but lack of contractAddress metadata`);
|
|
33
|
+
}
|
|
34
|
+
return slug === `${originChain}-${assetType}-${symbol}-${contractAddress}`;
|
|
35
|
+
}
|
|
36
|
+
throw new Error(`${slug} has unknown token type ${assetType}`);
|
|
37
|
+
}
|
|
38
|
+
function validateBrigeToken(chainAsset) {
|
|
39
|
+
var _chainAsset$metadata3, _chainAsset$metadata4;
|
|
40
|
+
const isBridged = (_chainAsset$metadata3 = chainAsset.metadata) === null || _chainAsset$metadata3 === void 0 ? void 0 : _chainAsset$metadata3.isBridged;
|
|
41
|
+
if (!isBridged) {
|
|
42
|
+
throw new Error(`${chainAsset.slug} is not bridged token`);
|
|
43
|
+
}
|
|
44
|
+
return !!((_chainAsset$metadata4 = chainAsset.metadata) !== null && _chainAsset$metadata4 !== void 0 && _chainAsset$metadata4.onChainInfo);
|
|
45
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.validateAssetTypeSupportByChain = validateAssetTypeSupportByChain;
|
|
7
|
+
exports.validateChainDisableEvmTransfer = validateChainDisableEvmTransfer;
|
|
8
|
+
exports.validateNativeInfoByChain = validateNativeInfoByChain;
|
|
9
|
+
exports.validateTokenHasValueByChain = validateTokenHasValueByChain;
|
|
10
|
+
var _chainList = require("@subwallet/chain-list");
|
|
11
|
+
var _types = require("@subwallet/chain-list/types");
|
|
12
|
+
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
13
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
14
|
+
|
|
15
|
+
function validateTokenHasValueByChain(chainAsset) {
|
|
16
|
+
const chainInfo = _chainList.ChainInfoMap[chainAsset.originChain];
|
|
17
|
+
const isTestnet = chainInfo && chainInfo.isTestnet;
|
|
18
|
+
if (!chainInfo) {
|
|
19
|
+
throw new Error(`${chainAsset.originChain} is not existed`);
|
|
20
|
+
}
|
|
21
|
+
return isTestnet !== chainAsset.hasValue; // todo: also check multichainAsset hasValue if has.
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function validateNativeInfoByChain(chainAsset) {
|
|
25
|
+
var _chainInfo$evmInfo, _chainInfo$substrateI, _chainInfo$bitcoinInf, _chainInfo$evmInfo2, _chainInfo$substrateI2, _chainInfo$bitcoinInf2, _chainInfo$evmInfo3, _chainInfo$substrateI3, _chainInfo$bitcoinInf3;
|
|
26
|
+
const chainInfo = _chainList.ChainInfoMap[chainAsset.originChain];
|
|
27
|
+
if (!chainInfo) {
|
|
28
|
+
throw new Error(`${chainAsset.originChain} is not existed`);
|
|
29
|
+
}
|
|
30
|
+
const nativeSymbol = chainInfo !== null && chainInfo !== void 0 && chainInfo.evmInfo ? chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$evmInfo = chainInfo.evmInfo) === null || _chainInfo$evmInfo === void 0 ? void 0 : _chainInfo$evmInfo.symbol : chainInfo !== null && chainInfo !== void 0 && chainInfo.substrateInfo ? chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$substrateI = chainInfo.substrateInfo) === null || _chainInfo$substrateI === void 0 ? void 0 : _chainInfo$substrateI.symbol : chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$bitcoinInf = chainInfo.bitcoinInfo) === null || _chainInfo$bitcoinInf === void 0 ? void 0 : _chainInfo$bitcoinInf.symbol;
|
|
31
|
+
const nativeDecimal = chainInfo !== null && chainInfo !== void 0 && chainInfo.evmInfo ? chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$evmInfo2 = chainInfo.evmInfo) === null || _chainInfo$evmInfo2 === void 0 ? void 0 : _chainInfo$evmInfo2.decimals : chainInfo !== null && chainInfo !== void 0 && chainInfo.substrateInfo ? chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$substrateI2 = chainInfo.substrateInfo) === null || _chainInfo$substrateI2 === void 0 ? void 0 : _chainInfo$substrateI2.decimals : chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$bitcoinInf2 = chainInfo.bitcoinInfo) === null || _chainInfo$bitcoinInf2 === void 0 ? void 0 : _chainInfo$bitcoinInf2.decimals;
|
|
32
|
+
const nativeED = chainInfo !== null && chainInfo !== void 0 && chainInfo.evmInfo ? chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$evmInfo3 = chainInfo.evmInfo) === null || _chainInfo$evmInfo3 === void 0 ? void 0 : _chainInfo$evmInfo3.existentialDeposit : chainInfo !== null && chainInfo !== void 0 && chainInfo.substrateInfo ? chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$substrateI3 = chainInfo.substrateInfo) === null || _chainInfo$substrateI3 === void 0 ? void 0 : _chainInfo$substrateI3.existentialDeposit : chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$bitcoinInf3 = chainInfo.bitcoinInfo) === null || _chainInfo$bitcoinInf3 === void 0 ? void 0 : _chainInfo$bitcoinInf3.existentialDeposit;
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
34
|
+
const nativeTokenSlug = `${chainInfo.slug}-NATIVE-${nativeSymbol}`;
|
|
35
|
+
return nativeSymbol === chainAsset.symbol && nativeDecimal === chainAsset.decimals && nativeED === chainAsset.minAmount && nativeTokenSlug === chainAsset.slug;
|
|
36
|
+
}
|
|
37
|
+
function validateAssetTypeSupportByChain(chainAsset) {
|
|
38
|
+
const chainInfo = _chainList.ChainInfoMap[chainAsset.originChain];
|
|
39
|
+
if (!chainInfo) {
|
|
40
|
+
throw new Error(`${chainAsset.originChain} is not existed`);
|
|
41
|
+
}
|
|
42
|
+
const bitcoinSupportAssetTypes = [_types._AssetType.NATIVE, _types._AssetType.RUNE, _types._AssetType.BRC20];
|
|
43
|
+
const evmSupportAssetTypes = [_types._AssetType.NATIVE, _types._AssetType.ERC20, _types._AssetType.ERC721];
|
|
44
|
+
const substrateSupportAssetTypes = [_types._AssetType.NATIVE, _types._AssetType.LOCAL, _types._AssetType.PSP22, _types._AssetType.PSP34, _types._AssetType.GRC20, _types._AssetType.GRC721];
|
|
45
|
+
|
|
46
|
+
// recheck chain with two types.
|
|
47
|
+
if (chainInfo.substrateInfo) {
|
|
48
|
+
return substrateSupportAssetTypes.includes(chainAsset.assetType);
|
|
49
|
+
}
|
|
50
|
+
if (chainInfo.evmInfo) {
|
|
51
|
+
return evmSupportAssetTypes.includes(chainAsset.assetType);
|
|
52
|
+
}
|
|
53
|
+
if (chainInfo.bitcoinInfo) {
|
|
54
|
+
return bitcoinSupportAssetTypes.includes(chainAsset.assetType);
|
|
55
|
+
}
|
|
56
|
+
throw new Error(`${chainAsset.originChain} does not has a suitable chainInfo`);
|
|
57
|
+
}
|
|
58
|
+
function validateChainDisableEvmTransfer(chainAsset) {
|
|
59
|
+
var _chainInfo$evmInfo4;
|
|
60
|
+
const chainInfo = _chainList.ChainInfoMap[chainAsset.originChain];
|
|
61
|
+
if (!chainInfo) {
|
|
62
|
+
throw new Error(`${chainAsset.originChain} is not existed`);
|
|
63
|
+
}
|
|
64
|
+
if (!chainInfo.evmInfo) {
|
|
65
|
+
throw new Error(`${chainAsset.originChain} is not Evm chain`);
|
|
66
|
+
}
|
|
67
|
+
const isChainMatchCondition = ((_chainInfo$evmInfo4 = chainInfo.evmInfo) === null || _chainInfo$evmInfo4 === void 0 ? void 0 : _chainInfo$evmInfo4.evmChainId) === -1 && chainInfo.substrateInfo;
|
|
68
|
+
if (isChainMatchCondition) {
|
|
69
|
+
var _chainAsset$metadata;
|
|
70
|
+
return (_chainAsset$metadata = chainAsset.metadata) === null || _chainAsset$metadata === void 0 ? void 0 : _chainAsset$metadata.disableEvmTransfer;
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.checkEvmSupportSmartContract = checkEvmSupportSmartContract;
|
|
7
|
+
exports.validateChainHasProvider = validateChainHasProvider;
|
|
8
|
+
exports.validateParaId = validateParaId;
|
|
9
|
+
var _types = require("@subwallet/chain-list/types");
|
|
10
|
+
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
11
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
12
|
+
|
|
13
|
+
function validateChainHasProvider(chainInfo) {
|
|
14
|
+
const chainStatus = chainInfo.chainStatus;
|
|
15
|
+
const providers = Object.keys(chainInfo.providers);
|
|
16
|
+
const validChainLive = chainStatus === _types._ChainStatus.ACTIVE && providers.length > 0;
|
|
17
|
+
const chainNotLive = chainStatus !== _types._ChainStatus.ACTIVE;
|
|
18
|
+
return validChainLive || chainNotLive;
|
|
19
|
+
}
|
|
20
|
+
function validateParaId(chainInfo) {
|
|
21
|
+
if (!chainInfo.substrateInfo) {
|
|
22
|
+
throw new Error('Not substrate chain');
|
|
23
|
+
}
|
|
24
|
+
const paraId = chainInfo.substrateInfo.paraId;
|
|
25
|
+
const chainType = chainInfo.substrateInfo.chainType;
|
|
26
|
+
const relaySlug = chainInfo.substrateInfo.relaySlug;
|
|
27
|
+
return paraId ? chainType === _types._SubstrateChainType.PARACHAIN && !!relaySlug : chainType === _types._SubstrateChainType.RELAYCHAIN && !relaySlug;
|
|
28
|
+
}
|
|
29
|
+
function checkEvmSupportSmartContract(chainInfo) {
|
|
30
|
+
if (!chainInfo.evmInfo) {
|
|
31
|
+
throw new Error('Not Evm chain');
|
|
32
|
+
}
|
|
33
|
+
return !!chainInfo.evmInfo.supportSmartContract;
|
|
34
|
+
}
|
|
@@ -28,7 +28,7 @@ const filterChainInfoMap = (data, ignoredChains) => {
|
|
|
28
28
|
return !info.bitcoinInfo && !ignoredChains.includes(slug);
|
|
29
29
|
}));
|
|
30
30
|
};
|
|
31
|
-
const ignoredList = ['bevm', 'bevmTest', 'bevm_testnet', 'layerEdge_testnet', 'merlinEvm', 'botanixEvmTest', 'syscoin_evm', 'rollux_evm'];
|
|
31
|
+
const ignoredList = ['bevm', 'bevmTest', 'bevm_testnet', 'layerEdge_testnet', 'merlinEvm', 'botanixEvmTest', 'syscoin_evm', 'syscoin_evm_testnet', 'rollux_evm', 'rollux_testnet', 'boolAlpha', 'boolBeta_testnet', 'core', 'satoshivm', 'satoshivm_testnet'];
|
|
32
32
|
const filterAssetInfoMap = (chainInfo, assets) => {
|
|
33
33
|
return Object.fromEntries(Object.entries(assets).filter(_ref2 => {
|
|
34
34
|
let [, info] = _ref2;
|
|
@@ -254,7 +254,7 @@ class ChainService {
|
|
|
254
254
|
});
|
|
255
255
|
}
|
|
256
256
|
getSupportedSmartContractTypes() {
|
|
257
|
-
return [_types._AssetType.ERC20, _types._AssetType.ERC721, _types._AssetType.PSP22, _types._AssetType.PSP34, _types._AssetType.GRC20, _types._AssetType.GRC721];
|
|
257
|
+
return [_types._AssetType.ERC20, _types._AssetType.ERC721, _types._AssetType.PSP22, _types._AssetType.PSP34, _types._AssetType.GRC20, _types._AssetType.GRC721, _types._AssetType.VFT];
|
|
258
258
|
}
|
|
259
259
|
getActiveChainInfoMap() {
|
|
260
260
|
const result = {};
|
|
@@ -683,6 +683,34 @@ class ChainService {
|
|
|
683
683
|
}
|
|
684
684
|
const onUpdateStatus = status => {
|
|
685
685
|
const slug = chainInfo.slug;
|
|
686
|
+
const isActive = this.getChainStateByKey(slug).active;
|
|
687
|
+
const isConnectProblem = status !== _types3._ChainConnectionStatus.CONNECTING && status !== _types3._ChainConnectionStatus.CONNECTED;
|
|
688
|
+
const isLightRpc = endpoint.startsWith('light');
|
|
689
|
+
if (isActive && isConnectProblem && !isLightRpc) {
|
|
690
|
+
const reportApiUrl = 'https://api-cache.subwallet.app/api/health-check/report-rpc';
|
|
691
|
+
const requestBody = {
|
|
692
|
+
chainSlug: slug,
|
|
693
|
+
chainStatus: status,
|
|
694
|
+
rpcReport: {
|
|
695
|
+
[providerName]: endpoint
|
|
696
|
+
},
|
|
697
|
+
configStatus: {
|
|
698
|
+
countUnstable: 10,
|
|
699
|
+
countDie: 20
|
|
700
|
+
}
|
|
701
|
+
};
|
|
702
|
+
fetch(reportApiUrl, {
|
|
703
|
+
// can get status from this response
|
|
704
|
+
method: 'POST',
|
|
705
|
+
headers: {
|
|
706
|
+
'X-API-KEY': '9b1c94a5e1f3a2d9f8b2a4d6e1f3a2d9',
|
|
707
|
+
'Content-Type': 'application/json'
|
|
708
|
+
},
|
|
709
|
+
body: JSON.stringify(requestBody)
|
|
710
|
+
})
|
|
711
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
712
|
+
.then(() => {}).catch(error => console.error('Error connecting to the report API:', error));
|
|
713
|
+
}
|
|
686
714
|
this.updateChainConnectionStatus(slug, status);
|
|
687
715
|
};
|
|
688
716
|
if (chainInfo.substrateInfo !== null && chainInfo.substrateInfo !== undefined) {
|
|
@@ -692,6 +720,7 @@ class ChainService {
|
|
|
692
720
|
//
|
|
693
721
|
// this.substrateChainHandler.setSubstrateApi(chainInfo.slug, chainApi);
|
|
694
722
|
// } else {
|
|
723
|
+
|
|
695
724
|
const chainApi = await this.substrateChainHandler.initApi(chainInfo.slug, endpoint, {
|
|
696
725
|
providerName,
|
|
697
726
|
onUpdateStatus
|
|
@@ -1450,7 +1479,7 @@ class ChainService {
|
|
|
1450
1479
|
async getSmartContractTokenInfo(contractAddress, tokenType, originChain, contractCaller) {
|
|
1451
1480
|
if ([_types._AssetType.ERC721, _types._AssetType.ERC20].includes(tokenType)) {
|
|
1452
1481
|
return await this.evmChainHandler.getEvmContractTokenInfo(contractAddress, tokenType, originChain);
|
|
1453
|
-
} else if ([_types._AssetType.PSP34, _types._AssetType.PSP22, _types._AssetType.GRC20].includes(tokenType)) {
|
|
1482
|
+
} else if ([_types._AssetType.PSP34, _types._AssetType.PSP22, _types._AssetType.GRC20, _types._AssetType.VFT].includes(tokenType)) {
|
|
1454
1483
|
return await this.substrateChainHandler.getSubstrateContractTokenInfo(contractAddress, tokenType, originChain, contractCaller);
|
|
1455
1484
|
}
|
|
1456
1485
|
return {
|
|
@@ -1669,6 +1698,9 @@ class ChainService {
|
|
|
1669
1698
|
this.deleteCustomAssets(customToken);
|
|
1670
1699
|
}
|
|
1671
1700
|
}
|
|
1701
|
+
|
|
1702
|
+
/* Metadata */
|
|
1703
|
+
|
|
1672
1704
|
getMetadata(chain) {
|
|
1673
1705
|
return this.dbService.stores.metadata.getMetadata(chain);
|
|
1674
1706
|
}
|
|
@@ -1678,6 +1710,48 @@ class ChainService {
|
|
|
1678
1710
|
getMetadataByHash(hash) {
|
|
1679
1711
|
return this.dbService.stores.metadata.getMetadataByGenesisHash(hash);
|
|
1680
1712
|
}
|
|
1713
|
+
getExtraInfo(chain) {
|
|
1714
|
+
var _chainInfo$substrateI2, _chainInfo$substrateI3, _chainInfo$substrateI4, _chainInfo$substrateI5, _chainInfo$substrateI6, _chainInfo$substrateI7;
|
|
1715
|
+
const chainInfo = this.getChainInfoByKey(chain);
|
|
1716
|
+
return {
|
|
1717
|
+
decimals: (_chainInfo$substrateI2 = (_chainInfo$substrateI3 = chainInfo.substrateInfo) === null || _chainInfo$substrateI3 === void 0 ? void 0 : _chainInfo$substrateI3.decimals) !== null && _chainInfo$substrateI2 !== void 0 ? _chainInfo$substrateI2 : 0,
|
|
1718
|
+
tokenSymbol: (_chainInfo$substrateI4 = (_chainInfo$substrateI5 = chainInfo.substrateInfo) === null || _chainInfo$substrateI5 === void 0 ? void 0 : _chainInfo$substrateI5.symbol) !== null && _chainInfo$substrateI4 !== void 0 ? _chainInfo$substrateI4 : 'Unit',
|
|
1719
|
+
base58Prefix: (_chainInfo$substrateI6 = (_chainInfo$substrateI7 = chainInfo.substrateInfo) === null || _chainInfo$substrateI7 === void 0 ? void 0 : _chainInfo$substrateI7.addressPrefix) !== null && _chainInfo$substrateI6 !== void 0 ? _chainInfo$substrateI6 : 42
|
|
1720
|
+
};
|
|
1721
|
+
}
|
|
1722
|
+
async calculateMetadataHash(chain) {
|
|
1723
|
+
const metadata = await this.getMetadata(chain);
|
|
1724
|
+
if (!metadata || !metadata.hexV15) {
|
|
1725
|
+
return undefined;
|
|
1726
|
+
}
|
|
1727
|
+
const extraInfo = this.getExtraInfo(chain);
|
|
1728
|
+
const specVersion = parseInt(metadata.specVersion);
|
|
1729
|
+
const specName = metadata.specName;
|
|
1730
|
+
const hexV15 = metadata.hexV15;
|
|
1731
|
+
return (0, _utils2.calculateMetadataHash)({
|
|
1732
|
+
...extraInfo,
|
|
1733
|
+
specVersion,
|
|
1734
|
+
specName
|
|
1735
|
+
}, hexV15);
|
|
1736
|
+
}
|
|
1737
|
+
async shortenMetadata(chain, txBlob) {
|
|
1738
|
+
const metadata = await this.getMetadata(chain);
|
|
1739
|
+
if (!metadata || !metadata.hexV15) {
|
|
1740
|
+
return undefined;
|
|
1741
|
+
}
|
|
1742
|
+
const extraInfo = this.getExtraInfo(chain);
|
|
1743
|
+
const specVersion = parseInt(metadata.specVersion);
|
|
1744
|
+
const specName = metadata.specName;
|
|
1745
|
+
const hexV15 = metadata.hexV15;
|
|
1746
|
+
return (0, _utils2.getShortMetadata)(txBlob, {
|
|
1747
|
+
...extraInfo,
|
|
1748
|
+
specVersion,
|
|
1749
|
+
specName
|
|
1750
|
+
}, hexV15);
|
|
1751
|
+
}
|
|
1752
|
+
|
|
1753
|
+
/* Metadata */
|
|
1754
|
+
|
|
1681
1755
|
getSubscanChainMap(reverse) {
|
|
1682
1756
|
const result = {};
|
|
1683
1757
|
const chainInfoMap = this.getChainInfoMap();
|
|
@@ -18,7 +18,7 @@ exports._ChainConnectionStatus = _ChainConnectionStatus;
|
|
|
18
18
|
})(_ChainConnectionStatus || (exports._ChainConnectionStatus = _ChainConnectionStatus = {}));
|
|
19
19
|
const _CUSTOM_PREFIX = 'custom-';
|
|
20
20
|
exports._CUSTOM_PREFIX = _CUSTOM_PREFIX;
|
|
21
|
-
const _FUNGIBLE_CONTRACT_STANDARDS = [_types._AssetType.ERC20, _types._AssetType.PSP22, _types._AssetType.GRC20];
|
|
21
|
+
const _FUNGIBLE_CONTRACT_STANDARDS = [_types._AssetType.ERC20, _types._AssetType.PSP22, _types._AssetType.GRC20, _types._AssetType.VFT];
|
|
22
22
|
exports._FUNGIBLE_CONTRACT_STANDARDS = _FUNGIBLE_CONTRACT_STANDARDS;
|
|
23
23
|
const _NFT_CONTRACT_STANDARDS = [_types._AssetType.PSP34, _types._AssetType.ERC721];
|
|
24
24
|
exports._NFT_CONTRACT_STANDARDS = _NFT_CONTRACT_STANDARDS;
|