Ethereum Miner Balance Tracker: Block Producer Income After the Merge
Ethereum stopped mining at the Merge in September 2022. The mining codes stay in the balance schema, 1 for an uncle reward and 2 for a block reward, but the TransactionBalances cube covers the recent realtime window only, so on Ethereum they never appear and a filter on them returns nothing. What a block producer earns today shows up under other codes:
- Priority fees, reason code 5, credited to the block's fee recipient for each transaction. In practice that address is a block builder, since most blocks are built through MEV-Boost.
- Consensus-layer rewards, which reach validators through consensus-layer withdrawals. Withdrawals are not transactions, so this cube does not record them; reason code 3 exists in the schema for them but returns no rows in live data. The validator balance tracker covers what can be tracked on the execution layer.
- Builder payments to the proposer, ordinary transfers in the last transaction of a block, covered by the MEV balance tracker.
This page tracks the first of these. Every example runs in the IDE on a free account. The example builder is Titan Builder, 0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97; the query under "Who collected fees" lists the others.
Stream fee credits as they happen
Each message is one transaction's priority fee. tip is the balance after minus the balance before, in ETH. Saved stream here.
subscription {
EVM(network: eth) {
TransactionBalances(
where: { TokenBalance: { BalanceChangeReasonCode: { eq: 5 } } }
) {
Block {
Number
Time
}
TokenBalance {
Address
PreBalance
PostBalance
Currency {
Symbol
}
}
Transaction {
Hash
From
}
tip: calculate(
expression: "$TokenBalance_PostBalance - $TokenBalance_PreBalance"
)
}
}
}
Largest tips in the last ten minutes
Sort on the computed field. calculate only sees fields that are selected, so PreBalance and PostBalance stay in the query. Saved query here.
{
EVM(network: eth) {
TransactionBalances(
limit: { count: 20 }
orderBy: { descendingByField: "tip" }
where: {
TokenBalance: { BalanceChangeReasonCode: { eq: 5 } }
Block: { Time: { since_relative: { minutes_ago: 10 } } }
}
) {
Block {
Number
Time
}
TokenBalance {
Address
PreBalance
PostBalance
}
Transaction {
Hash
From
}
tip: calculate(
expression: "$TokenBalance_PostBalance - $TokenBalance_PreBalance"
)
}
}
}
One builder's income per block
Group by block for one address. The balance before the first credit and after the last credit in the block bracket the block's fee income, so end minus start is what the builder collected in that block, and count is the number of transactions that paid. Saved query here.
{
EVM(network: eth) {
TransactionBalances(
limit: { count: 20 }
orderBy: { descending: Block_Number }
where: {
TokenBalance: {
BalanceChangeReasonCode: { eq: 5 }
Address: { is: "0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97" }
}
Block: { Time: { since_relative: { minutes_ago: 30 } } }
}
) {
Block {
Number
}
count
start: TokenBalance {
PreBalance(minimum: Transaction_Index)
}
end: TokenBalance {
PostBalance(maximum: Transaction_Index)
}
}
}
}
Who collected fees in the last hour
Group the code 5 rows by receiving address to see which builders and fee recipients were active, ranked by the number of transactions that paid them. Saved query here.
{
EVM(network: eth) {
TransactionBalances(
limit: { count: 20 }
orderBy: { descendingByField: "count" }
where: {
TokenBalance: { BalanceChangeReasonCode: { eq: 5 } }
Block: { Time: { since_relative: { hours_ago: 1 } } }
}
) {
TokenBalance {
Address
}
count
}
}
}
Why the mining codes return nothing
Codes 1 and 2 belong to proof-of-work blocks. The cube has no archive dataset on Ethereum, so the pre-Merge era is out of reach and the count below is zero in any window. Saved query here.
{
EVM(network: eth) {
TransactionBalances(
where: {
TokenBalance: { BalanceChangeReasonCode: { in: [1, 2] } }
Block: { Time: { since_relative: { hours_ago: 24 } } }
}
) {
count
}
}
}
Video walkthrough
Frequently Asked Questions
Does Ethereum still have mining rewards?
No. Mining ended at the Merge in September 2022. Reason codes 1 and 2 never appear in the realtime balance data, and the cube has no archive, so the pre-Merge era cannot be queried through it.
Who receives reason code 5 on Ethereum?
The block's fee recipient, which for most blocks is a builder such as Titan Builder. Group code 5 rows by TokenBalance.Address to list the active builders and how many transactions paid each.
How do I compute a builder's income for one block?
Filter code 5 rows on the builder's address, group by block, and take PostBalance at the maximum transaction index minus PreBalance at the minimum transaction index. The difference is the block's fee income.
Where are the proposer's earnings?
Builder payments to the proposer are regular transfers at the end of a block, covered by the MEV balance tracker. Consensus-layer rewards arrive as consensus-layer withdrawals, which are not transactions, so this cube does not record them and reason code 3 returns no rows.
Related pages
Ready to run this in production?
Get an API key and run these queries in minutes, or talk to us about plans and enterprise delivery.