> ## 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.

# Substrate ecosystem

> Standardized blocks, extrinsics and events for every Substrate chain.

Substrate is the framework Polkadot and the chains connected to it are built with. These chains call a transaction an extrinsic, and running one produces events: the chain's notes on what happened. That gives every chain here the same three tables, `blocks`, `extrinsics` and `events`, in one dataset per chain.

The [Tables](#tables) section below says what each table holds and lists the columns once for the whole family.

## Chains

<table>
  <thead>
    <tr>
      <th width="200">Chain</th>
      <th width="160"><code>chain\_id</code></th>
      <th width="90">blocks</th>
      <th width="90">events</th>
      <th width="110">extrinsics</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>Astar</td>
      <td><code>astar</code></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
    </tr>

    <tr>
      <td>Chainflip</td>
      <td><code>chainflip</code></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
    </tr>

    <tr>
      <td>Energy Web</td>
      <td><code>energyweb</code></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
    </tr>

    <tr>
      <td>Hydration</td>
      <td><code>hydradx</code></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
    </tr>

    <tr>
      <td>Kusama</td>
      <td><code>kusama</code></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
    </tr>

    <tr>
      <td>Litentry</td>
      <td><code>litentry</code></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
    </tr>

    <tr>
      <td>peaq</td>
      <td><code>peaq</code></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
    </tr>

    <tr>
      <td>Polkadot</td>
      <td><code>polkadot</code></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
    </tr>

    <tr>
      <td>Polkadot Asset Hub</td>
      <td><code>polkadotassethub</code></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
    </tr>

    <tr>
      <td>Polkadot Bridge Hub</td>
      <td><code>polkadotbridgehub</code></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
    </tr>

    <tr>
      <td>Polkadot Collectives</td>
      <td><code>polkadotcollectives</code></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
    </tr>

    <tr>
      <td>Polkadot Coretime</td>
      <td><code>polkadotcoretime</code></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
    </tr>

    <tr>
      <td>Polkadot People</td>
      <td><code>polkadotpeople</code></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
      <td><span class="tt-check">✓</span></td>
    </tr>
  </tbody>
</table>

## Tables

Substrate is the framework Polkadot and its parachains are built with, and every chain built that way carries the same three core tables with the same columns. The schemas below are read from `polkadot`, and apply to every chain listed on the [Substrate overview](/docs/catalog/chain-verticals/substrate/index).

Three words to know before the tables. An **extrinsic** is what these chains call a transaction: something submitted from outside the chain for it to act on. A **pallet** is one module of the chain's own code, such as balances, staking or governance, and an extrinsic names the pallet and the method it wants. An **event** is a note the chain writes about what happened while running one.

`extrinsics` and `events` are split by day on `block_timestamp`, and `blocks` on `timestamp`. Filter on that column in every query: with a filter the query reads only the days you asked for, without one it reads the whole table.

<Tabs>
  <Tab title="blocks">
    A block is a batch of extrinsics added to the chain. `blocks` contains one row per block.

    <table>
      <thead>
        <tr>
          <th width="280">Column</th>
          <th width="130">Type</th>
          <th>Description</th>
        </tr>
      </thead>

      <tbody>
        <tr>
          <td><code>relay\_chain</code></td>
          <td><code>STRING</code></td>
          <td>The main chain this one connects to, Polkadot or Kusama.</td>
        </tr>

        <tr>
          <td><code>chain</code></td>
          <td><code>STRING</code></td>
          <td>The chain name.</td>
        </tr>

        <tr>
          <td><code>timestamp</code></td>
          <td><code>TIMESTAMP</code></td>
          <td>The time the block was produced. Partition column.</td>
        </tr>

        <tr>
          <td><code>number</code></td>
          <td><code>INT64</code></td>
          <td>The block number.</td>
        </tr>

        <tr>
          <td><code>block\_hash</code></td>
          <td><code>STRING</code></td>
          <td>The hash of the block.</td>
        </tr>

        <tr>
          <td><code>parent\_hash</code></td>
          <td><code>STRING</code></td>
          <td>The hash of the parent block.</td>
        </tr>

        <tr>
          <td><code>state\_root</code></td>
          <td><code>STRING</code></td>
          <td>The root hash of the state trie.</td>
        </tr>

        <tr>
          <td><code>extrinsics\_root</code></td>
          <td><code>STRING</code></td>
          <td>The root hash of the extrinsics trie.</td>
        </tr>

        <tr>
          <td><code>author\_id</code></td>
          <td><code>STRING</code></td>
          <td>The account that authored the block.</td>
        </tr>

        <tr>
          <td><code>finalized</code></td>
          <td><code>BOOL</code></td>
          <td>Whether the block is finalized.</td>
        </tr>

        <tr>
          <td><code>block\_date</code></td>
          <td><code>TIMESTAMP</code></td>
          <td>The block timestamp truncated to the day.</td>
        </tr>

        <tr>
          <td><code>extrinsics\_count</code></td>
          <td><code>INT64</code></td>
          <td>The number of extrinsics in the block.</td>
        </tr>
      </tbody>
    </table>

    <Tabs>
      <Tab title="Daily blocks and extrinsics">
        **Count blocks and total extrinsics per day over one week.**

        ```sql theme={null}
        select
            timestamp_trunc(timestamp, day) as day,
            count(*) as blocks,
            sum(extrinsics_count) as extrinsics
        from `polkadot.blocks`
        where timestamp >= timestamp('2026-08-16')
          and timestamp < timestamp('2026-08-23')
        group by day
        order by day
        ```
      </Tab>
    </Tabs>
  </Tab>

  <Tab title="extrinsics">
    `extrinsics` contains one row per extrinsic. Group by `pallet` and `method` to see what the chain was asked to do; some extrinsics carry no signature and no fee, because the chain itself submitted them.

    <table>
      <thead>
        <tr>
          <th width="280">Column</th>
          <th width="130">Type</th>
          <th>Description</th>
        </tr>
      </thead>

      <tbody>
        <tr>
          <td><code>relay\_chain</code></td>
          <td><code>STRING</code></td>
          <td>The main chain this one connects to, Polkadot or Kusama.</td>
        </tr>

        <tr>
          <td><code>chain</code></td>
          <td><code>STRING</code></td>
          <td>The chain name.</td>
        </tr>

        <tr>
          <td><code>block\_number</code></td>
          <td><code>INT64</code></td>
          <td>The number of the containing block.</td>
        </tr>

        <tr>
          <td><code>block\_timestamp</code></td>
          <td><code>TIMESTAMP</code></td>
          <td>The time of the containing block. Partition column.</td>
        </tr>

        <tr>
          <td><code>block\_hash</code></td>
          <td><code>STRING</code></td>
          <td>The hash of the containing block.</td>
        </tr>

        <tr>
          <td><code>pallet</code></td>
          <td><code>STRING</code></td>
          <td>The part of the chain's code the call goes to, such as balances or staking.</td>
        </tr>

        <tr>
          <td><code>method</code></td>
          <td><code>STRING</code></td>
          <td>The method called in that pallet.</td>
        </tr>

        <tr>
          <td><code>signature</code></td>
          <td><code>STRING</code></td>
          <td>Who signed the extrinsic and their proof. Empty when the chain submitted it itself.</td>
        </tr>

        <tr>
          <td><code>id</code></td>
          <td><code>STRING</code></td>
          <td>The identifier of the extrinsic.</td>
        </tr>

        <tr>
          <td><code>nonce</code></td>
          <td><code>INT64</code></td>
          <td>The sender's nonce.</td>
        </tr>

        <tr>
          <td><code>args</code></td>
          <td><code>JSON</code></td>
          <td>The call arguments.</td>
        </tr>

        <tr>
          <td><code>tip</code></td>
          <td><code>BIGNUMERIC</code></td>
          <td>The tip paid to the block author.</td>
        </tr>

        <tr>
          <td><code>extrinsic\_hash</code></td>
          <td><code>STRING</code></td>
          <td>The hash of the extrinsic.</td>
        </tr>

        <tr>
          <td><code>extrinsic\_id</code></td>
          <td><code>STRING</code></td>
          <td>The block-number-and-index identifier of the extrinsic.</td>
        </tr>

        <tr>
          <td><code>info</code></td>
          <td><code>JSON</code></td>
          <td>What running it cost, including its weight and fee class.</td>
        </tr>

        <tr>
          <td><code>immortal\_era</code></td>
          <td><code>NUMERIC</code></td>
          <td>The mortality setting of the extrinsic.</td>
        </tr>

        <tr>
          <td><code>success</code></td>
          <td><code>BOOL</code></td>
          <td>Whether the extrinsic succeeded.</td>
        </tr>

        <tr>
          <td><code>pays\_fee</code></td>
          <td><code>BOOL</code></td>
          <td>Whether the extrinsic pays a fee.</td>
        </tr>
      </tbody>
    </table>

    <Tabs>
      <Tab title="Pallet calls">
        **Rank pallet calls by executed extrinsics over one week.**

        ```sql theme={null}
        select
            pallet,
            method,
            count(*) as extrinsics
        from `polkadot.extrinsics`
        where block_timestamp >= timestamp('2026-08-16')
          and block_timestamp < timestamp('2026-08-23')
        group by pallet, method
        order by extrinsics desc
        limit 20
        ```
      </Tab>
    </Tabs>
  </Tab>

  <Tab title="events">
    `events` contains one row per event, each linked back to the extrinsic that produced it. Watch the column names here: `pallet` and `method` describe that extrinsic, while `event_pallet` and `event_method` describe the event itself.

    <table>
      <thead>
        <tr>
          <th width="280">Column</th>
          <th width="130">Type</th>
          <th>Description</th>
        </tr>
      </thead>

      <tbody>
        <tr>
          <td><code>relay\_chain</code></td>
          <td><code>STRING</code></td>
          <td>The main chain this one connects to, Polkadot or Kusama.</td>
        </tr>

        <tr>
          <td><code>chain</code></td>
          <td><code>STRING</code></td>
          <td>The chain name.</td>
        </tr>

        <tr>
          <td><code>block\_number</code></td>
          <td><code>INT64</code></td>
          <td>The number of the containing block.</td>
        </tr>

        <tr>
          <td><code>block\_timestamp</code></td>
          <td><code>TIMESTAMP</code></td>
          <td>The time of the containing block. Partition column.</td>
        </tr>

        <tr>
          <td><code>block\_hash</code></td>
          <td><code>STRING</code></td>
          <td>The hash of the containing block.</td>
        </tr>

        <tr>
          <td><code>pallet</code></td>
          <td><code>STRING</code></td>
          <td>The pallet of the extrinsic that produced the event, not of the event itself.</td>
        </tr>

        <tr>
          <td><code>method</code></td>
          <td><code>STRING</code></td>
          <td>The method of that extrinsic.</td>
        </tr>

        <tr>
          <td><code>id</code></td>
          <td><code>STRING</code></td>
          <td>The identifier of the event.</td>
        </tr>

        <tr>
          <td><code>extrinsic\_hash</code></td>
          <td><code>STRING</code></td>
          <td>The hash of the producing extrinsic.</td>
        </tr>

        <tr>
          <td><code>extrinsic\_id</code></td>
          <td><code>STRING</code></td>
          <td>The identifier of the producing extrinsic.</td>
        </tr>

        <tr>
          <td><code>success</code></td>
          <td><code>BOOL</code></td>
          <td>Whether the producing extrinsic succeeded.</td>
        </tr>

        <tr>
          <td><code>event\_method</code></td>
          <td><code>STRING</code></td>
          <td>The method of the event itself.</td>
        </tr>

        <tr>
          <td><code>event\_pallet</code></td>
          <td><code>STRING</code></td>
          <td>The pallet that emitted the event.</td>
        </tr>

        <tr>
          <td><code>event\_data</code></td>
          <td><code>ARRAY\<JSON></code></td>
          <td>The event payload fields.</td>
        </tr>

        <tr>
          <td><code>event\_index</code></td>
          <td><code>INT64</code></td>
          <td>The position of the event within the block.</td>
        </tr>

        <tr>
          <td><code>event\_type</code></td>
          <td><code>STRING</code></td>
          <td>The type label of the event.</td>
        </tr>
      </tbody>
    </table>

    <Tabs>
      <Tab title="Event-emitting pallets">
        **Rank event-emitting pallets and methods over one week.**

        ```sql theme={null}
        select
            event_pallet,
            event_method,
            count(*) as events
        from `polkadot.events`
        where block_timestamp >= timestamp('2026-08-16')
          and block_timestamp < timestamp('2026-08-23')
        group by event_pallet, event_method
        order by events desc
        limit 20
        ```
      </Tab>
    </Tabs>
  </Tab>
</Tabs>

## Exceptions

One chain carries more than the three core tables. Polkadot adds `chain_ids`, a small lookup table, and `initialize_finalize_events`, which holds the events the chain writes at the start and end of a block rather than while running an extrinsic. Every other chain has exactly the three core tables.
