フロントエンドからの Web3 統合スキル。viem / wagmi / RainbowKit を使った ウォレット接続、コントラクト操作、トランザクション UX のパターンを提供する。 ユーザーが "Web3 フロントエンド", "ウォレット接続", "viem", "wagmi", "RainbowKit", "ConnectKit", "dApp UI", "web3-frontend" 等と言った時に使用。
フロントエンドアプリケーションからブロックチェーンと対話するための設計パターン、ライブラリ選択基準、実装ガイドを提供するスキル。viem / wagmi / RainbowKit を中心とした現代的な Web3 フロントエンドスタックを対象とする。
| ライブラリ | 役割 | 備考 |
|---|---|---|
| viem | 低レベル Ethereum クライアント | ethers.js の代替。TypeScript ファースト、tree-shakable |
| wagmi | React Hooks for Ethereum | viem ベース。React アプリの標準選択 |
| @tanstack/react-query | サーバー状態管理 | wagmi v2 の依存。キャッシュ・再検証を担当 |
| RainbowKit | ウォレット接続 UI | wagmi 統合済み。カスタマイズ性が高い |
| ConnectKit | ウォレット接続 UI(代替) | よりシンプルな API。小規模プロジェクト向け |
| WalletConnect v2 | マルチチェーンウォレット接続プロトコル | RainbowKit / ConnectKit の内部で使用 |
| 判断基準 | viem 推奨 | ethers.js 推奨 |
|---|---|---|
| 新規プロジェクト | はい | — |
| TypeScript 型安全性 | 完全な型推論 | 部分的 |
| バンドルサイズ | tree-shakable(小さい) | モノリシック(大きい) |
| 既存の ethers.js コードベース | — | 移行コスト大 |
| wagmi との統合 | ネイティブ統合 | アダプター必要 |
| ドキュメント・コミュニティ | 成長中 | 成熟 |
判断ルール: 新規プロジェクトまたは wagmi 使用時は viem を推奨。既存 ethers.js プロジェクトの場合はユーザーに移行の意向を AskUserQuestion で確認する。
package.json を読み込み、以下の依存関係を確認する:
viem / ethers → Ethereum クライアントの判定wagmi / @wagmi/core → React hooks 使用有無@rainbow-me/rainbowkit / connectkit → ウォレット UI の判定@tanstack/react-query → 状態管理の確認next / react → フレームワークの判定tsconfig.json の存在で TypeScript プロジェクトか判定する。createConfig, useAccount, useConnect → wagmi 使用中ethers.providers, new ethers.Contract → ethers.js 使用中検証ゲート: package.json が存在し、少なくとも 1 つの Web3 ライブラリが検出されること。Web3 ライブラリが未検出の場合は、AskUserQuestion で使用するスタックを確認する。
Step 1 の結果に基づき、必要なリファレンスを選択して読み込む:
| 状況 | 読み込むリファレンス |
|---|---|
| コントラクト操作 | references/viem-patterns.md から操作パターンを読み込み、read/write/event の該当セクションを選択 |
| React コンポーネント開発 | references/wagmi-hooks.md から hooks パターンを読み込み、該当カテゴリ(接続・読取・書込)を選択 |
| ウォレット接続実装 | references/wallet-connection.md からプロバイダー統合パターンを読み込み、使用ライブラリに合わせて選択 |
| トランザクション送信 | references/transaction-ux.md から UX パターンを読み込み、楽観的更新・エラー表示の該当パターンを選択 |
判断が不明な場合: 複数のアプローチが考えられる場合は AskUserQuestion で要件を確認してからリファレンスを選択する。
検証ゲート: 少なくとも 1 つのリファレンスファイルが正常に読み込めること。
as const アサーションで ABI を定義し、viem の型推論を有効にするabi/ ディレクトリに分離配置を推奨検証ゲート: 生成コードが TypeScript コンパイルを通ること(npx tsc --noEmit で確認可能)。
@wagmi/test のモックプロバイダーを使用createTestClient を使用anvil(Foundry のローカルノード)でローカルチェーンを起動してテストcast でテストデータのセットアップ検証ゲート: テストが全件パスすること。テストフレームワーク未導入の場合は AskUserQuestion でテスト方針を確認する。
ユーザー入力: 「RainbowKit でウォレット接続を実装して」
アクション:
package.json を確認 → wagmi + RainbowKit が依存に存在references/wallet-connection.md を読み込み → RainbowKit セクションを選択wagmi.config.ts — チェーン設定、トランスポート定義providers.tsx — WagmiProvider + QueryClientProvider + RainbowKitProvider のラッピングConnectButton コンポーネントの配置結果: RainbowKit のウォレット接続 UI が動作し、接続後にアドレスが表示される。
ユーザー入力: 「ユーザーのウォレットにある USDC 残高を表示したい」
アクション:
references/viem-patterns.md(コントラクト読取)+ references/wagmi-hooks.md(useReadContract)を読み込みas const で定義useReadContract で balanceOf を呼び出すカスタム hookformatUnits でデシマル変換した表示コンポーネント結果: 接続ウォレットの USDC 残高が正しいデシマルで表示される。
ユーザー入力: 「NFT ミントのトランザクション送信画面を作って。進捗表示もほしい」
アクション:
references/transaction-ux.md(トランザクションライフサイクル)+ references/wagmi-hooks.md(useWriteContract)を読み込みuseWriteContract + useWaitForTransactionReceipt を組み合わせたカスタム hookestimateContractGas)結果: NFT ミントの全ライフサイクルが視覚的にフィードバックされる UI が完成。
症状: ConnectButton を押してもウォレットが接続されない / エラーが出る
原因と対策:
cloud.walletconnect.com でプロジェクトを作成し、環境変数で設定する。wagmi.config.ts のチェーン設定がウォレットの接続チェーンと一致しない。chains 配列を確認する。window.ethereum にアクセスしている。'use client' ディレクティブの付与と、動的インポートまたは mounted state ガードを確認する。症状: useSwitchChain が失敗する / ユーザーにチェーン追加プロンプトが出ない
原因と対策:
chains 配列にターゲットチェーンが含まれているか確認する。transports でチェーン ID ごとに正しい RPC URL が設定されているか確認する。switchChain のエラーをキャッチし、手動切り替えの案内を表示する。症状: useWriteContract が ContractFunctionRevertedError を返す
原因と対策:
parseEther, parseUnits で正しく変換する。estimateContractGas で事前にガスを見積もり、十分な残高があるか確認する。onlyOwner 等の修飾子に引っかかっている。接続アドレスの権限を確認する。症状: 429 Too Many Requests または接続タイムアウト
原因と対策:
useReadContract の query.refetchInterval が短すぎる。適切な間隔(10-30秒)に設定する。fallback トランスポートで複数の RPC エンドポイントを設定し、フェイルオーバーを実装する。症状: ABI から型が推論されない / unknown 型になる
原因と対策:
as const がない: ABI 定義に as const アサーションを付与する。外部ファイルからインポートする場合も satisfies Abi + as const を使用する。wagmi と viem のメジャーバージョンが対応しているか確認する(wagmi v2 は viem v2 が必要)。writeContract でトランザクションを構築し、ウォレットに署名を委譲する。mainnet, sepolia 等の定義済みチェーンオブジェクトを使用し、マジックナンバーを避ける。solidity-core を参照する。