Skill de Migration OnchainKit
Migrez les apps de @coinbase/onchainkit vers des composants wagmi/viem autonomes sans dépendance à OnchainKit.
Avant de commencer
Créez un fichier mistakes.md à la racine du projet :
# Migration Mistakes & Learnings
Suivez les erreurs, corrections et leçons apprises lors de la migration OnchainKit.
## Errors
## Lessons Learned
Ajoutez chaque erreur, correction et leçon à ce fichier tout au long de la migration. Ce fichier améliore le skill au fil du temps.
Workflow de Migration
Les migrations DOIVENT se faire dans cet ordre. Ne sautez pas d'étapes.
Étape 1 : Détection
Scannez le projet pour comprendre l'utilisation actuelle d'OnchainKit :
- Recherchez dans tous les fichiers les imports
@coinbase/onchainkit - Identifiez les composants utilisés :
- Provider :
OnchainKitProvider(toujours présent si vous utilisez OnchainKit) - Wallet :
Wallet,ConnectWallet,WalletDropdown,WalletModal,Connected - Transaction :
Transaction,TransactionButton,TransactionStatus - Autre :
Identity,Avatar,Name,Address,Swap,Checkout, etc.
- Provider :
- Vérifiez
package.jsonpour les dépendances existanteswagmi,viem,@tanstack/react-query - Identifiez l'approche de styling du projet (Tailwind, CSS Modules, styled-components, etc.)
- Rapportez les découvertes à l'utilisateur avant de continuer
Étape 2 : Migration du Provider (toujours en premier)
Lisez references/provider-migration.md pour les instructions détaillées et le code.
Résumé :
- Assurez-vous que
wagmi,viemet@tanstack/react-querysont installés - Créez
wagmi-config.tsavec la configuration des chaînes et connecteurs - Remplacez
OnchainKitProviderparWagmiProvider+QueryClientProvider - Supprimez l'import
@coinbase/onchainkit/styles.css - Supprimez tout import
SafeAreaouMiniKitdes fichiers de layout
Validation : Exécutez npm run build (ou la commande build du projet). Doit réussir avant de continuer. En cas d'échec, corrigez les erreurs et documentez-les dans mistakes.md.
Étape 3 : Migration du Wallet (après le provider)
Lisez references/wallet-migration.md pour les instructions détaillées et le code.
Résumé :
- Créez un composant
WalletConnectutilisant les hooks wagmi (useAccount,useConnect,useDisconnect) - Le composant inclut une modal avec les options de wallet : Base Account, Coinbase Wallet, MetaMask
- Affiche l'adresse tronquée + bouton de déconnexion quand connecté
- Remplacez tous les imports et l'utilisation du composant wallet OnchainKit
Validation : Exécutez npm run build. Doit réussir avant de continuer. Documentez toute erreur dans mistakes.md.
Étape 4 : Migration des Transactions (après le wallet)
Lisez references/transaction-migration.md pour les instructions détaillées et le code.
Résumé :
- Vérifiez la prop
chainIdsur les composants<Transaction />existants -- ajoutez les chaînes manquantes àwagmi-config.ts - Créez un composant
TransactionFormutilisant les hooks wagmi (useWriteContract,useWaitForTransactionReceipt,useSwitchChain) - Le composant gère le cycle complet : idle, en attente de confirmation wallet, confirmation on-chain, succès, erreur
- Remplacez tous les imports de transactions OnchainKit (
Transaction,TransactionButton,TransactionStatus,TransactionSponsor, etc.) - Mettez à jour le format du tableau
calls-- utilisezaddress,abi,functionName,argsavec le typageas constapproprié - Mappez le callback
onStatusaux nouveaux noms de statut du cycle (init, pending, confirmed, success, error)
Validation : Exécutez npm run build. Doit réussir avant de continuer. Documentez toute erreur dans mistakes.md.
Étape 5 : Nettoyage
- Recherchez tout import
@coinbase/onchainkitrestant -- il ne devrait y en avoir aucun - Optionnellement, supprimez
@coinbase/onchainkitdes dépendancespackage.json - Exécutez
npm run buildfinal pour vérifier que tout fonctionne - Mettez à jour
mistakes.mdavec les leçons finales apprises
Dépannage
La build échoue après la migration du provider
- Dépendances manquantes : Assurez-vous que
wagmi,viem,@tanstack/react-querysont installés - Erreurs de type dans la config wagmi : Vérifiez que le tableau
chainsa au moins une chaîne et quetransportsa une entrée correspondante - "use client" manquant : Le provider et le composant wallet doivent tous deux avoir la directive
"use client"
Avertissement MetaMask SDK react-native
- L'avertissement
Can't resolve '@react-native-async-storage/async-storage'est inoffensif dans les builds web. Il provient du SDK MetaMask et n'affecte pas la fonctionnalité.
Le wallet ne se connecte pas
- Vérifiez que la config wagmi a les connecteurs corrects configurés
- Vérifiez que
WagmiProviderenveloppe l'arborescence des composants avant l'utilisation de tout hook wallet - Assurez-vous que
QueryClientProviderest à l'intérieur deWagmiProvider
Le reçu de transaction reste bloqué en attente
- Symptôme : Le hash de transaction apparaît, la tx se confirme on-chain, mais l'interface reste bloquée sur "Transaction in progress..." pour toujours
- Cause :
useWaitForTransactionReceiptn'a pas de RPC pour interroger car la chaîne de la transaction est manquante dans le tableauchainset l'objettransportsde la config wagmi - Solution : (1) Ajoutez la chaîne cible au tableau
chainsdewagmi-config.tsET à l'objettransports. (2) Passez toujourschainIdàuseWaitForTransactionReceipt({ hash, chainId })pour qu'il interroge la chaîne correcte
La transaction cible la mauvaise chaîne
TransactionFormchange automatiquement de chaîne, mais la chaîne cible doit exister dans le tableauchainsde la config wagmi et l'objettransports- Courant : ajouter
baseSepoliapour les transactions testnet (chainId 84532)
Restrictions d'export de page Next.js
- Next.js autorise uniquement des exports nommés spécifiques à partir des fichiers de page. Exporter des tableaux d'appels de contrat ou des constantes ABI à partir d'un fichier de page causera une erreur de build
- Solution : en faire des déclarations
constnon exportées ou les déplacer vers un module séparé
Erreurs de type ABI après la migration des transactions
- Lors de la définition d'ABIs en ligne, utilisez
as constsur le tableau pour une inférence de type appropriée - Marquez les champs individuels comme
type: 'function' as constetstateMutability: 'nonpayable' as const
Configuration wagmi existante détectée
- Si le projet enveloppe déjà avec
WagmiProvider, n'en ajoutez PAS un autre - À la place, mettez à jour simplement la config wagmi existante pour inclure les connecteurs nécessaires
- Le provider OnchainKit détecte et se défère aux providers wagmi existants -- la configuration autonome devrait aussi
Notes Importantes
- Utilisez toujours
wagmietviemdirectement. Ne jamais importer de@coinbase/onchainkit. - Le connecteur
baseAccountvient dewagmi/connectors, pas d'un package séparé. wagmi-config.tsdoit inclure chaque chaîne sur laquelle l'app fait des transactions. Si le<Transaction chainId={X} />OnchainKit original utilisait une chaîne spécifique, cette chaîne doit être danschainsETtransports. Sans cela,useWaitForTransactionReceiptrestera bloqué pour toujours.- Si le projet utilise Tailwind, utilisez les classes Tailwind pour les composants. Sinon, adaptez aux styles inline ou à l'approche de styling existante du projet (p. ex., CSS Modules).
- N'exportez pas les tableaux d'appels de contrat, les constantes ABI ou autres valeurs non-page à partir des fichiers de page Next.js. Utilisez des constantes non exportées ou un module séparé.
- Inspectez le code source OnchainKit dans
node_modules/@coinbase/onchainkit/src/si vous devez comprendre le fonctionnement interne d'un composant spécifique.