@subwallet/extension-base 1.2.13-0 → 1.2.15-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 (86) hide show
  1. package/background/errors/SwapError.js +5 -1
  2. package/cjs/background/errors/SwapError.js +5 -1
  3. package/cjs/core/logic-validation/swap.js +56 -3
  4. package/cjs/core/substrate/nominationpools-pallet.js +2 -1
  5. package/cjs/koni/api/nft/config.js +37 -23
  6. package/cjs/koni/api/nft/index.js +9 -1
  7. package/cjs/koni/api/nft/unique_network_nft/index.js +12 -20
  8. package/cjs/koni/background/handlers/Extension.js +12 -0
  9. package/cjs/packageInfo.js +1 -1
  10. package/cjs/services/balance-service/transfer/xcm/utils.js +2 -2
  11. package/cjs/services/chain-service/constants.js +2 -1
  12. package/cjs/services/chain-service/handler/SubstrateApi.js +6 -0
  13. package/cjs/services/chain-service/health-check/constants/index.js +4 -4
  14. package/cjs/services/chain-service/health-check/utils/asset-info.js +23 -6
  15. package/cjs/services/chain-service/health-check/utils/chain-info.js +25 -2
  16. package/cjs/services/chain-service/health-check/utils/new-utils/asset-asset-validate.js +160 -0
  17. package/cjs/services/chain-service/health-check/utils/new-utils/asset-validate.js +45 -0
  18. package/cjs/services/chain-service/health-check/utils/new-utils/chain-asset-validate.js +73 -0
  19. package/cjs/services/chain-service/health-check/utils/new-utils/chain-validate.js +34 -0
  20. package/cjs/services/chain-service/index.js +47 -5
  21. package/cjs/services/earning-service/handlers/liquid-staking/acala.js +49 -19
  22. package/cjs/services/migration-service/scripts/databases/ReloadMetadata.js +35 -0
  23. package/cjs/services/migration-service/scripts/index.js +4 -2
  24. package/cjs/services/price-service/coingecko.js +57 -32
  25. package/cjs/services/price-service/index.js +30 -11
  26. package/cjs/services/storage-service/db-stores/BaseStore.js +4 -0
  27. package/cjs/services/swap-service/handler/asset-hub/handler.js +343 -0
  28. package/cjs/services/swap-service/handler/asset-hub/index.js +12 -0
  29. package/cjs/services/swap-service/handler/asset-hub/router.js +93 -0
  30. package/cjs/services/swap-service/handler/asset-hub/utils.js +158 -0
  31. package/cjs/services/swap-service/index.js +10 -1
  32. package/cjs/services/swap-service/utils.js +10 -1
  33. package/cjs/types/swap/index.js +5 -1
  34. package/core/logic-validation/swap.d.ts +3 -1
  35. package/core/logic-validation/swap.js +55 -4
  36. package/core/substrate/nominationpools-pallet.js +2 -1
  37. package/koni/api/nft/config.d.ts +1 -0
  38. package/koni/api/nft/config.js +31 -19
  39. package/koni/api/nft/index.js +9 -1
  40. package/koni/api/nft/unique_network_nft/index.js +12 -20
  41. package/koni/background/handlers/Extension.js +12 -0
  42. package/package.json +56 -11
  43. package/packageInfo.js +1 -1
  44. package/services/balance-service/transfer/xcm/utils.js +2 -2
  45. package/services/chain-service/constants.d.ts +1 -0
  46. package/services/chain-service/constants.js +2 -1
  47. package/services/chain-service/handler/SubstrateApi.js +6 -0
  48. package/services/chain-service/health-check/constants/index.js +4 -4
  49. package/services/chain-service/health-check/utils/asset-info.d.ts +1 -0
  50. package/services/chain-service/health-check/utils/asset-info.js +20 -4
  51. package/services/chain-service/health-check/utils/chain-info.d.ts +4 -2
  52. package/services/chain-service/health-check/utils/chain-info.js +20 -0
  53. package/services/chain-service/health-check/utils/new-utils/asset-asset-validate.d.ts +10 -0
  54. package/services/chain-service/health-check/utils/new-utils/asset-asset-validate.js +146 -0
  55. package/services/chain-service/health-check/utils/new-utils/asset-validate.d.ts +3 -0
  56. package/services/chain-service/health-check/utils/new-utils/asset-validate.js +38 -0
  57. package/services/chain-service/health-check/utils/new-utils/chain-asset-validate.d.ts +5 -0
  58. package/services/chain-service/health-check/utils/new-utils/chain-asset-validate.js +64 -0
  59. package/services/chain-service/health-check/utils/new-utils/chain-validate.d.ts +4 -0
  60. package/services/chain-service/health-check/utils/new-utils/chain-validate.js +26 -0
  61. package/services/chain-service/index.js +47 -5
  62. package/services/chain-service/types.d.ts +5 -0
  63. package/services/earning-service/handlers/liquid-staking/acala.js +46 -17
  64. package/services/migration-service/scripts/databases/ReloadMetadata.d.ts +5 -0
  65. package/services/migration-service/scripts/databases/ReloadMetadata.js +27 -0
  66. package/services/migration-service/scripts/index.js +4 -2
  67. package/services/price-service/coingecko.js +54 -32
  68. package/services/price-service/index.js +29 -11
  69. package/services/storage-service/db-stores/BaseStore.d.ts +3 -0
  70. package/services/storage-service/db-stores/BaseStore.js +4 -0
  71. package/services/swap-service/handler/asset-hub/handler.d.ts +31 -0
  72. package/services/swap-service/handler/asset-hub/handler.js +335 -0
  73. package/services/swap-service/handler/asset-hub/index.d.ts +1 -0
  74. package/services/swap-service/handler/asset-hub/index.js +4 -0
  75. package/services/swap-service/handler/asset-hub/router.d.ts +16 -0
  76. package/services/swap-service/handler/asset-hub/router.js +85 -0
  77. package/services/swap-service/handler/asset-hub/utils.d.ts +18 -0
  78. package/services/swap-service/handler/asset-hub/utils.js +133 -0
  79. package/services/swap-service/index.js +10 -1
  80. package/services/swap-service/utils.d.ts +1 -0
  81. package/services/swap-service/utils.js +9 -1
  82. package/types/swap/index.d.ts +15 -2
  83. package/types/swap/index.js +5 -1
  84. /package/cjs/services/migration-service/scripts/{ClearMetadataDatabase.js → databases/ClearMetadataDatabase.js} +0 -0
  85. /package/services/migration-service/scripts/{ClearMetadataDatabase.d.ts → databases/ClearMetadataDatabase.d.ts} +0 -0
  86. /package/services/migration-service/scripts/{ClearMetadataDatabase.js → databases/ClearMetadataDatabase.js} +0 -0
