@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.
Files changed (96) hide show
  1. package/background/KoniTypes.d.ts +6 -1
  2. package/cjs/core/substrate/nominationpools-pallet.js +2 -1
  3. package/cjs/koni/api/nft/config.js +9 -5
  4. package/cjs/koni/api/nft/index.js +9 -1
  5. package/cjs/koni/api/nft/unique_network_nft/index.js +12 -20
  6. package/cjs/koni/background/handlers/Extension.js +45 -7
  7. package/cjs/koni/background/handlers/State.js +11 -1
  8. package/cjs/packageInfo.js +1 -1
  9. package/cjs/services/balance-service/helpers/subscribe/index.js +1 -1
  10. package/cjs/services/balance-service/helpers/subscribe/substrate/gear.js +135 -0
  11. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +9 -62
  12. package/cjs/services/balance-service/transfer/token.js +4 -3
  13. package/cjs/services/chain-service/constants.js +1 -0
  14. package/cjs/services/chain-service/handler/SubstrateApi.js +3 -1
  15. package/cjs/services/chain-service/handler/SubstrateChainHandler.js +21 -26
  16. package/cjs/services/chain-service/health-check/constants/index.js +4 -4
  17. package/cjs/services/chain-service/health-check/utils/asset-info.js +23 -6
  18. package/cjs/services/chain-service/health-check/utils/chain-info.js +25 -2
  19. package/cjs/services/chain-service/health-check/utils/new-utils/asset-asset-validate.js +160 -0
  20. package/cjs/services/chain-service/health-check/utils/new-utils/asset-validate.js +45 -0
  21. package/cjs/services/chain-service/health-check/utils/new-utils/chain-asset-validate.js +73 -0
  22. package/cjs/services/chain-service/health-check/utils/new-utils/chain-validate.js +34 -0
  23. package/cjs/services/chain-service/index.js +77 -3
  24. package/cjs/services/chain-service/types.js +1 -1
  25. package/cjs/services/chain-service/utils/index.js +18 -12
  26. package/cjs/services/earning-service/handlers/liquid-staking/acala.js +49 -19
  27. package/cjs/services/earning-service/service.js +3 -0
  28. package/cjs/services/migration-service/scripts/databases/ClearMetadataDatabase.js +16 -0
  29. package/cjs/services/migration-service/scripts/index.js +7 -7
  30. package/cjs/services/price-service/coingecko.js +57 -32
  31. package/cjs/services/price-service/index.js +30 -11
  32. package/cjs/services/transaction-service/index.js +12 -7
  33. package/cjs/utils/gear/combine.js +28 -0
  34. package/cjs/utils/gear/grc20.js +56 -49
  35. package/cjs/utils/gear/index.js +22 -0
  36. package/cjs/utils/gear/vft.js +173 -0
  37. package/cjs/utils/metadata.js +45 -34
  38. package/core/substrate/nominationpools-pallet.js +2 -1
  39. package/koni/api/nft/config.d.ts +1 -0
  40. package/koni/api/nft/config.js +3 -1
  41. package/koni/api/nft/index.js +9 -1
  42. package/koni/api/nft/unique_network_nft/index.js +12 -20
  43. package/koni/background/handlers/Extension.d.ts +2 -0
  44. package/koni/background/handlers/Extension.js +37 -1
  45. package/koni/background/handlers/State.d.ts +2 -0
  46. package/koni/background/handlers/State.js +11 -1
  47. package/package.json +44 -8
  48. package/packageInfo.js +1 -1
  49. package/services/balance-service/helpers/subscribe/index.js +1 -1
  50. package/services/balance-service/helpers/subscribe/substrate/gear.d.ts +4 -0
  51. package/services/balance-service/helpers/subscribe/substrate/gear.js +123 -0
  52. package/services/balance-service/helpers/subscribe/substrate/index.js +10 -61
  53. package/services/balance-service/transfer/token.js +5 -4
  54. package/services/chain-service/constants.d.ts +1 -0
  55. package/services/chain-service/constants.js +1 -0
  56. package/services/chain-service/handler/SubstrateApi.d.ts +1 -1
  57. package/services/chain-service/handler/SubstrateApi.js +3 -1
  58. package/services/chain-service/handler/SubstrateChainHandler.d.ts +1 -0
  59. package/services/chain-service/handler/SubstrateChainHandler.js +22 -27
  60. package/services/chain-service/health-check/constants/index.js +4 -4
  61. package/services/chain-service/health-check/utils/asset-info.d.ts +1 -0
  62. package/services/chain-service/health-check/utils/asset-info.js +20 -4
  63. package/services/chain-service/health-check/utils/chain-info.d.ts +4 -2
  64. package/services/chain-service/health-check/utils/chain-info.js +20 -0
  65. package/services/chain-service/health-check/utils/new-utils/asset-asset-validate.d.ts +10 -0
  66. package/services/chain-service/health-check/utils/new-utils/asset-asset-validate.js +146 -0
  67. package/services/chain-service/health-check/utils/new-utils/asset-validate.d.ts +3 -0
  68. package/services/chain-service/health-check/utils/new-utils/asset-validate.js +38 -0
  69. package/services/chain-service/health-check/utils/new-utils/chain-asset-validate.d.ts +5 -0
  70. package/services/chain-service/health-check/utils/new-utils/chain-asset-validate.js +64 -0
  71. package/services/chain-service/health-check/utils/new-utils/chain-validate.d.ts +4 -0
  72. package/services/chain-service/health-check/utils/new-utils/chain-validate.js +26 -0
  73. package/services/chain-service/index.d.ts +4 -0
  74. package/services/chain-service/index.js +78 -4
  75. package/services/chain-service/types.d.ts +6 -0
  76. package/services/chain-service/types.js +1 -1
  77. package/services/chain-service/utils/index.d.ts +1 -0
  78. package/services/chain-service/utils/index.js +16 -12
  79. package/services/earning-service/handlers/liquid-staking/acala.js +46 -17
  80. package/services/earning-service/service.js +3 -0
  81. package/services/migration-service/scripts/databases/ClearMetadataDatabase.js +16 -0
  82. package/services/migration-service/scripts/index.js +7 -7
  83. package/services/price-service/coingecko.js +54 -32
  84. package/services/price-service/index.js +29 -11
  85. package/services/transaction-service/index.js +13 -8
  86. package/types/metadata.d.ts +9 -2
  87. package/utils/gear/combine.d.ts +10 -0
  88. package/utils/gear/combine.js +18 -0
  89. package/utils/gear/grc20.d.ts +18 -20
  90. package/utils/gear/grc20.js +53 -45
  91. package/utils/gear/index.d.ts +2 -0
  92. package/utils/gear/index.js +3 -1
  93. package/utils/gear/vft.d.ts +36 -0
  94. package/utils/gear/vft.js +162 -0
  95. package/utils/metadata.d.ts +7 -2
  96. package/utils/metadata.js +41 -31
