Skip to main content
What you need to know: Add the EVM extension from the Chains table on Adding extensions. You need at least one EVM extension to support Ethereum-compatible chains. There are only two kinds of wallet: embedded and external. Each extension below lets you support one or both for EVM.
To interact with EVM wallets, add one or more EVM extensions to your client. Each extension enables a different way to discover and connect EVM wallets (e.g. EIP-6963, window.ethereum, or Dynamic embedded wallets). Enable the EVM chain in the Dynamic dashboard as well.

Installation

Default EVM extension

If you wish to support the standard EVM wallets and Dynamic embedded wallets, you can add the default EVM extension to your client using the addEvmExtension method.

Standalone EVM extensions

If you want to be more granular, you can add the standalone EVM extensions individually to your client.

EIP-6963 extension

Window-injected extension

When users open your app inside a wallet’s built-in browser (e.g. MetaMask Mobile, Trust Wallet, Coinbase Wallet), the wallet injects its provider into window.ethereum rather than announcing via EIP-6963. Use this extension as a fallback to support those environments:
When used alongside addEIP6963Extension, EIP-6963 providers take priority automatically — so if a wallet supports both, the EIP-6963 version is used.

WAAS EVM extension

Base Account extension

Adds support for Base Account — Coinbase’s popup / QR flow that surfaces both Coinbase Smart Wallet (passkey-backed ERC-4337 contract wallet at keys.coinbase.com) and Coinbase Wallet (EOA). It complements, rather than replaces, the EIP-6963 and window-injected paths, which continue to handle the Coinbase Wallet browser extension.
Pass preference.options to control which Base Account flavor(s) appear in the popup:

Combining extensions

You can combine as many extensions as you want to support all the wallets you want to support.

React

In React, register extensions at module level in the same file where you create the client — not inside components. This runs once when the module is first imported.
Then in your app entry point, import the client to trigger the module:
Last modified on June 2, 2026