eth_getLogs, which BOT Chain documents as disabled on its public RPC.
The situation
BOT Chain’s docs sayeth_getLogs is disabled on the public endpoints. In our tests on 2026-10-01 it did answer bounded ranges: a 50,000-block range read in 5,000-block chunks took about 8 seconds. A query from block 0 to the latest block timed out. Because the method is documented as disabled, don’t make it the only way your app gets data. See Known limitations for the details and the chunked query code.
Choose a pattern by what you need:
Read state instead of events
Most apps use events to rebuild a list that the contract already stores. If the contract has a view function for it, read that instead. This guest book stores every entry and returns a page of them:src/LatestEntries.tsx
Read the receipt
When your app sends the transaction, you don’t need to search for its events. They are in the receipt.read-receipt.ts
Output
useWaitForTransactionReceipt returns the same receipt. Pass receipt.data.logs to parseEventLogs. See Send transactions.
Keep recent activity in a ring buffer
If you write the contract, store the last few actions in a fixed-size array. Reads stay cheap and writes cost the same no matter how much history there is.src/RecentActivity.sol
recordoverwrites the oldest slot once the buffer is full.lastActions(10)returns the 10 newest actions. Call it withuseReadContractand polltotalActionsto know when to refetch.- Keep emitting the event too. Indexers and the explorer still use it.
record calls with 10, 20 and 30, lastActions(2) returned the 30 and 20 actions, newest first. Overwriting the oldest slot was tested with forge test only, since it takes 33 calls.
Enumerate NFTs
OpenZeppelin’sERC721Enumerable adds totalSupply, tokenByIndex and tokenOfOwnerByIndex. With them you can list an owner’s tokens from state:
list-nfts.ts
Use the BOTScan API
BOTScan indexes every log and serves them through its public API, with no API key. For a verified contract the logs come back decoded:explorer-logs.ts
getLogs endpoint, and Use the BOTScan API for a full walkthrough.
The explorer is a third-party index with no published rate limits. Cache responses on your server rather than calling it from every browser.
Run your own node
A node you run has no public endpoint limits, soeth_getLogs works over any range you allow. BOT Chain’s node documentation links to a deployment repository that returned 404 when we checked on 2026-10-01. See Known limitations and ask BOT Chain for current node instructions.
For indexing at scale, see Index chain data.
Troubleshooting
getLogs works locally but fails in production
getLogs works locally but fails in production
That’s expected from a method documented as disabled. Keep ranges small, retry on errors, and fall back to the BOTScan API.
The BOTScan logs have decoded: null
The BOTScan logs have decoded: null
The contract isn’t verified, so BOTScan can’t decode the logs. Verify it, or decode
topics and data yourself with viem’s decodeEventLog. See Verify contracts.The list doesn't update after a transaction
The list doesn't update after a transaction
The read is cached. Lower
refetchInterval, or call refetch after the receipt arrives.Next steps
Use the BOTScan API
Query transactions, logs and balances.
Index chain data
Build your own index.