> ## Documentation Index
> Fetch the complete documentation index at: https://tokenterminal.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> To query the Token Terminal data catalog, read https://tokenterminal.com/docs/catalog/agents-manual.md first. It is the whole catalog as one page: table naming grammar, key columns, partition and cluster rules, units, additivity, and the tables that are documented but not served yet.
> Never query a catalog table on a time bound alone. Also filter its cluster key, which you read from INFORMATION_SCHEMA.COLUMNS; an empty result means the object is a view, whose pruning contract is on its page. Compute is billed to the caller's own Google Cloud project.

# Raw

> The standardized Ethereum blocks, transactions, logs and internal calls.

The `ethereum` dataset holds the standardized Ethereum tables. The four core tables follow the shared EVM layout, and Ethereum adds tables of its own.

`beacon_validators` covers the consensus side of the chain. Ethereum runs two chains in step: the execution chain that holds transactions, and the beacon chain that agrees on them. One row is one validator at one slot, with its balance and status at that moment.

`uncle_blocks` holds a closed chapter. Before the 2022 switch away from mining, a block produced slightly too late became an uncle, referenced by a later canonical block and rewarded in part. The table stops at 2022-09-15 because Ethereum stopped producing them.

`block_rewards` records what mining paid. Each proof-of-work block paid its miner a fixed subsidy plus a bonus for every uncle it referenced, and paid each uncle's miner a share that shrank with the uncle's age. Those payments never appear as calls. Balances built from `traces` alone leave them out.

Every column is documented at [EVM ▸ Overview](https://tokenterminal.com/docs/catalog/chain-verticals/evm/index.md).

## Tables

<table>
  <thead>
    <tr>
      <th width="180">Table</th>
      <th width="110">Since</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`blocks`</td>
      <td>2015-07</td>
      <td>One row per block, with its gas and fee totals.</td>
    </tr>

    <tr>
      <td>`transactions`</td>
      <td>2015-08</td>
      <td>One row per transaction, with its receipt fields on the same row.</td>
    </tr>

    <tr>
      <td>`logs`</td>
      <td>2015-08</td>
      <td>One row per event log a contract emitted.</td>
    </tr>

    <tr>
      <td>`traces`</td>
      <td>2015-08</td>
      <td>One row per internal call recorded during execution.</td>
    </tr>

    <tr>
      <td>`beacon_validators`</td>
      <td>2020-12</td>
      <td>Beacon chain validator balances and statuses, snapshotted per slot.</td>
    </tr>

    <tr>
      <td>`uncle_blocks`</td>
      <td>2015-07 to 2022-09</td>
      <td>Headers of the uncle blocks that canonical blocks reference.</td>
    </tr>

    <tr>
      <td>`block_rewards`</td>
      <td>**In progress**</td>
      <td>One row per mining reward paid to a block or uncle miner, in wei.</td>
    </tr>
  </tbody>
</table>

## Sample queries

> [!WARNING]
>
> The partition column differs by table: `transactions`, `logs` and `traces` split on `block_timestamp`, `blocks` splits on `timestamp`. Bound the right column in every query and keep it bare on the left of the comparison; wrapping it in a function reads every partition.
>
> `blocks` also has a 1970-01-01 partition holding rows whose source timestamp is zero; bound the column and it never appears.

**Daily transactions**

**Count daily transactions and the accounts that sent them.**

```sql theme={null}
select
    timestamp_trunc(block_timestamp, day) as day,
    count(*) as transactions,
    count(distinct from_address) as senders
from `ethereum.transactions`
where block_timestamp >= timestamp('2026-08-16')
  and block_timestamp < timestamp('2026-08-23')
group by day
order by day
```

**Daily ETH burn**

**Work out how much ETH the network burned each day.** Ethereum destroys the base fee of every block rather than paying it to the block producer, so the burn is the base fee per gas unit multiplied by the gas the block used. `blocks` splits on `timestamp`, not `block_timestamp`.

```sql theme={null}
select
    timestamp_trunc(timestamp, day) as day,
    count(*) as blocks,
    sum(gas_used) as gas_used,
    sum(cast(base_fee_per_gas as bignumeric) * gas_used) / 1e18 as eth_burned
from `ethereum.blocks`
where timestamp >= timestamp('2026-08-16')
  and timestamp < timestamp('2026-08-23')
group by day
order by day
```

**One contract's logs**

**Count the logs one contract emitted on a single day.** A log is the record a contract writes when something happens inside it, and `address` is the contract that wrote it.

```sql theme={null}
select
    count(*) as usdt_logs,
    count(distinct transaction_hash) as transactions
from `ethereum.logs`
where block_timestamp >= timestamp('2026-08-20')
  and block_timestamp < timestamp('2026-08-21')
  and address = '0xdac17f958d2ee523a2206206994597c13d831ec7'
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.