@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
@@ -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 VFT balance without GearApi instance');
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.DEFAULT_GEAR_ADDRESS.ALICE), tokenContract.symbol(_utils2.DEFAULT_GEAR_ADDRESS.ALICE), tokenContract.decimals(_utils2.DEFAULT_GEAR_ADDRESS.ALICE)]);
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
- substrateApi.api.isReady.then(async api => {
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: 1,
14
+ ethereum: 0,
15
15
  polygon: 2,
16
- shidenEvm: 2,
17
- shiden: 2,
18
- ajunaPolkadot: 1,
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, _metadata] = await api.queryMulti([[api.query.assetRegistry.assets, (0, _utils3._getTokenOnChainAssetId)(asset)], [api.query.assetRegistry.assetMetadataMap, (0, _utils3._getTokenOnChainAssetId)(asset)]]);
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: metadata.decimals,
122
+ decimals: info.decimals,
124
123
  minAmount: info.existentialDeposit.toString(),
125
- symbol: metadata.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;