From 4991cac235ac947d0670e9b143c2d353f049fff1 Mon Sep 17 00:00:00 2001 From: S2kael Date: Mon, 3 Feb 2025 18:43:53 +0700 Subject: [PATCH] [Issue-4002] Handle and prevent case no url provider --- .../services/chain-online-service/index.ts | 18 +++++++++++++++++- .../src/services/chain-service/index.ts | 19 +++++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/packages/extension-base/src/services/chain-online-service/index.ts b/packages/extension-base/src/services/chain-online-service/index.ts index 1b8a4388f0..38ebb9846c 100644 --- a/packages/extension-base/src/services/chain-online-service/index.ts +++ b/packages/extension-base/src/services/chain-online-service/index.ts @@ -71,6 +71,22 @@ export class ChainOnlineService { return true; } + mergeChainList (oldChainInfoMap: Record, latestChainInfo: Record) { + const rs: Record = structuredClone(oldChainInfoMap); + + for (const [slug, _info] of Object.entries(latestChainInfo)) { + const { providers: _providers, ...info } = _info; + const providers = Object.assign(rs[slug]?.providers || {}, _providers); + + rs[slug] = { + ...info, + providers + }; + } + + return rs; + } + async handleLatestPatch (latestPatch: PatchInfo) { try { // 1. validate fetch data with its hash @@ -95,7 +111,7 @@ export class ChainOnlineService { // 2. merge data map if (latestChainInfo && Object.keys(latestChainInfo).length > 0) { - chainInfoMap = Object.assign({}, oldChainInfoMap, latestChainInfo); + chainInfoMap = this.mergeChainList(oldChainInfoMap, latestChainInfo); const [currentChainStateKey, newChainKey] = [Object.keys(currentChainStateMap), Object.keys(chainInfoMap)]; diff --git a/packages/extension-base/src/services/chain-service/index.ts b/packages/extension-base/src/services/chain-service/index.ts index accbad33e5..f0d3df7347 100644 --- a/packages/extension-base/src/services/chain-service/index.ts +++ b/packages/extension-base/src/services/chain-service/index.ts @@ -824,7 +824,7 @@ export class ChainService { /** * Disable chain if not found provider * */ - if (!endpoint && !providerName) { + if (!endpoint || !providerName) { this.disableChain(chainInfo.slug); return; @@ -1248,10 +1248,25 @@ export class ChainService { this.updateChainConnectionStatus(storedSlug, _ChainConnectionStatus.DISCONNECTED); + const providers = storedChainInfo.providers; + const { providerKey } = randomizeProvider(providers); + let selectedProvider = providerKey; + + const storedProviderKey = storedChainInfo.currentProvider; + const storedProviderValue = storedChainInfo.providers[storedProviderKey] || ''; + + if (storedProviderValue?.startsWith('light') || storedProviderKey?.startsWith(_CUSTOM_PREFIX)) { + const savedProviderKey = Object.keys(providers).find((key) => providers[key] === storedProviderValue); + + if (savedProviderKey) { + selectedProvider = savedProviderKey; + } + } + newStorageData.push({ ...storedChainSettingMap[storedSlug], active: storedChainInfo.active, - currentProvider: storedChainInfo.currentProvider, + currentProvider: selectedProvider, manualTurnOff });