<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Angela Chukuwike</title>
    <description>The latest articles on DEV Community by Angela Chukuwike (@web3smallie).</description>
    <link>https://dev.to/web3smallie</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3903231%2F0d1b97e8-16e9-438c-9519-68aa26e7fcf1.png</url>
      <title>DEV Community: Angela Chukuwike</title>
      <link>https://dev.to/web3smallie</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/web3smallie"/>
    <language>en</language>
    <item>
      <title>Automating wagmi v2 v3 and Inngest v3 v4 Migrations with Zero False Positives</title>
      <dc:creator>Angela Chukuwike</dc:creator>
      <pubDate>Tue, 28 Apr 2026 22:40:53 +0000</pubDate>
      <link>https://dev.to/web3smallie/automating-wagmi-v2-v3-and-inngest-v3-v4-migrations-with-zero-false-positives-71k</link>
      <guid>https://dev.to/web3smallie/automating-wagmi-v2-v3-and-inngest-v3-v4-migrations-with-zero-false-positives-71k</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Upgrading dependencies is one of the most frustrating parts of maintaining modern applications.&lt;/p&gt;

&lt;p&gt;A single breaking release can mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dozens of files to update
&lt;/li&gt;
&lt;li&gt;Hours of repetitive refactoring
&lt;/li&gt;
&lt;li&gt;Constant fear of introducing subtle bugs
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For wagmi v2→v3, that means renaming hooks like &lt;code&gt;useAccount&lt;/code&gt;, &lt;code&gt;useContractRead&lt;/code&gt;, and updating providers across your entire codebase.&lt;/p&gt;

&lt;p&gt;For Inngest v3→v4, it means restructuring function triggers, moving configuration, and adapting to a new middleware system.&lt;/p&gt;

&lt;p&gt;This is slow, error-prone, and hard to get right.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;Boring AI Migration Suite&lt;/strong&gt; — a production-grade codemod system that automates &lt;strong&gt;70–80% of these migrations with zero false positives&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;🔗 Live demo: &lt;a href="https://migrate-wagmi-v3.vercel.app" rel="noopener noreferrer"&gt;https://migrate-wagmi-v3.vercel.app&lt;/a&gt;&lt;br&gt;&lt;br&gt;
🔗 GitHub: &lt;a href="https://github.com/Web3smallie/migrate-wagmi-v3" rel="noopener noreferrer"&gt;https://github.com/Web3smallie/migrate-wagmi-v3&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;👉 The goal: eliminate the boring, risky parts of upgrades.&lt;/p&gt;


&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;The system uses a hybrid approach:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Deterministic AST transforms (70–80%)
&lt;/h3&gt;

&lt;p&gt;All safe, mechanical changes are handled automatically.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same input → same output
&lt;/li&gt;
&lt;li&gt;No guessing
&lt;/li&gt;
&lt;li&gt;No hallucinations
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  2. AI-ready TODO comments (20–30%)
&lt;/h3&gt;

&lt;p&gt;For complex cases, the codemod inserts structured comments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* TODO (AI): autoConnect was removed in wagmi v3. 
   Use reconnectOnMount instead if needed.
   See: https://wagmi.sh/react/guides/migrate-from-v2-to-v3 */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are designed so an AI agent (or developer) can resolve them quickly.&lt;/p&gt;




