@subwallet/extension-base 1.3.6-1 → 1.3.8-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 (132) hide show
  1. package/background/KoniTypes.d.ts +20 -5
  2. package/background/KoniTypes.js +1 -1
  3. package/cjs/background/KoniTypes.js +1 -1
  4. package/cjs/constants/blocked-actions.js +108 -0
  5. package/cjs/constants/index.js +4 -4
  6. package/cjs/core/substrate/xcm-parser.js +20 -5
  7. package/cjs/koni/api/contract-handler/utils/index.js +15 -1
  8. package/cjs/koni/api/nft/config.js +6 -4
  9. package/cjs/koni/api/nft/index.js +9 -0
  10. package/cjs/koni/api/nft/story_odyssey_nft/index.js +126 -0
  11. package/cjs/koni/background/handlers/Extension.js +64 -4
  12. package/cjs/koni/background/handlers/State.js +23 -2
  13. package/cjs/packageInfo.js +1 -1
  14. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +2 -1
  15. package/cjs/services/balance-service/transfer/xcm/index.js +31 -1
  16. package/cjs/services/balance-service/transfer/xcm/polygonBridge.js +108 -0
  17. package/cjs/services/chain-online-service/constants.js +32 -0
  18. package/cjs/services/chain-online-service/index.js +190 -0
  19. package/cjs/services/chain-service/constants.js +2 -1
  20. package/cjs/services/chain-service/index.js +87 -127
  21. package/cjs/services/chain-service/utils/index.js +0 -2
  22. package/cjs/services/chain-service/utils/patch.js +7 -3
  23. package/cjs/services/earning-service/handlers/native-staking/para-chain.js +20 -17
  24. package/cjs/services/environment-service/stores/Environment.js +19 -0
  25. package/cjs/services/fee-service/utils/index.js +14 -0
  26. package/cjs/services/inapp-notification-service/consts.js +6 -4
  27. package/cjs/services/inapp-notification-service/index.js +110 -6
  28. package/cjs/services/inapp-notification-service/interfaces.js +9 -1
  29. package/cjs/services/inapp-notification-service/utils/avail.js +88 -0
  30. package/cjs/services/inapp-notification-service/{utils.js → utils/common.js} +1 -84
  31. package/cjs/services/inapp-notification-service/utils/index.js +38 -0
  32. package/cjs/services/inapp-notification-service/utils/polygon.js +66 -0
  33. package/cjs/services/migration-service/scripts/MigrateTransactionHistoryBridge.js +37 -0
  34. package/cjs/services/migration-service/scripts/index.js +3 -1
  35. package/cjs/services/setting-service/SettingService.js +21 -0
  36. package/cjs/services/setting-service/constants.js +2 -1
  37. package/cjs/services/storage-service/DatabaseService.js +3 -0
  38. package/cjs/services/transaction-service/index.js +13 -7
  39. package/cjs/services/transaction-service/utils.js +3 -0
  40. package/cjs/stores/ChainlistStore.js +18 -0
  41. package/cjs/stores/EnvironmentStore.js +18 -0
  42. package/cjs/stores/index.js +8 -1
  43. package/cjs/types/index.js +11 -0
  44. package/cjs/utils/account/transform.js +1 -1
  45. package/cjs/utils/environment.js +15 -1
  46. package/cjs/utils/staticData/index.js +7 -2
  47. package/constants/blocked-actions.d.ts +29 -0
  48. package/constants/blocked-actions.js +96 -0
  49. package/constants/index.d.ts +1 -1
  50. package/constants/index.js +1 -1
  51. package/core/substrate/xcm-parser.d.ts +2 -1
  52. package/core/substrate/xcm-parser.js +19 -5
  53. package/koni/api/contract-handler/utils/index.d.ts +2 -0
  54. package/koni/api/contract-handler/utils/index.js +12 -0
  55. package/koni/api/contract-handler/utils/polygon_bridge_abi.json +1004 -0
  56. package/koni/api/nft/config.d.ts +1 -1
  57. package/koni/api/nft/config.js +5 -2
  58. package/koni/api/nft/index.js +9 -0
  59. package/koni/api/nft/story_odyssey_nft/index.d.ts +40 -0
  60. package/koni/api/nft/story_odyssey_nft/index.js +119 -0
  61. package/koni/background/handlers/Extension.d.ts +5 -0
  62. package/koni/background/handlers/Extension.js +65 -5
  63. package/koni/background/handlers/State.d.ts +5 -0
  64. package/koni/background/handlers/State.js +23 -2
  65. package/package.json +76 -18
  66. package/packageInfo.js +1 -1
  67. package/services/balance-service/helpers/subscribe/substrate/index.js +2 -1
  68. package/services/balance-service/transfer/xcm/index.d.ts +1 -0
  69. package/services/balance-service/transfer/xcm/index.js +29 -1
  70. package/services/balance-service/transfer/xcm/polygonBridge.d.ts +22 -0
  71. package/services/balance-service/transfer/xcm/polygonBridge.js +95 -0
  72. package/services/chain-online-service/constants.d.ts +4 -0
  73. package/services/chain-online-service/constants.js +23 -0
  74. package/services/chain-online-service/index.d.ts +22 -0
  75. package/services/chain-online-service/index.js +182 -0
  76. package/services/chain-service/constants.d.ts +1 -0
  77. package/services/chain-service/constants.js +2 -1
  78. package/services/chain-service/index.d.ts +6 -7
  79. package/services/chain-service/index.js +78 -116
  80. package/services/chain-service/utils/index.js +0 -2
  81. package/services/chain-service/utils/patch.d.ts +16 -1
  82. package/services/chain-service/utils/patch.js +7 -3
  83. package/services/earning-service/handlers/native-staking/para-chain.js +20 -17
  84. package/services/environment-service/stores/Environment.d.ts +10 -0
  85. package/services/environment-service/stores/Environment.js +12 -0
  86. package/services/fee-service/utils/index.js +14 -0
  87. package/services/inapp-notification-service/consts.d.ts +3 -1
  88. package/services/inapp-notification-service/consts.js +6 -4
  89. package/services/inapp-notification-service/index.d.ts +10 -2
  90. package/services/inapp-notification-service/index.js +111 -7
  91. package/services/inapp-notification-service/interfaces.d.ts +27 -3
  92. package/services/inapp-notification-service/interfaces.js +7 -0
  93. package/services/inapp-notification-service/utils/avail.d.ts +40 -0
  94. package/services/inapp-notification-service/utils/avail.js +73 -0
  95. package/services/inapp-notification-service/utils/common.d.ts +11 -0
  96. package/services/inapp-notification-service/{utils.js → utils/common.js} +1 -72
  97. package/services/inapp-notification-service/utils/index.d.ts +3 -0
  98. package/services/inapp-notification-service/utils/index.js +6 -0
  99. package/services/inapp-notification-service/utils/polygon.d.ts +71 -0
  100. package/services/inapp-notification-service/utils/polygon.js +54 -0
  101. package/services/migration-service/scripts/MigrateTransactionHistoryBridge.d.ts +4 -0
  102. package/services/migration-service/scripts/MigrateTransactionHistoryBridge.js +29 -0
  103. package/services/migration-service/scripts/index.js +3 -1
  104. package/services/setting-service/SettingService.d.ts +9 -0
  105. package/services/setting-service/SettingService.js +21 -0
  106. package/services/setting-service/constants.js +2 -1
  107. package/services/storage-service/DatabaseService.d.ts +1 -0
  108. package/services/storage-service/DatabaseService.js +3 -0
  109. package/services/transaction-service/index.js +14 -8
  110. package/services/transaction-service/utils.js +3 -0
  111. package/stores/ChainlistStore.d.ts +7 -0
  112. package/stores/ChainlistStore.js +10 -0
  113. package/stores/EnvironmentStore.d.ts +5 -0
  114. package/stores/EnvironmentStore.js +10 -0
  115. package/stores/index.d.ts +1 -0
  116. package/stores/index.js +2 -1
  117. package/types/{avail-bridge → bridge}/index.d.ts +1 -1
  118. package/types/index.d.ts +1 -0
  119. package/types/index.js +1 -0
  120. package/types/notification/index.d.ts +5 -0
  121. package/utils/account/transform.js +1 -1
  122. package/utils/environment.d.ts +6 -0
  123. package/utils/environment.js +8 -0
  124. package/utils/staticData/blockedActions.json +1 -0
  125. package/utils/staticData/index.d.ts +7 -3
  126. package/utils/staticData/index.js +5 -1
  127. package/cjs/constants/blocked-actions-list.js +0 -14
  128. package/constants/blocked-actions-list.d.ts +0 -7
  129. package/constants/blocked-actions-list.js +0 -7
  130. package/services/inapp-notification-service/utils.d.ts +0 -55
  131. /package/cjs/types/{avail-bridge → bridge}/index.js +0 -0
  132. /package/types/{avail-bridge → bridge}/index.js +0 -0
