| title | JavaScript Quickstart - MetaMask Connect Solana | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| description | Set up MetaMask Connect Solana in a vanilla JavaScript dapp using Wallet Standard features, signAndSendTransaction, and createSolanaClient. | |||||||||||
| sidebar_label | JavaScript | |||||||||||
| keywords |
|
This quickstart gets you up and running with MetaMask Connect Solana in a JavaScript dapp.
- Node.js version 19 or later installed.
- A package manager installed, such as npm, Yarn, pnpm, or bun.
- MetaMask installed in your browser or on mobile.
- An Infura API key from the Infura dashboard.
Install the Solana Client in an existing JavaScript project:
npm install @metamask/connect-solanaInitialize the Solana client using createSolanaClient.
The following is an example of initializing the client in a JavaScript project:
import { createSolanaClient, getInfuraRpcUrls } from '@metamask/connect-solana'
const solanaClient = await createSolanaClient({
dapp: {
name: 'Example JavaScript Solana dapp',
url: window.location.href,
iconUrl: 'https://mydapp.com/icon.png', // Optional
},
api: {
supportedNetworks: getInfuraRpcUrls({
infuraApiKey: 'YOUR_INFURA_API_KEY',
networks: ['devnet'],
}),
},
}):::info
createSolanaClient is async and uses a singleton multichain core under the hood.
Calling it multiple times returns the same underlying session, so you can safely call it during
initialization without worrying about duplicate connections.
:::
This example configures MetaMask Connect Solana with the following options:
dapp- Ensures trust by showing your dapp'sname,url, andiconUrlduring connection.api.supportedNetworks- A map of network names (mainnet,devnet,testnet) to RPC URLs for all networks supported by the dapp.
Get the Wallet Standard wallet instance and connect:
const wallet = solanaClient.getWallet()
const { accounts } = await wallet.features['standard:connect'].connect()
console.log('Connected account:', accounts[0].address)The client handles cross-platform connection (desktop and mobile), including deeplinking.
| Method | Description |
|---|---|
getWallet |
Returns a Wallet Standard compatible wallet instance |
registerWallet |
Registers MetaMask with the Wallet Standard registry (no-op if auto-registered) |
disconnect |
Disconnects Solana scopes without terminating the broader multichain session |
const wallet = solanaClient.getWallet()
// 1. Connect and get accounts
try {
const { accounts } = await wallet.features['standard:connect'].connect()
console.log('Connected:', accounts[0].address)
// 2. Sign a message
const message = new TextEncoder().encode('Hello from my dapp')
const [{ signature }] = await wallet.features['solana:signMessage'].signMessage({
account: accounts[0],
message,
})
console.log('Signature:', signature)
} catch (err) {
if (err.code === 4001) {
console.log('User rejected the request')
} else if (err.code === -32002) {
console.log('A request is already pending — check MetaMask')
} else {
console.error('Unexpected error:', err)
}
}
// 3. Disconnect
await solanaClient.disconnect()- Use the Wallet Adapter to integrate MetaMask with Solana's standard wallet discovery in a React dapp.
- Send a legacy transaction to transfer SOL or interact with programs.
- Sign messages to verify wallet ownership or authorize offchain actions.