@subwallet/extension-base 1.3.7-0 → 1.3.9-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 (109) hide show
  1. package/background/KoniTypes.d.ts +11 -5
  2. package/background/KoniTypes.js +1 -1
  3. package/cjs/background/KoniTypes.js +1 -1
  4. package/cjs/core/logic-validation/transfer.js +35 -24
  5. package/cjs/core/substrate/system-pallet.js +1 -1
  6. package/cjs/core/substrate/xcm-parser.js +16 -2
  7. package/cjs/core/utils.js +2 -2
  8. package/cjs/koni/api/contract-handler/utils/index.js +15 -1
  9. package/cjs/koni/background/handlers/Extension.js +158 -86
  10. package/cjs/koni/background/handlers/State.js +11 -2
  11. package/cjs/packageInfo.js +1 -1
  12. package/cjs/services/balance-service/index.js +24 -2
  13. package/cjs/services/balance-service/transfer/smart-contract.js +16 -5
  14. package/cjs/services/balance-service/transfer/xcm/index.js +31 -1
  15. package/cjs/services/balance-service/transfer/xcm/polygonBridge.js +108 -0
  16. package/cjs/services/chain-online-service/constants.js +32 -0
  17. package/cjs/services/chain-online-service/index.js +190 -0
  18. package/cjs/services/chain-service/constants.js +3 -1
  19. package/cjs/services/chain-service/index.js +87 -127
  20. package/cjs/services/chain-service/utils/index.js +0 -2
  21. package/cjs/services/chain-service/utils/patch.js +7 -3
  22. package/cjs/services/fee-service/utils/index.js +14 -0
  23. package/cjs/services/inapp-notification-service/consts.js +6 -4
  24. package/cjs/services/inapp-notification-service/index.js +110 -6
  25. package/cjs/services/inapp-notification-service/interfaces.js +9 -1
  26. package/cjs/services/inapp-notification-service/utils/avail.js +88 -0
  27. package/cjs/services/inapp-notification-service/{utils.js → utils/common.js} +1 -84
  28. package/cjs/services/inapp-notification-service/utils/index.js +38 -0
  29. package/cjs/services/inapp-notification-service/utils/polygon.js +66 -0
  30. package/cjs/services/migration-service/scripts/MigrateTransactionHistoryBridge.js +37 -0
  31. package/cjs/services/migration-service/scripts/index.js +3 -1
  32. package/cjs/services/setting-service/SettingService.js +8 -0
  33. package/cjs/services/setting-service/constants.js +2 -1
  34. package/cjs/services/storage-service/DatabaseService.js +3 -0
  35. package/cjs/services/transaction-service/index.js +1 -1
  36. package/cjs/stores/ChainlistStore.js +18 -0
  37. package/cjs/types/index.js +11 -0
  38. package/cjs/types/transaction/error.js +1 -0
  39. package/cjs/utils/account/transform.js +1 -1
  40. package/core/logic-validation/transfer.d.ts +2 -1
  41. package/core/logic-validation/transfer.js +36 -25
  42. package/core/substrate/system-pallet.js +1 -1
  43. package/core/substrate/xcm-parser.d.ts +1 -0
  44. package/core/substrate/xcm-parser.js +15 -2
  45. package/core/types.d.ts +1 -0
  46. package/core/utils.js +2 -2
  47. package/koni/api/contract-handler/utils/index.d.ts +2 -0
  48. package/koni/api/contract-handler/utils/index.js +12 -0
  49. package/koni/api/contract-handler/utils/polygon_bridge_abi.json +1004 -0
  50. package/koni/background/handlers/Extension.d.ts +4 -0
  51. package/koni/background/handlers/Extension.js +93 -22
  52. package/koni/background/handlers/State.d.ts +2 -0
  53. package/koni/background/handlers/State.js +11 -2
  54. package/package.json +56 -14
  55. package/packageInfo.js +1 -1
  56. package/services/balance-service/index.d.ts +3 -0
  57. package/services/balance-service/index.js +21 -2
  58. package/services/balance-service/transfer/smart-contract.js +16 -5
  59. package/services/balance-service/transfer/xcm/index.d.ts +1 -0
  60. package/services/balance-service/transfer/xcm/index.js +29 -1
  61. package/services/balance-service/transfer/xcm/polygonBridge.d.ts +22 -0
  62. package/services/balance-service/transfer/xcm/polygonBridge.js +95 -0
  63. package/services/chain-online-service/constants.d.ts +4 -0
  64. package/services/chain-online-service/constants.js +23 -0
  65. package/services/chain-online-service/index.d.ts +22 -0
  66. package/services/chain-online-service/index.js +182 -0
  67. package/services/chain-service/constants.d.ts +1 -0
  68. package/services/chain-service/constants.js +1 -0
  69. package/services/chain-service/index.d.ts +6 -7
  70. package/services/chain-service/index.js +78 -116
  71. package/services/chain-service/utils/index.js +0 -2
  72. package/services/chain-service/utils/patch.d.ts +16 -1
  73. package/services/chain-service/utils/patch.js +7 -3
  74. package/services/fee-service/utils/index.js +14 -0
  75. package/services/inapp-notification-service/consts.d.ts +3 -1
  76. package/services/inapp-notification-service/consts.js +6 -4
  77. package/services/inapp-notification-service/index.d.ts +10 -2
  78. package/services/inapp-notification-service/index.js +111 -7
  79. package/services/inapp-notification-service/interfaces.d.ts +27 -3
  80. package/services/inapp-notification-service/interfaces.js +7 -0
  81. package/services/inapp-notification-service/utils/avail.d.ts +40 -0
  82. package/services/inapp-notification-service/utils/avail.js +73 -0
  83. package/services/inapp-notification-service/utils/common.d.ts +11 -0
  84. package/services/inapp-notification-service/{utils.js → utils/common.js} +1 -72
  85. package/services/inapp-notification-service/utils/index.d.ts +3 -0
  86. package/services/inapp-notification-service/utils/index.js +6 -0
  87. package/services/inapp-notification-service/utils/polygon.d.ts +71 -0
  88. package/services/inapp-notification-service/utils/polygon.js +54 -0
  89. package/services/migration-service/scripts/MigrateTransactionHistoryBridge.d.ts +4 -0
  90. package/services/migration-service/scripts/MigrateTransactionHistoryBridge.js +29 -0
  91. package/services/migration-service/scripts/index.js +3 -1
  92. package/services/setting-service/SettingService.d.ts +4 -0
  93. package/services/setting-service/SettingService.js +8 -0
  94. package/services/setting-service/constants.js +2 -1
  95. package/services/storage-service/DatabaseService.d.ts +1 -0
  96. package/services/storage-service/DatabaseService.js +3 -0
  97. package/services/transaction-service/index.js +1 -1
  98. package/stores/ChainlistStore.d.ts +7 -0
  99. package/stores/ChainlistStore.js +10 -0
  100. package/types/{avail-bridge → bridge}/index.d.ts +1 -1
  101. package/types/index.d.ts +1 -0
  102. package/types/index.js +1 -0
  103. package/types/notification/index.d.ts +5 -0
  104. package/types/transaction/error.d.ts +2 -1
  105. package/types/transaction/error.js +1 -0
  106. package/utils/account/transform.js +1 -1
  107. package/services/inapp-notification-service/utils.d.ts +0 -55
  108. /package/cjs/types/{avail-bridge → bridge}/index.js +0 -0
  109. /package/types/{avail-bridge → bridge}/index.js +0 -0
