mcpField
W
web3-frontend

web3-frontend

github.com/pluginagentmarketplace开发1250 次安装43 周前更新
代码仓库

关于 web3-frontend

Web3 Frontend 是面向 dApp 开发者的技能,涵盖钱包连接与区块链交互。内容包括使用 wagmi 和 viem 的 React 模式,以及交易、签名和错误处理。

主要功能

  1. 01集成钱包并支持网络切换
  2. 02管理合约写入与交易状态
  3. 03估算 Gas 并处理交易错误
  4. 04使用 wagmi hooks 获取合约数据并执行操作
  5. 05实现 EIP-712、SIWE 和消息签名

适用场景

  1. 01为 React dApp 添加钱包连接
  2. 02构建合约铸造或转账流程
  3. 03展示交易状态与费用
  4. 04实现基于钱包的登录或授权

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/pluginagentmarketplace/custom-plugin-blockchain --skill web3-frontend

安装后在 Claude Code 中输入/web3-frontend确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

assets/
config.yaml
schema.json
references/
GUIDE.md
PATTERNS.md
scripts/
validate.py

详细介绍

Web3 前端技能

通过钱包集成、现代化库(viem/wagmi)和生产级 dApp 模式,精通 Web3 前端开发。

快速开始

# Invoke this skill for Web3 frontend development
Skill("web3-frontend", topic="wallet", framework="react")

涵盖主题

1. 钱包集成

将用户连接到 Web3:

  • RainbowKit:美观的钱包弹窗
  • WalletConnect:支持移动设备
  • 账户抽象:ERC-4337
  • 多链:切换网络
2. 交易管理

处理区块链交互:

  • 写入操作:合约写入
  • 状态跟踪:待处理、已确认
  • Gas 估算:显示费用
  • 错误处理:提供用户友好的消息
3. 签名与身份验证

验证用户身份:

  • EIP-712:类型化数据签名
  • SIWE:使用 Ethereum 登录
  • Permit:免 Gas 授权
  • 消息签名:个人签名
4. React Hooks

使用 wagmi 的现代模式:

  • useAccount:连接状态
  • useWriteContract:交易
  • useReadContract:数据获取
  • useWaitForTransactionReceipt:确认状态

代码示例

连接钱包
'use client';

import { ConnectButton } from '@rainbow-me/rainbowkit';
import { useAccount } from 'wagmi';

export function WalletConnect() {
  const { address, isConnected } = useAccount();

  return (
    <div>
      <ConnectButton />
      {isConnected && <p>Connected: {address}</p>}
    </div>
  );
}
写入合约
import { useWriteContract, useWaitForTransactionReceipt } from 'wagmi';
import { parseEther } from 'viem';

export function MintButton() {
  const { writeContract, data: hash, isPending } = useWriteContract();
  const { isLoading, isSuccess } = useWaitForTransactionReceipt({ hash });

  const mint = () => {
    writeContract({
      address: '0x...',
      abi: [...],
      functionName: 'mint',
      args: [1n],
      value: parseEther('0.08'),
    });
  };

  return (
    <button onClick={mint} disabled={isPending || isLoading}>
      {isPending ? 'Confirm in wallet...' :
       isLoading ? 'Minting...' :
       isSuccess ? 'Minted!' : 'Mint NFT'}
    </button>
  );
}
签署类型化数据(EIP-712)
import { useSignTypedData } from 'wagmi';

const DOMAIN = {
  name: 'My App',
  version: '1',
  chainId: 1,
  verifyingContract: '0x...',
};

export function useSignOrder() {
  const { signTypedDataAsync } = useSignTypedData();

  const sign = async (order: Order) => {
    return await signTypedDataAsync({
      domain: DOMAIN,
      types: { Order: [...] },
      primaryType: 'Order',
      message: order,
    });
  };

  return { sign };
}
错误处理
export function parseError(error: unknown): string {
  const msg = error instanceof Error ? error.message : String(error);

  if (msg.includes('user rejected')) return 'Transaction cancelled';
  if (msg.includes('insufficient funds')) return 'Insufficient balance';
  if (msg.includes('execution reverted')) {
    const reason = msg.match(/reason="([^"]+)"/)?.[1];
    return reason || 'Transaction would fail';
  }

  return 'Transaction failed';
}

包配置

npm install wagmi viem @rainbow-me/rainbowkit @tanstack/react-query
// providers/Web3.tsx
import { WagmiProvider } from 'wagmi';
import { RainbowKitProvider } from '@rainbow-me/rainbowkit';
import { QueryClientProvider, QueryClient } from '@tanstack/react-query';
import { config } from './config';

const queryClient = new QueryClient();

export function Web3Provider({ children }) {
  return (
    <WagmiProvider config={config}>
      <QueryClientProvider client={queryClient}>
        <RainbowKitProvider>{children}</RainbowKitProvider>
      </QueryClientProvider>
    </WagmiProvider>
  );
}

常见模式

模式使用场景Hook
连接钱包用户身份验证useAccount
读取数据显示余额useReadContract
写入交易铸造、转账useWriteContract
等待交易确认状态useWaitForTransactionReceipt
签署消息身份验证、授权useSignMessage

常见问题

问题影响解决方案
水合错误SSR 不匹配使用 dynamic 并设置 ssr: false
BigInt 序列化JSON.stringify自定义序列化器
数据过期缓存问题使用 refetchInterval

故障排除

“钱包无法连接”
// Ensure client-side only
import dynamic from 'next/dynamic';

const ConnectButton = dynamic(
  () => import('./ConnectButton'),
  { ssr: false }
);
“交易一直处于待处理状态”

检查 Gas 设置或加快交易速度:

await wallet.sendTransaction({
  ...tx,
  maxFeePerGas: tx.maxFeePerGas * 120n / 100n,
});

安全检查清单

  • 切勿公开私钥
  • 验证合约地址
  • 清理用户输入
  • 使用适当的错误边界
  • 实施 CSP 标头

交叉引用

  • Bonded Agent:05-web3-frontend
  • 相关技能:ethereum-development、solidity-development

版本历史

版本日期变更
2.0.02025-01使用 wagmi v2、viem,达到生产级标准
1.0.02024-12首次发布

评论

支持 Markdown