From c578f83a845375cdf7f3faf05c03a985e560ce8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?U=C4=9Fur=20Eren?= Date: Sat, 29 Jul 2023 18:17:15 +0300 Subject: [PATCH] fix: Try to switch first in AutoChangeChain --- src/utils/AutoChangeChain.ts | 55 ++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/src/utils/AutoChangeChain.ts b/src/utils/AutoChangeChain.ts index ad40b68..97c4b6e 100644 --- a/src/utils/AutoChangeChain.ts +++ b/src/utils/AutoChangeChain.ts @@ -1,40 +1,47 @@ /* eslint no-underscore-dangle: "off" */ import {ethers, utils} from 'ethers'; -import {Chain, ChainObject, DefaultChains, DefaultChainNames} from '../types'; +import {Chain, ChainObject, DefaultChains} from '../types'; const AutoChangeChain = async (provider: ethers.providers.Web3Provider, chains?: Chain[]) => { await provider._networkPromise; - if (Array.isArray(chains) && chains.length > 0) { - const foundIndex = chains.findIndex( - (chain) => - (typeof chain === 'object' && chain.chainId === provider.network.chainId) || - (typeof chain === 'string' && DefaultChains[chain] === provider.network.chainId), - ); + if (!provider.network.chainId || !Array.isArray(chains) || chains.length === 0) return; - if (foundIndex === -1) { - const defaultChains = chains.filter( - (chain): chain is DefaultChainNames => typeof chain === 'string', - ); + const providerNetwork = utils.hexValue(provider.network.chainId); - if (defaultChains.length > 0) { + const foundIndex = chains.findIndex( + (chain) => + (typeof chain === 'object' && utils.hexValue(chain.chainId) === providerNetwork) || + (typeof chain === 'string' && utils.hexValue(DefaultChains[chain]) === providerNetwork), + ); + + if (foundIndex === -1) { + try { + try { + // Try to switch await provider.send( 'wallet_switchEthereumChain', - defaultChains.map((chain) => ({chainId: utils.hexValue(DefaultChains[chain])})), + chains.map((chain) => ({ + chainId: utils.hexValue( + typeof chain === 'string' ? DefaultChains[chain] : chain.chainId, + ), + })), + ); + } catch (_) { + // Try to add if switch failed + await provider.send( + 'wallet_addEthereumChain', + chains + .filter((chain): chain is ChainObject => typeof chain === 'object') + .map((chain) => ({ + ...chain, + chainId: utils.hexValue(chain.chainId), + })), ); - return; } - - await provider.send( - 'wallet_addEthereumChain', - chains - .filter((chain): chain is ChainObject => typeof chain === 'object') - .map((chain) => ({ - ...chain, - chainId: utils.hexValue(chain.chainId), - })), - ); + } catch (_) { + // Don't do anything if switch and add failed } } };