Skip to Content
๐ŸŒ Web3๐Ÿ“– EVM๐Ÿ“ฑ DApp (EVM)๐ŸŒˆ Wagmi & RainbowKit

๐ŸŒˆ Wagmi & RainbowKit

Wagmi provides React hooks for connecting to EVM wallets, reading chain state, and calling contracts. RainbowKit adds a ready-made connect-button and modal (MetaMask, WalletConnect, Coinbase, etc.). Together they are a popular, modular choice for EVM dApps.


๐ŸŽฏ Why Wagmi + RainbowKit

  • Modular โ€” Use with any React/Next.js app; no full-stack template required
  • Hooks โ€” useAccount, useBalance, useContractRead, useContractWrite, useSwitchChain
  • RainbowKit โ€” One <ConnectButton />; supports many wallets and chains
  • Viem under the hood โ€” Wagmiย  is built on Viemย 

๐Ÿš€ Quick Setup (Next.js)

Install:

npm install wagmi viem @rainbow-me/rainbowkit

Configure providers and add the connect button:

// app/providers.jsx (or layout wrapper) "use client"; import { WagmiProvider, createConfig, http } from "wagmi"; import { mainnet, sepolia } from "wagmi/chains"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { RainbowKitProvider, getDefaultConfig } from "@rainbow-me/rainbowkit"; import "@rainbow-me/rainbowkit/styles.css"; const config = getDefaultConfig({ appName: "My dApp", projectId: process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID, chains: [mainnet, sepolia], ssr: true, }); const queryClient = new QueryClient(); export function Providers({ children }) { return ( <WagmiProvider config={config}> <QueryClientProvider client={queryClient}> <RainbowKitProvider>{children}</RainbowKitProvider> </QueryClientProvider> </WagmiProvider> ); }
// In any component import { ConnectButton } from "@rainbow-me/rainbowkit"; export default function Header() { return <ConnectButton />; }

๐Ÿ“ Reading Contract Data

import { useContractRead } from "wagmi"; const erc20Abi = [ { inputs: [{ name: "account", type: "address" }], name: "balanceOf", outputs: [{ type: "uint256" }], stateMutability: "view", type: "function" }, ]; function Balance({ tokenAddress, userAddress }) { const { data: balance } = useContractRead({ address: tokenAddress, abi: erc20Abi, functionName: "balanceOf", args: [userAddress], }); return <span>Balance: {balance?.toString() ?? "โ€”"}</span>; }

๐Ÿ“ Writing to Contracts

import { useContractWrite, useWaitForTransactionReceipt } from "wagmi"; function MintButton({ contractAddress, abi }) { const { write, data: hash, isPending } = useContractWrite({ address: contractAddress, abi, functionName: "mint", }); const { isLoading: isConfirming, isSuccess } = useWaitForTransactionReceipt({ hash }); return ( <> <button onClick={() => write({ args: [userAddress, amount] })} disabled={isPending}> {isPending ? "Confirm in wallet" : "Mint"} </button> {isConfirming && <p>Confirmingโ€ฆ</p>} {isSuccess && <p>Minted.</p>} </> ); }

๐Ÿ”— Resources

Last updated on