diff --git a/.changeset/walletconnect-switchchain-listener-leak.md b/.changeset/walletconnect-switchchain-listener-leak.md new file mode 100644 index 0000000000..71a4078190 --- /dev/null +++ b/.changeset/walletconnect-switchchain-listener-leak.md @@ -0,0 +1,5 @@ +--- +"@wagmi/connectors": patch +--- + +Fixed listener leak in WalletConnect connector `switchChain` when chain switch fails. diff --git a/packages/connectors/src/walletConnect.ts b/packages/connectors/src/walletConnect.ts index d5a3d622df..56f262f67f 100644 --- a/packages/connectors/src/walletConnect.ts +++ b/packages/connectors/src/walletConnect.ts @@ -338,15 +338,12 @@ export function walletConnect(parameters: WalletConnectParameters) { const chain = config.chains.find((x) => x.id === chainId) if (!chain) throw new SwitchChainError(new ChainNotConfiguredError()) + let listener: (opts: { chainId?: number | undefined }) => void = () => {} try { await Promise.all([ new Promise((resolve) => { - const listener = ({ - chainId: currentChainId, - }: { - chainId?: number | undefined - }) => { - if (currentChainId === chainId) { + listener = (opts) => { + if (opts.chainId === chainId) { config.emitter.off('change', listener) resolve() } @@ -364,6 +361,7 @@ export function walletConnect(parameters: WalletConnectParameters) { return chain } catch (err) { + config.emitter.off('change', listener) const error = err as RpcError if (/(user rejected)/i.test(error.message))