@@ -13,6 +13,6 @@ const packageInfo = {
13
13
  name: '@subwallet/extension-base',
14
14
  path: typeof __dirname === 'string' ? __dirname : 'auto',
15
15
  type: 'cjs',
16
- version: '1.3.7-0'
16
+ version: '1.3.9-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -17,6 +17,7 @@ var _utils2 = require("@subwallet/extension-base/utils");
17
17
  var _keyring = require("@subwallet/keyring");
18
18
  var _types2 = require("@subwallet/keyring/types");
19
19
  var _uiKeyring = _interopRequireDefault(require("@subwallet/ui-keyring"));
20
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
20
21
  var _i18next = require("i18next");
21
22
  var _rxjs = require("rxjs");
22
23
  var _util = require("@polkadot/util");
@@ -170,7 +171,10 @@ class BalanceService {
170
171
  }
171
172
 
172
173
  /** Subscribe token free balance of an address on chain */
173
- async subscribeTransferableBalance(address, chain, tokenSlug, extrinsicType, callback) {
174
+ async subscribeBalance(address, chain, tokenSlug) {
175
+ let balanceType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'transferable';
176
+ let extrinsicType = arguments.length > 4 ? arguments[4] : undefined;
177
+ let callback = arguments.length > 5 ? arguments[5] : undefined;
174
178
  const chainInfo = this.state.chainService.getChainInfoByKey(chain);
175
179
  const chainState = this.state.chainService.getChainStateByKey(chain);
176
180
  if (!chainInfo || !chainState || !chainState.active) {
@@ -199,10 +203,18 @@ class BalanceService {
199
203
  let unsub = _util.noop;
200
204
  unsub = (0, _helpers.subscribeBalance)([address], [chain], [tSlug], assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, result => {
201
205
  const rs = result[0];
206
+ let value;
207
+ switch (balanceType) {
208
+ case 'total':
209
+ value = new _bignumber.default(rs.free).plus(new _bignumber.default(rs.locked)).toFixed();
210
+ break;
211
+ default:
212
+ value = rs.free;
213
+ }
202
214
  if (rs.tokenSlug === tSlug && rs.state !== _KoniTypes.APIItemState.PENDING) {
203
215
  hasError = false;
204
216
  const balance = {
205
- value: rs.free,
217
+ value,
206
218
  decimals: tokenInfo.decimals || 0,
207
219
  symbol: tokenInfo.symbol,
208
220
  metadata: rs.metadata
@@ -226,6 +238,12 @@ class BalanceService {
226
238
  }, 9999);
227
239
  });
228
240
  }
241
+ async subscribeTransferableBalance(address, chain, tokenSlug, extrinsicType, callback) {
242
+ return this.subscribeBalance(address, chain, tokenSlug, 'transferable', extrinsicType, callback);
243
+ }
244
+ async subscribeTotalBalance(address, chain, tokenSlug, extrinsicType, callback) {
245
+ return this.subscribeBalance(address, chain, tokenSlug, 'total', extrinsicType, callback);
246
+ }
229
247
 
230
248
  /**
231
249
  * @public
@@ -242,6 +260,10 @@ class BalanceService {
242
260
  const [, balance] = await this.subscribeTransferableBalance(address, chain, tokenSlug, extrinsicType);
243
261
  return balance;
244
262
  }
263
+ async getTotalBalance(address, chain, tokenSlug, extrinsicType) {
264
+ const [, balance] = await this.subscribeTotalBalance(address, chain, tokenSlug, extrinsicType);
265
+ return balance;
266
+ }
245
267
 
246
268
  /** Remove balance from the subject object by addresses */
247
269
  removeBalanceByAddresses(addresses) {
@@ -15,6 +15,7 @@ var _utils2 = require("@subwallet/extension-base/koni/api/contract-handler/wasm/
15
15
  var _constants = require("@subwallet/extension-base/services/chain-service/constants");
16
16
  var _utils3 = require("@subwallet/extension-base/services/fee-service/utils");
17
17
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
18
+ var _i18next = require("i18next");
18
19
  // Copyright 2019-2022 @subwallet/extension-base
19
20
  // SPDX-License-Identifier: Apache-2.0
20
21
 
@@ -88,11 +89,21 @@ async function getERC721Transaction(web3Api, chain, contractAddress, senderAddre
88
89
  var _priority$maxFeePerGa3, _priority$maxPriority3;
89
90
  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
90
91
  const contract = new web3Api.api.eth.Contract(_utils._ERC721_ABI, contractAddress);
91
- const [gasLimit, priority] = await Promise.all([
92
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
93
- contract.methods.safeTransferFrom(senderAddress, recipientAddress, tokenId).estimateGas({
94
- from: senderAddress
95
- }), (0, _utils3.calculateGasFeeParams)(web3Api, chain)]);
92
+ let gasLimit;
93
+ let priority;
94
+ try {
95
+ [gasLimit, priority] = await Promise.all([
96
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
97
+ contract.methods.safeTransferFrom(senderAddress, recipientAddress, tokenId).estimateGas({
98
+ from: senderAddress
99
+ }), (0, _utils3.calculateGasFeeParams)(web3Api, chain)]);
100
+ } catch (e) {
101
+ const error = e;
102
+ if (error.message.includes('transfer to non ERC721Receiver implementer')) {
103
+ error.message = (0, _i18next.t)('Unable to send. NFT not supported on recipient address');
104
+ }
105
+ throw error;
106
+ }
96
107
  return {
97
108
  from: senderAddress,
98
109
  gasPrice: priority.gasPrice,
@@ -4,10 +4,11 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.getXcmMockTxFee = exports.createXcmExtrinsic = exports.createSnowBridgeExtrinsic = exports.createAvailBridgeTxFromEth = exports.createAvailBridgeExtrinsicFromAvail = void 0;
7
+ exports.getXcmMockTxFee = exports.createXcmExtrinsic = exports.createSnowBridgeExtrinsic = exports.createPolygonBridgeExtrinsic = exports.createAvailBridgeTxFromEth = exports.createAvailBridgeExtrinsicFromAvail = void 0;
8
8
  var _xcmParser = require("@subwallet/extension-base/core/substrate/xcm-parser");
9
9
  var _availBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge");
10
10
  var _polkadotXcm = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polkadotXcm");
11
+ var _polygonBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge");
11
12
  var _snowBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/snowBridge");
12
13
  var _xcmPallet = require("@subwallet/extension-base/services/balance-service/transfer/xcm/xcmPallet");
13
14
  var _xTokens = require("@subwallet/extension-base/services/balance-service/transfer/xcm/xTokens");
@@ -100,6 +101,35 @@ const createAvailBridgeExtrinsicFromAvail = async _ref4 => {
100
101
  return await (0, _availBridge.getAvailBridgeExtrinsicFromAvail)(recipient, sendingValue, substrateApi);
101
102
  };
102
103
  exports.createAvailBridgeExtrinsicFromAvail = createAvailBridgeExtrinsicFromAvail;
104
+ const createPolygonBridgeExtrinsic = async _ref5 => {
105
+ let {
106
+ chainInfoMap,
107
+ destinationTokenInfo,
108
+ evmApi,
109
+ originTokenInfo,
110
+ recipient,
111
+ sender,
112
+ sendingValue
113
+ } = _ref5;
114
+ const originChainInfo = chainInfoMap[originTokenInfo.originChain];
115
+ const destinationChainInfo = chainInfoMap[destinationTokenInfo.originChain];
116
+ if (!(0, _xcmParser._isPolygonBridgeXcm)(originChainInfo, destinationChainInfo)) {
117
+ throw new Error('This is not a valid PolygonBridge transfer');
118
+ }
119
+ if (!evmApi) {
120
+ throw Error('Evm API is not available');
121
+ }
122
+ if (!sender) {
123
+ throw Error('Sender is required');
124
+ }
125
+ const sourceChain = originChainInfo.slug;
126
+ if (sourceChain === 'polygonzkEvm_cardona' || sourceChain === 'polygonZkEvm') {
127
+ return (0, _polygonBridge._createPolygonBridgeL2toL1Extrinsic)(originTokenInfo, originChainInfo, sender, recipient, sendingValue, evmApi);
128
+ } else {
129
+ return (0, _polygonBridge._createPolygonBridgeL1toL2Extrinsic)(originTokenInfo, originChainInfo, sender, recipient, sendingValue, evmApi);
130
+ }
131
+ };
132
+ exports.createPolygonBridgeExtrinsic = createPolygonBridgeExtrinsic;
103
133
  const getXcmMockTxFee = async (substrateApi, chainInfoMap, originTokenInfo, destinationTokenInfo) => {
104
134
  try {
105
135
  var _paymentInfo$partialF;
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.POLYGON_PROOF_INDEXER = exports.POLYGON_GAS_INDEXER = void 0;
7
+ exports._createPolygonBridgeL1toL2Extrinsic = _createPolygonBridgeL1toL2Extrinsic;
8
+ exports._createPolygonBridgeL2toL1Extrinsic = _createPolygonBridgeL2toL1Extrinsic;
9
+ exports._isPolygonChainBridge = _isPolygonChainBridge;
10
+ exports.getClaimPolygonBridge = getClaimPolygonBridge;
11
+ exports.isClaimedPolygonBridge = isClaimedPolygonBridge;
12
+ var _chainList = require("@subwallet/chain-list");
13
+ var _web = require("@subwallet/extension-base/koni/api/contract-handler/evm/web3");
14
+ var _utils = require("@subwallet/extension-base/koni/api/contract-handler/utils");
15
+ var _utils2 = require("@subwallet/extension-base/services/chain-service/utils");
16
+ var _utils3 = require("@subwallet/extension-base/services/fee-service/utils");
17
+ // Copyright 2019-2022 @subwallet/extension-base
18
+ // SPDX-License-Identifier: Apache-2.0
19
+
20
+ const POLYGON_PROOF_INDEXER = {
21
+ MAINNET: 'https://api-gateway.polygon.technology/api/v3/proof/mainnet/merkle-proof',
22
+ TESTNET: 'https://api-gateway.polygon.technology/api/v3/proof/testnet/merkle-proof'
23
+ };
24
+ exports.POLYGON_PROOF_INDEXER = POLYGON_PROOF_INDEXER;
25
+ const POLYGON_GAS_INDEXER = {
26
+ MAINNET: 'https://gasstation.polygon.technology/zkevm',
27
+ TESTNET: 'https://gasstation.polygon.technology/zkevm/cardona'
28
+ };
29
+ exports.POLYGON_GAS_INDEXER = POLYGON_GAS_INDEXER;
30
+ async function createPolygonBridgeTransaction(tokenInfo, originChainInfo, sender, recipientAddress, value, destinationNetwork, evmApi) {
31
+ var _priority$maxFeePerGa, _priority$maxPriority;
32
+ const polygonBridgeContractAddress = (0, _utils.getPolygonBridgeContract)(originChainInfo.slug);
33
+ const polygonBridgeContract = (0, _web.getWeb3Contract)(polygonBridgeContractAddress, evmApi, _utils._POLYGON_BRIDGE_ABI);
34
+ const tokenContract = (0, _utils2._getContractAddressOfToken)(tokenInfo) || '0x0000000000000000000000000000000000000000'; // FOR Ethereum: use null address
35
+
36
+ if (tokenContract !== '0x0000000000000000000000000000000000000000') {
37
+ throw new Error('Only native token transfer is supported');
38
+ }
39
+
40
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
41
+ const transferCall = polygonBridgeContract.methods.bridgeAsset(destinationNetwork, recipientAddress, value, tokenContract, true, '0x');
42
+ const transferEncodedCall = transferCall.encodeABI();
43
+ const priority = await (0, _utils3.calculateGasFeeParams)(evmApi, evmApi.chainSlug);
44
+ const transactionConfig = {
45
+ from: sender,
46
+ to: polygonBridgeContractAddress,
47
+ value: value,
48
+ data: transferEncodedCall,
49
+ gasPrice: priority.gasPrice,
50
+ maxFeePerGas: priority === null || priority === void 0 ? void 0 : (_priority$maxFeePerGa = priority.maxFeePerGas) === null || _priority$maxFeePerGa === void 0 ? void 0 : _priority$maxFeePerGa.toString(),
51
+ maxPriorityFeePerGas: priority === null || priority === void 0 ? void 0 : (_priority$maxPriority = priority.maxPriorityFeePerGas) === null || _priority$maxPriority === void 0 ? void 0 : _priority$maxPriority.toString()
52
+ };
53
+ const gasLimit = await evmApi.api.eth.estimateGas(transactionConfig).catch(() => 200000);
54
+ transactionConfig.gas = gasLimit.toString();
55
+ return transactionConfig;
56
+ }
57
+ async function _createPolygonBridgeL1toL2Extrinsic(tokenInfo, originChainInfo, sender, recipientAddress, value, evmApi) {
58
+ return createPolygonBridgeTransaction(tokenInfo, originChainInfo, sender, recipientAddress, value, 1, evmApi);
59
+ }
60
+ async function _createPolygonBridgeL2toL1Extrinsic(tokenInfo, originChainInfo, sender, recipientAddress, value, evmApi) {
61
+ return createPolygonBridgeTransaction(tokenInfo, originChainInfo, sender, recipientAddress, value, 0, evmApi);
62
+ }
63
+ async function getClaimPolygonBridge(chainSlug, notification, evmApi) {
64
+ var _priority$maxFeePerGa2, _priority$maxPriority2;
65
+ const polygonBridgeContractAddress = (0, _utils.getPolygonBridgeContract)(chainSlug);
66
+ const polygonBridgeContract = (0, _web.getWeb3Contract)(polygonBridgeContractAddress, evmApi, _utils._POLYGON_BRIDGE_ABI);
67
+ const metadata = notification.metadata;
68
+ const isTestnet = chainSlug === _chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA;
69
+ const proofDomain = isTestnet ? POLYGON_PROOF_INDEXER.TESTNET : POLYGON_PROOF_INDEXER.MAINNET;
70
+ const proofResponse = await fetch(`${proofDomain}?networkId=${metadata.sourceNetwork}&depositCount=${metadata.counter}`).then(res => res.json());
71
+ const proof = proofResponse.proof;
72
+
73
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
74
+ const transferCall = polygonBridgeContract.methods.claimAsset(proof.merkle_proof, proof.rollup_merkle_proof, metadata.counter, proof.main_exit_root, proof.rollup_exit_root, metadata.originTokenNetwork, metadata.originTokenAddress, metadata.destinationNetwork, metadata.receiver, metadata.amounts[0], '0x');
75
+ const transferEncodedCall = transferCall.encodeABI();
76
+ const priority = await (0, _utils3.calculateGasFeeParams)(evmApi, evmApi.chainSlug);
77
+ const transactionConfig = {
78
+ from: metadata.userAddress,
79
+ to: polygonBridgeContractAddress,
80
+ value: '0',
81
+ data: transferEncodedCall,
82
+ gasPrice: priority.gasPrice,
83
+ maxFeePerGas: (_priority$maxFeePerGa2 = priority.maxFeePerGas) === null || _priority$maxFeePerGa2 === void 0 ? void 0 : _priority$maxFeePerGa2.toString(),
84
+ maxPriorityFeePerGas: (_priority$maxPriority2 = priority.maxPriorityFeePerGas) === null || _priority$maxPriority2 === void 0 ? void 0 : _priority$maxPriority2.toString()
85
+ };
86
+ const gasLimit = await evmApi.api.eth.estimateGas(transactionConfig).catch(() => 200000);
87
+ transactionConfig.gas = gasLimit.toString();
88
+ return transactionConfig;
89
+ }
90
+ async function isClaimedPolygonBridge(chainSlug, counter, sourceNetwork, evmApi) {
91
+ const polygonBridgeContractAddress = (0, _utils.getPolygonBridgeContract)(chainSlug);
92
+ const polygonBridgeContract = (0, _web.getWeb3Contract)(polygonBridgeContractAddress, evmApi, _utils._POLYGON_BRIDGE_ABI);
93
+
94
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-member-access
95
+ return await polygonBridgeContract.methods.isClaimed(counter, sourceNetwork).call();
96
+ }
97
+ function _isPolygonChainBridge(srcChain, destChain) {
98
+ if (srcChain === 'polygonzkEvm_cardona' && destChain === _chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA) {
99
+ return true;
100
+ } else if (srcChain === _chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA && destChain === 'polygonzkEvm_cardona') {
101
+ return true;
102
+ } else if (srcChain === 'polygonZkEvm' && destChain === _chainList.COMMON_CHAIN_SLUGS.ETHEREUM) {
103
+ return true;
104
+ } else if (srcChain === _chainList.COMMON_CHAIN_SLUGS.ETHEREUM && destChain === 'polygonZkEvm') {
105
+ return true;
106
+ }
107
+ return false;
108
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.LATEST_CHAIN_PATCH_FETCHING_INTERVAL = void 0;
7
+ exports.md5HashChainAsset = md5HashChainAsset;
8
+ exports.md5HashChainInfo = md5HashChainInfo;
9
+ var _tsMd = require("ts-md5");
10
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
11
+ // SPDX-License-Identifier: Apache-2.0
12
+
13
+ const LATEST_CHAIN_PATCH_FETCHING_INTERVAL = 180000;
14
+ exports.LATEST_CHAIN_PATCH_FETCHING_INTERVAL = LATEST_CHAIN_PATCH_FETCHING_INTERVAL;
15
+ function md5HashChainInfo(data) {
16
+ // todo: use from chain list package later
17
+ const {
18
+ chainStatus,
19
+ icon,
20
+ providers,
21
+ ...chainBaseInfo
22
+ } = data;
23
+ return _tsMd.Md5.hashStr(JSON.stringify(chainBaseInfo));
24
+ }
25
+ function md5HashChainAsset(data) {
26
+ // todo: use from chain list package later
27
+ const {
28
+ icon,
29
+ ...assetBaseInfo
30
+ } = data;
31
+ return _tsMd.Md5.hashStr(JSON.stringify(assetBaseInfo));
32
+ }
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ChainOnlineService = void 0;
7
+ var _chainList = require("@subwallet/chain-list");
8
+ var _constants = require("@subwallet/extension-base/services/chain-online-service/constants");
9
+ var _chainService = require("@subwallet/extension-base/services/chain-service");
10
+ var _types = require("@subwallet/extension-base/services/chain-service/types");
11
+ var _utils = require("@subwallet/extension-base/services/chain-service/utils");
12
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
13
+ // SPDX-License-Identifier: Apache-2.0
14
+
15
+ class ChainOnlineService {
16
+ constructor(chainService, settingService, eventService, dbService) {
17
+ this.chainService = chainService;
18
+ this.settingService = settingService;
19
+ this.eventService = eventService;
20
+ this.dbService = dbService;
21
+ this.firstApplied = false;
22
+ }
23
+ validatePatchWithHash(latestPatch) {
24
+ const {
25
+ ChainAsset,
26
+ ChainAssetHashMap,
27
+ ChainInfo,
28
+ ChainInfoHashMap
29
+ } = latestPatch;
30
+ for (const [chainSlug, chain] of Object.entries(ChainInfo)) {
31
+ if ((0, _constants.md5HashChainInfo)(chain) !== ChainInfoHashMap[chainSlug]) {
32
+ return false;
33
+ }
34
+ }
35
+ for (const [assetSlug, asset] of Object.entries(ChainAsset)) {
36
+ if ((0, _constants.md5HashChainAsset)(asset) !== ChainAssetHashMap[assetSlug]) {
37
+ return false;
38
+ }
39
+ }
40
+ return true;
41
+ }
42
+ validatePatchBeforeStore(candidateChainInfoMap, candidateAssetRegistry, latestPatch) {
43
+ for (const [chainSlug, chainHash] of Object.entries(latestPatch.ChainInfoHashMap)) {
44
+ if ((0, _constants.md5HashChainInfo)(candidateChainInfoMap[chainSlug]) !== chainHash) {
45
+ return false;
46
+ }
47
+ }
48
+ for (const [assetSlug, assetHash] of Object.entries(latestPatch.ChainAssetHashMap)) {
49
+ if (!candidateAssetRegistry[assetSlug]) {
50
+ if (!latestPatch.ChainInfo[assetSlug]) {
51
+ // assets are not existed in case chain is removed
52
+ continue;
53
+ }
54
+ return false;
55
+ }
56
+ if ((0, _constants.md5HashChainAsset)(candidateAssetRegistry[assetSlug]) !== assetHash) {
57
+ return false;
58
+ }
59
+ }
60
+ return true;
61
+ }
62
+ async handleLatestPatch(latestPatch) {
63
+ try {
64
+ var _await$this$settingSe;
65
+ // 1. validate fetch data with its hash
66
+ const isSafePatch = this.validatePatchWithHash(latestPatch);
67
+ const {
68
+ AssetLogoMap: latestAssetLogoMap,
69
+ ChainAsset: latestAssetInfo,
70
+ ChainInfo: latestChainInfo,
71
+ ChainLogoMap: latestChainLogoMap,
72
+ patchVersion: latestPatchVersion
73
+ } = latestPatch;
74
+ const currentPatchVersion = ((_await$this$settingSe = await this.settingService.getChainlistSetting()) === null || _await$this$settingSe === void 0 ? void 0 : _await$this$settingSe.patchVersion) || '';
75
+ const oldChainInfoMap = structuredClone(this.chainService.getChainInfoMap());
76
+ const oldAssetRegistry = structuredClone(this.chainService.getAssetRegistry());
77
+ let chainInfoMap = structuredClone(this.chainService.getChainInfoMap());
78
+ let assetRegistry = structuredClone(this.chainService.getAssetRegistry());
79
+ const currentChainStateMap = structuredClone(this.chainService.getChainStateMap());
80
+ const currentChainStatusMap = structuredClone(this.chainService.getChainStatusMap());
81
+ let addedChain = [];
82
+ if (isSafePatch && (!this.firstApplied || currentPatchVersion !== latestPatchVersion)) {
83
+ this.firstApplied = true;
84
+
85
+ // 2. merge data map
86
+ if (latestChainInfo && Object.keys(latestChainInfo).length > 0) {
87
+ chainInfoMap = Object.assign({}, oldChainInfoMap, latestChainInfo);
88
+ const [currentChainStateKey, newChainKey] = [Object.keys(currentChainStateMap), Object.keys(chainInfoMap)];
89
+ addedChain = newChainKey.filter(chain => !currentChainStateKey.includes(chain));
90
+ addedChain.forEach(key => {
91
+ currentChainStateMap[key] = {
92
+ active: false,
93
+ currentProvider: (0, _utils.randomizeProvider)(chainInfoMap[key].providers).providerKey,
94
+ manualTurnOff: false,
95
+ slug: key
96
+ };
97
+ currentChainStatusMap[key] = {
98
+ slug: key,
99
+ connectionStatus: _types._ChainConnectionStatus.DISCONNECTED,
100
+ lastUpdated: Date.now()
101
+ };
102
+ });
103
+ }
104
+ if (latestAssetInfo && Object.keys(latestAssetInfo).length > 0) {
105
+ assetRegistry = (0, _chainService.filterAssetInfoMap)(oldChainInfoMap, Object.assign({}, oldAssetRegistry, latestAssetInfo), addedChain);
106
+ }
107
+
108
+ // 3. validate data before write
109
+ const isCorrectPatch = this.validatePatchBeforeStore(chainInfoMap, assetRegistry, latestPatch);
110
+
111
+ // 4. write to subject
112
+ if (isCorrectPatch) {
113
+ this.chainService.setChainInfoMap(chainInfoMap);
114
+ this.chainService.subscribeChainInfoMap().next(chainInfoMap);
115
+ this.chainService.setAssetRegistry(assetRegistry);
116
+ this.chainService.subscribeAssetRegistry().next(assetRegistry);
117
+ this.chainService.autoEnableTokens().then(() => {
118
+ this.eventService.emit('asset.updateState', '');
119
+ }).catch(console.error);
120
+ this.chainService.setChainStateMap(currentChainStateMap);
121
+ this.chainService.subscribeChainStateMap().next(currentChainStateMap);
122
+ this.chainService.subscribeChainStatusMap().next(currentChainStatusMap);
123
+ const storedChainInfoList = Object.keys(chainInfoMap).map(chainSlug => {
124
+ return {
125
+ ...chainInfoMap[chainSlug],
126
+ ...currentChainStateMap[chainSlug]
127
+ };
128
+ });
129
+ await this.dbService.bulkUpdateChainStore(storedChainInfoList);
130
+ const addedAssets = [];
131
+
132
+ // todo: the stored asset is lack of adding new assets and edited assets of old chain, update to tracking exactly updated assets from patch online.
133
+ Object.entries(assetRegistry).forEach(_ref => {
134
+ let [slug, asset] = _ref;
135
+ if (addedChain.includes(asset.originChain)) {
136
+ addedAssets.push(asset);
137
+ }
138
+ });
139
+ await this.dbService.bulkUpdateAssetsStore(addedAssets);
140
+ if (latestChainLogoMap) {
141
+ const logoMap = Object.assign({}, _chainList.ChainLogoMap, latestChainLogoMap);
142
+ this.chainService.subscribeChainLogoMap().next(logoMap);
143
+ }
144
+ if (latestAssetLogoMap) {
145
+ const logoMap = Object.assign({}, _chainList.AssetLogoMap, latestAssetLogoMap);
146
+ this.chainService.subscribeAssetLogoMap().next(logoMap);
147
+ }
148
+ this.settingService.setChainlist({
149
+ patchVersion: latestPatchVersion
150
+ });
151
+ }
152
+ }
153
+ } catch (e) {
154
+ console.error('Error fetching latest patch data');
155
+ }
156
+ }
157
+ async fetchLatestPatchData() {
158
+ return await (0, _utils.fetchPatchData)();
159
+ }
160
+ handleLatestPatchData() {
161
+ this.fetchLatestPatchData().then(latestPatch => {
162
+ return new Promise(resolve => {
163
+ if (latestPatch && !this.chainService.getlockChainInfoMap()) {
164
+ this.eventService.waitAssetReady.then(() => {
165
+ this.chainService.setLockChainInfoMap(true);
166
+ this.handleLatestPatch(latestPatch).then(() => this.chainService.setLockChainInfoMap(false)).catch(e => {
167
+ this.chainService.setLockChainInfoMap(false);
168
+ console.error('Error update latest patch', e);
169
+ }).finally(resolve);
170
+ }).catch(e => {
171
+ console.error('Asset fail to ready', e);
172
+ resolve();
173
+ });
174
+ } else {
175
+ resolve();
176
+ }
177
+ });
178
+ }).catch(e => {
179
+ console.error('Error get latest patch or data map is locking', e);
180
+ }).finally(() => {
181
+ this.eventService.emit('asset.online.ready', true);
182
+ });
183
+ }
184
+ checkLatestData() {
185
+ clearInterval(this.refreshLatestChainDataTimeOut);
186
+ this.handleLatestPatchData();
187
+ this.refreshLatestChainDataTimeOut = setInterval(this.handleLatestPatchData.bind(this), _constants.LATEST_CHAIN_PATCH_FETCHING_INTERVAL);
188
+ }
189
+ }
190
+ exports.ChainOnlineService = ChainOnlineService;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports._ZK_ASSET_PREFIX = exports._XCM_TYPE = exports._XCM_CHAIN_GROUP = exports._TRANSFER_NOT_SUPPORTED_CHAINS = exports._TRANSFER_CHAIN_GROUP = exports._SUBSTRATE_DEFAULT_INFLATION_PARAMS = exports._STAKING_ERA_LENGTH_MAP = exports._PURE_EVM_CHAINS = exports._PREDEFINED_SINGLE_MODES = exports._PARACHAIN_INFLATION_DISTRIBUTION = exports._NFT_CHAIN_GROUP = exports._MULTI_CHAIN_ASSET_SRC = exports._MANTA_ZK_CHAIN_GROUP = exports._KNOWN_CHAIN_INFLATION_PARAMS = exports._EXPECTED_BLOCK_TIME = exports._DEFAULT_MANTA_ZK_CHAIN = exports._DEFAULT_ACTIVE_CHAINS = exports._CHAIN_LOGO_MAP_SRC = exports._CHAIN_INFO_SRC = exports._CHAIN_ASSET_SRC = exports._BALANCE_TOKEN_GROUP = exports._BALANCE_PARSING_CHAIN_GROUP = exports._BALANCE_CHAIN_GROUP = exports._ASSET_REF_SRC = exports._ASSET_LOGO_MAP_SRC = exports._API_OPTIONS_CHAIN_GROUP = exports.LATEST_CHAIN_DATA_FETCHING_INTERVAL = exports.EVM_REFORMAT_DECIMALS = exports.EVM_PASS_CONNECT_STATUS = exports.API_MAX_RETRY = exports.API_CONNECT_TIMEOUT = exports.API_AUTO_CONNECT_MS = void 0;
6
+ exports._ZK_ASSET_PREFIX = exports._XCM_TYPE = exports._XCM_CHAIN_GROUP = exports._TRANSFER_NOT_SUPPORTED_CHAINS = exports._TRANSFER_CHAIN_GROUP = exports._SUBSTRATE_DEFAULT_INFLATION_PARAMS = exports._STAKING_ERA_LENGTH_MAP = exports._PURE_EVM_CHAINS = exports._PREDEFINED_SINGLE_MODES = exports._PARACHAIN_INFLATION_DISTRIBUTION = exports._NFT_CHAIN_GROUP = exports._MULTI_CHAIN_ASSET_SRC = exports._MANTA_ZK_CHAIN_GROUP = exports._KNOWN_CHAIN_INFLATION_PARAMS = exports._EXPECTED_BLOCK_TIME = exports._DEFAULT_MANTA_ZK_CHAIN = exports._DEFAULT_ACTIVE_CHAINS = exports._CHAIN_LOGO_MAP_SRC = exports._CHAIN_INFO_SRC = exports._CHAIN_ASSET_SRC = exports._BALANCE_TOKEN_GROUP = exports._BALANCE_PARSING_CHAIN_GROUP = exports._BALANCE_CHAIN_GROUP = exports._ASSET_REF_SRC = exports._ASSET_LOGO_MAP_SRC = exports._API_OPTIONS_CHAIN_GROUP = exports.SUFFICIENT_CHAIN = exports.LATEST_CHAIN_DATA_FETCHING_INTERVAL = exports.EVM_REFORMAT_DECIMALS = exports.EVM_PASS_CONNECT_STATUS = exports.API_MAX_RETRY = exports.API_CONNECT_TIMEOUT = exports.API_AUTO_CONNECT_MS = void 0;
7
7
  var _chainList = require("@subwallet/chain-list");
8
8
  var _types = require("@subwallet/chain-list/types");
9
9
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
@@ -292,6 +292,8 @@ const _XCM_CHAIN_GROUP = {
292
292
  // default is xTokens pallet
293
293
  };
294
294
  exports._XCM_CHAIN_GROUP = _XCM_CHAIN_GROUP;
295
+ const SUFFICIENT_CHAIN = ['astar', 'calamari', 'parallel', 'darwinia2', 'crabParachain', 'pangolin', 'statemint', 'moonriver', 'shiden', 'moonbeam', 'statemine', 'liberland', 'dentnet', 'phala', 'crust', 'dbcchain', 'rococo_assethub'];
296
+ exports.SUFFICIENT_CHAIN = SUFFICIENT_CHAIN;
295
297
  const _XCM_TYPE = {
296
298
  RP: `${_types._SubstrateChainType.RELAYCHAIN}-${_types._SubstrateChainType.PARACHAIN}`,
297
299
  // DMP