<?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: Satori Geeks</title>
    <description>The latest articles on DEV Community by Satori Geeks (@satorigeeks).</description>
    <link>https://dev.to/satorigeeks</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%2F3842144%2F9173053c-d1d9-4b41-8bb6-080b7771329a.png</url>
      <title>DEV Community: Satori Geeks</title>
      <link>https://dev.to/satorigeeks</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/satorigeeks"/>
    <language>en</language>
    <item>
      <title>Lean context architecture for multi-agent pipelines</title>
      <dc:creator>Satori Geeks</dc:creator>
      <pubDate>Thu, 16 Apr 2026 19:01:25 +0000</pubDate>
      <link>https://dev.to/satorigeeks/lean-context-architecture-for-multi-agent-pipelines-4a81</link>
      <guid>https://dev.to/satorigeeks/lean-context-architecture-for-multi-agent-pipelines-4a81</guid>
      <description>&lt;p&gt;In a second week of &lt;a href="https://dev.to/satorigeeks/series/37587"&gt;my project&lt;/a&gt; I noticed my agents were getting slower and dumber. When I checked the logs, I realized why: every single agent was loading the entire project history just to write one line of copy.&lt;/p&gt;

&lt;p&gt;That file was 254 lines, around 3,400 tokens. Then there was a separate AGENTS.md — 267 lines, about 3,050 tokens. Two more root files added another 2,200. Every agent loaded all four. Roughly 8,700 tokens just to orient, most of it irrelevant to whatever that agent actually needed to do.&lt;/p&gt;

&lt;p&gt;This is the refactor that fixed it.&lt;/p&gt;

&lt;h2&gt;
  
  
  255 lines and everyone reads everything
&lt;/h2&gt;

&lt;p&gt;Token waste adds up (8,700 per invocation, across 8 agents, across multiple sessions), but that's not the real problem. The real problem is noise diluting signal. An agent working from clean, relevant context does better work than one working from an everything-file where most of what it reads doesn't apply to its job.&lt;/p&gt;

&lt;p&gt;I should have seen it earlier. I didn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The load-only-if-needed pattern
&lt;/h2&gt;

&lt;p&gt;The fix was just a tedious afternoon of moving files around. Four root files collapsed into one: &lt;code&gt;CLAUDE.md&lt;/code&gt;, now at ~1,070 tokens. Pipeline overview, agent roster, done criteria, chain lineup, dev commands — the minimum every agent needs to orient.&lt;/p&gt;

&lt;p&gt;Then each agent gets its own spec: &lt;code&gt;agents/[role]/AGENT.md&lt;/code&gt;. Small files on purpose. The Copywriter's runs ~420 tokens. QA is ~235. Each covers only what that role needs — inputs, outputs, what it doesn't do, and references to load only when relevant.&lt;/p&gt;

&lt;p&gt;Every one of them ends the same way: &lt;em&gt;Await your brief. It will contain all week-specific state.&lt;/em&gt; Agents spawn stateless. Stable context (who they are, what they do) lives in the AGENT.md. Week-specific facts arrive in the brief for that session. The separation sounds obvious in retrospect. It wasn't obvious when everything was baked into one file.&lt;/p&gt;

&lt;p&gt;Per-agent context load: ~8,700 tokens → ~1,385. Agent output got more focused. Fewer irrelevant references, fewer moments where the wrong agent wandered into territory that wasn't its job. This is also a Claude Code pipeline, and the refactor improved what the agents actually produced — less noise in means less noise out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cleaning up the broken links
&lt;/h2&gt;

&lt;p&gt;Every structural rename silently breaks briefs that reference the old path. You move a file, run the pipeline a week later, something fails in a confusing way, you trace it back to a path nobody updated.&lt;/p&gt;

&lt;p&gt;The fix is one habit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"old-filename"&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After collapsing the four root files, I ran it and found 18 files still pointing to deleted names. 11 active files got updated. 7 were historical records — intentionally left, because those paths were accurate when those files were written. That's not sloppiness. It's a triage decision, and it's worth making deliberately rather than stumbling into it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The checksum refactor workflow
&lt;/h2&gt;

&lt;p&gt;The grep habit catches stale references. The checksum workflow is what makes large-scale moves tractable in the first place.&lt;/p&gt;

&lt;p&gt;Before touching anything structural, snapshot checksums of every file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-not&lt;/span&gt; &lt;span class="nt"&gt;-path&lt;/span&gt; &lt;span class="s1"&gt;'*/.*'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | xargs &lt;span class="nb"&gt;md5sum&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; checksums_before.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do the moves. Then run it again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-not&lt;/span&gt; &lt;span class="nt"&gt;-path&lt;/span&gt; &lt;span class="s1"&gt;'*/.*'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | xargs &lt;span class="nb"&gt;md5sum&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; checksums_after.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same hash, different path means the same file moved. Diff the two outputs and you have a rename map automatically — no manual tracking of what went where. Then feed each old path into grep.&lt;/p&gt;

&lt;p&gt;This project moved 76 files in one session using this approach. Without the checksum diff, correlating old references to new paths across multiple terminal sessions would have been a manual tracking problem. With it, the rename map came out of a script. The combination is: checksum diff builds the map, grep burns through the tree, triage decides what to update and what to leave as historical record.&lt;/p&gt;

&lt;h2&gt;
  
  
  YAML vs Markdown — when each wins
&lt;/h2&gt;

&lt;p&gt;One design rule that came out of this: YAML for status documents, Markdown for instruction documents.&lt;/p&gt;

&lt;p&gt;State passed between pipeline stages — session status, open items, key facts — is short, structured, needs to be machine-readable. YAML fits. Agent briefs with code blocks, nested tables, and ordered research questions need Markdown. Forcing those into YAML adds syntax noise and makes them harder to parse.&lt;/p&gt;

&lt;p&gt;The rule: if an agent reads it to understand what to do, use Markdown. If a pipeline stage produces it for the next stage to consume, use YAML. That distinction maps to a lot of systems beyond this one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest tradeoff
&lt;/h2&gt;

&lt;p&gt;This architecture has overhead. For a solo one-week project, one context file is fine. You don't need any of this.&lt;/p&gt;

&lt;p&gt;The argument is only load-bearing when agents specialise and when the pipeline runs across multiple sessions — which is exactly this project's structure. If you're wiring up a couple of agents that each run once, skip it.&lt;/p&gt;

&lt;p&gt;It's better now, but I'm still keeping an eye on that 1,000-token root file. It’s already starting to grow again.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>multiagent</category>
      <category>devtools</category>
      <category>ai</category>
    </item>
    <item>
      <title>The most exotic consensus in the series. The most vanilla build.</title>
      <dc:creator>Satori Geeks</dc:creator>
      <pubDate>Wed, 15 Apr 2026 19:14:17 +0000</pubDate>
      <link>https://dev.to/satorigeeks/the-most-exotic-consensus-in-the-series-the-most-vanilla-build-1pf9</link>
      <guid>https://dev.to/satorigeeks/the-most-exotic-consensus-in-the-series-the-most-vanilla-build-1pf9</guid>
      <description>&lt;p&gt;Week 3 of &lt;a href="https://proof-of-support.pages.dev" rel="noopener noreferrer"&gt;Proof of Support&lt;/a&gt; is live on Core DAO. Chain selection has its own article — &lt;a href="https://dev.to/satorigeeks/finding-life-in-the-experimental-evm-shortlist-1o0h"&gt;I covered why Core won the shortlist here&lt;/a&gt;. Short version: Satoshi Plus consensus, Bitcoin miners voting with hashrate, BTC holders timelocking on L1 with OP_CLTV. Three parties, one validator election, EVM on top.&lt;/p&gt;

&lt;p&gt;Here's what actually happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  The thing that was supposed to bite didn't
&lt;/h2&gt;

&lt;p&gt;Research flagged one config change going in: &lt;code&gt;evm_version = "shanghai"&lt;/code&gt; in &lt;code&gt;foundry.toml&lt;/code&gt;. Core DAO's docs require the Shanghai pin — Cancun opcode support isn't confirmed even after the Hermes fork. Two weeks on Base and Scroll had me defaulting to &lt;code&gt;"cancun"&lt;/code&gt;, and silently wrong bytecode is exactly the kind of wrong that wastes a morning.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;forge build&lt;/code&gt; compiled clean on the first run. OZ Ownable and ReentrancyGuard are fine against the Shanghai target. 14 tests. No issues.&lt;/p&gt;

&lt;p&gt;So. That wasn't the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first L1 in the series — and the CORE token problem
&lt;/h2&gt;

&lt;p&gt;Base is an OP Stack rollup. Scroll is a ZK rollup. Core DAO is just an L1. No sequencer, no proving layer, no 7-day withdrawal window. After two weeks of rollup mechanics, the mental model simplification is real — "confirmed" means confirmed, full stop.&lt;/p&gt;

&lt;p&gt;The catch is the gas token. CORE, not ETH. For a developer it's trivial — you need CORE in the deployer wallet, you get it, you move on. For a casual supporter landing on the app, it's a different story.&lt;/p&gt;

&lt;p&gt;Getting CORE isn't smooth. There's one official bridge at &lt;a href="https://bridge.coredao.org/bridge/" rel="noopener noreferrer"&gt;bridge.coredao.org&lt;/a&gt; (uses LayerZero for its bridging tech!) that works. Symbiosis &lt;a href="https://symbiosis.finance/bridge-core-dao" rel="noopener noreferrer"&gt;also lists a Core DAO bridge&lt;/a&gt; — I checked, it was dry, at least for certain pairs. In the end I swapped on a CEX from my Base wallet and sent CORE directly to the deployer. That's not a bad path if you know your way around exchanges, but it's not something a casual user clicks through in thirty seconds. It's probably the biggest real-world friction point for adoption this week.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hermes finality is noticeable
&lt;/h2&gt;