&lt;h2&gt;
  
  
  wagmi v2→v3: Automated Changes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;useAccount&lt;/code&gt; → &lt;code&gt;useConnection&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useAccountEffect&lt;/code&gt; → &lt;code&gt;useConnectionEffect&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useSwitchAccount&lt;/code&gt; → &lt;code&gt;useSwitchConnection&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useContractRead&lt;/code&gt; → &lt;code&gt;useReadContract&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useContractWrite&lt;/code&gt; → &lt;code&gt;useWriteContract&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useNetwork&lt;/code&gt; → &lt;code&gt;useChains&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useSwitchNetwork&lt;/code&gt; → &lt;code&gt;useSwitchChain&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useWaitForTransaction&lt;/code&gt; → &lt;code&gt;useWaitForTransactionReceipt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WagmiConfig&lt;/code&gt; → &lt;code&gt;WagmiProvider&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;writeContract&lt;/code&gt; → &lt;code&gt;mutate&lt;/code&gt; / &lt;code&gt;mutateAsync&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wagmi/chains&lt;/code&gt; → &lt;code&gt;viem/chains&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Type renames (&lt;code&gt;UseAccountReturnType&lt;/code&gt; → &lt;code&gt;UseConnectionReturnType&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Inngest v3→v4: Automated Changes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;createFunction&lt;/code&gt; trigger → moved into &lt;code&gt;triggers: []&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;serve()&lt;/code&gt; options → moved to constructor&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;serveHost&lt;/code&gt; → &lt;code&gt;serveOrigin&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;streaming&lt;/code&gt; normalization&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;step.invoke&lt;/code&gt; → &lt;code&gt;referenceFunction()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Real World Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  scaffold-eth-2 (10k+ stars) — wagmi
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx migrate-wagmi-v3 ./scaffold-eth-2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Files affected: 13
&lt;/li&gt;
&lt;li&gt;Patterns detected: 15
&lt;/li&gt;
&lt;li&gt;Automated: 11
&lt;/li&gt;
&lt;li&gt;TODOs: 4
&lt;/li&gt;
&lt;li&gt;Coverage: 73%
&lt;/li&gt;
&lt;li&gt;False positives: 0
&lt;/li&gt;
&lt;li&gt;Time: &amp;lt; 5 seconds
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 What would normally take 1–2 hours was completed in seconds.&lt;/p&gt;

&lt;p&gt;PR: &lt;a href="https://github.com/scaffold-eth/scaffold-eth-2/pull/1278" rel="noopener noreferrer"&gt;https://github.com/scaffold-eth/scaffold-eth-2/pull/1278&lt;/a&gt;  &lt;/p&gt;




&lt;h3&gt;
  
  
  Documenso (10k+ stars) — Inngest
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx migrate-wagmi-v3 &lt;span class="nt"&gt;--inngest&lt;/span&gt; ./documenso
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Files affected: 1
&lt;/li&gt;
&lt;li&gt;Patterns detected: 3
&lt;/li&gt;
&lt;li&gt;Automated: 1
&lt;/li&gt;
&lt;li&gt;TODOs: 2
&lt;/li&gt;
&lt;li&gt;False positives: 0
&lt;/li&gt;
&lt;li&gt;Time: &amp;lt; 3 seconds
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PR: &lt;a href="https://github.com/documenso/documenso/pull/2736" rel="noopener noreferrer"&gt;https://github.com/documenso/documenso/pull/2736&lt;/a&gt;  &lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dry Run (Safe Preview)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx migrate-wagmi-v3 &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--dry-run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Preview all changes without modifying files.&lt;/p&gt;




&lt;h3&gt;
  
  
  Auto PR Generation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx migrate-wagmi-v3 &lt;span class="nt"&gt;--auto-pr&lt;/span&gt; https://github.com/owner/repo &lt;span class="nt"&gt;--token&lt;/span&gt; ghp_xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clone → migrate → commit → open PR automatically.&lt;/p&gt;




&lt;h3&gt;
  
  
  Migration Report
&lt;/h3&gt;

&lt;p&gt;Each run generates a &lt;code&gt;migration-report.md&lt;/code&gt; in your project root:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Patterns detected
&lt;/li&gt;
&lt;li&gt;Automated changes
&lt;/li&gt;
&lt;li&gt;TODOs
&lt;/li&gt;
&lt;li&gt;Coverage
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Zero False Positives Matters
&lt;/h2&gt;

&lt;p&gt;False positives are heavily penalized in automated migrations.&lt;/p&gt;

&lt;p&gt;This system avoids them by:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Only transforming patterns with 100% certainty
&lt;/li&gt;
&lt;li&gt;Flagging ambiguous cases instead of guessing
&lt;/li&gt;
&lt;li&gt;Using multi-pass analysis for safer detection
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 The result: migrations that are &lt;strong&gt;safe by default&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Test Suite
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wagmi:   10 tests passing  
Inngest: 15 tests passing  
Total:   25/25 passing  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Happy paths
&lt;/li&gt;
&lt;li&gt;Edge cases
&lt;/li&gt;
&lt;li&gt;Idempotency
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx migrate-wagmi-v3 ./your-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Software maintenance shouldn’t be this painful.&lt;/p&gt;

&lt;p&gt;By combining deterministic codemods with AI-assisted review, we can turn migrations from hours of manual work into a fast, reliable workflow.&lt;/p&gt;

&lt;p&gt;👉 This is a step toward making software maintenance… boring.&lt;/p&gt;

</description>
      <category>codemod</category>
      <category>wagmi</category>
      <category>inngest</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
