RainbowKit
RainbowKit Overview¶
RainbowKit is a wallet connection component library designed specifically for React applications, providing a beautiful, responsive, and highly customizable wallet connection UI. Developed by the Rainbow team, RainbowKit is built on top of WalletConnect and Wagmi, offering developers the industry's best wallet connection experience. It supports over 100 wallets and comes with built-in dark mode, connection animations, and comprehensive error handling, making Web3 application user experience comparable to Web2 applications.
Official Website: https://www.rainbowkit.com/
Core Features¶
1. Out-of-the-Box UI¶
Beautiful wallet connection interface:
- Wallet list: Automatically displays installed and recommended wallets
- Responsive design: Perfectly adapted for desktop and mobile
- Dark mode: Built-in light and dark themes
- Animations: Smooth connection and interaction animations
- Brand customization: Supports custom colors, border radius, and fonts
2. Extensive Wallet Support¶
Broad wallet ecosystem:
- Injected wallets: MetaMask, Coinbase Wallet, Brave Wallet
- WalletConnect: Supports all WalletConnect-compatible wallets
- Mobile wallets: Rainbow, Trust Wallet, Zerion
- Hardware wallets: Ledger Live (via WalletConnect)
- Smart wallets: Safe, Argent
3. Complete Feature Set¶
All the features needed for development:
- Connect button: One-click integration connect button component
- Account modal: Popup displaying account information and actions
- Network switching: Convenient network switching UI
- Transaction status: Displays pending transactions
- Disconnect: Clear disconnection flow
- Error handling: User-friendly error messages and retry mechanisms
4. Deep Wagmi Integration¶
Seamless integration with Wagmi:
- Hooks integration: Use Wagmi Hooks to fetch on-chain data
- Type safety: Full TypeScript type support
- State management: Automatic connection state management
- Chain configuration: Shares chain configuration with Wagmi
- Caching mechanism: Leverages Wagmi's query cache
Quick Start¶
Installation¶
Basic Configuration¶
import '@rainbow-me/rainbowkit/styles.css'
import { getDefaultConfig, RainbowKitProvider } from '@rainbow-me/rainbowkit'
import { WagmiProvider } from 'wagmi'
import { mainnet, polygon, optimism, arbitrum } from 'wagmi/chains'
import { QueryClientProvider, QueryClient } from '@tanstack/react-query'
const config = getDefaultConfig({
appName: 'My RainbowKit App',
projectId: 'YOUR_WALLETCONNECT_PROJECT_ID',
chains: [mainnet, polygon, optimism, arbitrum],
ssr: true // For Next.js SSR applications
})
const queryClient = new QueryClient()
function App() {
return (
<WagmiProvider config={config}>
<QueryClientProvider client={queryClient}>
<RainbowKitProvider>
{/* Your App */}
</RainbowKitProvider>
</QueryClientProvider>
</WagmiProvider>
)
}
Adding the Connect Button¶
import { ConnectButton } from '@rainbow-me/rainbowkit'
export function Header() {
return (
<header>
<h1>My **DApp**</h1>
<ConnectButton />
</header>
)
}
Custom Configuration¶
1. Theme Customization¶
Custom theme colors:
import { RainbowKitProvider, darkTheme } from '@rainbow-me/rainbowkit'
<RainbowKitProvider
theme={darkTheme({
accentColor: '#7b3ff2',
accentColorForeground: 'white',
borderRadius: 'medium',
fontStack: 'system',
overlayBlur: 'small'
})}
>
{/* ... */}
</RainbowKitProvider>
2. Custom Wallet List¶
Configure displayed wallets:
import { connectorsForWallets } from '@rainbow-me/rainbowkit'
import {
metaMaskWallet,
rainbowWallet,
walletConnectWallet,
coinbaseWallet
} from '@rainbow-me/rainbowkit/wallets'
const connectors = connectorsForWallets(
[
{
groupName: 'Recommended',
wallets: [rainbowWallet, metaMaskWallet]
},
{
groupName: 'Other',
wallets: [walletConnectWallet, coinbaseWallet]
}
],
{ appName: 'My App', projectId: 'YOUR_PROJECT_ID' }
)
const config = createConfig({
connectors,
chains: [mainnet],
// ...
})
3. Custom Connect Button¶
Customize button style and content:
import { ConnectButton } from '@rainbow-me/rainbowkit'
<ConnectButton.Custom>
{({
account,
chain,
openAccountModal,
openChainModal,
openConnectModal,
mounted
}) => {
const connected = mounted && account && chain
return (
<div>
{!connected ? (
<button onClick={openConnectModal}>Connect Wallet</button>
) : chain.unsupported ? (
<button onClick={openChainModal}>Wrong Network</button>
) : (
<div>
<button onClick={openChainModal}>
{chain.name}
</button>
<button onClick={openAccountModal}>
{account.displayName}
</button>
</div>
)}
</div>
)
}}
</ConnectButton.Custom>
4. Chain Configuration¶
Custom chain icons and information:
const config = getDefaultConfig({
appName: 'My App',
projectId: 'YOUR_PROJECT_ID',
chains: [
{
...mainnet,
iconUrl: 'https://example.com/ethereum.png'
},
{
...polygon,
iconUrl: 'https://example.com/polygon.png'
}
]
})
Using Wagmi Hooks¶
RainbowKit works in conjunction with Wagmi:
import { useAccount, useBalance, useEnsName } from 'wagmi'
import { ConnectButton } from '@rainbow-me/rainbowkit'
function Profile() {
const { address, isConnected } = useAccount()
const { data: balance } = useBalance({ address })
const { data: ensName } = useEnsName({ address })
if (!isConnected) {
return <ConnectButton />
}
return (
<div>
<p>Address: {ensName ?? address}</p>
<p>Balance: {balance?.formatted} {balance?.symbol}</p>
</div>
)
}
Advanced Features¶
1. Custom Avatars¶
Use ENS avatars or custom avatars:
<RainbowKitProvider
avatar={({ address, ensImage, size }) => {
return ensImage ? (
<img src={ensImage} width={size} height={size} />
) : (
<div style={{ width: size, height: size }}>
{/* Custom avatar */}
</div>
)
}}
>
2. Custom Chains¶
Add custom chains:
const myCustomChain = {
id: 12345,
name: 'My Custom Chain',
iconUrl: 'https://example.com/icon.png',
iconBackground: '#fff',
nativeCurrency: { name: 'Custom', symbol: 'CUSTOM', decimals: 18 },
rpcUrls: {
default: { http: ['https://rpc.example.com'] }
},
blockExplorers: {
default: { name: 'Explorer', url: 'https://explorer.example.com' }
}
}
3. Internationalization¶
Multi-language support:
import { RainbowKitProvider } from '@rainbow-me/rainbowkit'
<RainbowKitProvider locale="zh-CN">
{/* Chinese interface */}
</RainbowKitProvider>
4. Modal Hooks¶
Programmatic modal control:
import { useConnectModal, useAccountModal, useChainModal } from '@rainbow-me/rainbowkit'
function MyComponent() {
const { openConnectModal } = useConnectModal()
const { openAccountModal } = useAccountModal()
const { openChainModal } = useChainModal()
return (
<>
{openConnectModal && (
<button onClick={openConnectModal}>
Open Connect Modal
</button>
)}
{openAccountModal && (
<button onClick={openAccountModal}>
Open Account Modal
</button>
)}
{openChainModal && (
<button onClick={openChainModal}>
Open Chain Modal
</button>
)}
</>
)
}
Use Cases¶
- DeFi applications: DEX, lending platforms, yield aggregators
- NFT marketplaces: NFT trading platforms, minting websites
- DAO tools: Governance platforms, voting applications
- Web3 games: On-chain games and GameFi applications
- Social applications: Decentralized social networks
- Utility platforms: Blockchain explorers, analytics tools
Best Practices¶
1. Performance Optimization¶
- Code splitting: Dynamically import RainbowKit to reduce initial load
- SSR configuration: Properly configure server-side rendering
- Caching strategy: Leverage Wagmi's query cache
- Lazy loading: Defer loading of wallet connection components
2. User Experience¶
- Clear guidance: Provide wallet connection instructions
- Error handling: User-friendly error messages
- Status feedback: Display loading and transaction states
- Mobile optimization: Ensure smooth mobile experience
3. Security¶
- Network validation: Check the network the user is connected to
- Signature verification: Verify user-signed messages
- Minimal permissions: Only request necessary permissions
- User confirmation: Require secondary confirmation for important operations
Comparison with Other Solutions¶
| Feature | RainbowKit | Web3Modal | ConnectKit |
|---|---|---|---|
| UI Quality | Excellent | Good | Good |
| Wallet Support | 100+ | 300+ | 50+ |
| Customization | High | Medium | High |
| Documentation | Excellent | Good | Good |
| TypeScript | Complete | Complete | Complete |
| React Optimization | Deep Integration | General | Deep Integration |
| Maintenance Status | Active | Active | Active |
Ecosystem¶
Official Resources¶
- Website: https://www.rainbowkit.com/
- GitHub: https://github.com/rainbow-me/rainbowkit
- Documentation: Complete API documentation and examples
- Discord: Active community support
Related Tools¶
- Wagmi: React Hooks for Ethereum
- Viem: TypeScript Ethereum library
- WalletConnect: Wallet connection protocol
- Rainbow Wallet: Mobile wallet
Related Concepts and Technologies¶
- Wagmi: RainbowKit's underlying library, providing React Hooks
- WalletConnect: Wallet connection protocol
- Viem: Lightweight TypeScript Ethereum library
- TanStack Query: Data fetching and caching library
- MetaMask: The most popular Ethereum wallet
Summary¶
RainbowKit has become the go-to solution for wallet connections in React Web3 applications by providing beautiful UI components and an excellent development experience. Beyond its outstanding appearance, it offers a complete feature set, good customizability, and deep integration with Wagmi. Whether for rapid prototyping or production-grade applications, RainbowKit delivers a consistently high-quality user experience. For Web3 developers who pursue the ultimate user experience, RainbowKit is an exceptional tool.