@@ -11,7 +11,7 @@ export declare const BIT_AVATAR_API = "https://api.bitavatar.io/v1";
11
11
  export declare const BIT_COUNTRY_LAND_ESTATE_METADATA_API = "https://pioneer-api.bit.country/metadata/landTokenUriPioneer";
12
12
  export declare const BIT_COUNTRY_THUMBNAIL_RESOLVER = "https://res.cloudinary.com/ddftctzph/image/upload/c_scale,q_100,w_250/production-ipfs/asset/";
13
13
  export declare const CF_IPFS_GATEWAY = "https://cf-ipfs.com/ipfs/";
14
- export declare const PINATA_IPFS_GATEWAY = "https://gateway.pinata.cloud/ipfs/";
14
+ export declare const ODYSSEY_ENDPOINT = "https://indexer-v2.dev.aurascan.io/api/v2/graphql";
15
15
  export declare const VARA_SCAN_ENDPOINT = "https://nft-explorer.vara-network.io/graphql";
16
16
  export declare const AVAIL_LIGHT_CLIENT_NFT = "https://indexer.availspace.app/graphql";
17
17
  export declare const UNIQUE_SCAN_ENDPOINT = "https://api-unique.uniquescan.io/v1/graphql";
@@ -20,7 +20,7 @@ export const BIT_COUNTRY_THUMBNAIL_RESOLVER = 'https://res.cloudinary.com/ddftct
20
20
  export const CF_IPFS_GATEWAY = 'https://cf-ipfs.com/ipfs/';
