Find the daily income and APR of active validators on Beacon Chain.

The beacon.validator.income table provides a daily snapshot of consensus & execution layer income (MEV rewards) of active validators.

Consensus Layer Income

Effectively, validator balances on Beacon Chain can only change due to the following events:

  • rewards (attestation, block proposing)

  • penalties (attester slashing, proposer slashing)

  • deposits (from ETH1 - aka execution layer)

  • withdrawals (to ETH1, if withdrawal address is specified)


Thus, the consensus layer income from rewards and penalties accrued at the end of the day can be derived from the following calculation

consensus_income = current_balance - previous_balance - current_deposits - current_withdrawals

Where current_ refers to deposits, withdrawals made at the same day of the balance snapshot and previous_ is the last balance snapshot.

Note: Income can be negative in the event where the validator is slashed. Exiting validators are not included in the calculation.

Execution Layer Income

Execution Layer Income of the validator is dependent on whether there is proposer-builder separation (PBS).

  • PBS Blocks: These are blocks where by the builder sends a MEV payout to the Proposer Fee Recipient (block proposer), which typically happens in the last transaction of a block.

  • Non-PBS Blocks: For blocks that do not have build -> proposer MEV payout, the execution layer income will be the total builder priority fee reward from transactions + the total direct ETH transferred to block builders.


  • the proposer fee recipient (MEV Reward) on Execution Layer is same entity as the Validator that is proposing the block on Consensus Layer.

i.e. in the following example, Validator = 711548 proposed this block and would be the recipient of MEV Rewards. Note that the withdrawal address of the validator can be different from proposer fee recipient.

Sample Query

Finding daily income of active validators by ETH1 withdrawal_address specified in withdrawal credentials.

    date(slot_timestamp) as date,
    count(distinct validator_index) as validators, -- active validators 
    sum(total_income) as total_income -- daily total income 
from beacon.validator.income 
where withdrawal_address = '0x210b3cb99fa1de0a64085fa80e18c22fe4722a1b' -- Kraken Withdrawal
group by 1
order by 1 desc

Retrieve the daily income and apr of validator by validator_index.

slot_timestamp, validator_index, total_income, consensus_income, execution_income
from beacon.validator.income 
where validator_index = 10 

Table Columns

Last updated