> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dynamic.xyz/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Adding EVM Extensions

> Add one or more EVM extensions to support embedded wallets and external wallets on EVM chains

<Info>
  **What you need to know:** Add the EVM extension from the [Chains](/javascript/reference/adding-extensions#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.
</Info>

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](https://app.dynamic.xyz/dashboard/chains-and-networks#evm) as well.

## Installation

```bash theme={"system"}
npm install @dynamic-labs-sdk/evm
```

## 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.

```javascript theme={"system"}
import { createDynamicClient } from '@dynamic-labs-sdk/client';
import { addEvmExtension } from '@dynamic-labs-sdk/evm';

const dynamicClient = createDynamicClient({
  ...
});

addEvmExtension();

```

## Standalone EVM extensions

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

### EIP-6963 extension

```javascript theme={"system"}
import { addEIP6963Extension } from '@dynamic-labs-sdk/evm/eip6963';

const dynamicClient = createDynamicClient({
  ...
});

// this will add support for wallets that implement EIP-6963, which are most of the EVM external wallets
addEIP6963Extension();

```

### 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:

```javascript theme={"system"}
import { addEvmWindowInjectedExtension } from '@dynamic-labs-sdk/evm/window-injected';

const dynamicClient = createDynamicClient({
  ...
});

// this will add support for wallets injected into window.ethereum (built-in browser or legacy extensions)
addEvmWindowInjectedExtension();

```

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

```javascript theme={"system"}
import { addWaasEvmExtension } from '@dynamic-labs-sdk/evm/waas';

const dynamicClient = createDynamicClient({
  ...
});

// this will add support for Dynamic embedded EVM wallets
addWaasEvmExtension();

```

### Base Account extension

Adds support for [Base Account](https://docs.base.org/identity/smart-wallet/introduction/sw-quickstart) — 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.

```javascript theme={"system"}
import { addBaseAccountEvmExtension } from '@dynamic-labs-sdk/evm/base-account';

const dynamicClient = createDynamicClient({
  ...
});

// this will add Base Account (Coinbase Smart Wallet + EOA via popup/QR)
addBaseAccountEvmExtension();

```

Pass `preference.options` to control which Base Account flavor(s) appear in the popup:

| Value               | Behavior                                                                                                                                                                          |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `'all'` (default)   | Show both Smart Wallet and EOA options. Use this when in doubt.                                                                                                                   |
| `'smartWalletOnly'` | Only **Coinbase Smart Wallet** — a passkey-backed ERC-4337 contract wallet onboarded via Face ID / fingerprint / Yubikey, with no seed phrase. Best for first-time onchain users. |
| `'eoaOnly'`         | Only **Coinbase Wallet (EOA)** — the standard private-key Coinbase Wallet. Best when the user already has Coinbase Wallet installed.                                              |

```javascript theme={"system"}
addBaseAccountEvmExtension({
  preference: { options: 'smartWalletOnly' },
});
```

## Combining extensions

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

```javascript theme={"system"}
import { addEIP6963Extension } from '@dynamic-labs-sdk/evm/eip6963';
import { addWaasEvmExtension } from '@dynamic-labs-sdk/evm/waas';

const dynamicClient = createDynamicClient({
  ...
});

addEIP6963Extension();
addWaasEvmExtension();

```

## 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.

```tsx theme={"system"}
// dynamicClient.ts
import { createDynamicClient } from '@dynamic-labs-sdk/client';
import { addEIP6963Extension } from '@dynamic-labs-sdk/evm/eip6963';
import { addWaasEvmExtension } from '@dynamic-labs-sdk/evm/waas';

export const dynamicClient = createDynamicClient({
  environmentId: 'YOUR_ENVIRONMENT_ID',
});

addEIP6963Extension();
addWaasEvmExtension();
```

Then in your app entry point, import the client to trigger the module:

```tsx theme={"system"}
// main.tsx
import './dynamicClient';
import { initializeClient } from '@dynamic-labs-sdk/client';

void initializeClient();
```
