下载

arrow_down

构建

arrow_down

更多

arrow_down
activityactivityactivityactivity
  • themelight
  • languageIcon

  • menu
Skip to Content

Web3Modal

支持版本: >=v2 支持日期: 2023.10.18

  1. 官方文档
  2. 开发指南

开发示例

import { createWeb3Modal } from "@web3modal/wagmi/react"; import { http, createConfig, WagmiProvider } from "wagmi"; import { mainnet, arbitrum } from "viem/chains"; import { walletConnect, coinbaseWallet } from "wagmi/connectors"; // 1. 在 https://cloud.walletconnect.com 获取 projectId const projectId = 'YOUR_PROJECT_ID'; if (!projectId) throw new Error("Project ID is undefined"); // 2. 创建 wagmiConfig const metadata = { name: "Web3Modal", description: "Web3Modal Example", url: "https://web3modal.com", icons: ["https://avatars.githubusercontent.com/u/37784886"], }; // 定义链 const chains = [mainnet, arbitrum] as const const wagmiConfig = createConfig({ chains, // 在这里使用定义的链 transports: { [mainnet.id]: http(), [arbitrum.id]: http(), }, connectors: [ walletConnect({ projectId, metadata, showQrModal: false }), coinbaseWallet({ appName: metadata.name, appLogoUrl: metadata.icons[0], }), ], }); // 3. 创建模态框 createWeb3Modal({ wagmiConfig, projectId }); ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( <React.StrictMode> <WagmiProvider config={wagmiConfig}> <w3m-button /> </WagmiProvider> </React.StrictMode> );

安装

npm install @web3modal/wagmi wagmi viem @tanstack/react-query

基础配置

1. 获取项目 ID

访问 WalletConnect Cloud 注册并获取项目 ID。

2. 创建配置

import { createWeb3Modal } from '@web3modal/wagmi/react' import { defaultWagmiConfig } from '@web3modal/wagmi/react/config' import { WagmiProvider } from 'wagmi' import { arbitrum, mainnet } from 'wagmi/chains' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' // 1. 获取项目ID const projectId = 'YOUR_PROJECT_ID' // 2. 创建wagmiConfig const metadata = { name: '我的DApp', description: '我的DApp描述', url: 'https://myapp.com', icons: ['https://myapp.com/icon.png'], } const chains = [mainnet, arbitrum] as const const config = defaultWagmiConfig({ chains, projectId, metadata, }) // 3. 创建模态框 createWeb3Modal({ wagmiConfig: config, projectId, enableAnalytics: true, // 可选 - 默认为你的Cloud配置 }) export function Web3ModalProvider({ children }) { const queryClient = new QueryClient() return ( <WagmiProvider config={config}> <QueryClientProvider client={queryClient}>{children}</QueryClientProvider> </WagmiProvider> ) }

3. 包装应用

import { Web3ModalProvider } from './config' function App() { return <Web3ModalProvider>{/* 您的应用组件 */}</Web3ModalProvider> }

连接钱包

使用连接按钮

import { useWeb3Modal } from '@web3modal/wagmi/react' import { useAccount } from 'wagmi' function ConnectButton() { const { open } = useWeb3Modal() const { address, isConnected } = useAccount() if (isConnected) { return <div>已连接: {address}</div> } return <button onClick={() => open()}>连接钱包</button> }

使用预构建组件

import { W3mConnectButton, W3mAccountButton } from '@web3modal/wagmi/react' function WalletButtons() { return ( <div> <W3mConnectButton /> <W3mAccountButton /> </div> ) }

自定义主题

设置主题模式

