Field notes
Your indexer is three blocks late, and the book has moved
At 300 milliseconds, a one-second poll is a different market. Websocket heads, a host that actually serves history, and a receipt you waited for are the difference between a price and a rumour.
MONAF Desk · 25 October 2026 · 8 min
- 1s
- About three slots
- 25 rps
- Public primary, cited
- History
- Only some hosts
- Receipt
- The commit, not the head
An indexer is a story about the past that a trader is tempted to treat as the present. On Ethereum the temptation is expensive every twelve seconds. On Monad it is expensive three times a second. The docs’ websocket reference exists because polling the head is the wrong shape. Subscribe to new heads. Record the block number you acted on. If your process then spends a second in a database, you are writing a note about a block that is no longer the tip, and you should say so in the note. A dashboard that shows “live” without a block number is a mood.
History is a property of the host
Some public endpoints can answer an eth_call at an old block. The network page marks rpc2 and rpc-mainnet.monadinfra.com for that. Others will not, and several disable debug_ or trace_ outright. An indexer that replays state by calling at historical blocks must be pinned to a host that has agreed to serve them, and it must tolerate the batch cap on that host. The Foundation endpoint’s batch limit, in the table this piece was written against, is one. A client that sends batches of fifty will look, to a tired engineer, like a Monad outage. It is a client bug.
Rate limits are part of the design of the public good, not an insult. Twenty-five requests a second on the primary public URL is enough to paint a wallet and not enough to backfill a year of logs from a laptop on a cron. For the backfill, pay a provider or accept that the job takes days and checkpoint it. A retry storm against a 429 makes the next hour worse. Monad’s own RPC notes describe a 429 that should be respected. This app treats a 429 as a reason to slow down, not as a reason to guess a balance and trade it.
Store the block number next to every figure you show a human. A figure without a block is a rumour with a font.
The receipt is the commit
A head subscription tells you the chain moved. A receipt tells you your transaction was in a particular block and what it cost. Do not update a position from the head alone. Wait for the receipt, then mark it speculatively final one slot later and final one slot after that, if the difference matters to the product. Most users need the receipt and the two-slot wait. Almost none of them need a homemade mempool. If you do run one, remember that a transaction you saw and did not include is not a position. It is a wish, and on a chain that bills the limit, retrying the wish is how wishes become fees.