21
21
 
22
22
  // XOrigin
23
- export const PINATA_IPFS_GATEWAY = 'https://gateway.pinata.cloud/ipfs/';
23
+ export const ODYSSEY_ENDPOINT = 'https://indexer-v2.dev.aurascan.io/api/v2/graphql';
24
24
 
25
25
  // deprecated
26
26
  // export const UNIQUE_SCAN_ENDPOINT = 'https://explorer-api.unique.network/v1/graphql';
@@ -54,6 +54,9 @@ export const TERNOA_MAINNET_CLIENT_NFT = 'https://indexer-mainnet.ternoa.dev';
54
54
  export const TERNOA_ALPHANET_CLIENT_NFT = 'https://indexer-alphanet.ternoa.dev';
55
55
  export const TERNOA_MAINNET_GATEWAY = 'https://ipfs-mainnet.trnnfr.com/ipfs/';
56
56
  export const TERNOA_ALPHANET_GATEWAY = 'https://ipfs-dev.trnnfr.com/ipfs/';
57
+
58
+ // XOrigin
59
+
57
60
  export const IPFS_GATEWAY_4EVERLAND = 'https://4everland.io/ipfs/';
58
61
  export const IPFS_FLEEK = 'https://ipfs.fleek.co/ipfs/';
59
62
  export const W3S_IPFS = 'https://w3s.link/ipfs/'; // 400
@@ -82,7 +85,7 @@ export let SUPPORTED_TRANSFER_EVM_CHAIN_NAME;
82
85
  SUPPORTED_TRANSFER_EVM_CHAIN_NAME["shibuya"] = "shibuya";
83
86
  })(SUPPORTED_TRANSFER_EVM_CHAIN_NAME || (SUPPORTED_TRANSFER_EVM_CHAIN_NAME = {}));
84
87
  export const SUPPORTED_TRANSFER_EVM_CHAIN = [SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonbase, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonbeam, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonriver, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.astarEvm, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.shiden, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.shibuya];
