migrating-an-onchainkit-app について
`@coinbase/onchainkit`から、単独の`wagmi`/`viem`コンポーネントへ移行する開発者向けのスキルです。Provider、ウォレット、トランザクションを順に移行し、各段階でビルドを確認して学びを記録します。
主な機能
- 01OnchainKitの利用状況と構成のスキャン
- 02ProviderをwagmiとReact Queryに移行
- 03wagmiフックでウォレットコンポーネントを置換
- 04wagmiフックでトランザクション処理を再構築
- 05段階ごとのビルドと移行内容の記録
活用シーン
- 01アプリのOnchainKit Providerの置き換え
- 02ウォレット接続画面の移行
- 03トランザクションコンポーネントのwagmi/viem化
- 04移行各段階でのビルド確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ base/ skills --skill migrating-an-onchainkit-appインストール後、Claude Code で/migrating-an-onchainkit-appを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/provider-migration.mdtransaction-migration.mdtroubleshooting.mdwallet-migration.md詳細
OnchainKit 移行スキル
@coinbase/onchainkit を使用するアプリを、OnchainKit に依存しない単独の wagmi/viem コンポーネントに移行します。
開始前
プロジェクトのルートに mistakes.md ファイルを作成します。
# Migration Mistakes & Learnings
Track errors, fixes, and lessons learned during OnchainKit migration.
## Errors
## Lessons Learned
移行中に発生したエラー、修正内容、教訓をすべてこのファイルに追記してください。このファイルを通じてスキルを継続的に改善できます。
移行ワークフロー
移行は必ず次の順序で行ってください。手順を省略しないでください。
ステップ 1:検出
プロジェクトをスキャンして、現在の OnchainKit の使用状況を把握します。
- すべてのファイルを検索し、
@coinbase/onchainkitのインポートを探します - 使用されているコンポーネントを特定します。
- プロバイダー:
OnchainKitProvider(OnchainKit を使用している場合は必ず存在します) - ウォレット:
Wallet、ConnectWallet、WalletDropdown、WalletModal、Connected - トランザクション:
Transaction、TransactionButton、TransactionStatus - その他:
Identity、Avatar、Name、Address、Swap、Checkoutなど
- プロバイダー:
package.jsonを確認し、wagmi、viem、@tanstack/react-queryの依存関係がすでにあるか調べます- プロジェクトのスタイリング方法(Tailwind、CSS Modules、styled-components など)を特定します
- 作業を続ける前に、調査結果をユーザーに報告します
ステップ 2:プロバイダーの移行(必ず最初に実施)
詳細な手順とコードについては、references/provider-migration.md を参照してください。
概要:
wagmi、viem、@tanstack/react-queryがインストールされていることを確認します- チェーンとコネクターの設定を含む
wagmi-config.tsを作成します OnchainKitProviderをWagmiProvider+QueryClientProviderに置き換えます@coinbase/onchainkit/styles.cssのインポートを削除します- レイアウトファイルから
SafeAreaや MiniKit のインポートを削除します
検証ゲート:npm run build(またはプロジェクトのビルドコマンド)を実行します。続行する前に、必ず成功させてください。失敗した場合はエラーを修正し、mistakes.md に記録します。
ステップ 3:ウォレットの移行(プロバイダーの後に実施)
詳細な手順とコードについては、references/wallet-migration.md を参照してください。
概要:
- wagmi フック(
useAccount、useConnect、useDisconnect)を使用してWalletConnectコンポーネントを作成します - コンポーネントに、Base Account、Coinbase Wallet、MetaMask のウォレット選択肢を含むモーダルを追加します
- 接続時には、短縮したアドレスと切断ボタンを表示します
- OnchainKit のウォレット関連インポートとコンポーネントの使用箇所をすべて置き換えます
検証ゲート:npm run build を実行します。続行する前に、必ず成功させてください。エラーがあれば mistakes.md に記録します。
ステップ 4:トランザクションの移行(ウォレットの後に実施)
詳細な手順とコードについては、references/transaction-migration.md を参照してください。
概要:
- 既存の
<Transaction />コンポーネントのchainIdprop を確認し、不足しているチェーンがあればwagmi-config.tsに追加します - wagmi フック(
useWriteContract、useWaitForTransactionReceipt、useSwitchChain)を使用してTransactionFormコンポーネントを作成します - コンポーネントで、アイドル状態、ウォレット確認待ち、オンチェーン確認中、成功、エラーというライフサイクル全体を処理します
- OnchainKit のトランザクション関連インポート(
Transaction、TransactionButton、TransactionStatus、TransactionSponsorなど)をすべて置き換えます calls配列の形式を更新します。適切なas const型指定を用いて、address、abi、functionName、argsを使用しますonStatusコールバックを新しいライフサイクルのステータス名(init、pending、confirmed、success、error)に対応付けます
検証ゲート:npm run build を実行します。続行する前に、必ず成功させてください。エラーがあれば mistakes.md に記録します。
ステップ 5:クリーンアップ
- 残っている
@coinbase/onchainkitのインポートがないか検索します。残っていてはいけません - 必要に応じて、
package.jsonの依存関係から@coinbase/onchainkitを削除します - 最終確認として
npm run buildを実行し、すべてが正常に動作することを確認します - 学んだ教訓を
mistakes.mdに追記します
トラブルシューティング
プロバイダーの移行後にビルドが失敗する
- 依存関係が不足している:
wagmi、viem、@tanstack/react-queryがインストールされていることを確認してください - wagmi 設定の型エラー:
chains配列に少なくとも1つのチェーンがあり、transportsに対応するエントリがあることを確認してください - 「use client」がない:プロバイダーとウォレットの両方のコンポーネントに
"use client"ディレクティブが必要です
MetaMask SDK の react-native 警告
Can't resolve '@react-native-async-storage/async-storage'という警告は、Web ビルドでは無害です。MetaMask SDK に起因するもので、機能には影響しません。
ウォレットに接続できない
- wagmi 設定で正しいコネクターが設定されていることを確認してください
- ウォレットフックを使用する前に、
WagmiProviderがコンポーネントツリーをラップしていることを確認してください QueryClientProviderがWagmiProviderの内側にあることを確認してください
トランザクションのレシートが保留中のままになる
- 症状:トランザクションハッシュが表示され、トランザクションはオンチェーンで確定しているのに、UI が「Transaction in progress...」のままいつまでも変わらない
- 原因:トランザクションのチェーンが wagmi 設定の
chainsとtransportsにないため、useWaitForTransactionReceiptにポーリング用の RPC がありません - 修正方法:(1) 対象のチェーンを
wagmi-config.tsのchains配列とtransportsオブジェクトの両方に追加します。(2) 正しいチェーンをポーリングするよう、useWaitForTransactionReceipt({ hash, chainId })に必ずchainIdを渡します
トランザクションが誤ったチェーンを対象にする
TransactionFormはチェーンを自動で切り替えますが、対象のチェーンが wagmi 設定のchains配列とtransportsオブジェクトに存在する必要があります- よくある例:テストネットのトランザクションには
baseSepolia(chainId 84532)を追加します
Next.js のページエクスポートに関する制限
- Next.js では、ページファイルから特定の名前付きエクスポートのみが許可されています。ページファイルからコントラクト呼び出し配列や ABI 定数をエクスポートすると、ビルドエラーが発生します
- 修正方法:エクスポートしない
const宣言にするか、別のモジュールに移動します
トランザクション移行後の ABI 型エラー
- ABI をインラインで定義する場合、適切な型推論のため、配列に
as constを使用します type: 'function' as constやstateMutability: 'nonpayable' as constのように、個々のフィールドにも指定します
既存の wagmi セットアップが検出された
- プロジェクトがすでに
WagmiProviderでラップされている場合、別のプロバイダーを追加しないでください - 代わりに、既存の wagmi 設定を更新して、必要なコネクターを追加します
- OnchainKit のプロバイダーは既存の wagmi プロバイダーを検出してそちらに処理を委ねます。単独のセットアップでも同様にしてください
重要な注意事項
- 常に
wagmiとviemを直接使用してください。@coinbase/onchainkitからインポートしないでください。 baseAccountコネクターはwagmi/connectorsから提供されます。別のパッケージからではありません。wagmi-config.tsには、アプリがトランザクションを実行するすべてのチェーンを含める必要があります。元の OnchainKit の<Transaction chainId={X} />が特定のチェーンを使用していた場合、そのチェーンをchainsとtransportsの両方に含める必要があります。含めないと、useWaitForTransactionReceiptがいつまでも完了しません。- プロジェクトで Tailwind を使用している場合は、コンポーネントに Tailwind クラスを使用してください。使用していない場合は、インラインスタイルや既存のスタイリング方法(例:CSS Modules)に合わせてください。
- Next.js のページファイルから、コントラクト呼び出し配列、ABI 定数、その他ページ以外の値をエクスポートしないでください。エクスポートしない定数を使用するか、別のモジュールに移動してください。
- 特定のコンポーネントの内部動作を理解する必要がある場合は、
node_modules/@coinbase/onchainkit/src/にある OnchainKit のソースコードを確認してください。