> For the complete documentation index, see [llms.txt](/llms.txt).

# Connect to EVM quickstart

Install `@metamask/connect-evm`, initialize an EVM client, and connect to the MetaMask wallet in under 5 minutes. MetaMask Connect EVM provides an EIP-1193 provider that works with viem, ethers.js, and web3.js, handles cross-platform connections (desktop extension, mobile QR code, and deeplinks), and persists sessions across page reloads.

## Prerequisites

- [Node.js](https://nodejs.org/) version 19 or later installed.
- A package manager installed, such as [npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm), [Yarn](https://yarnpkg.com/), [pnpm](https://pnpm.io/installation), or [bun](https://bun.sh/).
- [MetaMask](https://metamask.io/) installed in your browser or on mobile.
- An [Infura API key](https://docs.infura.io/dashboard/get-started/create-api) from the [Infura dashboard](https://app.infura.io).

## Steps

### 1. Install MetaMask Connect EVM

Install the EVM client in an existing JavaScript project:

**npm**

```bash
npm install @metamask/connect-evm

```

**Yarn**

```bash
yarn add @metamask/connect-evm

```

**pnpm**

```bash
pnpm add @metamask/connect-evm

```

**Bun**

```bash
bun add @metamask/connect-evm

```

### 2. Initialize MetaMask Connect EVM

Initialize the EVM client using [createEVMClient](/metamask-connect/evm/reference/methods/#createevmclient). The following is an example of initializing the client in a JavaScript project:

```javascript
import { createEVMClient, getInfuraRpcUrls } from '@metamask/connect-evm'

const evmClient = await createEVMClient({
  dapp: {
    name: 'MetaMask Connect EVM Example',
    url: window.location.href,
    iconUrl: 'https://mydapp.com/icon.png', // Optional
  },
  api: {
    supportedNetworks: {
      ...getInfuraRpcUrls({ infuraApiKey: 'YOUR_INFURA_API_KEY' }),
      '0x1': 'https://mainnet.infura.io/v3/YOUR_INFURA_API_KEY',
      '0xaa36a7': 'https://sepolia.infura.io/v3/YOUR_INFURA_API_KEY',
    },
  },
})

```

This example configures MetaMask Connect EVM with the following options:

- `dapp` - Ensures trust by showing your dapp's `name`, `url`, and `iconUrl` during connection. Use `base64Icon` instead of `iconUrl` when a hosted URL is unavailable (for example, in React Native).
- `api.supportedNetworks` - A map of hex chain IDs to RPC URLs for all networks supported by the app. Use the [getInfuraRpcUrls](/metamask-connect/evm/reference/methods/#getinfurarpcurls) helper to generate URLs for all Infura-supported chains, or specify your own.

Async client

`createEVMClient` returns a promise. Always `await` it before using the client. The client is a singleton; calling `createEVMClient` again returns the same instance.

### 3. Connect and use provider

Connect to MetaMask and get the provider for RPC requests:

```javascript
const provider = evmClient.getProvider()

try {
  const { accounts, chainId } = await evmClient.connect({
    chainIds: ['0x1', '0xaa36a7'],
  })
  console.log('Connected account:', accounts[0])
  console.log('Active chain:', chainId)
} catch (error) {
  if (error.code === 4001) {
    console.log('User rejected the connection request')
  } else if (error.code === -32002) {
    console.log('Connection request already pending')
  } else {
    console.error('Connection failed:', error)
  }
}

const balance = await provider.request({
  method: 'eth_getBalance',
  params: [accounts[0], 'latest'],
})
console.log('Balance:', balance)

```

[evmClient.connect](/metamask-connect/evm/reference/methods/#connect) handles cross-platform connection (desktop and mobile), including deeplinking. Pass `chainIds` to request permission for specific chains (hex strings). Ethereum Mainnet (`0x1`) is always included regardless of what you pass.

Use [provider.request](/metamask-connect/evm/reference/provider-api/#request) for arbitrary [JSON-RPC requests](/metamask-connect/evm/reference/json-rpc-api/) like `eth_chainId` or `eth_getBalance`, or for [batching requests](/metamask-connect/evm/guides/metamask-exclusive/batch-requests/) via `metamask_batch`.

## Common MetaMask Connect EVM methods at a glance

| Method                                                                                        | Description                                              |
| --------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
| [connect](/metamask-connect/evm/reference/methods/#connect)                                   | Triggers wallet connection flow                          |
| [connectAndSign({ message: "..." })](/metamask-connect/evm/reference/methods/#connectandsign) | Connects and prompts the user to sign a message          |
| [getProvider](/metamask-connect/evm/reference/methods/#getprovider)                           | Returns the provider object for RPC requests             |
| [provider.request({ method, params })](/metamask-connect/evm/reference/provider-api/#request) | Calls any Ethereum JSON‑RPC method                       |
| [Batched RPC](/metamask-connect/evm/guides/metamask-exclusive/batch-requests/)                | Use `metamask_batch` to group multiple JSON-RPC requests |

## Usage example

```javascript
// 1. Connect and get accounts
const { accounts, chainId } = await evmClient.connect()

// 2. Connect and sign in one step
const { signature } = await evmClient.connectAndSign({
  message: 'Sign in to the dapp',
})

// 3. Get provider for RPC requests
const provider = evmClient.getProvider()

// 4. Make an RPC request
const result = await provider.request({
  method: 'eth_accounts',
  params: [],
})

// 5. Batch multiple RPC requests
const batchResults = await provider.request({
  method: 'metamask_batch',
  params: [{ method: 'eth_accounts' }, { method: 'eth_chainId' }],
})

```

## Next steps

- [Manage user accounts](/metamask-connect/evm/guides/manage-user-accounts/)
- [Send transactions](/metamask-connect/evm/guides/send-transactions/)
- [Sign data](/metamask-connect/evm/guides/sign-data/)
- [Use the Multichain SDK](/metamask-connect/multichain/quickstart/javascript/) to connect to both EVM and Solana from a single session