85
- export const UNSUPPORTED_TRANSFER_EVM_CHAIN_NAME = ['unique_evm', 'rari'];
88
+ export const UNSUPPORTED_TRANSFER_EVM_CHAIN_NAME = ['unique_evm', 'rari', 'storyOdyssey_testnet'];
86
89
  export const TRANSFER_CHAIN_ID = {
87
90
  [SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonbase]: 1287,
88
91
  [SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonbeam]: 1284,
@@ -18,6 +18,7 @@ import { _isChainSupportEvmNft, _isChainSupportNativeNft, _isChainSupportWasmNft
18
18
  import { categoryAddresses, targetIsWeb } from '@subwallet/extension-base/utils';
19
19
  import AssetHubNftsPalletApi from "./assethub_nft/index.js";
20
20
  import { RariNftApi } from "./rari/index.js";
21
+ import { OdysseyNftApi } from "./story_odyssey_nft/index.js";
21
22
  import { TernoaNftApi } from "./ternoa_nft/index.js";
22
23
  function createSubstrateNftApi(chain, substrateApi, addresses) {
23
24
  const {
@@ -48,6 +49,8 @@ function createSubstrateNftApi(chain, substrateApi, addresses) {
48
49
  return [new TernoaNftApi(substrateApi, substrateAddresses, chain)];
49
50
  } else if (_NFT_CHAIN_GROUP.rari.includes(chain)) {
50
51
  return [new RariNftApi(chain, evmAddresses)];
52
+ } else if (_NFT_CHAIN_GROUP.story_odyssey.includes(chain)) {
53
+ return [new OdysseyNftApi(chain, evmAddresses)];
51
54
  }
52
55
  return null;
53
56
  }
@@ -157,6 +160,12 @@ export class NftHandler {
157
160
  this.handlers.push(...handlers);
158
161
  }
159
162
  }
163
+ if (chain === 'storyOdyssey_testnet') {
164
+ const handlers = createSubstrateNftApi(chain, null, evmAddresses);
165
+ if (handlers && !!handlers.length) {
166
+ this.handlers.push(...handlers);
167
+ }
168
+ }
160
169
  if (_isChainSupportWasmNft(chainInfo)) {
161
170
  if (this.substrateApiMap[chain]) {
162
171
  const handler = createWasmNftApi(chain, this.substrateApiMap[chain], substrateAddresses);
@@ -0,0 +1,40 @@
1
+ import { BaseNftApi, HandleNftParams } from '../nft';
2
+ interface OdysseyTokenMetadata {
3
+ name: string;
4
+ image: string;
5
+ description: string;
6
+ }
7
+ interface OdysseyNftInfo {
8
+ onchain: {
9
+ metadata: OdysseyTokenMetadata;
10
+ token_uri: string;
11
+ };
12
+ offchain: {
13
+ image: {
14
+ url: string;
15
+ content_type: string;
16
+ };
17
+ animation?: object;
18
+ };
19
+ }
20
+ interface OdysseyToken {
21
+ owner: string;
22
+ token_id: string;
23
+ media_info: OdysseyNftInfo;
24
+ erc721_contract_address: string;
25
+ }
26
+ export declare class OdysseyNftApi extends BaseNftApi {
27
+ constructor(chain: string, addresses: string[]);
28
+ endpoint: string;
29
+ private static parseNftRequest;
30
+ private fetchNftData;
31
+ private fetchUrlMetadata;
32
+ private parseUrlIfIpfs;
33
+ private parseNftItem;
34
+ private parseNftCollection;
35
+ private processNftItem;
36
+ handleNfts(params: HandleNftParams): Promise<void>;
37
+ fetchNftsWithDetail(address: string): Promise<OdysseyToken[] | null>;
38
+ fetchNfts(params: HandleNftParams): Promise<0 | 1>;
39
+ }
40
+ export {};
@@ -0,0 +1,119 @@
1
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { ODYSSEY_ENDPOINT } from "../config.js";
5
+ import { BaseNftApi } from "../nft.js";
6
+ export class OdysseyNftApi extends BaseNftApi {
7
+ constructor(chain, addresses) {
8
+ super(chain, undefined, addresses);
9
+ }
10
+ endpoint = ODYSSEY_ENDPOINT;
11
+ static parseNftRequest(address) {
12
+ const lowerCaseAddress = address.toLowerCase();
13
+ return `
14
+ query MyQuery {
15
+ odyssey {
16
+ erc721_token(
17
+ where: {owner: {_eq: "${lowerCaseAddress}"}}
18
+ ) {
19
+ media_info
20
+ owner
21
+ token_id
22
+ erc721_contract_address
23
+ }
24
+ }
25
+ }
26
+ `;
27
+ }
28
+ async fetchNftData(query) {
29
+ try {
30
+ const response = await fetch(this.endpoint, {
31
+ method: 'POST',
32
+ headers: {
33
+ 'Content-Type': 'application/json'
34
+ },
35
+ body: JSON.stringify({
36
+ operationName: 'MyQuery',
37
+ variables: {},
38
+ query
39
+ })
40
+ });
41
+ const result = await response.json();
42
+ return result.data.odyssey.erc721_token;
43
+ } catch (err) {
44
+ console.error('Error:', err);
45
+ return null;
46
+ }
47
+ }
48
+ async fetchUrlMetadata(url) {
49
+ try {
50
+ const response = await fetch(url);
51
+ return await response.json();
52
+ } catch (err) {
53
+ console.error('Error:', err);
54
+ return null;
55
+ }
56
+ }
57
+ parseUrlIfIpfs(url) {
58
+ if (url.startsWith('ipfs://')) {
59
+ return this.parseUrl(url);
60
+ }
61
+ if (url.includes('github.com')) {
62
+ return `${url}?raw=true`;
63
+ }
64
+ return url;
65
+ }
66
+ parseNftItem(nft, metadata, address) {
67
+ var _metadata$media, _metadata$media$;
68
+ const urlMetadataImage = this.parseUrlIfIpfs((metadata === null || metadata === void 0 ? void 0 : metadata.image) || '');
69
+ return {
70
+ id: nft.token_id,
71
+ name: (metadata === null || metadata === void 0 ? void 0 : metadata.name) || (metadata === null || metadata === void 0 ? void 0 : metadata.title),
72
+ description: metadata === null || metadata === void 0 ? void 0 : metadata.description,
73
+ image: urlMetadataImage || (metadata === null || metadata === void 0 ? void 0 : (_metadata$media = metadata.media) === null || _metadata$media === void 0 ? void 0 : (_metadata$media$ = _metadata$media[0]) === null || _metadata$media$ === void 0 ? void 0 : _metadata$media$.url),
74
+ collectionId: nft.erc721_contract_address,
75
+ chain: this.chain,
76
+ owner: address
77
+ };
78
+ }
79
+ parseNftCollection(nft) {
80
+ const image = this.parseUrlIfIpfs(nft.media_info.onchain.metadata.image || '');
81
+ return {
82
+ collectionId: nft.erc721_contract_address,
83
+ chain: this.chain,
84
+ collectionName: nft.media_info.onchain.metadata.name,
85
+ image: image || undefined
86
+ };
87
+ }
88
+ async processNftItem(nft, address, params) {
89
+ const tokenUri = this.parseUrlIfIpfs(nft.media_info.onchain.token_uri) || '';
90
+ const urlMetadata = await this.fetchUrlMetadata(tokenUri);
91
+ const parsedNft = this.parseNftItem(nft, urlMetadata, address);
92
+ params.updateItem(this.chain, parsedNft, address);
93
+ const parsedCollection = this.parseNftCollection(nft);
94
+ params.updateCollection(this.chain, parsedCollection);
95
+ }
96
+ async handleNfts(params) {
97
+ await Promise.all(this.addresses.map(async address => {
98
+ const nftDetails = await this.fetchNftsWithDetail(address);
99
+ if (!nftDetails || nftDetails.length === 0) {
100
+ return;
101
+ }
102
+ await Promise.all(nftDetails.map(async nft => {
103
+ await this.processNftItem(nft, address, params);
104
+ }));
105
+ }));
106
+ }
107
+ async fetchNftsWithDetail(address) {
108
+ const query = OdysseyNftApi.parseNftRequest(address);
109
+ return await this.fetchNftData(query);
110
+ }
111
+ async fetchNfts(params) {
112
+ try {
113
+ await this.handleNfts(params);
114
+ } catch (e) {
115
+ return 0;
116
+ }
117
+ return 1;
118
+ }
119
+ }
@@ -196,6 +196,9 @@ export default class KoniExtension {
196
196
  private subscribeAssetLogoMap;
197
197
  private subscribeChainLogoMap;
198
198
  private passPhishingPage;
199
+ private saveAppConfig;
200
+ private saveBrowserConfig;
201
+ private saveOSConfig;
199
202
  private connectWalletConnect;
200
203
  private connectWCSubscribe;
201
204
  private approveWalletConnectSession;
@@ -254,6 +257,8 @@ export default class KoniExtension {
254
257
  private fetchInappNotifications;
255
258
  private getInappNotification;
256
259
  private submitClaimAvailBridge;
260
+ private getIsClaimedPolygonBridge;
261
+ private submitClaimPolygonBridge;
257
262
  private subscribeLedgerGenericAllowChains;
258
263
  handle<TMessageType extends MessageTypes>(id: string, type: TMessageType, request: RequestTypes[TMessageType], port: chrome.runtime.Port): Promise<ResponseType<TMessageType>>;
259
264
  }
@@ -26,8 +26,9 @@ import { isBounceableAddress } from '@subwallet/extension-base/services/balance-
26
26
  import { getERC20TransactionObject, getERC721Transaction, getEVMTransactionObject, getPSP34TransferExtrinsic } from '@subwallet/extension-base/services/balance-service/transfer/smart-contract';
27
27
  import { createTransferExtrinsic, getTransferMockTxFee } from '@subwallet/extension-base/services/balance-service/transfer/token';
28
28
  import { createTonTransaction } from '@subwallet/extension-base/services/balance-service/transfer/ton-transfer';
29
- import { createAvailBridgeExtrinsicFromAvail, createAvailBridgeTxFromEth, createSnowBridgeExtrinsic, createXcmExtrinsic, getXcmMockTxFee } from '@subwallet/extension-base/services/balance-service/transfer/xcm';
29
+ import { createAvailBridgeExtrinsicFromAvail, createAvailBridgeTxFromEth, createPolygonBridgeExtrinsic, createSnowBridgeExtrinsic, createXcmExtrinsic, getXcmMockTxFee } from '@subwallet/extension-base/services/balance-service/transfer/xcm';
30
30
  import { getClaimTxOnAvail, getClaimTxOnEthereum, isAvailChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge';
31
+ import { _isPolygonChainBridge, getClaimPolygonBridge, isClaimedPolygonBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge';
31
32
  import { _API_OPTIONS_CHAIN_GROUP, _DEFAULT_MANTA_ZK_CHAIN, _MANTA_ZK_CHAIN_GROUP, _ZK_ASSET_PREFIX } from '@subwallet/extension-base/services/chain-service/constants';
32
33
  import { _ChainConnectionStatus } from '@subwallet/extension-base/services/chain-service/types';
33
34
  import { _getAssetDecimals, _getAssetSymbol, _getChainNativeTokenBasicInfo, _getContractAddressOfToken, _getEvmChainId, _isAssetSmartContractNft, _isChainEvmCompatible, _isChainTonCompatible, _isCustomAsset, _isLocalToken, _isMantaZkAsset, _isNativeToken, _isPureEvmChain, _isTokenEvmSmartContract, _isTokenTransferredByEvm, _isTokenTransferredByTon } from '@subwallet/extension-base/services/chain-service/utils';
@@ -1255,6 +1256,7 @@ export default class KoniExtension {
1255
1256
  const isAvailBridgeFromEvm = _isPureEvmChain(chainInfoMap[originNetworkKey]) && isAvailChainBridge(destinationNetworkKey);
1256
1257
  const isAvailBridgeFromAvail = isAvailChainBridge(originNetworkKey) && _isPureEvmChain(chainInfoMap[destinationNetworkKey]);
1257
1258
  const isSnowBridgeEvmTransfer = _isPureEvmChain(chainInfoMap[originNetworkKey]) && _isSnowBridgeXcm(chainInfoMap[originNetworkKey], chainInfoMap[destinationNetworkKey]) && !isAvailBridgeFromEvm;
1259
+ const isPolygonBridgeTransfer = _isPolygonChainBridge(originNetworkKey, destinationNetworkKey);
1258
1260
  let additionalValidator;
1259
1261
  let eventsHandler;
1260
1262
  if (fromKeyPair && destinationTokenInfo) {
@@ -1271,7 +1273,9 @@ export default class KoniExtension {
1271
1273
  evmApi
1272
1274
  };
1273
1275
  let funcCreateExtrinsic;
1274
- if (isSnowBridgeEvmTransfer) {
1276
+ if (isPolygonBridgeTransfer) {
1277
+ funcCreateExtrinsic = createPolygonBridgeExtrinsic;
1278
+ } else if (isSnowBridgeEvmTransfer) {
1275
1279
  funcCreateExtrinsic = createSnowBridgeExtrinsic;
1276
1280
  } else if (isAvailBridgeFromEvm) {
1277
1281
  funcCreateExtrinsic = createAvailBridgeTxFromEth;
@@ -1336,7 +1340,7 @@ export default class KoniExtension {
1336
1340
  transaction: extrinsic,
1337
1341
  data: inputData,
1338
1342
  extrinsicType: ExtrinsicType.TRANSFER_XCM,
1339
- chainType: !isSnowBridgeEvmTransfer && !isAvailBridgeFromEvm ? ChainType.SUBSTRATE : ChainType.EVM,
1343
+ chainType: !isSnowBridgeEvmTransfer && !isAvailBridgeFromEvm && !isPolygonBridgeTransfer ? ChainType.SUBSTRATE : ChainType.EVM,
1340
1344
  transferNativeAmount: _isNativeToken(originTokenInfo) ? value : '0',
1341
1345
  ignoreWarnings,
1342
1346
  isTransferAll: transferAll,
@@ -2519,13 +2523,26 @@ export default class KoniExtension {
2519
2523
  }
2520
2524
 
2521
2525
  // Phishing detect
2522
-
2523
2526
  async passPhishingPage({
2524
2527
  url
2525
2528
  }) {
2526
2529
  return await this.#koniState.approvePassPhishingPage(url);
2527
2530
  }
2528
2531
 
2532
+ // Set environment config
2533
+ saveAppConfig(request) {
2534
+ this.#koniState.saveEnvConfig('appConfig', request.appConfig);
2535
+ return true;
2536
+ }
2537
+ saveBrowserConfig(request) {
2538
+ this.#koniState.saveEnvConfig('browserConfig', request.browserConfig);
2539
+ return true;
2540
+ }
2541
+ saveOSConfig(request) {
2542
+ this.#koniState.saveEnvConfig('osConfig', request.osConfig);
2543
+ return true;
2544
+ }
2545
+
2529
2546
  /// Wallet connect
2530
2547
 
2531
2548
  // Connect
@@ -3362,7 +3379,7 @@ export default class KoniExtension {
3362
3379
  chain,
3363
3380
  notification
3364
3381
  } = data;
3365
- const extrinsicType = ExtrinsicType.CLAIM_AVAIL_BRIDGE;
3382
+ const extrinsicType = ExtrinsicType.CLAIM_BRIDGE;
3366
3383
  let transaction = null;
3367
3384
  let chainType;
3368
3385
  if (isSubstrateAddress(address)) {
@@ -3383,6 +3400,32 @@ export default class KoniExtension {
3383
3400
  chainType
3384
3401
  });
3385
3402
  }
3403
+ async getIsClaimedPolygonBridge(data) {
3404
+ const evmApi = this.#koniState.getEvmApi(data.chainslug);
3405
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
3406
+ const isClaimed = await isClaimedPolygonBridge(data.chainslug, data.counter, data.sourceNetwork, evmApi);
3407
+ return isClaimed;
3408
+ }
3409
+ async submitClaimPolygonBridge(data) {
3410
+ const {
3411
+ address,
3412
+ chain,
3413
+ notification
3414
+ } = data;
3415
+ const extrinsicType = ExtrinsicType.CLAIM_BRIDGE;
3416
+ let transaction = null;
3417
+ const evmApi = this.#koniState.getEvmApi(chain);
3418
+ transaction = await getClaimPolygonBridge(chain, notification, evmApi);
3419
+ const chainType = ChainType.EVM;
3420
+ return await this.#koniState.transactionService.handleTransaction({
3421
+ address,
3422
+ chain,
3423
+ transaction,
3424
+ data,
3425
+ extrinsicType,
3426
+ chainType
3427
+ });
3428
+ }
3386
3429
 
3387
3430
  /* Ledger */
3388
3431
 
@@ -3798,6 +3841,14 @@ export default class KoniExtension {
3798
3841
  case 'pri(phishing.pass)':
3799
3842
  return await this.passPhishingPage(request);
3800
3843
 
3844
+ // Set Environment config
3845
+ case 'pri(settings.saveAppConfig)':
3846
+ return this.saveAppConfig(request);
3847
+ case 'pri(settings.saveBrowserConfig)':
3848
+ return this.saveBrowserConfig(request);
3849
+ case 'pri(settings.saveOSConfig)':
3850
+ return this.saveOSConfig(request);
3851
+
3801
3852
  /// Keyring state
3802
3853
  case 'pri(keyring.subscribe)':
3803
3854
  return this.keyringStateSubscribe(id, port);
@@ -3962,6 +4013,8 @@ export default class KoniExtension {
3962
4013
  return this.fetchInappNotifications(request);
3963
4014
  case 'pri(inappNotification.get)':
3964
4015
  return this.getInappNotification(request);
4016
+ case 'pri(inappNotification.isClaimedPolygonBridge)':
4017
+ return this.getIsClaimedPolygonBridge(request);
3965
4018
  /* Notification service */
3966
4019
 
3967
4020
  /* Avail Bridge */
@@ -3969,6 +4022,13 @@ export default class KoniExtension {
3969
4022
  return this.submitClaimAvailBridge(request);
3970
4023
  /* Avail Bridge */
3971
4024
 
4025
+ /* Polygon Bridge */
4026
+
4027
+ case 'pri(polygonBridge.submitClaimPolygonBridge)':
4028
+ return this.submitClaimPolygonBridge(request);
4029
+
4030
+ /* Polygon Bridge */
4031
+
3972
4032
  /* Ledger */
3973
4033
  case 'pri(ledger.generic.allow)':
3974
4034
  return this.subscribeLedgerGenericAllowChains(id, port);
@@ -2,9 +2,11 @@
2
2
  import { _AssetRef, _AssetType, _ChainAsset, _ChainInfo, _MultiChainAsset } from '@subwallet/chain-list/types';
3
3
  import { AddTokenRequestExternal, AmountData, ApiMap, AuthRequestV2, ChainStakingMetadata, ConfirmationsQueue, ConfirmationsQueueTon, CrowdloanItem, CrowdloanJson, EvmSendTransactionParams, ExternalRequestPromise, MantaPayConfig, MantaPaySyncState, NftCollection, NftItem, NftJson, NominatorMetadata, RequestAccountExportPrivateKey, RequestConfirmationComplete, RequestConfirmationCompleteTon, RequestCrowdloanContributions, RequestSettingsType, ResponseAccountExportPrivateKey, ServiceInfo, SingleModeJson, StakingItem, StakingJson, StakingRewardItem, StakingRewardJson, StakingType, UiSettings } from '@subwallet/extension-base/background/KoniTypes';
4
4
  import { RequestAuthorizeTab, RequestRpcSend, RequestRpcSubscribe, RequestRpcUnsubscribe, RequestSign, ResponseRpcListProviders, ResponseSigning } from '@subwallet/extension-base/background/types';
5
+ import { EnvConfig } from '@subwallet/extension-base/constants';
5
6
  import { BalanceService } from '@subwallet/extension-base/services/balance-service';
6
7
  import BuyService from '@subwallet/extension-base/services/buy-service';
7
8
  import CampaignService from '@subwallet/extension-base/services/campaign-service';
9
+ import { ChainOnlineService } from '@subwallet/extension-base/services/chain-online-service';
8
10
  import { ChainService } from '@subwallet/extension-base/services/chain-service';
9
11
  import { _ChainState, _NetworkUpsertParams, _ValidateCustomAssetRequest } from '@subwallet/extension-base/services/chain-service/types';
10
12
  import EarningService from '@subwallet/extension-base/services/earning-service/service';
@@ -75,6 +77,7 @@ export default class KoniState {
75
77
  readonly feeService: FeeService;
76
78
  readonly swapService: SwapService;
77
79
  readonly inappNotificationService: InappNotificationService;
80
+ readonly chainOnlineService: ChainOnlineService;
78
81
  private generalStatus;
79
82
  private waitSleeping;
80
83
  private waitStarting;
@@ -239,6 +242,8 @@ export default class KoniState {
239
242
  reloadBalance(): Promise<boolean>;
240
243
  reloadCrowdloan(): Promise<boolean>;
241
244
  approvePassPhishingPage(_url: string): Promise<boolean>;
245
+ saveEnvConfig<T extends keyof EnvConfig>(key: T, value: EnvConfig[T]): void;
246
+ initEnvConfig(envConfig: EnvConfig): void;
242
247
  resetWallet(resetAll: boolean): Promise<void>;
243
248
  enableMantaPay(updateStore: boolean, address: string, password: string, seedPhrase?: string): Promise<string | undefined>;
244
249
  disableMantaPay(address: string): Promise<boolean>;
@@ -11,6 +11,7 @@ import { BalanceService } from '@subwallet/extension-base/services/balance-servi
11
11
  import { ServiceStatus } from '@subwallet/extension-base/services/base/types';
12
12
  import BuyService from '@subwallet/extension-base/services/buy-service';
13
13
  import CampaignService from '@subwallet/extension-base/services/campaign-service';
14
+ import { ChainOnlineService } from '@subwallet/extension-base/services/chain-online-service';
14
15
  import { ChainService } from '@subwallet/extension-base/services/chain-service';
15
16
  import { _DEFAULT_MANTA_ZK_CHAIN, _MANTA_ZK_CHAIN_GROUP, _PREDEFINED_SINGLE_MODES } from '@subwallet/extension-base/services/chain-service/constants';
16
17
  import { _getEvmChainId, _getSubstrateGenesisHash, _getTokenOnChainAssetId, _isAssetFungibleToken, _isChainEnabled, _isChainTestNet, _parseMetadataForSmartContractAsset } from '@subwallet/extension-base/services/chain-service/utils';
@@ -105,6 +106,7 @@ export default class KoniState {
105
106
  this.feeService = new FeeService(this);
106
107
  this.swapService = new SwapService(this);
107
108
  this.inappNotificationService = new InappNotificationService(this.dbService, this.keyringService, this.eventService, this.chainService);
109
+ this.chainOnlineService = new ChainOnlineService(this.chainService, this.settingService, this.eventService, this.dbService);
108
110
  this.subscription = new KoniSubscription(this, this.dbService);
109
111
  this.cron = new KoniCron(this, this.subscription, this.dbService);
110
112
  this.logger = createLogger('State');
@@ -198,7 +200,6 @@ export default class KoniState {
198
200
  async init() {
199
201
  await this.eventService.waitCryptoReady;
200
202
  await this.chainService.init();
201
- this.afterChainServiceInit();
202
203
  await this.migrationService.run();
203
204
  this.campaignService.init();
204
205
  this.mktCampaignService.init();
@@ -214,7 +215,11 @@ export default class KoniState {
214
215
  // TODO: consider moving this to a separate service
215
216
  await this.dbService.stores.crowdloan.removeEndedCrowdloans();
216
217
  await this.startSubscription();
218
+ this.chainOnlineService.checkLatestData();
217
219
  this.chainService.checkLatestData();
220
+ this.chainService.subscribeChainInfoMap().subscribe(() => {
221
+ this.afterChainServiceInit();
222
+ });
218
223
  }
219
224
  async initMantaPay(password) {
220
225
  var _this$chainService, _this$chainService$ma;
@@ -779,6 +784,7 @@ export default class KoniState {
779
784
  return this.chainService.stopAllChainApis();
780
785
  }
781
786
  async resumeAllNetworks() {
787
+ this.chainOnlineService.checkLatestData();
782
788
  return this.chainService.resumeAllChainApis();
783
789
  }
784
790
  publishCrowdloan(reset) {
@@ -1302,6 +1308,18 @@ export default class KoniState {
1302
1308
  });
1303
1309
  });
1304
1310
  }
1311
+ saveEnvConfig(key, value) {
1312
+ this.settingService.getEnvironmentList(config => {
1313
+ const newSettings = {
1314
+ ...config,
1315
+ [key]: value
1316
+ };
1317
+ this.settingService.setEnvironment(newSettings);
1318
+ });
1319
+ }
1320
+ initEnvConfig(envConfig) {
1321
+ this.settingService.setEnvironment(envConfig);
1322
+ }
1305
1323
  async resetWallet(resetAll) {
1306
1324
  await this.keyringService.resetWallet(resetAll);
1307
1325
  await this.earningService.resetYieldPosition();
@@ -1319,8 +1337,11 @@ export default class KoniState {
1319
1337
  this.chainService.resetWallet(resetAll);
1320
1338
  await this.walletConnectService.resetWallet(resetAll);
1321
1339
  await this.chainService.init();
1322
- this.afterChainServiceInit();
1340
+ this.chainOnlineService.checkLatestData();
1323
1341
  this.chainService.checkLatestData();
1342
+ this.chainService.subscribeChainInfoMap().subscribe(() => {
1343
+ this.afterChainServiceInit();
1344
+ });
1324
1345
  }
1325
1346
  async enableMantaPay(updateStore, address, password, seedPhrase) {
1326
1347
  var _this$chainService3, _this$chainService3$m, _this$chainService4, _this$chainService4$m, _this$chainService4$m2, _this$chainService11, _this$chainService11$, _this$chainService11$2;