@subwallet/extension-base 1.1.39-0 → 1.1.39-beta.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.
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "./cjs/detectPackage.js"
18
18
  ],
19
19
  "type": "module",
20
- "version": "1.1.39-0",
20
+ "version": "1.1.39-beta.0",
21
21
  "main": "./cjs/index.js",
22
22
  "module": "./index.js",
23
23
  "types": "./index.d.ts",
@@ -1802,4 +1802,4 @@
1802
1802
  "web3-eth-contract": "^1.10.0",
1803
1803
  "web3-utils": "^1.10.0"
1804
1804
  }
1805
- }
1805
+ }
@@ -2,7 +2,7 @@
2
2
  import { _AssetRef, _AssetType, _ChainAsset, _ChainInfo, _MultiChainAsset } from '@subwallet/chain-list/types';
3
3
  import { AssetSetting, ValidateNetworkResponse } from '@subwallet/extension-base/background/KoniTypes';
4
4
  import { MantaPrivateHandler } from '@subwallet/extension-base/services/chain-service/handler/manta/MantaPrivateHandler';
5
- import { _ChainConnectionStatus, _ChainState, _NetworkUpsertParams, _ValidateCustomAssetRequest, _ValidateCustomAssetResponse } from '@subwallet/extension-base/services/chain-service/types';
5
+ import { _ChainApiStatus, _ChainConnectionStatus, _ChainState, _NetworkUpsertParams, _ValidateCustomAssetRequest, _ValidateCustomAssetResponse } from '@subwallet/extension-base/services/chain-service/types';
6
6
  import { EventService } from '@subwallet/extension-base/services/event-service';
7
7
  import { IMetadataItem } from '@subwallet/extension-base/services/storage-service/databases';
8
8
  import DatabaseService from '@subwallet/extension-base/services/storage-service/DatabaseService';
