Base vs Extended blocks
EVM Firehose and Substreams stream the same block type — but how much execution detail a block carries depends on how it was produced. Here's the difference, what each level contains, and when you need extended.
The short version
It's the same block type (Firehose sf.ethereum.type.v2.Block) either way — the level is not the block version. What differs is the data source:
- Extended — produced by an instrumented (Firehose-enabled) node that records the full execution of every transaction.
- Base — reconstructed by polling a standard JSON-RPC node (
eth_getBlock+ receipts). No execution tracing, so the block carries less.
A type.v2 block can therefore be either base or extended. The wire format is identical; extended blocks simply populate fields that base blocks leave empty.
What's in each
| Data | Base | Extended |
|---|---|---|
| Block header (number, hash, timestamp, miner, gas) | ||
| Transactions (from, to, value, input, nonce) | ||
| Receipts — status, gas used, effective gas price | ||
| Event logs (topics + data) (from receipts) | ||
| Call traces — internal contract-to-contract calls | ||
| Native value transfers inside calls | ||
| Balance changes | ||
| Storage changes (state diffs) | ||
| Nonce / code changes | ||
| Per-call gas changes |
Both levels carry event logs, so log-driven indexing (the bulk of subgraphs and Substreams) works on either. The split only matters once you reach for execution traces or state.
Why it matters
The level dictates what your Substreams modules can read:
- Works on base — anything driven by event logs: ERC-20
Transfer/Approval, DEXSwapevents, contract events in general. - Needs extended — internal calls, native ETH transfers that don't emit a log, proxy/factory call graphs, gas accounting per call, and any module reading
balanceorstoragechanges (state diffs).
Run a trace- or state-dependent module against a base chain and those fields come back empty — the module compiles and runs, it just sees nothing. Confirm the chain is extended before relying on them.
How to tell which a chain is
Each EVM chain's level is shown as a badge on its endpoint in Endpoints (Firehose / Substreams) — extended or base. Hover the badge for a one-line summary.
Major high-traffic chains (Ethereum, Base, Arbitrum, Optimism, Polygon, BNB) generally ship extended blocks; some chains are served base-only. The badge is the source of truth — the registry is refreshed daily, so check there rather than memorizing a list.
In raw Substreams output the block's detail_level field reports the same thing:
DETAIL_LEVEL_BASE // RPC-polled — header, txs, receipts, logs DETAIL_LEVEL_EXTENDED // instrumented node — + traces + state changes
Frequently asked
type.v2 is the block schema; base and extended are detail levels within it. A v2 block can be either — it depends on whether the source node was instrumented or RPC-polled.base, traces and state diffs aren't available there.Related
- Substreams reference — modules, packages, and the block models you read.
- Firehose reference — the streaming source these blocks come from.
- Endpoints — per-chain base/extended badges.