&lt;p&gt;One quick line on this: post-Hermes (November 2025), Core DAO has 2-block finality — about 6 seconds. Compared to Scroll's ZK proving latency, where confirmation means "in the sequencer, not yet on L1," the Core DAO frontend felt fast. Transactions landed visibly. No sitting and wondering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vibe Check
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;(Full methodology: &lt;a href="https://dev.to/satorigeeks/how-im-scoring-the-chains-clc"&gt;how I'm scoring the chains&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;Est&lt;/th&gt;
&lt;th&gt;Actual&lt;/th&gt;
&lt;th&gt;Delta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;D1 Getting Started&lt;/td&gt;
&lt;td&gt;×1.0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D2 Developer Tooling&lt;/td&gt;
&lt;td&gt;×2.0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D3 Contract Authoring&lt;/td&gt;
&lt;td&gt;×2.0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D4 Documentation Quality&lt;/td&gt;
&lt;td&gt;×1.5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;−1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D5 Frontend / Wallet&lt;/td&gt;
&lt;td&gt;×2.0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D6 Deployment Experience&lt;/td&gt;
&lt;td&gt;×1.5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;−1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D7 Transaction Cost&lt;/td&gt;
&lt;td&gt;×1.0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D8 Community &amp;amp; Ecosystem&lt;/td&gt;
&lt;td&gt;×1.0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Actual: 46/60. Estimated: 49/60. Delta: −3 weighted points&lt;/strong&gt; &lt;em&gt;(D4 and D6 each drop one raw point at ×1.5 weight: −1.5 each)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;D4 and D6 are both down one — the verification docs had the wrong flags, and the testnet/mainnet API key split wasn't documented anywhere. Everything else landed where research said it would.&lt;/p&gt;

&lt;p&gt;D5 is the strong spot: &lt;code&gt;coreDao&lt;/code&gt; is built into viem, MetaMask connected immediately, zero custom chain config for mainnet. D7 stays a 5 — the deploy cost 0.083 CORE, roughly $0.002 at ~$0.027/CORE. A &lt;code&gt;sendSupport()&lt;/code&gt; call is a fraction of that. Effectively free for supporters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The consensus paradox
&lt;/h2&gt;

&lt;p&gt;Satoshi Plus is the most interesting security mechanism I've touched in this series. Bitcoin miners include metadata in coinbase transactions to vote for Core validators. BTC holders timelock coins on Bitcoin mainnet using OP_CLTV — the coins don't move, they just declare a preference. Three independent parties produce a hybrid score that elects 31 validators for the day.&lt;/p&gt;

&lt;p&gt;From inside the house — the Solidity contract, the viem adapter, the MetaMask prompt — I felt none of it. Same EVM. Same Foundry flags. Same gas estimates I'd have on any other EVM L1. The foundations are Bitcoin-native. The walls look identical.&lt;/p&gt;

&lt;p&gt;I'm genuinely uncertain whether that's a feature or a missed opportunity. You want the security model to be invisible to the developer — that's what "it just works" means. But there's something odd about spending a week on the most exotic consensus design in the series and coming away with a build log that reads the same as the previous two weeks.&lt;/p&gt;




&lt;p&gt;The app is live: &lt;a href="https://proof-of-support.pages.dev" rel="noopener noreferrer"&gt;https://proof-of-support.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Week 4 picks up the non-EVM category. The build log will look different.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>bitcoin</category>
      <category>ethereum</category>
      <category>foundry</category>
    </item>
    <item>
      <title>Finding life in the experimental EVM shortlist</title>
      <dc:creator>Satori Geeks</dc:creator>
      <pubDate>Mon, 13 Apr 2026 20:40:06 +0000</pubDate>
      <link>https://dev.to/satorigeeks/finding-life-in-the-experimental-evm-shortlist-1o0h</link>
      <guid>https://dev.to/satorigeeks/finding-life-in-the-experimental-evm-shortlist-1o0h</guid>
      <description>&lt;p&gt;"Experimental" EVM. That was the brief for Week 3. For this series, it means finding a chain where the Solidity code stays the same but the neighborhood is completely foreign. No L2s, no rollups, no "rebranded" OP Stack chains. I wanted my code secured by something that isn't an Ethereum validator.&lt;/p&gt;

&lt;p&gt;I expected a playground. I found a graveyard.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ghosts and the marketing plays
&lt;/h2&gt;

&lt;p&gt;Step outside the Ethereum L2 bubble and the landscape changes fast. Most of the names I remembered from previous cycles are either in maintenance mode or actively winding down. &lt;/p&gt;

&lt;p&gt;Evmos, once the poster child for EVM on Cosmos, effectively finished in 2025. Milkomeda—the bridge to Cardano and Algorand—is archived and frozen. Vaulta (the artist formerly known as EOS EVM) is being deprecated in favor of yet another project. (I’ve lost track of how many times EOS has rebranded at this point).&lt;/p&gt;

&lt;p&gt;Then there’s the "Bitcoin EVM" wave. BOB (Build on Bitcoin) sounds perfect, until you realize it’s just another OP Stack rollup on Ethereum where you pay gas in ETH. It’s a marketing play in a trench coat. I’m looking for a new security model, not a new way to pay fees to Ethereum L1. &lt;/p&gt;

&lt;p&gt;Hedera was another candidate, but the "EVM compatibility" has too many asterisks. You have to "activate" new MetaMask addresses manually. The contract size limit is enforced through a non-EVM file service that breaks standard Foundry deploys. It’s a neighborhood with a very restrictive HOA—technically live, but a nightmare to move into. I'm here to write code, not read a 40-page manual on how to use a wallet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The scored finalists
&lt;/h2&gt;

&lt;p&gt;I ran the remaining candidates through &lt;a href="https://dev.to/satorigeeks/how-im-scoring-the-chains-clc"&gt;the rubric&lt;/a&gt;. I wasn't just looking for a chain that worked; I wanted one that was actually alive. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Chain&lt;/th&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;One-line verdict&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core DAO&lt;/td&gt;
&lt;td&gt;Bitcoin (Satoshi Plus)&lt;/td&gt;
&lt;td&gt;49/60&lt;/td&gt;
&lt;td&gt;Cleanest DX, stable ecosystem, Bitcoin consensus is the real story&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Moonbeam&lt;/td&gt;
&lt;td&gt;Polkadot parachain&lt;/td&gt;
&lt;td&gt;48/60&lt;/td&gt;
&lt;td&gt;Solid tooling, sharp ecosystem decline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flare Network&lt;/td&gt;
&lt;td&gt;Data-centric L1&lt;/td&gt;
&lt;td&gt;48/60&lt;/td&gt;
&lt;td&gt;FTSOv2 oracles are interesting; niche audience&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Berachain&lt;/td&gt;
&lt;td&gt;Cosmos SDK&lt;/td&gt;
&lt;td&gt;45/60&lt;/td&gt;
&lt;td&gt;TVL collapsed from $3.2B to $74M since launch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kava&lt;/td&gt;
&lt;td&gt;Cosmos SDK EVM&lt;/td&gt;
&lt;td&gt;41/60&lt;/td&gt;
&lt;td&gt;Maintenance mode, verification friction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rootstock / RSK&lt;/td&gt;
&lt;td&gt;Bitcoin (merge-mined)&lt;/td&gt;
&lt;td&gt;41/60&lt;/td&gt;
&lt;td&gt;Oldest Bitcoin EVM, Foundry bug, HTTP-only RPC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Astar Network&lt;/td&gt;
&lt;td&gt;Polkadot parachain&lt;/td&gt;
&lt;td&gt;41/60&lt;/td&gt;
&lt;td&gt;Team pivoted to Soneium; parachain in caretaker mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Neon EVM&lt;/td&gt;
&lt;td&gt;Solana SVM&lt;/td&gt;
&lt;td&gt;36/60&lt;/td&gt;
&lt;td&gt;Exotic, but lacks Ethereum's &lt;code&gt;transfer()&lt;/code&gt; gas stipend / reentrancy protection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canto&lt;/td&gt;
&lt;td&gt;Cosmos SDK EVM&lt;/td&gt;
&lt;td&gt;36/60&lt;/td&gt;
&lt;td&gt;No GitHub commits since Sep 2024; team status unknown&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why Core DAO
&lt;/h2&gt;

&lt;p&gt;Core DAO won because it offered the cleanest path to the most interesting narrative. While other survivors are in maintenance mode (Moonbeam, Kava, Astar) or dealing with massive TVL drawdowns (Berachain), Core DAO feels stable enough to actually build on. I checked the explorer—the blocks are ticking over, the documentation is current, and the "neighborhood" doesn't feel like it’s being packed into boxes.&lt;/p&gt;

&lt;p&gt;The hook is "Satoshi Plus" consensus. It’s a three-party model: Bitcoin miners delegate their hash power, BTC holders stake natively (via &lt;code&gt;OP_CLTV&lt;/code&gt; time-locks, no custodians involved), and CORE stakers handle the validation. It’s an EVM chain physically integrated into the Bitcoin mining economy.&lt;/p&gt;

&lt;p&gt;Coming from &lt;a href="https://dev.to/satorigeeks/why-im-starting-with-base-and-what-comes-after-1733"&gt;Week 1&lt;/a&gt; (Base, an optimistic rollup) and &lt;a href="https://dev.to/satorigeeks/the-runner-up-chain-won-how-i-chose-scroll-for-week-2-11n5"&gt;Week 2&lt;/a&gt; (Scroll, a ZK rollup), Core DAO is the third major answer to the "what secures my code?" question. This time, the answer is Bitcoin miners. &lt;/p&gt;

&lt;h2&gt;
  
  
  The ones that got away
&lt;/h2&gt;

&lt;p&gt;Flare Network and Rootstock are still on my list. Flare's "enshrined oracles"—where data feeds are part of the L1 protocol itself—is a compelling piece of infrastructure. Rootstock remains the OG Bitcoin EVM, and despite some Foundry-related address bugs, it's still the purist's choice for merge-mining.&lt;/p&gt;

&lt;p&gt;But for Week 3, we're heading to Core. The code is the same, but the security model is a completely different animal.&lt;/p&gt;




&lt;p&gt;→ The live app is at &lt;a href="https://proof-of-support.pages.dev" rel="noopener noreferrer"&gt;https://proof-of-support.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ Scoring methodology for the series: &lt;a href="https://dev.to/satorigeeks/how-im-scoring-the-chains-clc"&gt;How I'm Scoring the Chains&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>buildinpublic</category>
      <category>web3</category>
    </item>
    <item>
      <title>What "Stage 1 ZK Rollup" actually means for your deployed contract</title>
      <dc:creator>Satori Geeks</dc:creator>
      <pubDate>Sun, 12 Apr 2026 09:08:28 +0000</pubDate>
      <link>https://dev.to/satorigeeks/what-stage-1-zk-rollup-actually-means-for-your-deployed-contract-1cif</link>
      <guid>https://dev.to/satorigeeks/what-stage-1-zk-rollup-actually-means-for-your-deployed-contract-1cif</guid>
      <description>&lt;p&gt;You'll see "Stage 1" on L2Beat and most developers treat it as a good sign — higher is better, move on. But it's a specific security model with specific requirements. Scroll crossed into it with the Euclid upgrade in April 2025.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three stages
&lt;/h2&gt;

&lt;p&gt;L2Beat defines rollup maturity in three stages. The progression isn't about performance — it's about who can stop you from getting your money out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 0&lt;/strong&gt; is where most rollups start. The validity proof system may be live, but user protections are thin: the operator can censor transactions, the team controls upgrade keys unilaterally, and there's no guaranteed exit path that doesn't depend on the team cooperating. You're trusting that the people running it won't act against you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 1&lt;/strong&gt; adds three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Forced transaction inclusion.&lt;/strong&gt; If the sequencer ignores your transaction, you can submit it directly to the L1 inbox contract. The sequencer can't censor you indefinitely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissionless batch submission.&lt;/strong&gt; If the sequencer fails to post a batch within a defined window — the Liveness Gap — any user can submit a batch and a validity proof directly to the L1 contract to move state forward. The chain doesn't die with its operator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Council with independent majority.&lt;/strong&gt; Upgrade keys move from team-controlled multisig to a council where independent members hold the majority. For Scroll, that's a 9-of-12 multisig — 7 of the 9 required signers are not Scroll employees. The team cannot push a protocol upgrade unilaterally.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Stage 2&lt;/strong&gt; removes trust in the Security Council as well. Exit is fully guaranteed by code, not governance. No rollup has reached Stage 2 yet — Arbitrum has removed the whitelist for fraud proofs, but retains a Security Council emergency override for bug fixes, most researchers still call it Stage 1.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Euclid actually changed
&lt;/h2&gt;

&lt;p&gt;Before Euclid, Scroll's prover used custom halo2 arithmetic circuits — one circuit gadget per EVM opcode, hard capacity ceiling per batch. Valid state transitions required the proof system, but forced inclusion and permissionless batch submission weren't live.&lt;/p&gt;

&lt;p&gt;Euclid shipped in two phases: Phase 1 on April 16, 2025, Phase 2 on April 22. Forced inclusion went live — users can now submit directly to the L1 inbox contract if censored — and the Security Council replaced team-controlled upgrade keys. Scroll also replaced the prover stack with OpenVM (a RISC-V zkVM built with Axiom and the Ethereum Foundation's PSE team), which delivered the 5× throughput and ~50% fee reduction, and migrated the state commitment from Scroll's custom zktrie to Ethereum's standard Merkle-Patricia Trie.&lt;/p&gt;

&lt;p&gt;The ZK validity proofs were already live before Euclid. What Euclid added was the exit guarantees and independent upgrade control.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for a contract you deploy today
&lt;/h2&gt;

&lt;p&gt;For a simple storage contract: every state transition is cryptographically verified, so an adversarial sequencer can't produce an invalid state root without generating an invalid proof. If the sequencer goes rogue, your funds aren't trapped — unlike an Optimistic rollup where exit requires a 7-day fraud proof window, the validity proof proves your exit is valid immediately once the batch is finalized on L1. A protocol upgrade still requires sign-off from independent members who can block it.&lt;/p&gt;

&lt;p&gt;None of this is full decentralization. A single sequencer still handles transaction ordering, and Stage 2 is the actual end state — nobody's there yet. But the trust assumptions are different from a Stage 0 chain where "we're a reputable team" is the primary protection.&lt;/p&gt;

&lt;p&gt;It matters most when evaluating chains for anything with real money in it. For the Proof of Support rubric, it's part of why Scroll's ecosystem score sits where it does — even as Scroll has shifted focus from the points-farming TVL chase of 2024 toward Total Value Secured (TVS) and technical alignment.&lt;/p&gt;




&lt;p&gt;→ The build this came from: &lt;a href="[https://dev.to/satorigeeks/research-passed-tests-passed-security-passed-scroll-mainnet-didnt-37l]"&gt;Week 2 retrospective on Scroll&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ The live app is at &lt;a href="https://proof-of-support.pages.dev" rel="noopener noreferrer"&gt;https://proof-of-support.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ Scoring methodology for the series: &lt;a href="https://dev.to/satorigeeks/how-im-scoring-the-chains-clc"&gt;How I'm Scoring the Chains&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>ethereum</category>
      <category>zk</category>
      <category>security</category>
    </item>
    <item>
      <title>Why Your Scroll Deployment Cost $25 — And Then $0.04 the Next Attempt</title>
      <dc:creator>Satori Geeks</dc:creator>
      <pubDate>Sat, 11 Apr 2026 11:44:55 +0000</pubDate>
      <link>https://dev.to/satorigeeks/why-your-scroll-deployment-cost-25-and-then-004-the-next-attempt-4m8c</link>
      <guid>https://dev.to/satorigeeks/why-your-scroll-deployment-cost-25-and-then-004-the-next-attempt-4m8c</guid>
      <description>&lt;p&gt;&lt;code&gt;forge script&lt;/code&gt; returned an L1 fee estimate of roughly $25 to deploy a 6,452-byte contract on Scroll mainnet. L1 base fee at the time: 0.23 gwei — historically low. The wallet had ETH. The node rejected the transaction anyway.&lt;/p&gt;

&lt;p&gt;The next morning, the same contract deployed for $0.04 total. The 625× gap comes down to two parameters and who controls them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the oracle returns
&lt;/h2&gt;

&lt;p&gt;Every Scroll transaction carries an L1 data fee on top of the L2 execution fee. The Curie hardfork (mainnet July 3, 2024) introduced this formula:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;l1Fee = (commitScalar × l1BaseFee + blobScalar × txDataLength × l1BlobBaseFee) / 1e9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both parameters are in the &lt;code&gt;L1GasPriceOracle&lt;/code&gt; contract at &lt;code&gt;0x5300000000000000000000000000000000000002&lt;/code&gt;. Call &lt;code&gt;getL1Fee(bytes calldata data)&lt;/code&gt; with your serialised transaction to see what Scroll will estimate.&lt;/p&gt;

&lt;p&gt;At peak: L1 base fee was 0.23 gwei, &lt;code&gt;commitScalar&lt;/code&gt; was &lt;code&gt;6,195,200,000,000&lt;/code&gt;. The oracle returned &lt;code&gt;15,216,334,956,613,434 wei&lt;/code&gt; — roughly $25. The math checks out.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;getL1Fee&lt;/code&gt; is an upper-bound estimate, not the amount charged. The oracle is a push model — a Scroll-operated relayer updates &lt;code&gt;l1BaseFee&lt;/code&gt; and &lt;code&gt;l1BlobBaseFee&lt;/code&gt; when the change crosses a threshold. Once your transaction lands in an L2 block, the L1 fee locks in at whatever value the oracle holds at that moment. The sequencer absorbs the difference between quoted and actual L1 cost. The actual charge is typically ~2× lower than the estimate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened to the scalars
&lt;/h2&gt;

&lt;p&gt;The $25 estimate wasn't caused by high Ethereum gas or unusual contract size. Over roughly four days, the Scroll team made six consecutive &lt;code&gt;setCommitScalar&lt;/code&gt; and &lt;code&gt;setBlobScalar&lt;/code&gt; calls from a team multisig — a cumulative &lt;strong&gt;1,280×&lt;/strong&gt; increase.&lt;/p&gt;

&lt;p&gt;There's no onchain governance vote required to update these parameters. No timelock. The &lt;code&gt;L1GasPriceOracle&lt;/code&gt; owner calls the setter directly. Scroll's own SDK docs noted as of early 2025 that tooling to automate updates was "currently being built" — the adjustments are manual operational decisions.&lt;/p&gt;

&lt;p&gt;On April 9, 2026, after developer pushback — notably from the Succinct relayer team — the scalars were rolled back 160×. Transactions that had been costing $20+ returned to fractions of a cent. Total excess fees paid during the spike: roughly $50,000. Automated Ether.fi Cash bots, mid-migration to Optimism, bore about 66% of that. L2BEAT and The Defiant covered the event; the event framing is theirs; the numbers here are on-chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The deploy, after the rollback
&lt;/h2&gt;

&lt;p&gt;Next morning: L1 base fee at 0.092 gwei. &lt;code&gt;getL1Fee&lt;/code&gt; estimated 0.000038 ETH. Actual L1 data fee on-chain: &lt;code&gt;0.000019191719458387 ETH&lt;/code&gt;. Total deploy cost: &lt;code&gt;0.000019357216031371 ETH&lt;/code&gt; — $0.04.&lt;/p&gt;

&lt;p&gt;The 2× gap between estimate and actual is expected, not a discrepancy. The conservative &lt;code&gt;fluctuation_multiplier&lt;/code&gt; baked into the scalars is intentional. The sequencer quoted high, settled lower, kept the margin.&lt;/p&gt;

&lt;p&gt;Gas used: 1,377,898 of 1,791,267 (76.92%). Same 6,452-byte bytecode. Identical contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you deploy on Scroll
&lt;/h2&gt;

&lt;p&gt;Read &lt;code&gt;l1BaseFee()&lt;/code&gt; from the oracle before any large deploy. If it looks elevated relative to L1 mainnet gas at &lt;a href="https://etherscan.io/gastracker" rel="noopener noreferrer"&gt;etherscan.io/gastracker&lt;/a&gt;, the scalars may be set high — not L1 congestion.&lt;/p&gt;

&lt;p&gt;Treat &lt;code&gt;getL1Fee&lt;/code&gt; as a ceiling. A 2× overestimate is normal. During the April 2026 spike it was the difference between $25 and $0.04.&lt;/p&gt;

&lt;p&gt;There's no automated alert when scalars change. The most reliable current signal is L2BEAT's Scroll page or the Scroll team's announcement channels.&lt;/p&gt;

&lt;p&gt;If the estimate looks wrong, wait. The fee model is an operational parameter, not a protocol constant. It changed 1,280× in four days. It rolled back in one.&lt;/p&gt;

&lt;p&gt;The contract deployed. Week 2 is done. The mechanism is documented.&lt;/p&gt;




&lt;p&gt;→ The build this came from: &lt;a href="[https://dev.to/satorigeeks/research-passed-tests-passed-security-passed-scroll-mainnet-didnt-37l]"&gt;Week 2 retrospective on Scroll&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ The live app is at &lt;a href="https://proof-of-support.pages.dev" rel="noopener noreferrer"&gt;https://proof-of-support.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ Scoring methodology for the series: &lt;a href="https://dev.to/satorigeeks/how-im-scoring-the-chains-clc"&gt;How I'm Scoring the Chains&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>buildinpublic</category>
      <category>solidity</category>
      <category>ethereum</category>
    </item>
    <item>
      <title>Research Passed. Tests Passed. Security Passed. Scroll Mainnet Didn't.</title>
      <dc:creator>Satori Geeks</dc:creator>
      <pubDate>Thu, 09 Apr 2026 14:47:47 +0000</pubDate>
      <link>https://dev.to/satorigeeks/research-passed-tests-passed-security-passed-scroll-mainnet-didnt-37l</link>
      <guid>https://dev.to/satorigeeks/research-passed-tests-passed-security-passed-scroll-mainnet-didnt-37l</guid>
      <description>&lt;p&gt;The wallet had ETH. The transaction kept failing with "insufficient funds."&lt;/p&gt;

&lt;p&gt;I checked the balance: &lt;code&gt;cast balance&lt;/code&gt; confirmed 0.0023 ETH. The error was &lt;code&gt;-32000: invalid transaction: insufficient funds for l1fee + gas * price + value&lt;/code&gt;. That last field was the tell. This wasn't about execution gas.&lt;/p&gt;

&lt;h2&gt;
  
  
  The investigation
&lt;/h2&gt;

&lt;p&gt;Sent 1 wei to myself first — no calldata, just to confirm the account could actually send anything.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cast send 0x5f7bD072EADeB2C18F2aDa5a0c5b125423a1EA36 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--value&lt;/span&gt; 1 &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; https://rpc.scroll.io &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--account&lt;/span&gt; deployer &lt;span class="nt"&gt;--legacy&lt;/span&gt; &lt;span class="nt"&gt;--gas-price&lt;/span&gt; 200000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Went through. Receipt showed &lt;code&gt;l1Fee: 127,720,592,525,704 wei&lt;/code&gt; (0.000128 ETH) for zero calldata. At 0.23 gwei Ethereum base fee. Which is historically low.&lt;/p&gt;

&lt;p&gt;That was the tell. Queried the L1GasOracle at &lt;code&gt;0x5300000000000000000000000000000000000002&lt;/code&gt; for the full picture. Post-Curie hardfork, Scroll's fee model uses a &lt;code&gt;commitScalar&lt;/code&gt; to price L1 data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commitScalar: 6,195,200,000,000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;6.2 trillion. That number amplifies how much weight L1 data costs carry in the final fee. Then called &lt;code&gt;getL1Fee&lt;/code&gt; directly with the deployment bytecode — all 6,452 bytes.&lt;/p&gt;

&lt;p&gt;Result: &lt;code&gt;15,216,334,956,613,434 wei&lt;/code&gt;. That's 0.01521 ETH in L1 fees before L2 execution. Total roughly 0.016 ETH, about $25 at current prices.&lt;/p&gt;

&lt;p&gt;Week 1, Base: 0.000021 ETH total including L1 fees. Same contract, same bytecode.&lt;/p&gt;

&lt;p&gt;That's 700×. Not a universal constant. Base and Scroll have different underlying architectures, DA models, and fee parameters. It's the number for this contract, on these two chains, at the time of testing.&lt;/p&gt;

&lt;p&gt;Mainnet cancelled. Not a bug, not a configuration error. Economically unsuitable for this use case.&lt;/p&gt;

&lt;p&gt;(The per-transaction L1 fee tells the same story: in this implementation, a user's &lt;code&gt;sendSupport&lt;/code&gt; call would cost more in L1 overhead than the tip itself. Deployment cost is sensitive to bytecode size and compression, so other contracts will see different numbers — but for a small social contract, the math doesn't work.)&lt;/p&gt;

&lt;h2&gt;
  
  
  One thing worth calling out
&lt;/h2&gt;

&lt;p&gt;Scrollscan runs on Blockscout, not Etherscan. On the verified contract page there's a file tree panel in the sidebar: the full project directory structure, each file readable on click. Nothing flattened into a single tab. There's also a UML diagram auto-generated from the Solidity source: inheritance, state variables, function signatures in one view. Best block explorer UX I've seen in this series so far. The UML visualizer especially — Etherscan doesn't have one.&lt;/p&gt;

&lt;p&gt;The verified testnet contract is at &lt;a href="https://sepolia.scrollscan.com/address/0x6d89c4974f8f211ed07b8e8da08177dee627defa" rel="noopener noreferrer"&gt;&lt;code&gt;0x6D89c4974f8f211eD07b8E8DA08177DEE627DeFa&lt;/code&gt;&lt;/a&gt; on Scroll Sepolia. Worth a look at the explorer tab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Community signal
&lt;/h2&gt;

&lt;p&gt;Posted to &lt;a href="https://farcaster.xyz/satorigeeks/0x0ab0373a" rel="noopener noreferrer"&gt;Farcaster&lt;/a&gt;, Scroll Discord, and &lt;a href="https://ethereum.stackexchange.com/questions/172244/scroll-mainnet-is-a-0-015-eth-l1-data-fee-for-deploying-a-6-5-kb-contract-corre" rel="noopener noreferrer"&gt;Ethereum StackExchange&lt;/a&gt; asking about the Curie fee model's impact on deployers. No response so far. If I got the fee mechanics wrong, nobody's corrected me yet. Not bitter — but it's a data point, and the rubric counts it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The vibe check
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;(Full methodology: &lt;a href="https://paragraph.com/@0x5f7bd072eadeb2c18f2ada5a0c5b125423a1ea36/how-im-scoring-the-chains" rel="noopener noreferrer"&gt;How I'm Scoring the Chains&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;Estimated&lt;/th&gt;
&lt;th&gt;Actual&lt;/th&gt;
&lt;th&gt;Delta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;D1 Getting Started&lt;/td&gt;
&lt;td&gt;×1.0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;-2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D2 Developer Tooling&lt;/td&gt;
&lt;td&gt;×2.0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D3 Contract Authoring&lt;/td&gt;
&lt;td&gt;×2.0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D4 Documentation Quality&lt;/td&gt;
&lt;td&gt;×1.5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D5 Frontend / Wallet&lt;/td&gt;
&lt;td&gt;×2.0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D6 Deployment Experience&lt;/td&gt;
&lt;td&gt;×1.5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D7 Transaction Cost&lt;/td&gt;
&lt;td&gt;×1.0&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;-2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D8 Community &amp;amp; Ecosystem&lt;/td&gt;
&lt;td&gt;×1.0&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Weighted total: 42/60.&lt;/strong&gt; Good band. Research estimated 50/60.&lt;/p&gt;

&lt;p&gt;Every point of that 8-point drop came from economics and ecosystem, not tooling.&lt;/p&gt;

&lt;p&gt;D2, D3: identical Foundry and OZ setup to Week 1. Nothing changed. Score unchanged.&lt;/p&gt;

&lt;p&gt;D1 (2/5): nine faucets tried. Most required login, mainnet ETH balance, or were under maintenance. Resolution: Sepolia ETH from Google Cloud Web3 faucet, bridged via the Scroll Sepolia portal. About 10 minutes waiting for the bridge. The neighbourhood is fine once you're in; getting there is a longer walk than expected.&lt;/p&gt;

&lt;p&gt;D4 (3/5): Scrollscan stopped accepting new API key registrations mid-transition between explorer providers. The fix is Foundry's &lt;code&gt;--verifier blockscout --verifier-url https://sepolia.scrollscan.com/api/&lt;/code&gt; flags. Not mentioned anywhere in the official getting-started docs. The Curie fee model impact on deployers is the same story — research and blog posts exist, but none of it is surfaced where a developer would look before a mainnet deploy.&lt;/p&gt;

&lt;p&gt;D5 (4/5): wagmi ships &lt;code&gt;scroll&lt;/code&gt; and &lt;code&gt;scrollSepolia&lt;/code&gt; chain imports. Wallet integration was clean. Dropped the Coinbase SDK connector — Scroll supports EIP-1193 so injected wallets including Coinbase Wallet work fine, but the Coinbase SDK's Smart Wallet onboarding path lacks native Scroll support. Integration hurdle, not a chain-level incompatibility. Worth knowing before you wire it up.&lt;/p&gt;

&lt;p&gt;D6 (3/5): testnet was a single command, Blockscout verification worked first attempt. Mainnet blocked on economics, not process.&lt;/p&gt;

&lt;p&gt;D7 (1/5): ~$25 to deploy at historically low L1 prices. That cost would increase significantly under higher L1 gas prices — rollup fees don't scale linearly due to batching and compression, but the direction is clear. For small, frequent transactions the L1 fee overhead is structural and unworkable for this use case.&lt;/p&gt;

&lt;p&gt;D8 (2/5): three channels, zero responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testnet is the verdict
&lt;/h2&gt;

&lt;p&gt;The testnet deploy worked cleanly. One command, contract verified on Blockscout, 14/14 tests passing. The decision to stop at testnet was economic, not technical.&lt;/p&gt;

&lt;p&gt;There is no mainnet contract address. That's not an oversight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; The ZK proof system is genuinely interesting. Foundry, OZ, wagmi all work identically to every other EVM chain. The Blockscout explorer is the best in this series. The fee model, at current parameters, makes Scroll unsuitable for social micro-transactions.&lt;/p&gt;

&lt;p&gt;I wouldn't build a production tip jar here today.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Update — same day, a few hours later&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It went through.&lt;/p&gt;

&lt;p&gt;Contract live on Scroll mainnet at &lt;code&gt;0x53814B0BB5fe236285843342563213287DFFb674&lt;/code&gt;. First message already sent — &lt;a href="https://scrollscan.com/tx/0xf8cba11c0b2ac1f496c5a14af4bcc8001578cd1d75714ea6168c185b47ae452c" rel="noopener noreferrer"&gt;tx on Scrollscan&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Total deploy cost: 0.000019357 ETH. $0.04. L1 data fee: 0.000019191 ETH, L2 execution: 0.000000165 ETH. The oracle's re-query had estimated ~0.000038 ETH earlier — actual was roughly half. It overestimates.&lt;/p&gt;

&lt;p&gt;The number worth keeping: peak L1 fee earlier that day was ~0.01521 ETH (~$25). Actual deploy a few hours later: $0.04. Same contract. Same bytecode. Same chain. Same day. ~625×.&lt;/p&gt;

&lt;p&gt;That's not a misconfiguration. That's the fee model responding to Ethereum L1 congestion. You cannot quote a deploy cost on Scroll. You can quote a range. That range, within a single calendar day, spanned three orders of magnitude.&lt;/p&gt;

&lt;p&gt;The week is complete. Failed retro, then not failed. That's the story.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Something about running five weeks of chain comparisons with AI assistance: the gaps in the documentation that the agents flag as "likely resolved by now" keep turning out to be real.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;→ The live app is at &lt;a href="https://proof-of-support.pages.dev" rel="noopener noreferrer"&gt;https://proof-of-support.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ Scoring methodology for the series: &lt;a href="https://dev.to/satorigeeks/how-im-scoring-the-chains-clc"&gt;How I'm Scoring the Chains&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>solidity</category>
      <category>buildinpublic</category>
      <category>foundry</category>
    </item>
    <item>
      <title>The runner-up chain won: how I chose Scroll for Week 2</title>
      <dc:creator>Satori Geeks</dc:creator>
      <pubDate>Wed, 08 Apr 2026 20:23:46 +0000</pubDate>
      <link>https://dev.to/satorigeeks/the-runner-up-chain-won-how-i-chose-scroll-for-week-2-11n5</link>
      <guid>https://dev.to/satorigeeks/the-runner-up-chain-won-how-i-chose-scroll-for-week-2-11n5</guid>
      <description>&lt;p&gt;Linea scored 51 out of 60 on &lt;a href="https://dev.to/satorigeeks/how-im-scoring-the-chains-clc"&gt;my rubric&lt;/a&gt;. Scroll scored 50. Scroll got the build week.&lt;/p&gt;

&lt;p&gt;That one-point gap wasn't post-rationalized. The pick came down to two things the rubric doesn't score directly: faucet auth requirements and timing. I'll get to both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two chains that didn't make the shortlist
&lt;/h2&gt;

&lt;p&gt;Five candidates went through the blocker check. Two were eliminated. Polygon zkEVM was announced as sunset in June 2025. PancakeSwap pulled support the following month and developer momentum has been draining out since. Building on it now would produce an article about a chain in hospice care. Kakarot was simpler: the GitHub repo was archived January 9, 2025, the team was acquired by Zama, and they pivoted to FHE. No deployable mainnet. Both gone before we talk scores.&lt;/p&gt;

&lt;h2&gt;
  
  
  The remaining four
&lt;/h2&gt;

&lt;p&gt;zkSync Era made the cut but scored the lowest at 40.5 out of 60. The &lt;code&gt;foundry-zksync&lt;/code&gt; fork is still alpha, tests run roughly 17× slower than mainline Foundry, and the native account abstraction model means &lt;code&gt;msg.sender&lt;/code&gt; behaves differently in smart wallet contexts. Real build risk for a quick-turnaround week.&lt;/p&gt;

&lt;p&gt;Taiko is technically the purest: Type 1 zkEVM, identical EVM, zero code changes, decentralized sequencer through Ethereum L1 validators. It scored 49. TVL sits around $20M, and the Hoodi testnet only replaced Hekla in September 2025, so the wagmi chain definition needs manual configuration. Newer testnet story than I wanted.&lt;/p&gt;

&lt;p&gt;That left Linea at 51 and Scroll at 50.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Linea almost won
&lt;/h2&gt;

&lt;p&gt;Linea is built by Consensys, the same company behind MetaMask, and it ships pre-configured in MetaMask's default network list. Docs are professionally maintained. TVL is the highest of the qualified candidates. The proof system uses lattice-based cryptography (Vortex/Plonk) instead of elliptic-curve SNARKs, which is a genuinely interesting post-quantum angle. If the criterion were "biggest chain with the most traction," Linea wins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Scroll won
&lt;/h2&gt;

&lt;p&gt;Two things.&lt;/p&gt;

&lt;p&gt;First: faucets. W1 on Base went smoothly partly because the testnet faucet only needed a wallet address. I learned to check this before scoring, not after. Linea's cleanest path to Sepolia ETH requires a free Infura account. Not social-gated or ENS-gated, but you still need an account. Scroll's Telegram bot takes a wallet address and sends ETH, nothing else. That difference is small on paper. After last week, I notice it.&lt;/p&gt;

&lt;p&gt;Second: timing. In April 2025, Scroll replaced its entire prover stack. The original architecture used hand-written halo2 arithmetic circuits to prove EVM execution, one circuit gadget per opcode, with a hard capacity ceiling per batch. Euclid swapped it out for OpenVM, a RISC-V zkVM built by Axiom in collaboration with Scroll and the Ethereum Foundation's research team. Instead of proving EVM execution directly, the system compiles to RISC-V and proves that. Throughput went up 5×, transaction costs dropped roughly 50%, Scroll hit Stage 1 ZK Rollup status on L2Beat. They also moved from a custom zktrie to Ethereum's standard Merkle-Patricia Trie, so any tooling that handles Ethereum state proofs now handles Scroll state proofs too. Most developers I've talked to don't know this happened. It's April 2026 and it's still not common knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  The TVL question
&lt;/h2&gt;

&lt;p&gt;Ether.fi exited to Optimism in early 2026. They took 300,000 user accounts, 70,000 active cards, and roughly 85% of Scroll's TVL with them, dropping the number from over $1 billion to around $27 million. That's the number. Ether.fi's reason: Optimism has larger TVL and a broader app suite, which matters more than ZK rollup maturity for a payments product. That's a real signal about where liquidity goes. But it's a liquidity routing decision, not a judgment on the developer infrastructure. The tooling is solid. The proving stack is active. The GitHub has ongoing commits across 152 repositories as of April 2026. TVL and developer experience are different charts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the pick says
&lt;/h2&gt;

&lt;p&gt;Picking the second-ranked chain means the rubric is a starting point, not a verdict. A 1-point gap is noise. What mattered was whether the friction points I care about actually lined up: faucet auth on day one, a fresh technical story, proven tooling. They did.&lt;/p&gt;

&lt;p&gt;Scroll was open-source from the first commit. Not retroactively. A governance vote happened before the biggest upgrade shipped. W1 was the establishment chain. This is the contrast.&lt;/p&gt;




&lt;p&gt;→ The live app is at &lt;a href="https://proof-of-support.pages.dev" rel="noopener noreferrer"&gt;https://proof-of-support.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ Scoring methodology for the series: &lt;a href="https://dev.to/satorigeeks/how-im-scoring-the-chains-clc"&gt;How I'm Scoring the Chains&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>zk</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>I ran the same smart contract through three AI security audits. The brief was the bug.</title>
      <dc:creator>Satori Geeks</dc:creator>
      <pubDate>Fri, 03 Apr 2026 15:28:24 +0000</pubDate>
      <link>https://dev.to/satorigeeks/i-ran-the-same-smart-contract-through-three-ai-security-audits-the-brief-was-the-bug-dnl</link>
      <guid>https://dev.to/satorigeeks/i-ran-the-same-smart-contract-through-three-ai-security-audits-the-brief-was-the-bug-dnl</guid>
      <description>&lt;p&gt;A smart contract reviewed by the same model that wrote it is a managed risk at best. Models from the same family, given similar prompts, will apply similar reasoning patterns — not because they're "colluding," but because of their shared DNA. If they're trained on the same overlapping datasets (Common Crawl, GitHub, Stack Overflow), they'll likely converge on the same blind spots regarding obscure Solidity vulnerabilities or specific EIPs. The same interpretive pattern that shaped a flaw is the one most likely to miss it.&lt;/p&gt;

&lt;p&gt;The fix isn't to stop using them; it's to increase coverage. Running reviews across different lineages — different training data, different alignment, different fine-tuning — minimises the chance of a shared blind spot. ChatGPT, Gemini, and Qwen are all transformers, but the paths they took to get here are different enough to matter.&lt;/p&gt;

&lt;p&gt;For Week 1 on Base, I ran the audit on three models independently: ChatGPT, Gemini, and a local Qwen instance. Same contract, same checklist, parallel sessions. No "peeking" allowed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What three independent audits found
&lt;/h2&gt;

&lt;p&gt;All three passed. No one found a dealbreaker. That's a useful signal, but it isn't a guarantee. LLM-based reviews can still miss critical vulnerabilities entirely; having three models agree doesn't change the underlying tech's limits. What it does do is ensure a gap isn't just a quirk of one model's training.&lt;/p&gt;

&lt;p&gt;Interestingly, all three flagged the same bottleneck: &lt;code&gt;getMessages()&lt;/code&gt; iterates over the entire message array to return results newest-first. This is an O(n) scaling issue. On Base (an L2), gas is cheap, but the block gas limit is still the ceiling. While off-chain view calls would handle the load, any on-chain transaction triggering that iteration would eventually revert — a Gas Limit DoS that grows silently alongside adoption.&lt;/p&gt;

&lt;p&gt;Qwen called it Medium severity. ChatGPT and Gemini treated it as a Note. The resolution: spec-required, acceptable at current scale, no action before mainnet. The finding was consistent; the panic level was the variable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The brief was the real problem
&lt;/h2&gt;

&lt;p&gt;This was the biggest takeaway I didn't see coming.&lt;/p&gt;

&lt;p&gt;My original brief for all three models was: "Audit the contract against the spec." That's a standard request, but it's also a trap. It frames the spec as the ceiling. A model following that instruction will check if the code matches the document, but it won't necessarily ask if the document itself is flawed or missing key security properties.&lt;/p&gt;

&lt;p&gt;I caught the framing error early and updated the briefs: "Perform a full security audit; treat the spec as the correctness baseline, not the audit scope."&lt;/p&gt;

&lt;p&gt;It's a minor wording tweak with a massive shift in optimisation. The spec becomes a reference — what the contract is supposed to do — rather than a boundary — the only thing you need to check. The first brief asks for conformance. The second asks for vulnerabilities.&lt;/p&gt;

&lt;p&gt;The lesson: prompts are specifications. The same discipline that goes into writing a contract interface — precise, unambiguous, explicit — has to apply to the security brief. Vague input produces vague output. Not because the model is "lazy," but because the brief didn't ask the right question.&lt;/p&gt;

&lt;h2&gt;
  
  
  The new standing structure
&lt;/h2&gt;

&lt;p&gt;Three-model review is now the standard. Each week, three parallel briefs go out — &lt;code&gt;SECURITY_CHATGPT.md&lt;/code&gt;, &lt;code&gt;SECURITY_GEMINI.md&lt;/code&gt;, &lt;code&gt;SECURITY_QWEN.md&lt;/code&gt; — and consolidate into a single &lt;code&gt;security.md&lt;/code&gt; for the final handoff.&lt;/p&gt;

&lt;p&gt;This isn't just overhead. It's the difference between a single-pass sanity check and a robust coverage strategy. It's not a replacement for formal verification or a professional audit, but it's significantly more reliable than a single-model pass.&lt;/p&gt;




&lt;p&gt;The structural risk of AI blind spots is real. The solution has to be structural, too. Running a parallel process surfaced a flaw in the briefing that a single-model review never would have caught.&lt;/p&gt;

&lt;p&gt;The contract passed. The process stayed. The next brief is already in the works.&lt;/p&gt;

&lt;p&gt;→ The full Week 1 build — deploy experience, faucet reality, rubric scores — is in the retrospective: &lt;a href="https://dev.to/satorigeeks/week-1-base-5660-4bga"&gt;Week 1: Base — 56/60&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ The live app is at &lt;a href="https://proof-of-support.pages.dev" rel="noopener noreferrer"&gt;https://proof-of-support.pages.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>ai</category>
      <category>security</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Base Is Migrating Off the OP Stack. Here's What I Checked Before Building.</title>
      <dc:creator>Satori Geeks</dc:creator>
      <pubDate>Thu, 02 Apr 2026 10:05:32 +0000</pubDate>
      <link>https://dev.to/satorigeeks/base-is-migrating-off-the-op-stack-heres-what-i-checked-before-building-5f9</link>
      <guid>https://dev.to/satorigeeks/base-is-migrating-off-the-op-stack-heres-what-i-checked-before-building-5f9</guid>
      <description>&lt;p&gt;In February 2026, Coinbase &lt;a href="https://blog.base.dev/next-chapter-for-base-chain-1" rel="noopener noreferrer"&gt;announced&lt;/a&gt; what amounted to a quiet bombshell: Base is moving away from the OP Stack toward an in-house "unified codebase."&lt;/p&gt;

&lt;p&gt;I caught the news right as I was prepping a contract deployment. My entire stack — chain IDs, RPC endpoints, Foundry configs, wagmi imports — had been built for the OP Stack. My first thought wasn't "this is a crisis," but it was: is my documentation about to become obsolete at the exact moment I hit deploy?&lt;/p&gt;

&lt;p&gt;I went down the rabbit hole. Here's what's actually changing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the migration actually is (and isn't)
&lt;/h2&gt;

&lt;p&gt;The new system is the &lt;a href="https://github.com/base/base" rel="noopener noreferrer"&gt;unified stack&lt;/a&gt;, currently living in &lt;code&gt;github.com/base/base&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Don't let the "in-house codebase" framing spook you. This isn't a VM overhaul or a sudden pivot to ZK (yet). It's an infrastructure consolidation — pulling components previously scattered across different repositories into a single Base-managed binary, &lt;a href="https://blog.base.dev/next-chapter-for-base-chain-1" rel="noopener noreferrer"&gt;built on open-sourced components including Reth&lt;/a&gt;, the Rust Ethereum execution client.&lt;/p&gt;

&lt;p&gt;Status as of now: v0.6.0 shipped March 27, 2026, and the repo has over 3,000 commits. We're well past announcement territory. The full mainnet cutover is expected "in the coming months," per the blog. Base Sepolia and mainnet RPCs are unaffected throughout.&lt;/p&gt;

&lt;p&gt;One data point on the Superchain side: &lt;a href="https://www.dlnews.com/articles/defi/optimism-token-price-plunges-as-base-leaves-superchain/" rel="noopener noreferrer"&gt;DL News reports&lt;/a&gt; that revenue sharing with the Optimism Collective is expected to end as part of this move, citing an Optimism spokesperson. The &lt;a href="https://coincentral.com/optimism-op-price-token-drops-4-after-base-announces-move-away-from-op-stack/" rel="noopener noreferrer"&gt;OP token fell roughly 4%&lt;/a&gt; on the day of the announcement, with further declines over the following days. Whether the Superchain model survives that departure is a debate for another day; the price move is just a signal of how it was read.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building on Base this week? Change nothing.
&lt;/h2&gt;

&lt;p&gt;I cross-referenced the &lt;a href="https://blog.base.dev/next-chapter-for-base-chain-1" rel="noopener noreferrer"&gt;Base Engineering Blog&lt;/a&gt; with current tooling and repo activity. No changes have been announced to developer-facing tooling, and everything continues to work as-is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solidity:&lt;/strong&gt; &lt;code&gt;pragma solidity 0.8.24&lt;/code&gt; — still correct. No EVM or compiler changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foundry:&lt;/strong&gt; Business as usual. &lt;code&gt;forge script --verify&lt;/code&gt; still targets Basescan. Base has explicitly committed to "continue contributing to Foundry."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RPCs:&lt;/strong&gt; &lt;code&gt;https://mainnet.base.org&lt;/code&gt; and &lt;code&gt;https://sepolia.base.org&lt;/code&gt; — no changes. Base's stated commitment: "All RPCs, including those in the optimism namespace, will continue to be fully supported."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; &lt;code&gt;import { base, baseSepolia } from 'wagmi/chains'&lt;/code&gt; — unchanged. Chain IDs 8453 (mainnet) and 84532 (Sepolia) do not change mid-chain. Base commits to "continue contributing to Wagmi."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;viem, EIP-1559, &lt;code&gt;block.timestamp&lt;/code&gt;&lt;/strong&gt; — no changes announced.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Research Agent ran the verification in minutes; the conclusion took three seconds to read. Nothing you interact with as a developer has changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two threads to watch
&lt;/h2&gt;

&lt;p&gt;Two items stayed on my radar after the verification pass.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The proof system upgrade.&lt;/strong&gt; Base has had &lt;a href="https://base.mirror.xyz/eOsedW4tm8MU5OhdGK107A9wsn-aU7MAb8f3edgX5Tk" rel="noopener noreferrer"&gt;fault proofs live since October 2024&lt;/a&gt;, using the Cannon optimistic system — permissionless challengers, 3.5-day dispute window. Base reached &lt;a href="https://blog.base.org/base-has-reached-stage-1-decentralization" rel="noopener noreferrer"&gt;Stage 1 decentralization in April 2025&lt;/a&gt;. The unified stack roadmap points toward Base V1: a planned swap from optimistic to TEE/ZK proofs for faster finality. No launch date yet. This is an upgrade to a functioning system, not a gap being closed — but worth watching when the spec arrives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The exit mechanics.&lt;/strong&gt; Two paths currently protect you from sequencer failure. Withdrawal finalization has a &lt;a href="https://docs.base.org/base-chain/network-information/transaction-finality" rel="noopener noreferrer"&gt;7-day challenge window&lt;/a&gt;. If the sequencer goes offline entirely, you can force transaction inclusion via L1 — &lt;a href="https://l2beat.com/scaling/projects/base" rel="noopener noreferrer"&gt;L2Beat documents&lt;/a&gt; up to a 12-hour delay on that path. Both are confirmed compatible during the current transition. How they change post-Base V1 is not publicly specified — a genuine documentation gap to revisit once the spec is out.&lt;/p&gt;




&lt;p&gt;I checked what I needed to before building. The tools work as expected. Two threads to revisit when Base V1 ships — the proof system upgrade and the exit mechanics spec. The build went ahead on the same configuration the research documented. The &lt;a href="https://dev.to/satorigeeks/week-1-base-5660-4bga"&gt;Week 1 retrospective&lt;/a&gt; covers how it went.&lt;/p&gt;

&lt;p&gt;→ The full Week 1 build — deploy experience, faucet reality, rubric scores — is in the retrospective: &lt;a href="https://dev.to/satorigeeks/week-1-base-5660-4bga"&gt;Week 1: Base — 56/60&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ The live app is at &lt;a href="https://proof-of-support.pages.dev" rel="noopener noreferrer"&gt;https://proof-of-support.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ Scoring methodology for the series: &lt;a href="https://dev.to/satorigeeks/how-im-scoring-the-chains-clc"&gt;How I'm Scoring the Chains&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>base</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Your private key doesn't belong in your terminal. Here's the Foundry fix.</title>
      <dc:creator>Satori Geeks</dc:creator>
      <pubDate>Wed, 01 Apr 2026 13:10:01 +0000</pubDate>
      <link>https://dev.to/satorigeeks/your-private-key-doesnt-belong-in-your-terminal-heres-the-foundry-fix-8me</link>
      <guid>https://dev.to/satorigeeks/your-private-key-doesnt-belong-in-your-terminal-heres-the-foundry-fix-8me</guid>
      <description>&lt;p&gt;You're about to run &lt;code&gt;forge script --broadcast&lt;/code&gt;. The command needs a private key. The options that come to mind first all share the same problem: paste it into the terminal and it ends up in &lt;code&gt;.bash_history&lt;/code&gt; or &lt;code&gt;.zsh_history&lt;/code&gt;. Put it in &lt;code&gt;.env&lt;/code&gt; and it's one accidental &lt;code&gt;git add&lt;/code&gt; away from the repo. Hardcode it in the deploy script and it's in version history the moment the file is committed. These aren't theoretical risks — they're how keys get exposed.&lt;/p&gt;

&lt;p&gt;There is a better way built directly into Foundry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Foundry's encrypted keystore
&lt;/h2&gt;

&lt;p&gt;Import your private key into an encrypted keystore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cast wallet import deployer &lt;span class="nt"&gt;--interactive&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--interactive&lt;/code&gt; flag prompts for your private key and a password. Foundry stores the key encrypted at &lt;code&gt;~/.foundry/keystores/deployer&lt;/code&gt;. Nothing touches shell history. The name &lt;code&gt;deployer&lt;/code&gt; is arbitrary — use whatever you'll recognise.&lt;/p&gt;

&lt;p&gt;Before running a deploy, confirm the import worked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cast wallet list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lists all keystores by name. If &lt;code&gt;deployer&lt;/code&gt; appears, the import succeeded. Two seconds, one less thing to debug mid-deploy.&lt;/p&gt;

&lt;p&gt;Now run the deploy referencing the keystore by name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;forge script script/Deploy.s.sol &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; &lt;span class="nv"&gt;$RPC_URL&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--account&lt;/span&gt; deployer &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--broadcast&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--verify&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--account deployer&lt;/code&gt; tells Foundry which keystore to use. It prompts for the password at runtime. The private key is not in the command, not in &lt;code&gt;.env&lt;/code&gt;, not anywhere in the repository. The password prompt is the only moment the key decrypts, and it never leaves your machine.&lt;/p&gt;

&lt;p&gt;What this protects against: shell history logs every command you run — &lt;code&gt;.bash_history&lt;/code&gt;, &lt;code&gt;.zsh_history&lt;/code&gt;, your terminal emulator's scrollback. &lt;code&gt;.env&lt;/code&gt; files get committed. Command arguments show up in process listings. The key is encrypted at rest and decrypted only at deploy time. There is no passive exposure surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  One note on the password
&lt;/h2&gt;

&lt;p&gt;The password matters. A weak password on an encrypted keystore holding a deploy key for a contract with real funds is not meaningfully safer than &lt;code&gt;.env&lt;/code&gt;. Use a password manager. The keystore adds a layer; the quality of your password determines what that layer is worth.&lt;/p&gt;




&lt;p&gt;This is now the default for every remaining week of this series. First-time setup took about ninety seconds. The instinct — "I don't feel okay putting it in the terminal" — was right; the tooling already had the answer.&lt;/p&gt;

&lt;p&gt;→ The full Week 1 build — deploy experience, faucet reality, rubric scores — is in the retrospective: &lt;a href="https://dev.to/satorigeeks/week-1-base-5660-4bga"&gt;Week 1: Base — 56/60&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ The live app is at &lt;a href="https://proof-of-support.pages.dev" rel="noopener noreferrer"&gt;https://proof-of-support.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ Scoring methodology for the series: &lt;a href="https://dev.to/satorigeeks/how-im-scoring-the-chains-clc"&gt;How I'm Scoring the Chains&lt;/a&gt;&lt;/p&gt;

</description>
      <category>foundry</category>
      <category>blockchain</category>
      <category>solidity</category>
      <category>security</category>
    </item>
    <item>
      <title>How I'm Scoring the Chains</title>
      <dc:creator>Satori Geeks</dc:creator>
      <pubDate>Wed, 01 Apr 2026 12:58:06 +0000</pubDate>
      <link>https://dev.to/satorigeeks/how-im-scoring-the-chains-clc</link>
      <guid>https://dev.to/satorigeeks/how-im-scoring-the-chains-clc</guid>
      <description>&lt;p&gt;Designing a scoring system after the build is convenient. The dimensions settle around what you happened to encounter; the weights drift toward what turned out to matter. The score feels right because the rubric was shaped around the result.&lt;/p&gt;

&lt;p&gt;This one was fixed before Week 1 started.&lt;/p&gt;

&lt;p&gt;A scoring system designed after the build will justify what happened rather than measure it. Building it first forces the criteria to be general enough to apply to every chain — EVM and non-EVM, polished and experimental — before you know which one you're deploying on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Eight dimensions. Three weights.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;Max&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;D1&lt;/td&gt;
&lt;td&gt;Getting Started&lt;/td&gt;
&lt;td&gt;×1.0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D2&lt;/td&gt;
&lt;td&gt;Developer Tooling&lt;/td&gt;
&lt;td&gt;×2.0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D3&lt;/td&gt;
&lt;td&gt;Contract Authoring&lt;/td&gt;
&lt;td&gt;×2.0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D4&lt;/td&gt;
&lt;td&gt;Documentation Quality&lt;/td&gt;
&lt;td&gt;×1.5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D5&lt;/td&gt;
&lt;td&gt;Frontend / Wallet&lt;/td&gt;
&lt;td&gt;×2.0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D6&lt;/td&gt;
&lt;td&gt;Deployment Experience&lt;/td&gt;
&lt;td&gt;×1.5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D7&lt;/td&gt;
&lt;td&gt;Transaction Cost&lt;/td&gt;
&lt;td&gt;×1.0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D8&lt;/td&gt;
&lt;td&gt;Community &amp;amp; Ecosystem&lt;/td&gt;
&lt;td&gt;×1.0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Maximum score: 60. Each dimension scores 1–5. The weight reflects how much that dimension determines whether you'd actually build a production app on the chain.&lt;/p&gt;

&lt;p&gt;D2, D3, and D5 carry the most weight because they are the daily surface: the tools you use every hour, the language you write in, the wallet integration you fight with on every frontend. Get those wrong and no amount of documentation or community enthusiasm compensates.&lt;/p&gt;

&lt;p&gt;D4 and D6 are mid-weight — important but recoverable. Bad documentation can be worked around with research; a difficult deploy flow can be scripted.&lt;/p&gt;

&lt;p&gt;D1, D7, and D8 are single-weight. Getting started friction matters, but you only experience it once. Transaction cost matters for production apps, but at this scale the variance between chains is more interesting than the absolute number. Community is context, not infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I'm measuring&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each dimension is scored from the perspective of a developer building this specific app — a social tip jar with a straightforward contract, wallet connect, and a message wall — on this specific chain, this specific week. Not a permanent rating. A snapshot of the developer experience at build time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;D1: everything before the first line of code — wallet setup, testnet funds, network configuration. The faucet experience lives here.&lt;/li&gt;
&lt;li&gt;D2: the toolchain — Foundry or equivalent, CLI tools, local node, testing. How much of the standard EVM workflow translates unchanged?&lt;/li&gt;
&lt;li&gt;D3: the contract side — EVM equivalence, library support, Solidity version compatibility, anything that required rewriting logic.&lt;/li&gt;
&lt;li&gt;D4: documentation — official quickstarts, deployment guides, API references. Does the official docs get you to a working deploy, or do you end up in forum threads?&lt;/li&gt;
&lt;li&gt;D5: frontend and wallet layer — chain imports in wagmi/viem, wallet connector support, anything that required custom integration.&lt;/li&gt;
&lt;li&gt;D6: deploy and verify workflow — commands, manual steps, verification speed, block explorer quality.&lt;/li&gt;
&lt;li&gt;D7: transaction cost on mainnet — deploy cost and per-transaction cost for the app's primary function. For a tip jar, a transaction that costs more than the tip is broken.&lt;/li&gt;
&lt;li&gt;D8: broader ecosystem — community size, documentation freshness, signs of active development versus stagnation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The score bands&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;55–60: Outstanding — build here with confidence, caveats worth naming but none are blockers.&lt;/li&gt;
&lt;li&gt;45–54: Strong — solid foundation, specific gaps worth understanding before committing.&lt;/li&gt;
&lt;li&gt;35–44: Mixed — viable, but with meaningful friction or risk you need to plan around.&lt;/li&gt;
&lt;li&gt;Below 35: Challenged — fundamental issues that affect the build directly.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;→ The full Week 1 build — deploy experience, faucet reality, rubric scores — is in the retrospective: &lt;a href="https://dev.to/satorigeeks/week-1-base-5660-4bga"&gt;Week 1: Base — 56/60&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ The live app is at &lt;a href="https://proof-of-support.pages.dev" rel="noopener noreferrer"&gt;https://proof-of-support.pages.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>buildinpublic</category>
      <category>devjournal</category>
      <category>learning</category>
    </item>
    <item>
      <title>Week 1: Base — 56/60</title>
      <dc:creator>Satori Geeks</dc:creator>
      <pubDate>Tue, 31 Mar 2026 11:58:52 +0000</pubDate>
      <link>https://dev.to/satorigeeks/week-1-base-5660-4bga</link>
      <guid>https://dev.to/satorigeeks/week-1-base-5660-4bga</guid>
      <description>&lt;p&gt;The app deployed cleanly. I ran the function. Nothing happened.&lt;/p&gt;

&lt;p&gt;That's &lt;code&gt;cast call&lt;/code&gt;. It simulates — never broadcasts. The fix was &lt;code&gt;cast send&lt;/code&gt;. One word. Thirty seconds once I asked the right question. (The honest version: I knew the difference, once. Muscle memory had just drifted.) Returning to a toolchain after time away means re-learning where the sharp edges are — even when the tooling is genuinely excellent.&lt;/p&gt;

&lt;p&gt;Before writing a line of code, I ran a verification pass on Base's OP Stack migration. Infrastructure consolidation, not a developer-surface change. Every tool confirmed unchanged. The full check is in a &lt;a href="https://dev.to/satorigeeks/base-is-migrating-off-the-op-stack-heres-what-i-checked-before-building-5f9"&gt;separate article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then the faucet situation. This is where the PM brain kicked in — because the developer brain just wants to deploy, and what I found was a TSA pat-down at every gate. Ethereum Ecosystem required an ENS name. Bware Labs was under maintenance. QuickNode and Alchemy required an ETH balance on Ethereum mainnet. LearnWeb3 wanted wallet connection and GitHub auth. Five faucets, five blocked. The one that worked — Coinbase Developer Platform — required sign-in and delivered 0.0001 Sepolia ETH. Enough to proceed. But the "multiple no-auth faucets" story from the research didn't survive contact with reality. That's a getting-started problem — the kind of friction that doesn't show until someone actually tries to move in.&lt;/p&gt;

&lt;p&gt;Private key: encrypted Foundry keystore, not &lt;code&gt;.env&lt;/code&gt;. Right call. Full method in a &lt;a href="https://dev.to/satorigeeks/your-private-key-doesnt-belong-in-your-terminal-heres-the-foundry-fix-8me"&gt;dedicated article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The deploy itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;forge script script/Deploy.s.sol:Deploy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; baseSepolia &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--broadcast&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--verify&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--etherscan-api-key&lt;/span&gt; &lt;span class="nv"&gt;$BASESCAN_API_KEY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"Pass - Verified" on Basescan in forty-five seconds. No flattening, no manual ABI upload, no second command. That's the D6 story in one run.&lt;/p&gt;

&lt;p&gt;Mainnet followed the same path. Contract address: &lt;code&gt;0x6D89c4974f8f211eD07b8E8DA08177DEE627DeFa&lt;/code&gt;. Same address as Sepolia — the EVM derives contract addresses from deployer nonce, and mine matched on both networks. A separate Farcaster thread covers the mechanics. Frontend wiring was one environment variable: &lt;code&gt;VITE_BASE_CONTRACT_ADDRESS&lt;/code&gt;. Wallet connect, form submit, &lt;code&gt;sendSupport()&lt;/code&gt;, on-chain confirmation, message on the wall. End-to-end in one take. First live mainnet message: "First message outside the testnet." Verifiable on Basescan.&lt;/p&gt;

&lt;p&gt;One post-QA fix: the first mainnet message came in at 10,000,000,000,000 wei, and &lt;code&gt;formatAmount&lt;/code&gt; displayed it incorrectly below 0.0001 ETH. Tests written, implementation fixed. The dev half wrote the code; the PM half noticed the edge case existed. That split is the whole job.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9bkp8wh4oec0jlndn1px.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9bkp8wh4oec0jlndn1px.png" alt="live app on Base mainnet, message wall with first entry visible" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Vibe Check.&lt;/strong&gt; &lt;em&gt;(Eight dimensions, three weights, max 60. Full methodology: &lt;a href="https://dev.to/satorigeeks/how-im-scoring-the-chains-clc"&gt;How I'm Scoring the Chains&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;D2, D3, D5, D6: all 5/5. The locals know what they're doing here. Foundry runs identically to Ethereum mainnet. OpenZeppelin v5.0.2 installed without ceremony. Wagmi ships a &lt;code&gt;base&lt;/code&gt; chain import out of the box. &lt;code&gt;forge script --broadcast --verify&lt;/code&gt; deploys and auto-verifies in a single run. No translation required — if you've built on EVM before, you already speak this language.&lt;/p&gt;

&lt;p&gt;D7 (5/5): under $0.005 per &lt;code&gt;sendSupport&lt;/code&gt; at current ETH prices, 0.005–0.006 gwei effective gas price. For a tip jar. Practically free.&lt;/p&gt;

&lt;p&gt;Three misses.&lt;/p&gt;

&lt;p&gt;D1 (4/5): the faucet. Five of six blocked — ENS requirements, mainnet balance gates, maintenance, GitHub auth. The one that opened required sign-in and gave 0.0001 ETH. The neighbourhood works fine once you're in. Getting there is harder than the welcome mat suggests.&lt;/p&gt;

&lt;p&gt;D4 (4/5): the official Base quickstart uses &lt;code&gt;forge create&lt;/code&gt;, not &lt;code&gt;forge script&lt;/code&gt;. The &lt;code&gt;[etherscan]&lt;/code&gt; block needed for auto-verification isn't in the primary guide — it came from the research doc. The street signs are in a language only locals speak. Not a blocker for someone who's been here before. A genuine detour for everyone else.&lt;/p&gt;

&lt;p&gt;D8 (4/5): large community, Farcaster-native, Coinbase-backed, highest daily transaction volume of any L2. The score is 4 because Base is departing the Optimism Superchain — OP token dropped roughly 7% on the announcement. Zero practical impact on this deploy. But a chain leaving a shared ecosystem is a signal, and I've been around long enough not to ignore signals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weighted total: 56/60.&lt;/strong&gt; Outstanding band.&lt;/p&gt;

&lt;p&gt;The research estimated 56. The build delivered 56. Zero delta is what a baseline is supposed to do — the rubric held up, which means it's functioning. The interesting data starts next week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; I would build a production app on Base, with the standard caveats — no live fraud proofs yet, Coinbase trust assumption, Superchain transition still in progress. None of those are blockers at this scale. Live app: &lt;code&gt;https://proof-of-support.pages.dev&lt;/code&gt;. Contract verified at &lt;code&gt;0x6D89c4974f8f211eD07b8E8DA08177DEE627DeFa&lt;/code&gt; on Base mainnet.&lt;/p&gt;

&lt;p&gt;Base is home. If you've built on Ethereum mainnet, you already know this toolchain — you just haven't paid these gas fees.&lt;/p&gt;

&lt;p&gt;Week 2 is coming. The chain is chosen. The toolchain will not be identical. That's the point.&lt;/p&gt;




&lt;p&gt;→ The live app is at &lt;a href="https://proof-of-support.pages.dev" rel="noopener noreferrer"&gt;https://proof-of-support.pages.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>solidity</category>
      <category>webdev</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