@@ -6,9 +6,8 @@ import { _AssetType } from '@subwallet/chain-list/types';
6
6
  import { getDefaultWeightV2 } from '@subwallet/extension-base/koni/api/contract-handler/wasm/utils';
7
7
  import { AbstractChainHandler } from '@subwallet/extension-base/services/chain-service/handler/AbstractChainHandler';
8
8
  import { SubstrateApi } from '@subwallet/extension-base/services/chain-service/handler/SubstrateApi';
9
- import { DEFAULT_GEAR_ADDRESS, getGRC20ContractPromise } from '@subwallet/extension-base/utils';
9
+ import { cacheMetadata, GEAR_DEFAULT_ADDRESS, getGRC20ContractPromise, getVFTContractPromise } from '@subwallet/extension-base/utils';
10
10
  import { ContractPromise } from '@polkadot/api-contract';
11
- import { getSpecExtensions, getSpecTypes } from '@polkadot/types-known';
12
11
  import { BN } from '@polkadot/util';
13
12
  import { logger as createLogger } from '@polkadot/util/logger';
14
13
  import { _PSP22_ABI, _PSP34_ABI } from "../../../koni/api/contract-handler/utils/index.js";
@@ -137,12 +136,26 @@ export class SubstrateChainHandler extends AbstractChainHandler {
137
136
  }