import { createWeb3Modal } from '@web3modal/wagmi/react' createWeb3Modal({ wagmiConfig: config, projectId, themeMode: 'dark', // 'light' | 'dark' })

自定义主题变量

createWeb3Modal({ wagmiConfig: config, projectId, themeVariables: { '--w3m-color-mix': '#00DCFF', '--w3m-color-mix-strength': 20, '--w3m-font-family': 'Roboto, sans-serif', '--w3m-border-radius-master': '10px', }, })

网络切换

import { useWeb3Modal } from '@web3modal/wagmi/react' import { useAccount, useSwitchChain } from 'wagmi' function NetworkSwitcher() { const { open } = useWeb3Modal() const { chain } = useAccount() const { switchChain } = useSwitchChain() return ( <div> <p>当前网络: {chain?.name}</p> <button onClick={() => open({ view: 'Networks' })}>切换网络</button> </div> ) }

获取连接状态

import { useWeb3ModalState } from '@web3modal/wagmi/react' function ConnectionStatus() { const { open, selectedNetworkId } = useWeb3ModalState() return ( <div> <p>模态框打开: {open ? '是' : '否'}</p> <p>选中网络: {selectedNetworkId}</p> </div> ) }

事件监听

import { useWeb3ModalEvents } from '@web3modal/wagmi/react' function EventListener() { const events = useWeb3ModalEvents() useEffect(() => { console.log('Web3Modal事件:', events) }, [events]) return <div>查看控制台以获取事件</div> }

高级配置

自定义钱包列表

import { createWeb3Modal } from '@web3modal/wagmi/react' createWeb3Modal({ wagmiConfig: config, projectId, featuredWalletIds: [ 'c57ca95b47569778a828d19178114f4db188b89b763c899ba0be274e97267d96', // MetaMask 'fd20dc426fb37566d803205b19bbc1d4096b248ac04548e3cfb6b3a38bd033aa', // Bitget Wallet ], includeWalletIds: [ 'c57ca95b47569778a828d19178114f4db188b89b763c899ba0be274e97267d96', 'fd20dc426fb37566d803205b19bbc1d4096b248ac04548e3cfb6b3a38bd033aa', ], excludeWalletIds: ['some-wallet-id-to-exclude'], })

自定义令牌

createWeb3Modal({ wagmiConfig: config, projectId, tokens: { 1: { address: '0xA0b86a33E6441c41bf2d68dC6AF6C344CC22b4Ad', image: 'token_image_url', }, 42161: { address: '0x912CE59144191C1204E64559FE8253a0e49E6548', image: 'arbitrum_token_image_url', }, }, })

使用 Hook

钱包信息

import { useWeb3Modal } from '@web3modal/wagmi/react' import { useAccount, useDisconnect } from 'wagmi' function WalletInfo() { const { open } = useWeb3Modal() const { address, connector, isConnected } = useAccount() const { disconnect } = useDisconnect() if (!isConnected) { return <button onClick={() => open()}>连接钱包</button> } return ( <div> <p>钱包: {connector?.name}</p> <p>地址: {address}</p> <button onClick={() => disconnect()}>断开连接</button> <button onClick={() => open({ view: 'Account' })}>账户详情</button> </div> ) }

余额和交易

import { useBalance, useSendTransaction } from 'wagmi' import { parseEther } from 'viem' function WalletActions() { const { address } = useAccount() const { data: balance } = useBalance({ address }) const { sendTransaction } = useSendTransaction() const handleSend = () => { sendTransaction({ to: '0x...', value: parseEther('0.01'), }) } return ( <div> <p> 余额: {balance?.formatted} {balance?.symbol} </p> <button onClick={handleSend}>发送 0.01 ETH</button> </div> ) }

完整示例

import { createWeb3Modal } from '@web3modal/wagmi/react' import { defaultWagmiConfig } from '@web3modal/wagmi/react/config' import { WagmiProvider } from 'wagmi' import { mainnet, arbitrum } from 'wagmi/chains' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { useAccount, useBalance } from 'wagmi' import { W3mConnectButton, W3mAccountButton } from '@web3modal/wagmi/react' // 配置 const projectId = 'YOUR_PROJECT_ID' const metadata = { name: 'Web3Modal Example', description: 'Web3Modal Example', url: 'https://web3modal.com', icons: ['https://avatars.githubusercontent.com/u/37784886'], } const chains = [mainnet, arbitrum] as const const config = defaultWagmiConfig({ chains, projectId, metadata, }) createWeb3Modal({ wagmiConfig: config, projectId, enableAnalytics: true, }) function DApp() { const { address, isConnected } = useAccount() const { data: balance } = useBalance({ address }) return ( <div> <W3mConnectButton /> {isConnected && ( <div> <p>地址: {address}</p> <p> 余额: {balance?.formatted} {balance?.symbol} </p> <W3mAccountButton /> </div> )} </div> ) } function App() { const queryClient = new QueryClient() return ( <WagmiProvider config={config}> <QueryClientProvider client={queryClient}> <DApp /> </QueryClientProvider> </WagmiProvider> ) } export default App

注意事项

  1. 项目 ID: 确保在生产环境中使用有效的 WalletConnect 项目 ID
  2. 网络配置: 根据您的 DApp 需求配置支持的网络
  3. 主题定制: 利用主题变量匹配您的品牌风格
  4. 钱包过滤: 使用 featuredWalletIds 和 excludeWalletIds 控制显示的钱包

相关资源

Last updated on