@@ -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,13 +28,30 @@ 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'];
32
32
  const filterAssetInfoMap = (chainInfo, assets) => {
33
33
  return Object.fromEntries(Object.entries(assets).filter(_ref2 => {
34
34
  let [, info] = _ref2;
35
35
  return chainInfo[info.originChain];
36
36
  }));
37
37
  };
38
+
39
+ // const rawAssetRefMap = (assetRefMap: Record<string, _AssetRef>) => {
40
+ // const result: Record<string, _AssetRef> = {};
41
+ //
42
+ // Object.entries(assetRefMap).forEach(([key, assetRef]) => {
43
+ // const originChainInfo = ChainInfoMap[assetRef.srcChain];
44
+ // const destChainInfo = ChainInfoMap[assetRef.destChain];
45
+ // const isSnowBridgeXcm = assetRef.path === _AssetRefPath.XCM && _isSnowBridgeXcm(originChainInfo, destChainInfo);
46
+ //
47
+ // if (!isSnowBridgeXcm) {
48
+ // result[key] = assetRef;
49
+ // }
50
+ // });
51
+ //
52
+ // return result;
53
+ // };
54
+
38
55
  class ChainService {
39
56
  dataMap = {
40
57
  chainInfoMap: {},
@@ -467,10 +484,6 @@ class ChainService {
467
484
 
468
485
  // TODO: reconsider the flow of initiation
469
486
  this.multiChainAssetMapSubject.next(_chainList.MultiChainAssetMap);
470
- // const storedAssetRefMap = await this.dbService.getAssetRefMap();
471
- //
472
- // this.dataMap.assetRefMap = storedAssetRefMap && Object.values(storedAssetRefMap).length > 0 ? storedAssetRefMap : AssetRefMap;
473
-
474
487
  await this.initChains();
475
488
  this.chainInfoMapSubject.next(this.getChainInfoMap());
476
489
  this.assetRegistrySubject.next(this.getAssetRegistry());
@@ -670,6 +683,34 @@ class ChainService {
670
683
  }
671
684
  const onUpdateStatus = status => {
672
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
+ }
673
714
  this.updateChainConnectionStatus(slug, status);
674
715
  };
675
716
  if (chainInfo.substrateInfo !== null && chainInfo.substrateInfo !== undefined) {
@@ -679,6 +720,7 @@ class ChainService {
679
720
  //
680
721
  // this.substrateChainHandler.setSubstrateApi(chainInfo.slug, chainApi);
681
722
  // } else {
723
+
682
724
  const chainApi = await this.substrateChainHandler.initApi(chainInfo.slug, endpoint, {
683
725
  providerName,
684
726
  onUpdateStatus
@@ -6,8 +6,9 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
9
+ var _constants = require("@subwallet/extension-base/services/chain-service/constants");
9
10
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
10
- var _constants = require("@subwallet/extension-base/services/earning-service/constants");
11
+ var _constants2 = require("@subwallet/extension-base/services/earning-service/constants");
11
12
  var _types = require("@subwallet/extension-base/types");
12
13
  var _util = require("@polkadot/util");
13
14
  var _base = _interopRequireDefault(require("./base"));
@@ -16,6 +17,9 @@ var _base = _interopRequireDefault(require("./base"));
16
17
 
17
18
  const GRAPHQL_API = 'https://api.polkawallet.io/acala-liquid-staking-subql';
18
19
  const EXCHANGE_RATE_REQUEST = 'query { dailySummaries(first:30, orderBy:TIMESTAMP_DESC) {nodes { exchangeRate timestamp }}}';
20
+ function convertDerivativeToken(amount, exchangeRate, decimals) {
21
+ return amount.mul(new _util.BN(exchangeRate)).div(_util.BN_TEN.pow(new _util.BN(decimals)));
22
+ }
19
23
  class AcalaLiquidStakingPoolHandler extends _base.default {
20
24
  altInputAsset = 'polkadot-NATIVE-DOT';
21
25
  derivativeAssets = ['acala-LOCAL-LDOT'];
@@ -29,8 +33,7 @@ class AcalaLiquidStakingPoolHandler extends _base.default {
29
33
  defaultUnstake: true,
30
34
  fastUnstake: true,
31
35
  cancelUnstake: false,
32
- withdraw: false,
33
- // TODO: Change after verify unstake info
36
+ withdraw: true,
34
37
  claimReward: false
35
38
  };
36
39
  constructor(state, chain) {
@@ -118,30 +121,56 @@ class AcalaLiquidStakingPoolHandler extends _base.default {
118
121
  return;
119
122
  }
120
123
  const balances = _balances;
121
- const redeemRequests = await substrateApi.api.query.homa.redeemRequests.multi(useAddresses);
122
- // This rate is multiple with decimals
123
- const exchangeRate = await this.getExchangeRate();
124
- const decimals = _util.BN_TEN.pow(new _util.BN(this.rateDecimals));
124
+ const [redeemRequests, exchangeRate, _currentEra] = await Promise.all([substrateApi.api.query.homa.redeemRequests.multi(useAddresses), this.getExchangeRate(), substrateApi.api.query.homa.relayChainCurrentEra()]);
125
+ const currentEra = _currentEra.toPrimitive();
125
126
  for (let i = 0; i < balances.length; i++) {
126
127
  const balanceItem = balances[i];
127
128
  const address = useAddresses[i];
128
129
  const activeTotalBalance = balanceItem.free || _util.BN_ZERO;
129
- let totalBalance = activeTotalBalance.mul(new _util.BN(exchangeRate)).div(decimals);
130
+ let totalBalance = convertDerivativeToken(activeTotalBalance, exchangeRate, this.rateDecimals);
130
131
  let unlockingBalance = _util.BN_ZERO;
131
132
  const unstakings = [];
133
+
134
+ // Handle redeem request
132
135
  const redeemRequest = redeemRequests[i].toPrimitive();
133
136
  if (redeemRequest) {
134
- // If withdrawable = false, redeem request is claimed
135
- const [redeemAmount, withdrawable] = redeemRequest;
136
-
137
- // Redeem amount in derivative token
138
- const amount = new _util.BN(redeemAmount).mul(new _util.BN(exchangeRate)).div(decimals);
139
- totalBalance = totalBalance.add(amount);
140
- unlockingBalance = unlockingBalance.add(amount);
137
+ const [derivativeRedeemAmount, _] = redeemRequest;
138
+ const redeemAmount = convertDerivativeToken(new _util.BN(derivativeRedeemAmount), exchangeRate, this.rateDecimals);
139
+ totalBalance = totalBalance.add(redeemAmount);
140
+ unlockingBalance = unlockingBalance.add(redeemAmount);
141
141
  unstakings.push({
142
142
  chain: this.chain,
143
- status: withdrawable ? _types.UnstakingStatus.CLAIMABLE : _types.UnstakingStatus.UNLOCKING,
144
- claimable: amount.toString()
143
+ status: _types.UnstakingStatus.UNLOCKING,
144
+ claimable: redeemAmount.toString(),
145
+ waitingTime: 28 * _constants._STAKING_ERA_LENGTH_MAP.polkadot // up to 29 day (in case non-fast-match
146
+ });
147
+ }
148
+
149
+ // Handle unbondings
150
+ const unbondings = await substrateApi.api.query.homa.unbondings.entries(address);
151
+ if (unbondings.length > 0) {
152
+ unbondings.forEach(_ref => {
153
+ let [unbondingInfo, unbondingValue] = _ref;
154
+ // @ts-ignore
155
+ const _targetEra = unbondingInfo.toHuman()[1];
156
+ const targetEra = parseInt(_targetEra.replaceAll(',', ''));
157
+ const amount = new _util.BN(unbondingValue.toPrimitive());
158
+ totalBalance = totalBalance.add(amount);
159
+ unlockingBalance = unlockingBalance.add(amount);
160
+ if (targetEra > currentEra) {
161
+ unstakings.push({
162
+ chain: this.chain,
163
+ status: _types.UnstakingStatus.UNLOCKING,
164
+ claimable: amount.toString(),
165
+ waitingTime: (targetEra - currentEra) * _constants._STAKING_ERA_LENGTH_MAP.polkadot // Todo: Handle exact timestamp?
166
+ });
167
+ } else {
168
+ unstakings.push({
169
+ chain: this.chain,
170
+ status: _types.UnstakingStatus.CLAIMABLE,
171
+ claimable: amount.toString()
172
+ });
173
+ }
145
174
  });
146
175
  }
147
176
  const result = {
@@ -181,7 +210,7 @@ class AcalaLiquidStakingPoolHandler extends _base.default {
181
210
  const poolOriginSubstrateApi = await this.substrateApi.isReady;
182
211
  const defaultFeeTokenSlug = this.feeAssets[0];
183
212
  if (new _util.BN(params.amount).gt(_util.BN_ZERO)) {
184
- const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.homa.mint(params.amount).paymentInfo(_constants.fakeAddress);
213
+ const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.homa.mint(params.amount).paymentInfo(_constants2.fakeAddress);
185
214
  const mintFeeInfo = _mintFeeInfo.toPrimitive();
186
215
  return {
187
216
  amount: mintFeeInfo.partialFee.toString(),
@@ -232,7 +261,8 @@ class AcalaLiquidStakingPoolHandler extends _base.default {
232
261
  }
233
262
  async handleYieldUnstake(amount, address, selectedTarget) {
234
263
  const chainApi = await this.substrateApi.isReady;
235
- const extrinsic = chainApi.api.tx.homa.requestRedeem(amount, false);
264
+ const extrinsic = chainApi.api.tx.homa.requestRedeem(amount, true); // set true to allow fast match
265
+
236
266
  return [_KoniTypes.ExtrinsicType.UNSTAKE_LDOT, extrinsic];
237
267
  }
238
268
  async handleYieldWithdraw(address, unstakingInfo) {
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _Base = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/Base"));
9
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
10
+ // SPDX-License-Identifier: Apache-2.0
11
+
12
+ class ReloadMetadata extends _Base.default {
13
+ chains = ['goldberg_testnet'];
14
+ async run() {
15
+ const activeChains = this.state.chainService.getActiveChains();
16
+ for (const chain of this.chains) {
17
+ const item = await this.state.dbService.stores.metadata.getMetadata(chain);
18
+ if (item) {
19
+ // @ts-ignore
20
+ await this.state.dbService.stores.metadata.remove(item.genesisHash);
21
+ const isActive = activeChains.includes(chain);
22
+ if (isActive) {
23
+ this.state.chainService.disableChain(chain);
24
+ setTimeout(() => {
25
+ this.state.chainService.enableChain(chain).catch(console.error);
26
+ }, 500);
27
+ }
28
+ }
29
+ }
30
+ // Clear all old metadata data
31
+
32
+ return Promise.resolve();
33
+ }
34
+ }
35
+ exports.default = ReloadMetadata;
@@ -6,9 +6,11 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = exports.EVERYTIME = void 0;
8
8
  var _AutoEnableSomeTokens = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/scripts/databases/AutoEnableSomeTokens"));
9
+ var _ReloadMetadata = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/scripts/databases/ReloadMetadata"));
9
10
  var _DeleteEarningData = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/scripts/DeleteEarningData"));
10
11
  var _MigrateRemoveGenesisHash = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/scripts/MigrateRemoveGenesisHash"));
11
12
  var _MigrateTransactionHistoryBySymbol = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/scripts/MigrateTransactionHistoryBySymbol"));
13
+ var _ClearMetadataDatabase = _interopRequireDefault(require("./databases/ClearMetadataDatabase"));
12
14
  var _MigrateAssetSetting = _interopRequireDefault(require("./databases/MigrateAssetSetting"));
13
15
  var _MigrateEarningVersion = _interopRequireDefault(require("./databases/MigrateEarningVersion"));
14
16
  var _MigrateEthProvider = _interopRequireDefault(require("./providers/MigrateEthProvider"));
@@ -16,7 +18,6 @@ var _MigratePioneerProvider = _interopRequireDefault(require("./providers/Migrat
16
18
  var _MigrateProvidersV1M1P = _interopRequireDefault(require("./providers/MigrateProvidersV1M1P24"));
17
19
  var _MigratePolygonUSDCProvider = _interopRequireDefault(require("./tokens/MigratePolygonUSDCProvider"));
18
20
  var _AutoEnableChainsTokens = _interopRequireDefault(require("./AutoEnableChainsTokens"));
19
- var _ClearMetadataDatabase = _interopRequireDefault(require("./ClearMetadataDatabase"));
20
21
  var _DeleteChain = _interopRequireDefault(require("./DeleteChain"));
21
22
  var _DeleteChainStaking = _interopRequireDefault(require("./DeleteChainStaking"));
22
23
  var _EnableVaraChain = _interopRequireDefault(require("./EnableVaraChain"));
@@ -63,7 +64,8 @@ var _default = {
63
64
  '1.1.69-03': _MigrateAssetSetting.default,
64
65
  '1.1.69-02': _MigrateTransactionHistoryBySymbol.default,
65
66
  '1.2.69-01': _MigrateRemoveGenesisHash.default,
66
- '1.2.1-01': _ClearMetadataDatabase.default
67
+ '1.2.1-01': _ClearMetadataDatabase.default,
68
+ '1.2.13-01': _ReloadMetadata.default
67
69
  // [`${EVERYTIME}-1.1.42-02`]: MigrateTransactionHistoryBySymbol
68
70
  // [`${EVERYTIME}-1`]: AutoEnableChainsTokens
69
71
  };