diff --git a/.changeset/unlucky-boats-dance.md b/.changeset/unlucky-boats-dance.md new file mode 100644 index 0000000000..488418235b --- /dev/null +++ b/.changeset/unlucky-boats-dance.md @@ -0,0 +1,5 @@ +--- +"@wagmi/core": patch +--- + +Fixed injected connector throwing error after switching to a chain that was just added via 'wallet_addEthereumChain' diff --git a/packages/core/src/connectors/injected.ts b/packages/core/src/connectors/injected.ts index c242094d58..0a1579c1ca 100644 --- a/packages/core/src/connectors/injected.ts +++ b/packages/core/src/connectors/injected.ts @@ -478,16 +478,32 @@ export function injected(parameters: InjectedParameters = {}) { rpcUrls, } satisfies AddEthereumChainParameter - await provider.request({ - method: 'wallet_addEthereumChain', - params: [addEthereumChain], - }) - - const currentChainId = await this.getChainId() - if (currentChainId !== chainId) - throw new UserRejectedRequestError( - new Error('User rejected switch after adding network.'), - ) + await Promise.all([ + provider + .request({ + method: 'wallet_addEthereumChain', + params: [addEthereumChain], + }) + .then(async () => { + const currentChainId = await this.getChainId() + if (currentChainId === chainId) { + config.emitter.emit('change', { chainId }) + } else { + throw new UserRejectedRequestError( + new Error('User rejected switch after adding network.'), + ) + } + }), + new Promise((resolve) => { + const listener = ((data) => { + if ('chainId' in data && data.chainId === chainId) { + config.emitter.off('change', listener) + resolve() + } + }) satisfies Parameters[1] + config.emitter.on('change', listener) + }), + ]) return chain } catch (error) {