FIND EVENT LOGS on one Ethereum (eth, ETH, mainnet, L1) contract by event name — e.g. every
"Transfer", or a rare custom event. `contract` matches logs that contract
EMITTED ITSELF (a proxy token is found by its public address), plus — when
it is a proxy's implementation — the logs its code emitted for that proxy.
Logs emitted by OTHER contracts it calls are NOT included: a DEX router's
swaps are logged by the pair/pool it calls, not by the router, so
contract=<router> with event=Swap returns NOTHING even when the router
executed thousands of swaps. An empty result for a router, aggregator or
smart wallet does NOT mean there was no activity. To get those logs, pass
the pair/pool (or token) address as `contract`; if it is unknown, list the
router's transactions with eth_find_calls (contract=<router>) and pass their
Tx hashes (up to 50, "|"-separated) to eth_tx_events with event=Swap — its
CallPath shows which call produced each log. Narrow matched rows to
one emitting contract with `emitter`. Match by event
name or full signature (case-insensitive). Searches the last 7 days by
default — set after_time to reach further back, or page back with cursor:
pass the Cursor value of the LAST row of a page to get the next one, and
that page covers the same number of days ending at that row. Unlike
before_time, a cursor never skips rows that share a timestamp — a busy
contract can emit hundreds of logs in one second. Then inspect a
transaction's fund movements with eth_tx_transfers. For finding the CALLS
themselves (method, selector, revert info) use eth_find_calls.
Each row carries the log's decoded Arguments (Name, Type, Value, Indexed; integers are
decimal strings in raw units, NOT divided by token decimals; addresses as 0x-hex) - at most
32 per row: ArgumentCount is the full number and ArgumentsTruncated=1 marks a cut
list (every array element counts as one). Parsed=0 rows have no Arguments. Argument NAMES
come from one known ABI for the Signature: a contract that emits the same Signature with
other parameter names gets those names too, so a Name can be wrong for this contract -
identify an argument by its position and Type, and check a doubtful one against the raw
Topics/Data. For raw
Topics/Data, or the rest of a cut list, pass the Tx to eth_tx_events. Unrecognized events can be found here by `topic0`.
ONE ROW = ONE EVENT LOG. A contract can be called many times inside a single
transaction and each of those internal calls can emit its own logs, so the same
event name legitimately repeats within one transaction - that is NOT duplication.
Rows are told apart by CallIndex (which internal call emitted the log) together
with LogInCall (the log's position inside that call); that pair is unique within
a transaction. To COUNT events, count the returned rows - never de-duplicate on
Tx/Event/Emitter, which would merge genuinely different logs into one.
Rows inside one transaction come back in no particular order - sort them by
CallIndex then LogInCall if you need emission order.
SCAN COST scales with the window, not with the limit: on a very high-traffic
contract set days=1 and page back with cursor - several times cheaper than
a 7-day window for the same page. Widen days for quiet contracts or rare matches.