Data access · 11 min read

MegaETH onchain data: what one second of the chain contains

MegaETH produces an EVM block every second, which is 86,400 blocks a day. This guide reads one hour of them, block by block, and reports what is inside: a clock with zero jitter, 96,403 transactions of which three services account for 78%, and a price feed that publishes 110 updates every second and carries microsecond timestamps the block header does not have.

Everything here comes from portal.sqd.dev/datasets/megaeth-mainnet, a public dataset. The queries behind the headline numbers are printed along the way, and the last section is a Pipes SDK script that reproduces the feed census, the lag percentiles, and the per-symbol counts end to end.

Updated 2026-08-28 · By the SQD team

1. The clock is exactly one second wide

Start with the block headers, because they set the terms for everything else.

your terminal
curl -s https://portal.sqd.dev/datasets/megaeth-mainnet/stream \
-H 'content-type: application/json' \
-d '{
"type": "evm",
"fromBlock": 23400000,
"toBlock": 23400004,
"includeAllBlocks": true,
"fields": { "block": { "number": true, "timestamp": true } }
}'

Five lines back, one per block:

{"header":{"number":23400000,"timestamp":1786197011}}
{"header":{"number":23400001,"timestamp":1786197012}}
{"header":{"number":23400002,"timestamp":1786197013}}
{"header":{"number":23400003,"timestamp":1786197014}}
{"header":{"number":23400004,"timestamp":1786197015}}

One second per block. That holds for the whole window, and it holds more strictly than "about a second". Sweeping all 3,600 headers with includeAllBlocks and collecting the set of timestamp - number values returns a set with exactly one element:

blocks: 3600 distinct (timestamp - number) values: {1762797011}

So on MegaETH the block timestamp is the block number plus a constant. There is no jitter to observe, no slow blocks, no gaps. This is not an artifact of how SQD stores the data: the chain's own RPC at mainnet.megaeth.com/rpc returns 1786202259 for block 23,405,248 and 1786202260 for 23,405,249, the same constant, and reports chain ID 0x10e6 (4326).

It is also the documented design rather than a quirk. MegaETH runs two block types: mini-blocks every ~10ms with microsecond-resolution timestamps, and EVM blocks every ~1s with the standard one-second resolution, which is what indexers and wallets see.

Two consequences follow for anyone querying this chain. First, a time-bucketed query is a block-number query with extra steps, and you can convert either way in your head. Second, and this is the part that bites later, the block header cannot tell you anything about ordering or latency inside a second. If you want sub-second detail on an EVM block stream, it has to come from the event payloads.

One more header fact, since it frames the transaction section: the block gas limit is 10,000,000,000, on both Portal and the chain's own RPC. Mean gas used per block over the hour was 8,930,064 and the heaviest block used 29,633,254, so the average block used 0.0893% of the limit.

2. What 96,403 transactions actually are

A transactions request with no filter returns every transaction in the window, one NDJSON line per block:

your terminal
curl -s https://portal.sqd.dev/datasets/megaeth-mainnet/stream \
-H 'content-type: application/json' \
-d '{
"type": "evm",
"fromBlock": 23400000,
"toBlock": 23403599,
"transactions": [{}],
"fields": { "transaction": { "from": true, "to": true, "type": true, "status": true } }
}'

Tallying what comes back: 96,403 transactions across the 3,600 blocks, 26.78 per block. 163 reverted, which is 0.17%. Grouping by sender and recipient shows the shape: the hour has 1,261 distinct senders but only 98 distinct recipient addresses.

Three flows dominate, and each runs at a rate that does not vary by a single transaction from block to block.

ToSendersPer blockHour total
  • 0x6342…0001 (Oracle system contract)11036,000
  • 0x897a33a0… (price feed)51036,000
  • 0x4200…0015 (type 0x7e deposit)113,600
  • Everything else1,254varies20,803
Fixed-rate flows, blocks 23,400,000 to 23,403,599. Counts are exact, not rounded.

Those three account for 75,600 transactions, or 78.4% of the hour. The first is MegaETH's Oracle system contract at 0x6342…0001, a key-value store for offchain data, fed by a single sender at 10 transactions per block with selector 0x01caec13. It emits no logs at all, so it is invisible to anything that only watches events. The third is a type 0x7e deposit transaction, one per block, from the depositor account 0xdead…0001 to the L1 attributes predeploy at 0x4200…0015, the update that rollups post at the head of every block. The second is the subject of the next section.

The practical point: a transactions-per-second chart of MegaETH is mostly a chart of a constant. Strip the three fixed flows and the remaining traffic is 20,803 transactions from 1,254 senders in the hour, 5.78 per second. No sender appears in more than one group, so the rows reconcile with the totals: 1 + 5 + 1 + 1,254 senders is the 1,261, and 36,000 + 36,000 + 3,600 + 20,803 transactions is the 96,403. Both rates are true; they answer different questions, and a dashboard that does not separate them is not measuring usage.