@@ -19,6 +19,7 @@ export declare class ChainService {
19
19
  get mantaPay(): MantaPrivateHandler | undefined;
20
20
  private chainInfoMapSubject;
21
21
  private chainStateMapSubject;
22
+ private chainStatusMapSubject;
22
23
  private assetRegistrySubject;
23
24
  private multiChainAssetMapSubject;
24
25
  private xcmRefMapSubject;
@@ -40,6 +41,7 @@ export declare class ChainService {
40
41
  subscribeMultiChainAssetMap(): Subject<Record<string, _MultiChainAsset>>;
41
42
  subscribeXcmRefMap(): Subject<Record<string, _AssetRef>>;
42
43
  subscribeChainStateMap(): Subject<Record<string, _ChainState>>;
44
+ subscribeChainStatusMap(): BehaviorSubject<Record<string, _ChainApiStatus>>;
43
45
  getAssetRegistry(): Record<string, _ChainAsset>;
44
46
  getMultiChainAssetMap(): Record<string, _MultiChainAsset>;
45
47
  getSmartContractTokens(): Record<string, _ChainAsset>;
@@ -51,6 +53,8 @@ export declare class ChainService {
51
53
  getAssetRefMap(): Record<string, _AssetRef>;
52
54
  getChainStateMap(): Record<string, _ChainState>;
53
55
  getChainStateByKey(key: string): _ChainState;
56
+ getChainStatusMap(): Record<string, _ChainApiStatus>;
57
+ getChainStatusByKey(key: string): _ChainApiStatus;
54
58
  getActiveChains(): string[];
55
59
  getSupportedSmartContractTypes(): _AssetType[];
56
60
  getActiveChainInfoMap(): Record<string, _ChainInfo>;
@@ -66,7 +70,8 @@ export declare class ChainService {
66
70
  forceRemoveChain(slug: string): boolean;
67
71
  removeCustomChain(slug: string): boolean;
68
72
  resetChainInfoMap(excludedChains?: string[]): boolean;
69
- setChainConnectionStatus(slug: string, connectionStatus: _ChainConnectionStatus): void;
73
+ private connectionStatusQueueMap;
74
+ updateChainConnectionStatus(slug: string, connectionStatus: _ChainConnectionStatus): void;
70
75
  upsertCustomToken(token: _ChainAsset): string;
71
76
  deleteAssetsByChain(chainSlug: string): void;
72
77
  deleteCustomAssets(targetAssets: string[]): void;
@@ -109,7 +114,6 @@ export declare class ChainService {
109
114
  refreshEvmApi(slug: string): void;
110
115
  stopAllChainApis(): Promise<void>;
111
116
  resumeAllChainApis(): Promise<void>;
112
- checkAndUpdateStatusMapForChain(chainSlug: string): void;
113
117
  initAssetSettings(): Promise<void>;
114
118
  setAssetSettings(assetSettings: Record<string, AssetSetting>, emitEvent?: boolean): void;
115
119
  setMantaZkAssetSettings(visible: boolean): void;
@@ -31,6 +31,7 @@ export class ChainService {
31
31
  // TODO: consider BehaviorSubject
32
32
  chainInfoMapSubject = new Subject();
33
33
  chainStateMapSubject = new Subject();
34
+ chainStatusMapSubject = new BehaviorSubject({});
34
35
  assetRegistrySubject = new Subject();
35
36
  multiChainAssetMapSubject = new Subject();
36
37
  xcmRefMapSubject = new Subject();
@@ -104,6 +105,9 @@ export class ChainService {
104
105
  subscribeChainStateMap() {
105
106
  return this.chainStateMapSubject;
106
107
  }
108
+ subscribeChainStatusMap() {
109
+ return this.chainStatusMapSubject;
110
+ }
107
111
  getAssetRegistry() {
108
112
  return this.dataMap.assetRegistry;
109
113
  }
@@ -181,6 +185,12 @@ export class ChainService {
181
185
  getChainStateByKey(key) {
182
186
  return this.dataMap.chainStateMap[key];
183
187
  }
188
+ getChainStatusMap() {
189
+ return this.chainStatusMapSubject.getValue();
190
+ }
191
+ getChainStatusByKey(key) {
192
+ return this.getChainStatusMap()[key];
193
+ }
184
194
  getActiveChains() {
185
195
  return Object.entries(this.dataMap.chainStateMap).filter(([, chainState]) => _isChainEnabled(chainState)).map(([key]) => key);
186
196
  }
@@ -339,9 +349,31 @@ export class ChainService {
339
349
  this.lockChainInfoMap = false;
340
350
  return true;
341
351
  }
342
- setChainConnectionStatus(slug, connectionStatus) {
343
- const chainStateMap = this.getChainStateMap();
344
- chainStateMap[slug].connectionStatus = connectionStatus;
352
+ connectionStatusQueueMap = {};
353
+ updateChainConnectionStatus(slug, connectionStatus) {
354
+ this.connectionStatusQueueMap[slug] = connectionStatus;
355
+ addLazy('updateChainConnectionStatus', () => {
356
+ const chainStatusMap = this.getChainStatusMap();
357
+ let update = false;
358
+ Object.entries(this.connectionStatusQueueMap).forEach(([slug, status]) => {
359
+ if (chainStatusMap[slug]) {
360
+ if (chainStatusMap[slug].connectionStatus !== status) {
361
+ chainStatusMap[slug].connectionStatus = status;
362
+ chainStatusMap[slug].lastUpdated = Date.now();
363
+ update = true;
364
+ }
365
+ } else {
366
+ chainStatusMap[slug] = {
367
+ slug,
368
+ connectionStatus: status,
369
+ lastUpdated: Date.now()
370
+ };
371
+ update = true;
372
+ }
373
+ });
374
+ this.connectionStatusQueueMap = {};
375
+ update && this.chainStatusMapSubject.next(chainStatusMap);
376
+ });
345
377
  }
346
378
  upsertCustomToken(token) {
347
379
  if (token.slug.length === 0) {
@@ -513,13 +545,8 @@ export class ChainService {
513
545
  providerName
514
546
  } = this.getChainCurrentProviderByKey(chainInfo.slug);
515
547
  const onUpdateStatus = status => {
516
- const currentStatus = this.getChainStateByKey(chainInfo.slug).connectionStatus;
517
-
518
- // Avoid unnecessary update in case disable chain
519
- if (currentStatus !== status) {
520
- this.setChainConnectionStatus(chainInfo.slug, status);
521
- this.updateChainStateMapSubscription();
522
- }
548
+ const slug = chainInfo.slug;
549
+ this.updateChainConnectionStatus(slug, status);
523
550
  };
524
551
  if (chainInfo.substrateInfo !== null && chainInfo.substrateInfo !== undefined) {
525
552
  if (_MANTA_ZK_CHAIN_GROUP.includes(chainInfo.slug) && MODULE_SUPPORT.MANTA_ZK && this.mantaChainHandler) {
@@ -618,7 +645,7 @@ export class ChainService {
618
645
  this.lockChainInfoMap = true;
619
646
  chainStateMap[chainSlug].active = false;
620
647
  // Set disconnect state for inactive chain
621
- chainStateMap[chainSlug].connectionStatus = _ChainConnectionStatus.DISCONNECTED;
648
+ this.updateChainConnectionStatus(chainSlug, _ChainConnectionStatus.DISCONNECTED);
622
649
  this.destroyApiForChain(chainInfo);
623
650
  this.dbService.updateChainStore({
624
651
  ...chainInfo,
@@ -711,9 +738,9 @@ export class ChainService {
711
738
  this.dataMap.chainStateMap[chainInfo.slug] = {
712
739
  currentProvider: providerKey,
713
740
  slug: chainInfo.slug,
714
- connectionStatus: _ChainConnectionStatus.DISCONNECTED,
715
741
  active: _DEFAULT_ACTIVE_CHAINS.includes(chainInfo.slug)
716
742
  };
743
+ this.updateChainConnectionStatus(chainInfo.slug, _ChainConnectionStatus.DISCONNECTED);
717
744
 
718
745
  // create data for storage
719
746
  newStorageData.push({
@@ -764,9 +791,9 @@ export class ChainService {
764
791
  this.dataMap.chainStateMap[storedSlug] = {
765
792
  currentProvider: selectedProvider,
766
793
  slug: storedSlug,
767
- connectionStatus: _ChainConnectionStatus.DISCONNECTED,
768
794
  active: canActive && storedChainInfo.active
769
795
  };
796
+ this.updateChainConnectionStatus(storedSlug, _ChainConnectionStatus.DISCONNECTED);
770
797
  newStorageData.push({
771
798
  ...mergedChainInfoMap[storedSlug],
772
799
  active: canActive && storedChainInfo.active,
@@ -786,9 +813,9 @@ export class ChainService {
786
813
  this.dataMap.chainStateMap[duplicatedDefaultSlug] = {
787
814
  currentProvider: storedChainInfo.currentProvider,
788
815
  slug: duplicatedDefaultSlug,
789
- connectionStatus: _ChainConnectionStatus.DISCONNECTED,
790
816
  active: storedChainInfo.active
791
817
  };
818
+ this.updateChainConnectionStatus(duplicatedDefaultSlug, _ChainConnectionStatus.DISCONNECTED);
792
819
  newStorageData.push({
793
820
  ...mergedChainInfoMap[duplicatedDefaultSlug],
794
821
  active: storedChainInfo.active,
@@ -813,9 +840,9 @@ export class ChainService {
813
840
  currentProvider: storedChainInfo.currentProvider,
814
841
  // TODO: review
815
842
  slug: storedSlug,
816
- connectionStatus: _ChainConnectionStatus.DISCONNECTED,
817
843
  active: storedChainInfo.active
818
844
  };
845
+ this.updateChainConnectionStatus(storedSlug, _ChainConnectionStatus.DISCONNECTED);
819
846
  newStorageData.push({
820
847
  ...mergedChainInfoMap[storedSlug],
821
848
  active: storedChainInfo.active,
@@ -833,9 +860,9 @@ export class ChainService {
833
860
  this.dataMap.chainStateMap[slug] = {
834
861
  currentProvider: Object.keys(chainInfo.providers)[0],
835
862
  slug,
836
- connectionStatus: _ChainConnectionStatus.DISCONNECTED,
837
863
  active: _DEFAULT_ACTIVE_CHAINS.includes(slug)
838
864
  };
865
+ this.updateChainConnectionStatus(slug, _ChainConnectionStatus.DISCONNECTED);
839
866
  newStorageData.push({
840
867
  ...mergedChainInfoMap[slug],
841
868
  active: _DEFAULT_ACTIVE_CHAINS.includes(slug),
@@ -910,9 +937,7 @@ export class ChainService {
910
937
  }
911
938
  }
912
939
  updateChainStateMapSubscription() {
913
- addLazy('updateChainStateMapSubscription', () => {
914
- this.chainStateMapSubject.next(this.getChainStateMap());
915
- }, 300, 900);
940
+ this.chainStateMapSubject.next(this.getChainStateMap());
916
941
  }
917
942
  updateChainInfoMapSubscription() {
918
943
  this.chainInfoMapSubject.next(this.getChainInfoMap());
@@ -1021,10 +1046,17 @@ export class ChainService {
1021
1046
  const chainStateMap = this.getChainStateMap();
1022
1047
  chainStateMap[newChainSlug] = {
1023
1048
  active: true,
1024
- connectionStatus: _ChainConnectionStatus.DISCONNECTED,
1025
1049
  currentProvider: params.chainEditInfo.currentProvider,
1026
1050
  slug: newChainSlug
1027
1051
  };
1052
+
1053
+ // const chainStatusMap = this.getChainStatusMap();
1054
+ // const chainStatusMap[newChainSlug] = {
1055
+ // slug: newChainSlug,
1056
+ // connectionStatus: _ChainConnectionStatus.DISCONNECTED,
1057
+ // lastUpdated: Date.now()
1058
+ // };
1059
+
1028
1060
  await this.initApiForChain(chainInfo);
1029
1061
 
1030
1062
  // create a record in assetRegistry for native token and update store/subscription
@@ -1309,29 +1341,6 @@ export class ChainService {
1309
1341
  await Promise.all([this.substrateChainHandler.wakeUp(), this.evmChainHandler.wakeUp()]);
1310
1342
  this.checkLatestData();
1311
1343
  }
1312
- checkAndUpdateStatusMapForChain(chainSlug) {
1313
- const substrateApiMap = this.getSubstrateApiMap();
1314
- const evmApiMap = this.getEvmApiMap();
1315
- const chainState = this.getChainStateByKey(chainSlug);
1316
- let update = false;
1317
- function updateState(current, status) {
1318
- if (current.connectionStatus !== status) {
1319
- current.connectionStatus = status;
1320
- update = true;
1321
- }
1322
- }
1323
- if (chainState.active) {
1324
- const api = substrateApiMap[chainSlug] || evmApiMap[chainSlug];
1325
- if (api) {
1326
- updateState(chainState, api.isApiConnected ? _ChainConnectionStatus.CONNECTED : _ChainConnectionStatus.DISCONNECTED);
1327
- }
1328
- } else {
1329
- updateState(chainState, _ChainConnectionStatus.DISCONNECTED);
1330
- }
1331
- if (update) {
1332
- this.dataMap.chainStateMap[chainSlug] = chainState;
1333
- }
1334
- }
1335
1344
  async initAssetSettings() {
1336
1345
  const assetSettings = await this.getAssetSettings();
1337
1346
  const activeChainSlugs = this.getActiveChainSlugs();
@@ -22,7 +22,11 @@ export interface _ChainState {
22
22
  slug: string;
23
23
  active: boolean;
24
24
  currentProvider: string;
25
+ }
26
+ export interface _ChainApiStatus {
27
+ slug: string;
25
28
  connectionStatus: _ChainConnectionStatus;
29
+ lastUpdated: number;
26
30
  }
27
31
  export interface _SubstrateDefaultFormatBalance {
28
32
  decimals?: number[] | number;