14 posts.
July 10, 2026 · 5 min read
One stuck nonce can freeze every transaction behind it. If you're sending from a hot wallet at volume — a relayer, a market maker, a bridge — leaning on eth_getTransactionCount('pending') will eventually stall you. Here's how nonces actually work and how to manage them locally at scale.
Read →July 6, 2026 · 4 min read
Fetching every receipt in a block one transaction at a time is the N+1 problem in disguise — hundreds of round-trips per block. eth_getBlockReceipts returns all of them in a single call. Here's how it works, when to use it over JSON-RPC batching, and how to fall back when a node doesn't support it.
Read →July 4, 2026 · 5 min read
A transaction being mined does not mean it worked — a reverted transaction still lands in a block and still costs you gas. The receipt is where the truth lives: the status flag, the event logs, the real gas paid, and how many confirmations you should wait. Here's how to read one.
Read →July 3, 2026 · 6 min read
Half of failed transactions are gas mistakes: an 'out of gas' revert or a fee too low to ever get mined. Here's how eth_estimateGas actually works, how EIP-1559 fees are built, why you buffer the gas limit, and how to put it all together without overpaying.
Read →June 30, 2026 · 5 min read
Your indexer works perfectly in testing, then a reorg silently corrupts your database with transactions that no longer exist. Here's how reorgs break indexers and two proven patterns to handle them — confirmation lag and reorg detection with rollback.
Read →June 25, 2026 · 4 min read
eth_call defaults to the latest block, but you can point it at any past block to read state as it was then — a balance last Tuesday, an oracle price at a specific block. The catch: historical state reads need an archive node. Here's how to do it in viem, ethers, and web3.py, and why a full node returns 'missing trie node'.
Read →June 21, 2026 · 6 min read
A naive retry loop turns a brief blip into an outage. Here's how to retry RPC calls correctly: exponential backoff with jitter, knowing which calls are safe to retry, and failing over across providers — with copy-paste examples in viem, ethers, and web3.py.
Read →June 12, 2026 · 6 min read
A WebSocket subscription that silently drops is worse than no subscription at all — you keep running, but events vanish into the gap. Here's how to build reconnect logic that detects the drop, backs off, re-subscribes, and backfills the missed events so your indexer never loses a log.
Read →June 5, 2026 · 7 min read
Tracing a transaction costs 20-30× more than reading its receipt. Sometimes that's worth it; usually it isn't. Here's what trace actually tells you, the four tracer modes, and when a cheaper RPC method gets the same answer.
Read →June 4, 2026 · 7 min read
Multicall3 lives at the same address on every EVM chain and turns 100 contract reads into one RPC call. Here's how it actually works, when to use which variant, and the gotchas that bite people in production.
Read →June 3, 2026 · 6 min read
Three of 2025's biggest EVM chain launches, three sets of MetaMask configuration values. The exact fields to paste, why the official public RPCs aren't enough for real use, and the errors to expect when you mistype something.
Read →June 1, 2026 · 6 min read
Your indexer works fine until it hits a single dense block range, then everything stops. Here's the cap mechanics across providers, the adaptive chunking pattern that actually works, and the code to do it right.
Read →May 30, 2026 · 6 min read
Most Solana bots burn 80% of their RPC budget polling for state that WebSocket subscriptions would push to them for free. Here's when to use which, with the commitment-level gotchas that bite people in production.
Read →May 28, 2026 · 6 min read
Most dApps make 50 RPC calls when they could make one. Here's how JSON-RPC batching works, why ethers.js and viem already do most of it for you, and where you still have to think about it.
Read →