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.
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}:
requiredNamespaces.eip155.chains
property, the connection may fail. This is because the Safe is only available on a single network and approving multiple chains could risk the user's funds.requiredNamespaces.methods
property includes an unsupported method by Safe like eth_signTransaction
, it can lead to compatibility issues when users interact with the dApp.requiredNamespaces.events
property includes common events like accountsChanged
& chainChanged
, it might not function correctly. These events do not exist in the context of a Safe but could be ignored by the smart 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.
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.