138
137
  async getGrc20TokenInfo(apiPromise, contractAddress) {
139
138
  if (!(apiPromise instanceof GearApi)) {
140
- console.warn('Cannot subscribe VFT balance without GearApi instance');
139
+ console.warn('Cannot subscribe GRC20 balance without GearApi instance');
141
140
  return ['', -1, '', true];
142
141
  }
143
142
  let contractError = false;
144
143
  const tokenContract = getGRC20ContractPromise(apiPromise, contractAddress);
145
- const [nameRes, symbolRes, decimalsRes] = await Promise.all([tokenContract.name(DEFAULT_GEAR_ADDRESS.ALICE), tokenContract.symbol(DEFAULT_GEAR_ADDRESS.ALICE), tokenContract.decimals(DEFAULT_GEAR_ADDRESS.ALICE)]);
144
+ const [nameRes, symbolRes, decimalsRes] = await Promise.all([tokenContract.service.name(GEAR_DEFAULT_ADDRESS), tokenContract.service.symbol(GEAR_DEFAULT_ADDRESS), tokenContract.service.decimals(GEAR_DEFAULT_ADDRESS)]);
145
+ const decimals = typeof decimalsRes === 'string' ? parseInt(decimalsRes) : decimalsRes;
146
+ if (!nameRes || !symbolRes) {
147
+ contractError = true;
148
+ }
149
+ return [nameRes, decimals, symbolRes, contractError];
150
+ }
151
+ async getVftTokenInfo(apiPromise, contractAddress) {
152
+ if (!(apiPromise instanceof GearApi)) {
153
+ console.warn('Cannot subscribe VFT balance without GearApi instance');
154
+ return ['', -1, '', true];
155
+ }
156
+ let contractError = false;
157
+ const tokenContract = getVFTContractPromise(apiPromise, contractAddress);
158
+ const [nameRes, symbolRes, decimalsRes] = await Promise.all([tokenContract.service.name(GEAR_DEFAULT_ADDRESS), tokenContract.service.symbol(GEAR_DEFAULT_ADDRESS), tokenContract.service.decimals(GEAR_DEFAULT_ADDRESS)]);
146
159
  const decimals = typeof decimalsRes === 'string' ? parseInt(decimalsRes) : decimalsRes;
147
160
  if (!nameRes || !symbolRes) {
148
161
  contractError = true;
@@ -168,6 +181,9 @@ export class SubstrateChainHandler extends AbstractChainHandler {
168
181
  case _AssetType.GRC20:
169
182
  [name, decimals, symbol, contractError] = await this.getGrc20TokenInfo(apiPromise, contractAddress);
170
183
  break;
184
+ case _AssetType.VFT:
185
+ [name, decimals, symbol, contractError] = await this.getVftTokenInfo(apiPromise, contractAddress);
186
+ break;
171
187
  }
172
188
  return {
173
189
  name,
@@ -199,31 +215,9 @@ export class SubstrateChainHandler extends AbstractChainHandler {
199
215
  } = {}) {
200
216
  var _this$parent2;
201
217
  const existed = this.substrateApiMap[chainSlug];
202
- const metadata = await ((_this$parent2 = this.parent) === null || _this$parent2 === void 0 ? void 0 : _this$parent2.getMetadata(chainSlug));
203
218
  const updateMetadata = substrateApi => {
204
219
  // Update metadata to database with async methods
205
- substrateApi.api.isReady.then(async api => {
206
- var _this$parent3;
207
- const currentSpecVersion = api.runtimeVersion.specVersion.toString();
208
- const genesisHash = api.genesisHash.toHex();
209
-
210
- // Avoid date existed metadata
211
- if (metadata && metadata.specVersion === currentSpecVersion && metadata.genesisHash === genesisHash) {
212
- return;
213
- }
214
- const systemChain = await api.rpc.system.chain();
215
- // const _metadata: Option<OpaqueMetadata> = await api.call.metadata.metadataAtVersion(15);
216
- // const metadataHex = _metadata.isSome ? _metadata.unwrap().toHex().slice(2) : ''; // Need unwrap to create metadata object
217
-
218
- (_this$parent3 = this.parent) === null || _this$parent3 === void 0 ? void 0 : _this$parent3.upsertMetadata(chainSlug, {
219
- chain: chainSlug,
220
- genesisHash: genesisHash,
221
- specVersion: currentSpecVersion,
222
- hexValue: api.runtimeMetadata.toHex(),
223
- types: getSpecTypes(api.registry, systemChain, api.runtimeVersion.specName, api.runtimeVersion.specVersion),
224
- userExtensions: getSpecExtensions(api.registry, systemChain, api.runtimeVersion.specName)
225
- }).catch(console.error);
226
- }).catch(console.error);
220
+ cacheMetadata(chainSlug, substrateApi, this.parent);
227
221
  };
228
222
 
229
223
  // Return existed to avoid re-init metadata
@@ -237,6 +231,7 @@ export class SubstrateChainHandler extends AbstractChainHandler {
237
231
  updateMetadata(existed);
238
232
  return existed;
239
233
  }
234
+ const metadata = await ((_this$parent2 = this.parent) === null || _this$parent2 === void 0 ? void 0 : _this$parent2.getMetadata(chainSlug));
240
235
  const apiObject = new SubstrateApi(chainSlug, apiUrl, {
241
236
  providerName,
242
237
  metadata,
@@ -4,11 +4,11 @@
4
4
  import BigN from 'bignumber.js';
5
5
  export const chainProvider = {
6
6
  default: 0,
7
- ethereum: 1,
7
+ ethereum: 0,
8
8
  polygon: 2,
9
- shidenEvm: 2,
10
- shiden: 2,
11
- ajunaPolkadot: 1,
9
+ shidenEvm: 1,
10
+ shiden: 1,
11
+ ajunaPolkadot: 0,
12
12
  crabParachain: 1,
13
13
  astarEvm: 1,
14
14
  shibuya: 1,
@@ -12,3 +12,4 @@ export declare const getPsp22AssetInfo: (asset: _ChainAsset, api: ApiPromise) =>
12
12
  export declare const getEvmNativeInfo: (api: _EvmApi) => Promise<AssetSpec>;
13
13
  export declare const getErc20AssetInfo: (asset: _ChainAsset, api: _EvmApi) => Promise<AssetSpec>;
14
14
  export declare const compareAsset: (assetInfo: AssetSpec, asset: _ChainAsset, errors: string[]) => void;
15
+ export declare const validateAsset: (onchainAsset: AssetSpec, chainlistAsset: _ChainAsset) => boolean;
@@ -109,13 +109,12 @@ const getByAssetManagerWithAssetIdPallet = async (asset, api) => {
109
109
  };
110
110
  };
111
111
  const getByAssetRegistryWithAssetIdPallet = async (asset, api) => {
112
- const [_info, _metadata] = await api.queryMulti([[api.query.assetRegistry.assets, _getTokenOnChainAssetId(asset)], [api.query.assetRegistry.assetMetadataMap, _getTokenOnChainAssetId(asset)]]);
112
+ const [_info] = await api.queryMulti([[api.query.assetRegistry.assets, _getTokenOnChainAssetId(asset)]]);
113
113
  const info = _info.toPrimitive();
114
- const metadata = _metadata.toPrimitive();
115
114
  return {
116
- decimals: metadata.decimals,
115
+ decimals: info.decimals,
117
116
  minAmount: info.existentialDeposit.toString(),
118
- symbol: metadata.symbol
117
+ symbol: info.symbol
119
118
  };
120
119
  };
121
120
  export const getLocalAssetInfo = async (chain, asset, api) => {
@@ -264,4 +263,21 @@ export const compareAsset = (assetInfo, asset, errors) => {
264
263
  var _asset$decimals;
265
264
  errors.push(`Wrong decimals: current - ${(_asset$decimals = asset.decimals) !== null && _asset$decimals !== void 0 ? _asset$decimals : 'null'}, onChain - ${decimals}`);
266
265
  }
266
+ };
267
+ export const validateAsset = (onchainAsset, chainlistAsset) => {
268
+ const {
269
+ decimals,
270
+ minAmount,
271
+ symbol
272
+ } = onchainAsset;
273
+ const chainlistMinAmount = chainlistAsset.minAmount || '0';
274
+ const chainlistDecimals = chainlistAsset.decimals || 0;
275
+ const chainlistSymbol = chainlistAsset.symbol;
276
+ console.log(`[i] minAmount: current - ${chainlistMinAmount}, onchain - ${minAmount}`);
277
+ console.log(`[i] decimals: current - ${chainlistDecimals}, onchain - ${decimals}`);
278
+ console.log(`[i] symbol: current - ${chainlistSymbol}, onchain - ${symbol}`);
279
+ const isValidSymbol = symbol === chainlistSymbol ? true : 'zk' + symbol === chainlistSymbol;
280
+ const isValidMinAmount = minAmount === chainlistMinAmount;
281
+ const isValidDecimal = decimals === chainlistDecimals;
282
+ return isValidSymbol && isValidMinAmount && isValidDecimal;
267
283
  };
@@ -1,8 +1,10 @@
1
1
  import { AssetSpec } from '@subwallet/extension-base/services/chain-service/health-check/utils/asset-info';
2
- interface NativeAssetInfo {
2
+ export interface NativeAssetInfo {
3
3
  decimals: number;
4
4
  existentialDeposit: string;
5
5
  symbol: string;
6
6
  }
7
7
  export declare const compareNativeAsset: (assetInfo: AssetSpec, nativeAsset: NativeAssetInfo, errors: string[]) => void;
8
- export {};
8
+ export declare const checkNativeAsset: (assetInfo: AssetSpec, nativeAsset: NativeAssetInfo) => boolean;
9
+ export declare const checkSs58Prefix: (onchainPrefix: number, chainlistPrefix: number) => boolean;
10
+ export declare const checkParachainId: (onchainPrefix: number | null, chainlistPrefix: number | null) => boolean;
@@ -3,6 +3,7 @@
3
3
 
4
4
  import { BIG_TEN } from '@subwallet/extension-base/services/chain-service/health-check/constants';
5
5
  import BigN from 'bignumber.js';
6
+ // function for old health-check chain
6
7
  export const compareNativeAsset = (assetInfo, nativeAsset, errors) => {
7
8
  const {
8
9
  decimals: _decimals,
@@ -25,4 +26,23 @@ export const compareNativeAsset = (assetInfo, nativeAsset, errors) => {
25
26
  if (decimals !== _decimals) {
26
27
  errors.push(`Wrong decimals: current - ${_decimals}, onChain - ${decimals}`);
27
28
  }
29
+ };
30
+ export const checkNativeAsset = (assetInfo, nativeAsset) => {
31
+ const {
32
+ decimals: _decimals,
33
+ existentialDeposit: _minAmount,
34
+ symbol: _symbol
35
+ } = nativeAsset;
36
+ const {
37
+ decimals,
38
+ minAmount,
39
+ symbol
40
+ } = assetInfo;
41
+ return minAmount === _minAmount && symbol === _symbol && decimals === _decimals;
42
+ };
43
+ export const checkSs58Prefix = (onchainPrefix, chainlistPrefix) => {
44
+ return onchainPrefix === chainlistPrefix;
45
+ };
46
+ export const checkParachainId = (onchainPrefix, chainlistPrefix) => {
47
+ return onchainPrefix === chainlistPrefix;
28
48
  };
@@ -0,0 +1,10 @@
1
+ import { _AssetRef, _ChainAsset, _ChainInfo, _MultiChainAsset } from '@subwallet/chain-list/types';
2
+ export declare function validateAssetGroupPrice(multiChainAsset: _MultiChainAsset, chainAsset: _ChainAsset): boolean;
3
+ export declare function validateAssetsGroupPrice(chainAsset1: _ChainAsset, chainAsset2: _ChainAsset): boolean;
4
+ export declare function checkMultichainAssetValid(chainAsset: _ChainAsset): boolean;
5
+ export declare function checkSwapAssetRef(slug: string, assetRef: _AssetRef): boolean;
6
+ export declare function validateNotDuplicateSmartcontract(chainAsset: _ChainAsset): boolean;
7
+ export declare function validateNativeLocalTransferMetadata(chainAsset: _ChainAsset): boolean;
8
+ export declare function validateSwapAlterAsset(assetRef: _AssetRef): boolean;
9
+ export declare function validateXcmMetadata(assetRef: _AssetRef): {};
10
+ export declare function checkValidSupportStaking(chainInfo: _ChainInfo): true | undefined;
@@ -0,0 +1,146 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { ChainAssetMap, MultiChainAssetMap } from '@subwallet/chain-list';
5
+ import { _TRANSFER_CHAIN_GROUP } from '@subwallet/extension-base/services/chain-service/constants';
6
+
7
+ // Check priceId valid in group asset
8
+
9
+ export function validateAssetGroupPrice(multiChainAsset, chainAsset) {
10
+ if (chainAsset.multiChainAsset !== multiChainAsset.slug) {
11
+ throw new Error(`Asset ${chainAsset.slug} are not in ${multiChainAsset.slug} group asset`);
12
+ }
13
+ return multiChainAsset.priceId === chainAsset.priceId;
14
+ }
15
+ export function validateAssetsGroupPrice(chainAsset1, chainAsset2) {
16
+ if (chainAsset1.multiChainAsset !== chainAsset2.multiChainAsset) {
17
+ throw new Error(`Asset ${chainAsset1.slug} and asset ${chainAsset2.slug} are not in a group asset`);
18
+ }
19
+ return chainAsset1.priceId === chainAsset2.priceId;
20
+ }
21
+
22
+ // Check priceId valid in group asset
23
+
24
+ // Check multichainAsset valid
25
+
26
+ export function checkMultichainAssetValid(chainAsset) {
27
+ if (!chainAsset.multiChainAsset) {
28
+ return true;
29
+ }
30
+ return Object.keys(MultiChainAssetMap).includes(chainAsset.multiChainAsset);
31
+ }
32
+
33
+ // Check multichainAsset valid
34
+
35
+ // Check slug asset ref
36
+
37
+ export function checkSwapAssetRef(slug, assetRef) {
38
+ return slug === `${assetRef.srcAsset}___${assetRef.destAsset}`;
39
+ }
40
+
41
+ // Check slug asset ref
42
+
43
+ // Check duplicate smartcontract
44
+
45
+ export function validateNotDuplicateSmartcontract(chainAsset) {
46
+ if (!['ERC20', 'ERC721', 'PSP22', 'PSP34', 'GRC20', 'GRC721'].includes(chainAsset.assetType)) {
47
+ throw new Error(`${chainAsset.slug} is not smart contract asset`);
48
+ }
49
+ const slug = chainAsset.slug;
50
+ const isDuplicate = Object.entries(ChainAssetMap).some(([key, tokenInfo]) => {
51
+ var _chainAsset$metadata, _tokenInfo$metadata;
52
+ 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);
53
+ });
54
+ return !isDuplicate;
55
+ }
56
+
57
+ // Check duplicate smartcontract
58
+
59
+ // ---------------------
60
+
61
+ // TRANSFER
62
+
63
+ export function validateNativeLocalTransferMetadata(chainAsset) {
64
+ if (!chainAsset.metadata) {
65
+ // recheck this
66
+ throw new Error(`Asset ${chainAsset.slug} is lack of metadata`);
67
+ }
68
+ const moonbeamGroup = ['moonbeam, moonbase, moonriver'];
69
+ const onChainInfoLocalGroup = [_TRANSFER_CHAIN_GROUP.centrifuge, ..._TRANSFER_CHAIN_GROUP.bitcountry, ..._TRANSFER_CHAIN_GROUP.acala, ..._TRANSFER_CHAIN_GROUP.kintsugi, 'pendulum', 'amplitude'];
70
+ const onChainInfoNativeGroup = [_TRANSFER_CHAIN_GROUP.centrifuge, ..._TRANSFER_CHAIN_GROUP.acala, ..._TRANSFER_CHAIN_GROUP.kintsugi];
71
+ const assetIdLocalGroup = [..._TRANSFER_CHAIN_GROUP.statemine, ..._TRANSFER_CHAIN_GROUP.genshiro, ...moonbeamGroup, 'hydradx'];
72
+ const assetIdNativeGroup = [..._TRANSFER_CHAIN_GROUP.sora_substrate, 'hydradx'];
73
+ const chain = chainAsset.originChain;
74
+ const isLocal = chainAsset.assetType === 'LOCAL';
75
+ const isNative = chainAsset.assetType === 'NATIVE';
76
+ if (isLocal && onChainInfoLocalGroup.includes(chain)) {
77
+ return !!chainAsset.metadata.onChainInfo;
78
+ }
79
+ if (isNative && onChainInfoNativeGroup.includes(chain)) {
80
+ return !!chainAsset.metadata.onChainInfo;
81
+ }
82
+ if (isLocal && assetIdLocalGroup.includes(chain)) {
83
+ return !!chainAsset.metadata.assetId;
84
+ }
85
+ if (isNative && assetIdNativeGroup.includes(chain)) {
86
+ return !!chainAsset.metadata.assetId;
87
+ }
88
+ throw new Error(`${chainAsset.slug} is not local or native asset`);
89
+ }
90
+
91
+ // TRANSFER
92
+
93
+ // SWAP
94
+
95
+ export function validateSwapAlterAsset(assetRef) {
96
+ var _assetRef$metadata;
97
+ if (assetRef.path !== 'SWAP') {
98
+ throw new Error(`${assetRef.srcAsset}___${assetRef.destAsset} is not SWAP`);
99
+ }
100
+ const srcAsset = assetRef.srcAsset;
101
+ const alterAsset = (_assetRef$metadata = assetRef.metadata) === null || _assetRef$metadata === void 0 ? void 0 : _assetRef$metadata.alternativeAsset;
102
+ if (!alterAsset) {
103
+ throw new Error(`${assetRef.srcAsset}___${assetRef.destAsset} does not has alternativeAsset`);
104
+ }
105
+ if (!ChainAssetMap[srcAsset] || !ChainAssetMap[alterAsset]) {
106
+ throw new Error(`${srcAsset} or ${alterAsset} do not exist`);
107
+ }
108
+ return ChainAssetMap[srcAsset].multiChainAsset === ChainAssetMap[alterAsset].multiChainAsset;
109
+ }
110
+
111
+ // SWAP
112
+
113
+ // XCM
114
+
115
+ export function validateXcmMetadata(assetRef) {
116
+ var _ChainAssetMap$srcAss, _ChainAssetMap$destAs;
117
+ if (assetRef.path !== 'XCM') {
118
+ throw new Error(`${assetRef.srcAsset}___${assetRef.destAsset} is not XCM`);
119
+ }
120
+ const srcAsset = assetRef.srcAsset;
121
+ const destAsset = assetRef.destAsset;
122
+ if (!ChainAssetMap[srcAsset] || !ChainAssetMap[destAsset]) {
123
+ throw new Error(`${srcAsset} or ${destAsset} do not exist`);
124
+ }
125
+ return ((_ChainAssetMap$srcAss = ChainAssetMap[srcAsset].metadata) === null || _ChainAssetMap$srcAss === void 0 ? void 0 : _ChainAssetMap$srcAss.multilocation) && ((_ChainAssetMap$destAs = ChainAssetMap[destAsset].metadata) === null || _ChainAssetMap$destAs === void 0 ? void 0 : _ChainAssetMap$destAs.multilocation) || false;
126
+ }
127
+
128
+ // XCM
129
+
130
+ // EARNING
131
+
132
+ // @ts-ignore
133
+ export function checkValidSupportStaking(chainInfo) {
134
+ if (!chainInfo.substrateInfo) {
135
+ throw new Error(`chain ${chainInfo.slug} is not substrate chain`);
136
+ }
137
+ if (!chainInfo.substrateInfo.supportStaking) {
138
+ return true;
139
+ }
140
+
141
+ // todo: check has related pallet staking
142
+ }
143
+
144
+ // todo: check alternativeAsset
145
+
146
+ // EARNING
@@ -0,0 +1,3 @@
1
+ import { _ChainAsset } from '@subwallet/chain-list/types';
2
+ export declare function validateAssetSlug(chainAsset: _ChainAsset): boolean;
3
+ export declare function validateBrigeToken(chainAsset: _ChainAsset): boolean;
@@ -0,0 +1,38 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { _AssetType } from '@subwallet/chain-list/types';
5
+ export function validateAssetSlug(chainAsset) {
6
+ const slug = chainAsset.slug;
7
+ const originChain = chainAsset.originChain;
8
+ const assetType = chainAsset.assetType;
9
+ const symbol = chainAsset.symbol;
10
+ if ([_AssetType.LOCAL, _AssetType.NATIVE, _AssetType.BRC20].includes(assetType)) {
11
+ return slug === `${originChain}-${assetType}-${symbol}`;
12
+ }
13
+ if ([_AssetType.RUNE].includes(assetType)) {
14
+ var _chainAsset$metadata;
15
+ const runeId = (_chainAsset$metadata = chainAsset.metadata) === null || _chainAsset$metadata === void 0 ? void 0 : _chainAsset$metadata.runeId;
16
+ if (!runeId) {
17
+ throw new Error(`${slug} is ${assetType} but lack of runeId metadata`);
18
+ }
19
+ return slug === `${originChain}-${assetType}-${symbol}-${runeId}`;
20
+ }
21
+ if ([_AssetType.ERC20, _AssetType.ERC721, _AssetType.PSP22, _AssetType.PSP34, _AssetType.GRC20, _AssetType.GRC721].includes(assetType)) {
22
+ var _chainAsset$metadata2;
23
+ const contractAddress = (_chainAsset$metadata2 = chainAsset.metadata) === null || _chainAsset$metadata2 === void 0 ? void 0 : _chainAsset$metadata2.contractAddress;
24
+ if (!contractAddress) {
25
+ throw new Error(`${slug} is ${assetType} but lack of contractAddress metadata`);
26
+ }
27
+ return slug === `${originChain}-${assetType}-${symbol}-${contractAddress}`;
28
+ }
29
+ throw new Error(`${slug} has unknown token type ${assetType}`);
30
+ }
31
+ export function validateBrigeToken(chainAsset) {
32
+ var _chainAsset$metadata3, _chainAsset$metadata4;
33
+ const isBridged = (_chainAsset$metadata3 = chainAsset.metadata) === null || _chainAsset$metadata3 === void 0 ? void 0 : _chainAsset$metadata3.isBridged;
34
+ if (!isBridged) {
35
+ throw new Error(`${chainAsset.slug} is not bridged token`);
36
+ }
37
+ return !!((_chainAsset$metadata4 = chainAsset.metadata) !== null && _chainAsset$metadata4 !== void 0 && _chainAsset$metadata4.onChainInfo);
38
+ }
@@ -0,0 +1,5 @@
1
+ import { _ChainAsset } from '@subwallet/chain-list/types';
2
+ export declare function validateTokenHasValueByChain(chainAsset: _ChainAsset): boolean;
3
+ export declare function validateNativeInfoByChain(chainAsset: _ChainAsset): boolean;
4
+ export declare function validateAssetTypeSupportByChain(chainAsset: _ChainAsset): boolean;
5
+ export declare function validateChainDisableEvmTransfer(chainAsset: _ChainAsset): boolean | undefined;
@@ -0,0 +1,64 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { ChainInfoMap } from '@subwallet/chain-list';
5
+ import { _AssetType } from '@subwallet/chain-list/types';
6
+ export function validateTokenHasValueByChain(chainAsset) {
7
+ const chainInfo = ChainInfoMap[chainAsset.originChain];
8
+ const isTestnet = chainInfo && chainInfo.isTestnet;
9
+ if (!chainInfo) {
10
+ throw new Error(`${chainAsset.originChain} is not existed`);
11
+ }
12
+ return isTestnet !== chainAsset.hasValue; // todo: also check multichainAsset hasValue if has.
13
+ }
14
+
15
+ export function validateNativeInfoByChain(chainAsset) {
16
+ var _chainInfo$evmInfo, _chainInfo$substrateI, _chainInfo$bitcoinInf, _chainInfo$evmInfo2, _chainInfo$substrateI2, _chainInfo$bitcoinInf2, _chainInfo$evmInfo3, _chainInfo$substrateI3, _chainInfo$bitcoinInf3;
17
+ const chainInfo = ChainInfoMap[chainAsset.originChain];
18
+ if (!chainInfo) {
19
+ throw new Error(`${chainAsset.originChain} is not existed`);
20
+ }
21
+ 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;
22
+ 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;
23
+ 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;
24
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
25
+ const nativeTokenSlug = `${chainInfo.slug}-NATIVE-${nativeSymbol}`;
26
+ return nativeSymbol === chainAsset.symbol && nativeDecimal === chainAsset.decimals && nativeED === chainAsset.minAmount && nativeTokenSlug === chainAsset.slug;
27
+ }
28
+ export function validateAssetTypeSupportByChain(chainAsset) {
29
+ const chainInfo = ChainInfoMap[chainAsset.originChain];
30
+ if (!chainInfo) {
31
+ throw new Error(`${chainAsset.originChain} is not existed`);
32
+ }
33
+ const bitcoinSupportAssetTypes = [_AssetType.NATIVE, _AssetType.RUNE, _AssetType.BRC20];
34
+ const evmSupportAssetTypes = [_AssetType.NATIVE, _AssetType.ERC20, _AssetType.ERC721];
35
+ const substrateSupportAssetTypes = [_AssetType.NATIVE, _AssetType.LOCAL, _AssetType.PSP22, _AssetType.PSP34, _AssetType.GRC20, _AssetType.GRC721];
36
+
37
+ // recheck chain with two types.
38
+ if (chainInfo.substrateInfo) {
39
+ return substrateSupportAssetTypes.includes(chainAsset.assetType);
40
+ }
41
+ if (chainInfo.evmInfo) {
42
+ return evmSupportAssetTypes.includes(chainAsset.assetType);
43
+ }
44
+ if (chainInfo.bitcoinInfo) {
45
+ return bitcoinSupportAssetTypes.includes(chainAsset.assetType);
46
+ }
47
+ throw new Error(`${chainAsset.originChain} does not has a suitable chainInfo`);
48
+ }
49
+ export function validateChainDisableEvmTransfer(chainAsset) {
50
+ var _chainInfo$evmInfo4;
51
+ const chainInfo = ChainInfoMap[chainAsset.originChain];
52
+ if (!chainInfo) {
53
+ throw new Error(`${chainAsset.originChain} is not existed`);
54
+ }
55
+ if (!chainInfo.evmInfo) {
56
+ throw new Error(`${chainAsset.originChain} is not Evm chain`);
57
+ }
58
+ const isChainMatchCondition = ((_chainInfo$evmInfo4 = chainInfo.evmInfo) === null || _chainInfo$evmInfo4 === void 0 ? void 0 : _chainInfo$evmInfo4.evmChainId) === -1 && chainInfo.substrateInfo;
59
+ if (isChainMatchCondition) {
60
+ var _chainAsset$metadata;
61
+ return (_chainAsset$metadata = chainAsset.metadata) === null || _chainAsset$metadata === void 0 ? void 0 : _chainAsset$metadata.disableEvmTransfer;
62
+ }
63
+ return false;
64
+ }
@@ -0,0 +1,4 @@
1
+ import { _ChainInfo } from '@subwallet/chain-list/types';
2
+ export declare function validateChainHasProvider(chainInfo: _ChainInfo): boolean;
3
+ export declare function validateParaId(chainInfo: _ChainInfo): boolean;
4
+ export declare function checkEvmSupportSmartContract(chainInfo: _ChainInfo): boolean;
@@ -0,0 +1,26 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { _ChainStatus, _SubstrateChainType } from '@subwallet/chain-list/types';
5
+ export function validateChainHasProvider(chainInfo) {
6
+ const chainStatus = chainInfo.chainStatus;
7
+ const providers = Object.keys(chainInfo.providers);
8
+ const validChainLive = chainStatus === _ChainStatus.ACTIVE && providers.length > 0;
9
+ const chainNotLive = chainStatus !== _ChainStatus.ACTIVE;
10
+ return validChainLive || chainNotLive;
11
+ }
12
+ export function validateParaId(chainInfo) {
13
+ if (!chainInfo.substrateInfo) {
14
+ throw new Error('Not substrate chain');
15
+ }
16
+ const paraId = chainInfo.substrateInfo.paraId;
17
+ const chainType = chainInfo.substrateInfo.chainType;
18
+ const relaySlug = chainInfo.substrateInfo.relaySlug;
19
+ return paraId ? chainType === _SubstrateChainType.PARACHAIN && !!relaySlug : chainType === _SubstrateChainType.RELAYCHAIN && !relaySlug;
20
+ }
21
+ export function checkEvmSupportSmartContract(chainInfo) {
22
+ if (!chainInfo.evmInfo) {
23
+ throw new Error('Not Evm chain');
24
+ }
25
+ return !!chainInfo.evmInfo.supportSmartContract;
26
+ }
@@ -7,6 +7,7 @@ import { EventService } from '@subwallet/extension-base/services/event-service';
7
7
  import { IMetadataItem } from '@subwallet/extension-base/services/storage-service/databases';
8
8
  import DatabaseService from '@subwallet/extension-base/services/storage-service/DatabaseService';
9
9
  import { BehaviorSubject, Subject } from 'rxjs';
10
+ import { ExtraInfo } from '@polkadot-api/merkleize-metadata';
10
11
  export declare class ChainService {
11
12
  private dataMap;
12
13
  private dbService;
@@ -141,6 +142,9 @@ export declare class ChainService {
141
142
  getMetadata(chain: string): import("dexie").PromiseExtended<IMetadataItem | undefined>;
142
143
  upsertMetadata(chain: string, metadata: IMetadataItem): import("dexie").PromiseExtended<unknown>;
143
144
  getMetadataByHash(hash: string): import("dexie").PromiseExtended<IMetadataItem | undefined>;
145
+ getExtraInfo(chain: string): Omit<ExtraInfo, 'specVersion' | 'specName'>;
146
+ calculateMetadataHash(chain: string): Promise<string | undefined>;
147
+ shortenMetadata(chain: string, txBlob: string): Promise<string | undefined>;
144
148
  getSubscanChainMap(reverse?: boolean): Record<string, string>;
145
149
  get detectBalanceChainSlugMap(): Record<string, string>;
146
150
  getFeeTokensByChain(chainSlug: string): string[];