What is an event log?
An event log is the record an EVM contract writes when it executes the LOG0–LOG4 opcodes (emit in Solidity). Each entry contains the emitting contract's address, up to four 32-byte topics and an arbitrary-length data field. Decoding a log means matching topics[0] to an event signature, reading the indexed parameters from the remaining topics, and ABI-decoding the non-indexed parameters from data. Explorers do this with the verified source; this page does it from the signature alone, for forty-plus common events, or from any ABI you paste.
How a log is encoded
| Field | Content | Example (ERC-20 Transfer) |
|---|---|---|
| address | The contract that emitted the event | 0xdAC17F958D2ee523a2206206994597C13D831ec7 (USDT) |
| topics[0] | keccak256 of the canonical signature | 0xddf252ad… = keccak256("Transfer(address,address,uint256)") |
| topics[1] | First indexed parameter, left-padded to 32 bytes | from address |
| topics[2] | Second indexed parameter | to address |
| data | ABI encoding of all non-indexed parameters | 32-byte value |
Indexed parameters of static type (address, integers, bool, bytes1–32) are stored directly in the topic. Indexed parameters of dynamic type (string, bytes, arrays, structs) are replaced by the Keccak-256 hash of their encoding, as the Solidity ABI specification's events section describes; the decoder marks these as hashed.
Worked example: a USDT transfer
Click "ERC-20 Transfer" above. topics[0] matches the Transfer signature, and because there are exactly three topics the ERC-20 layout (two indexed addresses) is chosen over the ERC-721 layout (three indexed). topics[1] decodes to from = 0xd8dA6BF2…96045, topics[2] to to = 0x1111…1111, and the single data word 0x17d7840 is value = 25000000, which at USDT's six decimals is 25 USDT. The same mechanism decodes a Uniswap V2 Swap (two indexed addresses, four amounts in data) or an ERC-1155 TransferBatch, whose data field holds two dynamic arrays with offsets and lengths.
Events recognised without an ABI
The table below is generated on the page from the same signature list the decoder uses, so each topics[0] value is a self-test of the Keccak implementation. It covers ERC-20 and ERC-721 Transfer and Approval, ApprovalForAll, ERC-1155 TransferSingle, TransferBatch and URI, WETH Deposit and Withdrawal, Uniswap V2 Swap, Sync, Mint, Burn and PairCreated, Uniswap V3 Swap, Mint, Burn, Collect and PoolCreated, OwnershipTransferred, EIP-1967 Upgraded, AdminChanged and BeaconUpgraded, Initializable, Pausable and AccessControl events, Permit2 Approval, Permit, NonceInvalidation and Lockdown, ERC-4626 Deposit and Withdraw, and Safe ExecutionSuccess, ExecutionFailure, SafeMultiSigTransaction, owner and threshold changes, SafeSetup and ProxyCreation.
Accepted inputs
- A single log object
{"address","topics","data"}copied from an explorer, viem, ethers or web3.py. - An array of logs, the
resultofeth_getLogs, or the whole JSON-RPC response. - A transaction receipt: every entry in its
logsarray is decoded in order, with block number, log index and transaction hash shown. - Topics pasted one per line plus the data hex, for logs copied out of a trace or a debugger; labels such as "topics[1]:" are ignored.
- An optional ABI: a JSON array of fragments, an object with an
abikey (Hardhat and Foundry artifacts), or human-readableevent …lines. ABI events take priority over the built-in table.
Related: compute a topic hash from any signature with the selector and topic calculator, decode the transaction's calldata with the ABI decoder, or inspect a raw transaction with the Ethereum transaction decoder.