Skip to main content

Wallet interoperability

A web dapp can integrate with multiple installed browser wallets simultaneously by adding support for EIP-6963, which introduces an alternative wallet detection mechanism to the window.ethereum injected provider. This mechanism is enabled by using the standardized interfaces defined by EIP-6963.

Why EIP-6963?

EIP-1193 standardizes the interface for wallet providers, but it results in conflicts when users have multiple wallets installed, due to how the provider object is injected. This can cause issues with wallet discovery, user onboarding, and connecting. The wallet discovery mechanism introduced by EIP-6963 solves these issues.

The following is a demo of the user experience of detecting multiple wallets, showing the data provided from each installed wallet:

You can connect to MetaMask using EIP-6963 and see the EIP-6963 Vite React + TypeScript demo for more information.

EIP-6963 interfaces

Wallets that support EIP-6963 implement and expose the following standardized interfaces. When connecting to MetaMask using EIP-6963, it's important to review and understand these interfaces.

Provider info

The EIP6963ProviderInfo interface represents the assets needed to display a wallet:

  • uuid - The wallet ID (UUIDv4).
  • name - A human-readable name of the wallet.
  • icon - A URI pointing to an icon of the wallet.
  • rdns - The wallet's domain name.

Provider detail

The EIP6963ProviderDetail interface represents additional metadata about the wallet:

Announce and request events

The EIP6963AnnounceProviderEvent interface announces an event dispatched by the wallet:

interface EIP6963AnnounceProviderEvent extends CustomEvent {
type: "eip6963:announceProvider";
detail: EIP6963ProviderDetail;
}

The EIP6963RequestProviderEvent interface requests an event dispatched by a dapp:

interface EIP6963RequestProviderEvent extends Event {
type: "eip6963:requestProvider";
}

Third-party library support

The following third-party libraries support EIP-6963:

MIPD Store

The MIPD Store stores the wallet providers and enables you to subscribe to the store and retrieve the providers. Unlike Wagmi and Web3-Onboard, which are libraries that provide components and connectors for multiple wallets and depend on MetaMask SDK for integration, the MIPD Store is a utility library that makes it easier to work with EIP-6963 and supports TypeScript types.

MetaMask SDK support

note

MetaMask SDK does not support connecting to non-MetaMask wallets via EIP-6963. If you intend to support discovery of other wallets, we recommend using other methods of adding EIP-6963 support such as Wagmi 2+.

The MetaMask JavaScript SDK automatically checks for the presence of the MetaMask extension via EIP-6963. This eliminates the need for manual configuration or detection methods, simplifying the initial setup process for both developers and users.

By adhering to the standards set by EIP-6963, the SDK unambiguously identifies and connects to MetaMask, resolving potential conflicts that might arise with other wallet extensions, ensuring a more stable and reliable interaction for users.

The SDK is also being integrated into Wagmi 2+, which supports EIP-6963. The SDK on its own supports connecting only to MetaMask via EIP-6963, so if you intend to support discovery of other wallets, we recommend using other methods of adding EIP-6963 support, such as Wagmi 2+.

Wallet support

The EIP-6963 alternative discovery mechanism works for wallets that have implemented support for EIP-6963. This includes MetaMask, Coinbase, Trust Wallet, OKX, and other major wallets. See the list of wallets that support EIP-6963.

Backwards compatibility

Dapps that do not support EIP-6963 can still detect MetaMask using the window.ethereum provider. However, we recommend adding support to improve the user experience for multiple installed wallets. Read more about EIP-6963 backwards compatibility.