> 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[​](#prerequisites "Direct link to 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](/developer-tools/dashboard/get-started/create-api/) from the Infura dashboard.

## Steps[​](#steps "Direct link to Steps")

### 1\. Install MetaMask Connect EVM[​](#1-install-metamask-connect-evm "Direct link to 1. Install MetaMask Connect EVM")

Install the EVM client in an existing JavaScript project:

- npm
- Yarn
- pnpm
- Bun

```
npm install @metamask/connect-evm

```

```
yarn add @metamask/connect-evm

```

```
pnpm add @metamask/connect-evm

```

```
bun add @metamask/connect-evm

```

### 2\. Initialize MetaMask Connect EVM[​](#2-initialize-metamask-connect-evm "Direct link to 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:

```
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[​](#3-connect-and-use-provider "Direct link to 3. Connect and use provider")

Connect to MetaMask and get the provider for RPC requests:

```
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[​](#common-metamask-connect-evm-methods-at-a-glance "Direct link to 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[​](#usage-example "Direct link to Usage example")

```
// 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[​](#next-steps "Direct link to 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
