Web3-Onboard
A wallet connection library developed by Blocknative, supporting multiple wallets and frameworks.
Connect to Wallet
@web3-onboard/core
Connect to a wallet using the native Web3-Onboard API. This approach is suitable for vanilla JS or non-React environments.
Params
// No params required for connectWallet()
Returns
// Returns an array of connected wallet objects
Array<{
label: string;
accounts: Array<{ address: string; ens?: { name?: string } }>;
chains: Array<{ id: string; namespace: string; rpcUrl: string }>;
// ...other wallet info
}>
Example
import Onboard from '@web3-onboard/core'
import BitGetWallet from '@web3-onboard/bitget'
import InjectedWallet from '@web3-onboard/injected-wallets'
const onboard = Onboard({
wallets: [
new BitGetWallet(),
new InjectedWallet()
],
chains: [
{
id: 1,
token: 'ETH',
label: 'Ethereum Mainnet',
rpcUrl: 'https://api.pimlico.io/v2/1/rpc?apikey=YOUR_KEY',
},
]
})
async function connectWallet() {
const wallets = await onboard.connectWallet()
console.log(wallets)
}
// In your UI:
// <button onclick={connectWallet}>Connect Bitget wallet</button>
@web3-onboard/react
Web3-Onboard also provides a React context and hooks for easier integration in React apps.
Params
// No params required for useConnectWallet()
Returns
// useConnectWallet returns [state, connect, disconnect]
[
{
wallet: WalletState | null,
connecting: boolean,
// ...
},
connect: () => Promise<void>,
disconnect: (wallet: WalletState) => Promise<void>
]
Example
import { useConnectWallet, Web3OnboardProvider, init } from '@web3-onboard/react'
import BitGetWallet from '@web3-onboard/bitget'
import InjectedWallet from '@web3-onboard/injected-wallets'
const reactOnBoard = init({
wallets: [
new BitGetWallet(),
new InjectedWallet()
],
chains: [
{
id: 1,
token: 'ETH',
label: 'Ethereum Mainnet',
rpcUrl: 'https://api.pimlico.io/v2/1/rpc?apikey=YOUR_KEY',
},
]
})
function ConnectDemo() {
const [{ wallet, connecting }, connect, disconnect] = useConnectWallet()
return (
<button disabled={connecting} onClick={() => (wallet ? disconnect(wallet) : connect())}>
{connecting ? 'connecting' : wallet ? 'disconnect' : 'connect'}
</button>
)
}
function App() {
return (
<Web3OnboardProvider web3Onboard={reactOnBoard}>
<ConnectDemo />
</Web3OnboardProvider>
)
}
Manage Network
Switch Chain
Complete Example
import { useConnectWallet } from '@web3-onboard/react'
import { Button, Input } from 'antd'
import React from 'react'
function SwitchChainDemo() {
const [{ wallet }] = useConnectWallet()
const provider = wallet?.provider
const [chainId, setChainId] = React.useState('0x1')
const [result, setResult] = React.useState('')
const [err, setErr] = React.useState('')
async function handleSwitchChain() {
setErr(''); setResult('')
if (!provider) return setErr('No provider')
try {
await provider.request({
method: 'wallet_switchEthereumChain',
params: [{ chainId }],
})
setResult('Switched to chain: ' + chainId)
} catch (e) {
setErr(e?.message || String(e))
}
}
return (
<div>
<Input style={{ width: 200, marginRight: 8 }} value={chainId} onChange={e => setChainId(e.target.value)} placeholder="chainId (hex, e.g. 0x1)" />
<Button disabled={!provider} onClick={handleSwitchChain}>Switch Chain</Button>
{result && <div style={{ color: 'green' }}>{result}</div>}
{err && <div style={{ color: 'red' }}>{err}</div>}
</div>
)
}
Parameters
interface SwitchChainParams {
chainId: string // hex string, e.g. '0x1' for Ethereum Mainnet
}
Returns
// Returns null if successful, throws error if failed
null
Usage
await provider.request({
method: 'wallet_switchEthereumChain',
params: [{ chainId: '0x1' }],
})
Try It
Add Chain
Example
import { useConnectWallet } from '@web3-onboard/react'
import { Button, Input } from 'antd'
import React from 'react'
function AddChainDemo() {
const [{ wallet }] = useConnectWallet()
const provider = wallet?.provider
const [addChainParams, setAddChainParams] = React.useState('')
const [result, setResult] = React.useState('')
const [err, setErr] = React.useState('')
async function handleAddChain() {
setErr(''); setResult('')
if (!provider) return setErr('No provider')
let params
try {
params = JSON.parse(addChainParams)
} catch {
setErr('Invalid JSON for chain params')
return
}
try {
await provider.request({
method: 'wallet_addEthereumChain',
params: [params],
})
setResult('Chain added: ' + params.chainId)
} catch (e) {
setErr(e?.message || String(e))
}
}
return (
<div>
<Input style={{ width: 400, marginRight: 8 }} value={addChainParams} onChange={e => setAddChainParams(e.target.value)} placeholder='Add Chain Params (JSON)' />
<Button disabled={!provider} onClick={handleAddChain}>Add Chain</Button>
{result && <div style={{ color: 'green' }}>{result}</div>}
{err && <div style={{ color: 'red' }}>{err}</div>}
</div>
)
}
Parameters
interface AddChainParams {
chainId: string
chainName: string
rpcUrls: string[]
nativeCurrency: { name: string; symbol: string; decimals: number }
blockExplorerUrls?: string[]
iconUrls?: string[]
}
Returns
// Returns null if successful, throws error if failed
null
Usage
await provider.request({
method: 'wallet_addEthereumChain',
params: [chainParams],
})
Try It
Get Chain ID
Complete Example
import { useConnectWallet } from '@web3-onboard/react'
import { Button } from 'antd'
import React from 'react'
function GetChainIdDemo() {
const [{ wallet }] = useConnectWallet()
const provider = wallet?.provider
const [result, setResult] = React.useState('')
const [err, setErr] = React.useState('')
async function handleGetChainId() {
setErr(''); setResult('')
if (!provider) return setErr('No provider')
try {
const chainId = await provider.request({
method: 'eth_chainId',
})
setResult('Current Chain ID: ' + chainId)
} catch (e) {
setErr(e?.message || String(e))
}
}
return (
<div>
<Button disabled={!provider} onClick={handleGetChainId}>Get Chain ID</Button>
{result && <div style={{ color: 'green', wordBreak: 'break-all' }}>{result}</div>}
{err && <div style={{ color: 'red' }}>{err}</div>}
</div>
)
}
Parameters
// No params required for eth_chainId
type GetChainIdParams = void
Returns
// Returns the current chain ID as a hex string
string // e.g. '0x1'
Usage
await provider.request({
method: 'eth_chainId',
})
Try It
Sign Message
Sign Typed Data
Sign EIP-712 typed data using eth_signTypedData_v4
.
Parameters
interface SignTypedDataParams {
typedData: object // EIP-712 typed data object (must be valid JSON)
address: string // address to sign with
}
Returns
// Returns the signature string
type SignTypedDataResult = string // e.g. '0x...'
Usage
await provider.request({
method: 'eth_signTypedData_v4',
params: [address, JSON.stringify(typedData)],
})
Input Example
{
"types": {
"EIP712Domain": [{"name": "name", "type": "string"}],
"Person": [{"name": "name", "type": "string"}]
},
"primaryType": "Person",
"domain": {"name": "Bitget"},
"message": {"name": "Alice"}
}
Try It
Sign Personal Message
Sign a message using personal_sign
.
Parameters
interface SignPersonalMessageParams {
message: string
address: string
}
Returns
// Returns the signature string
type SignPersonalMessageResult = string // e.g. '0x...'
Usage
await provider.request({
method: 'personal_sign',
params: [message, address],
})
Try It
Transaction
Get Balance
Complete Example
import { useConnectWallet } from '@web3-onboard/react'
import { Button } from 'antd'
import React from 'react'
function GetBalanceDemo() {
const [{ wallet }] = useConnectWallet()
const provider = wallet?.provider
const address = wallet?.accounts?.[0]?.address
const [result, setResult] = React.useState('')
const [err, setErr] = React.useState('')
async function handleGetBalance() {
setErr(''); setResult('')
if (!provider || !address) return setErr('No provider or address')
try {
const balance = await provider.request({
method: 'eth_getBalance',
params: [address, 'latest'],
})
setResult(balance)
} catch (e) {
setErr(e?.message || String(e))
}
}
return (
<div>
<Button disabled={!provider || !address} onClick={handleGetBalance}>Get Balance</Button>
{result && <div style={{ color: 'green', wordBreak: 'break-all' }}>{result}</div>}
{err && <div style={{ color: 'red' }}>{err}</div>}
</div>
)
}
Parameters
interface GetBalanceParams {
address: string
blockTag?: string // e.g. 'latest'
}
Returns
// Returns the balance as a hex string
string // e.g. '0x...' (wei)
Usage
await provider.request({
method: 'eth_getBalance',
params: [address, 'latest'],
})
Try It
Sign Transaction
Example
import { useConnectWallet } from '@web3-onboard/react'
import { Button, Input } from 'antd'
import React from 'react'
function SignTransactionDemo() {
const [{ wallet }] = useConnectWallet()
const provider = wallet?.provider
const address = wallet?.accounts?.[0]?.address
const [tx, setTx] = React.useState('{"to":"0x...","value":"0x0"}')
const [result, setResult] = React.useState('')
const [err, setErr] = React.useState('')
async function handleSignTx() {
setErr(''); setResult('')
if (!provider || !address) return setErr('No provider or address')
let txObj
try {
txObj = JSON.parse(tx)
} catch {
setErr('Invalid JSON for tx')
return
}
try {
const sig = await provider.request({
method: 'eth_signTransaction',
params: [txObj],
})
setResult(sig)
} catch (e) {
setErr(e?.message || String(e))
}
}
return (
<div>
<Input style={{ width: 400, marginRight: 8 }} value={tx} onChange={e => setTx(e.target.value)} placeholder='Tx JSON (to, value, ...)' />
<Button disabled={!provider || !address} onClick={handleSignTx}>Sign Transaction</Button>
{result && <div style={{ color: 'green', wordBreak: 'break-all' }}>{result}</div>}
{err && <div style={{ color: 'red' }}>{err}</div>}
</div>
)
}
Parameters
interface SignTransactionParams {
to: string
value: string // hex string
// ...other tx fields (gas, gasPrice, data, nonce, etc.)
}
Returns
// Returns the signed transaction as a hex string
string // e.g. '0x...'
Usage
await provider.request({
method: 'eth_signTransaction',
params: [txObj],
})
Send Transaction
Example
import { useConnectWallet } from '@web3-onboard/react'
import { Button, Input } from 'antd'
import React from 'react'
function SendTransactionDemo() {
const [{ wallet }] = useConnectWallet()
const provider = wallet?.provider
const address = wallet?.accounts?.[0]?.address
const [tx, setTx] = React.useState('{"to":"0x...","value":"0x0"}')
const [result, setResult] = React.useState('')
const [err, setErr] = React.useState('')
async function handleSendTx() {
setErr(''); setResult('')
if (!provider || !address) return setErr('No provider or address')
let txObj
try {
txObj = JSON.parse(tx)
} catch {
setErr('Invalid JSON for tx')
return
}
try {
const txHash = await provider.request({
method: 'eth_sendTransaction',
params: [txObj],
})
setResult(txHash)
} catch (e) {
setErr(e?.message || String(e))
}
}
return (
<div>
<Input style={{ width: 400, marginRight: 8 }} value={tx} onChange={e => setTx(e.target.value)} placeholder='Tx JSON (to, value, ...)' />
<Button disabled={!provider || !address} onClick={handleSendTx}>Send Transaction</Button>
{result && <div style={{ color: 'green', wordBreak: 'break-all' }}>{result}</div>}
{err && <div style={{ color: 'red' }}>{err}</div>}
</div>
)
}
Parameters
interface SendTransactionParams {
to: string
value: string // hex string
// ...other tx fields (gas, gasPrice, data, nonce, etc.)
}
Returns
// Returns the transaction hash as a hex string
string // e.g. '0x...'
Usage
await provider.request({
method: 'eth_sendTransaction',
params: [txObj],
})