Overview
The upcoming V1 Rewards release for EigenLayer will enable AVSs to submit ERC20 token rewards to the protocol to be distributed to their respective operators and delegated stakers.
The overall process is as follows:
All rewards from AVSs will be sent to the singleton RewardsCoordinator
contract by the createAVSRewardsSubmission
interface, emitting events that will then be indexed off-chain.
This data is used to calculate rewards proportional to stake based on an AVSs RewardsSubmission and how much delegated stake their operators have (operators take a 10% commission cut of their delegated stakers’ earnings). The rewards distribution of all operator and staker earnings is then merkleized with it’s merkle root posted to the RewardsCoordinator
on a weekly cadence.
Merkle roots posted to the contract require a 1 week delay before the merkle root is activated and can be claimed against. Note that rewards are cumulative so if an earner (either a staker or operator) has not claimed their rewards in the past 3 weeks where 3 merkle roots have been posted to the contract, they could claim all their rewards in one tx by claiming with proofs against the latest merkle root.
Calculating Rewards & Snapshots
Calculating staker and operator rewards occur from the following 3 steps:
- Extraction - reading raw event log data from EigenLayer core contracts
- Transformation - transforming logs into daily on-chain “snapshots” of every staker, operator, and AVS in the EigenLayer ecosystem
- Calculation - calculating the rewards payout for each operator/stakers eligible reward tokens from AVSs.
Further details can be found here which include the actual queries being used but the most consequential design of this entire calculation process is the concept of snapshots.
Current implementation revolves around querying state onchain by performing daily snapshotting at 16:00 UTC. Queries to on-chain events and event calculations are all rounded down to 0:00 UTC. We handle reorgs by running the daily pipeline several hours after the 0:00 UTC, giving our reorg handler enough time to heal state.
Every rewards submission has two arrays of equivalent length: strategies
and multiplier
. The pipeline uses this value to calculate the stakeWeight of earners for snapshot rewards. For a given staker, s, on snapshot, d, the stakeWeight is given by:
stakeWeight_{s, d} = multiplier_i \cdot shares_{i,s,d}
The calculation is also done in an AVS’s StakeRegistry
contract. Reference solidity implementation. This allows AVSs to weigh certain strategies subjectively depending on how they value the stake that is delegated to the operators that are serving their AVS. For operator earnings, a 10% global commission is set where they take this portion from the sum of their delegated stake earnings.
Additional Resources
Contract Docs: https://github.com/Layr-Labs/eigenlayer-contracts/blob/v0.3.0-holesky-rewards/docs/core/RewardsCoordinator.md
Rewards Calculations: https://hackmd.io/u-NHKEvtQ7m7CVDb4_42bA?view#3-Operator-Reward-Amounts
Discussion Topics
The aim of this post is to gather feedback and to drive discussion around future changes to Rewards in the EigenLayer protocol.
Some of the flagged feature requests and issues include the following but are not exhaustive:
- Operator specific rewards - more desirable for heavy computational based AVSs. This is in the works in an upcoming release that will introduce OperatorSets into the protocol. This is commonly referred to as a
quorum
by AVSs. - Adjustable operator commission settings
- Snapshots performed per-block for accurate querying of on-chain state
- Ability for AVSs to publish their own merkle roots for full granular control of rewards distribution