Transaction types split 56,145 EIP-1559, 36,658 legacy, and 3,600 deposits. The legacy count is almost exactly the Oracle system-contract flow, which sends type 0.

3. A price feed emits 85% of all logs

129 contracts emitted a log during the hour, 463,893 logs between them. One address accounts for 395,984 of those, 85.4% of the total: 0x897a…6acd. It receives 10 transactions per block from five separate senders, two each, and emits 110 logs per block. Every one carries the same topic0 and no indexed parameters, so all the content is in the data field. Ask for one block and the response is a single NDJSON line: the block header plus a logs array holding all 110 matching logs.

your terminal
curl -s https://portal.sqd.dev/datasets/megaeth-mainnet/stream \
-H 'content-type: application/json' \
-d '{
"type": "evm",
"fromBlock": 23400000,
"toBlock": 23400000,
"logs": [{
"address": ["0x897a33a0af45b3ba097bd6045187d622252e6acd"],
"topic0": ["0xffcbf7f11b241556bfaa9228d6d51124009fd1f67009431663b49b6c87da0dd3"]
}],
"fields": {
"block": { "number": true, "timestamp": true },
"log": { "data": true, "topics": true, "transactionHash": true }
}
}'
{
"header": { "number": 23400000, "timestamp": 1786197011 },
"logs": [
{
"transactionHash": "0xbe6ddb17f6af41eaea5e0dc83031d2bae4980357d7165b8b5de19920a99d40db",
"data": "0x0000000000000000000000000000000000000000000000000000002ca850755645544800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006588966480bc2000000000000000000000000000000000000000000000000000658896647a8800000000000000000000000000000000000000000000000000000000000000004",
"topics": ["0xffcbf7f11b241556bfaa9228d6d51124009fd1f67009431663b49b6c87da0dd3"]
},

That is the response with line breaks added, cut after the first log; the remaining 109 objects have the same shape and every value shown is untouched. Five 32-byte words in the data field. The contract is not verified on the explorer and no plausible event signature keccaks to that topic0, so the field names below are read off the payload rather than taken from an ABI:

w0 0x2ca8507556 191802406230 price, scaled by 1e8 -> 1918.0240623
w1 0x4554480000...0000 "ETH" symbol as ASCII in a bytes32
w2 0x6588966480bc2 1786197010025410 publish time, microseconds
w3 0x658896647a880 1786197010000000 observation time, microseconds
w4 0x04 4 constant across the window
w2 - w3 = 25,410us = 25.4ms

The 1e8 scale is not an assumption. Decode every symbol in one block and the two dollar stablecoins land where they must, which is what fixes the divisor:

SymbolPrice at 13:50:11 UTCLow over the hourHigh over the hour
  • BTC64,966.72311264,964.94430565,140.780125
  • ETH1,918.0240621,918.0240621,924.945928
  • BNB596.929789596.917842611.115320
  • SOL75.42942875.42716476.083656
  • HYPE54.44349854.31760854.592125
  • XRP1.0410001.0403811.044355
  • USDC0.9998300.9997200.999860
  • USDT0.9993300.9992200.999330
  • ADA0.1993660.1991640.200560
  • DOGE0.0705630.0704250.071365
  • MEGA0.0354960.0353730.035505
All 11 symbols at block 23,400,000, word 0 divided by 1e8. USDC and USDT are the check on the scale.

Over the full hour that is 395,984 logs: 11 symbols at 10 updates per block for 3,600 blocks, which would be 396,000. The 16 that are missing are section 5.

4. Measuring publish lag on a one-second clock

Words 2 and 3 are both microsecond timestamps, and they are not equal. Word 3 always sits on a clean 100ms grid (…523000000, …523100000, …523200000) while word 2 is tens of milliseconds later and irregular. Read as a publish time and an observation time, their difference is how stale a price is by the time it is on the chain.

Across all 395,984 logs in the hour:

PercentileMicrosecondsMilliseconds
  • Minimum17,60217.6
  • p5024,49824.5
  • p9032,15732.2
  • p9942,10942.1
  • Maximum126,808126.8
Word 2 minus word 3, all 395,984 feed logs in the window.

A median of 24.5 milliseconds, with a tail to 127. The block header this data arrives in has one-second resolution and cannot express any of that. Ten distinct observations, each with its own sub-second timing, share a single block.timestamp. Anything that buckets this feed by block timestamp throws away the entire measurement and reports a flat 1-second cadence.

It also means the feed's real resolution is 100ms rather than the one second the block clock suggests. If you are pricing anything against it, that is the number that matters, and it is only in the payload.

5. The 1.7 seconds MEGA went missing

Ten of the eleven symbols publish exactly 36,000 times in the hour. MEGA publishes 35,984. Counting per symbol per block locates the shortfall in two adjacent blocks:

block 23401512 logs=110 {ADA:10 BNB:10 BTC:10 DOGE:10 ETH:10 HYPE:10 MEGA:10 SOL:10 USDC:10 USDT:10 XRP:10}
block 23401513 logs=103 {ADA:10 BNB:10 BTC:10 DOGE:10 ETH:10 HYPE:10 MEGA:3 SOL:10 USDC:10 USDT:10 XRP:10}
block 23401514 logs=101 {ADA:10 BNB:10 BTC:10 DOGE:10 ETH:10 HYPE:10 MEGA:1 SOL:10 USDC:10 USDT:10 XRP:10}
block 23401515 logs=110 {ADA:10 BNB:10 BTC:10 DOGE:10 ETH:10 HYPE:10 MEGA:10 SOL:10 USDC:10 USDT:10 XRP:10}
MEGA observation timestamps around the gap (microseconds)
...523000000 ...523100000 ...523200000 <- last three, block 23401513
...524900000 <- next one, block 23401514

The MEGA observation grid stops after …523200000 and resumes at …524900000. That is a 1.7-second hole, which on a 100ms grid is 16 missed ticks, and 396,000 minus 16 is 395,984. The arithmetic closes exactly.

MEGA missed 16 ticks; the other ten symbols missed none

One mark per feed observation on the shared 100 ms slot grid, blocks 23,401,512 to 23,401,515 (4 seconds)

23,401,512 23,401,513 23,401,514 23,401,515 block BTC ETH BNB SOL HYPE XRP USDC USDT ADA DOGE MEGA 16 missed ticks · 1.7 s …523200000 to …524900000, microsecond observation times
Blocks 23,401,512-23,401,515 Source: SQD Portal · megaeth-mainnet · 2026-08-28

Every other symbol published normally through both blocks, so this is one publisher stalling on one symbol, not a chain-level event, and no block was slow: the header cadence is still one per second through the gap. The last quoted MEGA price before the stall and the first one after it are both 0.035484, so nothing moved while the feed was out.

The reason this is worth writing down is that it is invisible at every level of aggregation above the individual log. It does not show up in transaction counts, because all ten feed transactions landed in both blocks. It does not show up in the price series, because the price was unchanged. It shows up only if you count events per symbol per block across the whole window, which means reading all 395,984 of them.

6. Reproduce every number

This script runs the whole feed census: one stream over the pinned range, positional decode, per-symbol counts and the lag percentiles. It needs @subsquid/pipes and nothing else.

oracle.mjs
import { evmPortalStream, evmQuery } from '@subsquid/pipes/evm'
const FEED = '0x897a33a0af45b3ba097bd6045187d622252e6acd'
const TOPIC = '0xffcbf7f11b241556bfaa9228d6d51124009fd1f67009431663b49b6c87da0dd3'
const word = (data, i) => data.slice(2 + i * 64, 2 + (i + 1) * 64)
const num = (data, i) => BigInt('0x' + word(data, i))
const symbol = (data, i) =>
Buffer.from(word(data, i), 'hex').toString('ascii').replace(/\0+$/, '')
const stream = evmPortalStream({
id: 'megaeth-oracle-census',
portal: 'https://portal.sqd.dev/datasets/megaeth-mainnet',
outputs: evmQuery()
.addFields({
block: { number: true, timestamp: true },
log: { address: true, topics: true, data: true, transactionHash: true },
})
.addLogRequest({
range: { from: 23_400_000, to: 23_403_599 },
request: { address: [FEED], topic0: [TOPIC] },
})
.build(),
})
const perSymbol = new Map()
const lags = []
let blocks = 0
let logs = 0
for await (const { data } of stream) {
for (const block of data) {
blocks++
for (const log of block.logs ?? []) {
logs++
const sym = symbol(log.data, 1)
const price = Number(num(log.data, 0)) / 1e8
lags.push(Number(num(log.data, 2) - num(log.data, 3)))
const s = perSymbol.get(sym) ?? { n: 0, last: 0 }
s.n++
s.last = price
perSymbol.set(sym, s)
}
}
}
lags.sort((a, b) => a - b)
const p = (q) => lags[Math.floor(lags.length * q)] / 1000
console.log(`feed logs : ${logs.toLocaleString()}`)
console.log(`logs per block : ${(logs / blocks).toFixed(2)}`)
console.log(`publish lag ms : p50 ${p(0.5).toFixed(1)} p90 ${p(0.9).toFixed(1)} p99 ${p(0.99).toFixed(1)}`)
for (const [sym, s] of [...perSymbol].sort((a, b) => b[1].n - a[1].n)) {
console.log(`${sym.padEnd(6)} ${String(s.n).padStart(7)} updates last ${s.last}`)
}

The script's own output, on @subsquid/pipes 1.0.0-beta.1. Pipes also writes progress lines to the log as it streams; those are left out here.

feed logs : 395,984
logs per block : 110.00
publish lag ms : p50 24.5 p90 32.2 p99 42.1
ETH 36000 updates last 1922.9481889
HYPE 36000 updates last 54.5773964
DOGE 36000 updates last 0.0713603
USDC 36000 updates last 0.99981953
ADA 36000 updates last 0.19964615
XRP 36000 updates last 1.04435476
SOL 36000 updates last 76.0114261
USDT 36000 updates last 0.99922
BNB 36000 updates last 609.9488685
BTC 36000 updates last 65105.1683278
MEGA 35984 updates last 0.03541236

Same 395,984, same 110.00 per block, same percentiles, same per-symbol counts including the short MEGA row, all matching the raw curl path from the earlier sections. Two independent code paths over the same window agreeing to the log is the check that the decode is right.

7. Why this is awkward over RPC

Nothing above needs contract state, an archive node, or a paid debug endpoint. It needs one thing: every log and every transaction in a range, cheaply enough that scanning an hour is not a project. That is the part a JSON-RPC endpoint makes hard, and the block rate is why.

At one block per second, MegaETH produces 86,400 blocks a day and 31.5 million a year. The transaction census in section 2 needs full transaction bodies, which over RPC is eth_getBlockByNumber once per block: 3,600 round trips for the hour, 86,400 for a day. Against Portal you state a fromBlock and a toBlock and read NDJSON back. Both censuses here came back in one response each, though that is a property of this hour rather than a guarantee: a response covers as much of the range as fits, and past that you resume from the last block it returned. The loop is a few lines and it is driven by payload size, not by a provider's cap on how wide a window you are allowed to ask for.

The MEGA gap is the clearest illustration. Finding it required a per-symbol, per-block count over the full hour. If each attempt at that question costs thousands of requests, you do not ask it, and a 1.7-second outage in a price feed stays unnoticed. If it costs one request, you ask it while you are still exploring.

MegaETH is one of the networks Portal serves with the same request shape, so the queries here change by one word to run against another chain. The MegaETH chain page has the dataset details.

Frequently asked questions

What is MegaETH's block time?
MegaETH produces two kinds of block. Mini-blocks arrive roughly every 10 milliseconds and carry microsecond timestamps; EVM blocks, the ones standard Ethereum tooling and indexers see, arrive every second. Measured across blocks 23,400,000 to 23,403,599 the EVM cadence is exactly one second with no drift at all: every block in the window satisfies timestamp = block number + 1,762,797,011, and the chain's own RPC returns the same constant.
How many transactions per second does MegaETH do?
In the hour measured here, 96,403 transactions across 3,600 blocks, which is 26.78 per second. That figure needs a caveat: 75,600 of those transactions (78.4%) come from three services running at a fixed rate of exactly 10, 10, and 1 transaction per block regardless of demand. Everything else on the chain, from 1,255 remaining senders, is 20,803 transactions in the hour, or 5.78 per second.
Does MegaETH have an onchain price oracle?
Yes. MegaETH documents an Oracle system contract at 0x6342000000000000000000000000000000000001 that stores offchain data as key-value pairs, and it receives 10 transactions per block from a single sender. Separately, the contract at 0x897a33a0af45b3ba097bd6045187d622252e6acd emits the actual price events: 110 logs per block, covering 11 symbols (BTC, ETH, SOL, BNB, XRP, ADA, DOGE, HYPE, MEGA, USDC, USDT) at 10 updates per symbol per second.
How do I index MegaETH?
SQD Portal serves megaeth-mainnet as a public dataset, from block 6,920,000 to the head, with real-time streaming. A POST to portal.sqd.dev/datasets/megaeth-mainnet/stream states a block range and returns matching logs or transactions as NDJSON; a response covers as much of the range as fits and you resume from the last block it returned. On a chain producing 86,400 blocks a day, that replaces per-block RPC calls with a handful of range requests. The Pipes SDK wraps the same endpoint with typed queries and handles the continuation.
How much gas does MegaETH actually use?
MegaETH sets a block gas limit of 10,000,000,000, confirmed on both SQD Portal and the chain's own RPC. Across the hour measured here the mean gas used per block was 8,930,064 and the busiest block used 29,633,254, so the average block used 0.0893% of the limit.

Querying a fast chain?

Portal serves megaeth-mainnet as a public dataset. Point a query at it and see what comes back.