WC.png

The recent migration to WalletConnect version 2 (WCv2) has caused several compatibility issues with smart wallets (smart accounts) like Safe{Wallet}, impacting the ability of users to connect to various popular decentralised applications (dApps).

With this post, we aim to reach out to the ecosystem to create awareness for these current issues and provide some solutions on how we can move forward.

WCv2 and smart wallet compatibility

Smart wallets cannot guarantee that they exist or can be deployed with the same address on multiple other chains (more on this in our Mirror post), nor do they necessarily support the same methods and events across multiple chains. The release of WCv2 and consequential shutdown of WCv1 did not address these differences between EOA wallets and smart wallets properly, resulting in the current compatibility issues.

Here are some examples of situations that cause connection failures, particularly for smart wallets like Safe{Wallet}:

Despite these challenges, WalletConnect has taken steps to address the most critical of these issues, specifically chain support, in their latest v2.9.0 release. Now, dApps can list supported chains under 'optionalNamespaces' and leave the ‘requiredNamespaces' empty. This allows a smart wallet to establish a connection and approve a single chain interaction without causing the connection to fail.

Proposed solutions for smart wallet compatibility

  1. RECOMMENDED: Set 'requiredNamespaces' as undefined and send all the chains the dApp intends to support in the 'optionalNamespaces'. This adjustment allows the smart wallet to establish a connection and approve a single chain, eliminating the connection failure issue.
  2. ALTERNATIVE: Send 'requiredNamespaces' only with a single chain — the chain to which the smart account is connected to. This method may be more suited to certain use cases.

List of popular dApps tested with WCv2

DApp WC version Working? Details
Lido v2 Ethereum only Sending Ethereum chainId as requireNamespaces so it will only work on that chain
Aave v2 Yes Sending {{currentChainId}} as requireNamespaces so it will work but heavily recommended for them to use optionalNamespaces
Uniswap v2 Yes Sending {{currentChainId}} as requireNamespaces so it will work but heavily recommended for them to use optionalNamespaces
Curve v2 Ethereum only Sending Ethereum chainId as requireNamespaces so it will only work on that chain
Convex v2 Ethereum only Sending Ethereum chainId as requireNamespaces so it will only work on that chain
Compound v2 Yes Sending {{currentChainId}} as requireNamespaces so it will work but heavily recommended for them to use optionalNamespaces
Instadapp v2 Ethereum only Sending Ethereum chainId as requireNamespaces so it will only work on that chain
Rocket Pool v2 Ethereum only Sending Ethereum chainId as requireNamespaces so it will only work on that chain
PancakeSwap v2 Yes Sending {{currentChainId}} as requireNamespaces so it will work but heavily recommended for them to use optionalNamespaces
Balancer v2 Ethereum only Sending Ethereum chainId as requireNamespaces so it will only work on that chain
Frax Finance v2 Ethereum only Sending Ethereum chainId as requireNamespaces so it will only work on that chain
Liquity v1 Yes None
GMX v2 Yes Sending {{currentChainId}} as requireNamespaces so it will work but heavily recommended for them to use optionalNamespaces
Aura v2 Ethereum only Sending Ethereum chainId as requireNamespaces so it will only work on that chain
Yearn V2 Ethereum only Sending Ethereum chainId as requireNamespaces so it will only work on that chain
Sushi V2 Arbitrum only Sending Arbitrum chainId as requireNamespaces so it will only work on that chain
Morpho V2 Ethereum only Sending Ethereum chainId as requireNamespaces so it will only work on that chain
Stargate V2 Yes* *Working partially. When selecting to connect via ‘All chains’ connection will fail as all available chains for the dapp are sent as {{requiredNamespaces}} but when selecting only one chain it will work as only one chain is sent inside {{requiredNamespaces}}. All chains should be sent inside of {{optionalNamespaces}}
Stakewise V2 Yes Sending {{currentChainId}} as requireNamespaces so it will work but heavily recommended for them to use optionalNamespaces
CoW Swap V1 Yes None
ENS V2 Ethereum only Sending Ethereum chainId as requireNamespaces so it will only work on that chain. Testnets (goerli) wont work

We appreciate your patience as we work through these issues and seek to deliver the best possible experience for Safe{Wallet} users. We're committed to ensuring the seamless integration of WCv2 with smart wallets and the wider ecosystem.