The app deployed cleanly. I ran the function. Nothing happened.
I stared at the terminal for a moment, then at the Anvil output. The contract was there — address confirmed, bytecode matching, tests passing 14/14. I had called sendSupport. Nothing moved.
The command was cast call. Cast call simulates a transaction against a local node; it never broadcasts one. The fix was cast send. One word, thirty seconds to diagnose once I asked the right question. The broader point is more interesting than the mistake: returning to a toolchain after time away means re-learning where the sharp edges are, even when the tooling is genuinely excellent. Foundry's cast is well-designed. That didn't stop me from mixing up two commands I'd used before.
Before writing a line of code, I ran a verification pass. Base is mid-migration — Coinbase announced in February 2026 that the chain is moving from the OP Stack to an in-house unified stack built on Reth, housed in the public github.com/base/base repository. By the time I sat down to build, v0.6.0 had shipped three days prior. That's not an announcement anymore; it's an active transition. A standalone article coming later this week covers this in full. The short version: every developer-facing tool — Foundry, wagmi, viem, Basescan, the public RPC endpoints, the chain IDs — is confirmed unchanged. The migration is an infrastructure consolidation, not a developer-surface change. I verified it before building because the right move is to check, not assume.
Getting testnet ETH turned out to be the most friction-dense part of the week. The research had listed several no-auth faucets; the reality was more complicated. Ethereum Ecosystem required an ENS name. Bware Labs was under maintenance. QuickNode and Alchemy both required an ETH balance on Ethereum mainnet. LearnWeb3 required wallet connection and GitHub authentication. Six faucets, five blocked. The one that worked — Coinbase Developer Platform — required a sign-in and delivered 0.0001 Sepolia ETH. Enough to deploy, but the path was materially harder than the research suggested. This is where the D1 score comes from.
The private key moment came next. The natural instinct before deploying to testnet is to reach for a .env file. It didn't feel right. The correct tool is Foundry's encrypted keystore: cast wallet import deployer --interactive. The key is stored encrypted at ~/.foundry/keystores/deployer, password-prompted at deploy time. Nothing sensitive touches shell history, the repo, or the environment. The full treatment is in a separate article; the point here is that the instinct was right, and the tooling had the answer.
Deploy to Sepolia: one command.
forge script script/Deploy.s.sol:Deploy \
--rpc-url baseSepolia \
--broadcast \
--verify \
--etherscan-api-key $BASESCAN_API_KEY
Contract deployed, Basescan showed "Pass - Verified" within forty-five seconds. No flattening, no manual ABI upload, no second command. That's the D6 experience in practice.
Mainnet followed the same path. Contract address: 0x6D89c4974f8f211eD07b8E8DA08177DEE627DeFa. One fact stood out immediately: the mainnet address is identical to the Sepolia address. Not a copy-paste error. The EVM derives a contract address from keccak256(deployer_address, nonce). My deployer wallet had the same nonce on both networks at deploy time, so the math gave the same result. A separate Farcaster thread covers the mechanics; here it's a moment worth noting — the kind of EVM behaviour that surprises you until it clicks.
Wiring the frontend to mainnet was one environment variable: VITE_BASE_CONTRACT_ADDRESS. Wallet connect, form submit, sendSupport(), on-chain confirmation, message on the wall. End-to-end in one take, no debugging. The first live mainnet message was "First message outside the testnet." — real entry, verifiable on Basescan at the address above.
After QA PASS, a second frontend pass ran — six user stories, thirty tasks, all clean. Nothing touched the contract or adapter. The only thing worth naming: that first mainnet message was sent with 10,000,000,000,000 wei. Below 0.0001 ETH, the original formatAmount displayed it incorrectly. The test suite hadn't caught it because no test used a value that small. I wrote the tests first — six red — then fixed the implementation, then green. The display now shows 0.00001 ETH correctly. This is the difference between "passes tests" and "handles real data."
The rubric.
D2, D3, D5, D6 all came in at 5/5. Foundry worked identically to any EVM mainnet. OZ v5.0.2 installed cleanly. Wagmi had a base chain import out of the box. forge script --broadcast --verify deployed and auto-verified in a single run. These don't need elaboration — the score is the verdict.
D7 (5/5): per-sendSupport transaction cost under $0.005 at current ETH prices and 0.005–0.006 gwei effective gas price. For a tip jar, that's effectively free. The deploy cost the same order of magnitude.
Three misses.
D1 (4/5): faucet access. Five of six faucets I tried were blocked — ENS requirements, mainnet ETH balance gates, one under maintenance. The one that worked required sign-in. Testnet ETH was obtained; the build proceeded. But the "multiple no-auth faucets" story from the research didn't hold at build time. That's a real gap in the getting-started experience.
D4 (4/5): documentation. The official Base quickstart uses forge create, not forge script. The [etherscan] block in foundry.toml needed for auto-verification isn't in the primary guide — it came from the research doc. Minor gap, specific one. Docs are otherwise good.
D8 (4/5): ecosystem. Base's community is large and active — Coinbase backing, Farcaster native, highest daily transaction volume of any L2. The score is 4 because Base is in the middle of departing the Optimism Superchain. The OP token dropped around 7% on the announcement. The practical impact on deploying a contract this week was zero. But a chain leaving a shared ecosystem is a signal worth naming.
Weighted total: 56/60. Outstanding band.
The research estimated 56. The build delivered 56. That's not a surprise — Base is home ground for an EVM developer. The toolchain is identical to what you'd use on Ethereum mainnet. A zero delta is what you want from a baseline: the research held up, which means the rubric is functioning. The interesting data starts next week.
Verdict: I would build a production app on Base, with the standard caveats — no live fraud proofs yet, Coinbase trust assumption, the Superchain transition still in progress. None of those are blockers at this scale. The live app is at https://proof-of-support.pages.dev. The contract is verified at 0x6D89c4974f8f211eD07b8E8DA08177DEE627DeFa on Base mainnet.
Base is home. If you've built on Ethereum mainnet, you already know this toolchain — you just haven't paid these gas fees.
Week 2 is coming. The chain is chosen. The toolchain will not be identical. That's the point.

Top comments (0)