Skip to main content
This guide shows you how to show on-chain activity in your app without relying on eth_getLogs, which BOT Chain documents as disabled on its public RPC.
Everything on this page uses testnet (chain 968). Get free test tokens from the faucet.

The situation

BOT Chain’s docs say eth_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
The count is polled every 5 seconds. When it changes, the entries query gets new arguments and refetches, so new entries appear without any event subscription. The list shows the newest 10, newest first.

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
In React, 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
  • record overwrites the oldest slot once the buffer is full.
  • lastActions(10) returns the 10 newest actions. Call it with useReadContract and poll totalActions to know when to refetch.
  • Keep emitting the event too. Indexers and the explorer still use it.
On 2026-10-02 this contract was deployed on testnet. After three 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’s ERC721Enumerable adds totalSupply, tokenByIndex and tokenOfOwnerByIndex. With them you can list an owner’s tokens from state:
list-nfts.ts
Enumerable costs more gas on every transfer. Use it when your app needs the list on-chain.

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
The response is paginated. See Explorer API for pagination and the Etherscan-style 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, so eth_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

That’s expected from a method documented as disabled. Keep ranges small, retry on errors, and fall back to the BOTScan API.
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 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.
Last modified on October 3, 2026