Skip to main content

Multichain quickstart

Get started with MetaMask Connect Multichain in your JavaScript (Vite) dapp.

Prerequisites

note

This quickstart uses Vite as the build tool for convenience, but MetaMask Connect Multichain works with vanilla JavaScript or any build tool of your choice.

Steps

1. Install MetaMask Connect Multichain

Install the multichain client in an existing JavaScript (Vite) project:

npm install @metamask/connect-multichain

2. Initialize MetaMask Connect Multichain

The following is an example of using MetaMask Connect Multichain for a multichain dapp in a JavaScript (Vite) project:

import { createMultichainClient } from '@metamask/connect-multichain'

const client = await createMultichainClient({
dapp: {
name: 'My Multichain Dapp',
url: window.location.href,
iconUrl: 'https://mydapp.com/icon.png',
},
api: {
supportedNetworks: {
'eip155:1': 'https://mainnet.infura.io/v3/YOUR_INFURA_API_KEY',
'eip155:137': 'https://polygon-mainnet.infura.io/v3/YOUR_INFURA_API_KEY',
'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp':
'https://solana-mainnet.infura.io/v3/YOUR_INFURA_API_KEY',
},
},
})

This example configures MetaMask Connect Multichain with the following options:

  • dapp - Ensures trust by showing your dapp's name, url, and iconUrl during connection.
  • api.supportedNetworks - A map of CAIP-2 chain IDs to RPC URLs for all networks supported by the dapp.

3. Connect and use the Multichain client

Connect to MetaMask, get accounts from the session, and invoke RPC methods on chain of your choice:

await client.connect(['eip155:1', 'eip155:137', 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp'], [])

const session = await client.getSession()
const ethAccounts = session.sessionScopes['eip155:1']?.accounts || []
const solAccounts = session.sessionScopes['solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp']?.accounts || []
console.log('ETH accounts:', ethAccounts)
console.log('SOL accounts:', solAccounts)

if (ethAccounts.length > 0) {
const ethAddress = ethAccounts[0].split(':')[2]
const ethBalance = await client.invokeMethod({
scope: 'eip155:1', // Ethereum Mainnet
request: {
method: 'eth_getBalance',
params: [ethAddress, 'latest'],
},
})
console.log('ETH balance:', ethBalance)
}

The user sees a single approval prompt for all requested chains. Use invokeMethod() to call RPC methods on any chain in the session by specifying a scope.

Multichain client methods at a glance

MethodDescription
connect(scopes, caipAccountIds)Connects to MetaMask with multichain scopes
getSession()Returns the current session with approved accounts
invokeMethod({ scope, request })Calls an RPC method on a specific chain using a scope
disconnect()Disconnects all scopes and ends the session
disconnect(scopes)Disconnects specific scopes without ending the session
on(event, handler)Registers an event handler
off(event, handler)Removes an event handler
getInfuraRpcUrls({ infuraApiKey })Generates Infura RPC URLs keyed by CAIP-2 chain ID

Next steps