feat: add EigenDA rewards submission type#1705
Merged
elhajin merged 4 commits intorelease-dev/incentive-councilfrom Jan 22, 2026
Merged
feat: add EigenDA rewards submission type#1705elhajin merged 4 commits intorelease-dev/incentive-councilfrom
elhajin merged 4 commits intorelease-dev/incentive-councilfrom
Conversation
elhajin
reviewed
Jan 22, 2026
elhajin
reviewed
Jan 22, 2026
elhajin
approved these changes
Jan 22, 2026
eigenmikem
added a commit
that referenced
this pull request
Mar 2, 2026
# v1.12.0 Incentive Council (ELIP-012) ## Release Manager @0xClandestine # Overview **Core Features** - **EmissionsController**: Mints EIGEN at a fixed inflation rate per epoch and distributes via gauge weights (bips 0-10,000) - **Permissionless Trigger**: Anyone can call `pressButton()` to process epoch emissions—no trusted keeper required - **5 Distribution Types**: - `RewardsForAllEarners` — Protocol-wide rewards for all delegated stake - `OperatorSetTotalStake` — Rewards proportional to total stake in operator set - `OperatorSetUniqueStake` — Rewards proportional to unique stake allocations - `EigenDA` — Special pathway for EigenDA (pre-OperatorSets AVS) - `Manual` — Off-chain computed distributions sent directly to Incentives Committee - **Silent Failure Handling**: Distribution failures don't block other distributions (except reentrancy/OOG attacks) - **Protocol Fee Mechanism**: Opt-in 20% fee on reward submissions in RewardsCoordinator - Disabled by default (backward compatible) - Submitters opt-in via `setOptInForProtocolFee()` - Fee recipient configurable by owner **Governance & Roles** - **Protocol Council**: Sets Incentives Committee address via `setIncentiveCouncil()` - **Incentives Committee**: - Configure distributions: `addDistribution()`, `updateDistribution()` - Receive swept tokens via `sweep()` - **AVSs**: Must grant EmissionsController permission for OperatorSet distributions **Key Design Points** - **Epoch-Based**: EIGEN minted once per epoch at `EMISSIONS_INFLATION_RATE` - **Future-Only Updates**: Distributions can only be added/updated for future epochs - **Immutable Config**: Inflation rate, start time, and epoch length set at deployment - **Pausable**: Both `pressButton()` and `sweep()` respect `PAUSED_TOKEN_FLOWS` flag - **Missed Epochs Skipped**: No accumulation—if `pressButton()` isn't called during an epoch, those emissions are permanently lost # Changelog - feat(incentives): add interface [#1678](#1678) - feat(incentives): add implementation [#1681](#1681) - feat(incentives): add protocol fee [#1691](#1691) - feat(incentives): add deploy scripts [#1699](#1699) - fix: internal review changes [#1703](#1703) - feat: add EigenDA rewards submission type [#1705](#1705) # Scope **New Contracts:** - `EmissionsController.sol` — Main implementation - `EmissionsControllerStorage.sol` — Storage layout - `IEmissionsController.sol` — Interface **Modified Contracts:** - `RewardsCoordinator.sol` — Added protocol fee mechanism and `createEigenDARewardsSubmission()` - `RewardsCoordinatorStorage.sol` — Added `PROTOCOL_FEE_BIPS`, `isOptedInForProtocolFee`, `feeRecipient`, `emissionsController` --------- Co-authored-by: Rajath Alex <rajathalex@gmail.com> Co-authored-by: eigenmikem <michael.muehl@eigenlabs.org> Co-authored-by: ELHAJ <124453227+elhajin@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com>
0xClandestine
added a commit
that referenced
this pull request
Mar 5, 2026
# v1.12.0 Incentive Council (ELIP-012) ## Release Manager @0xClandestine # Overview **Core Features** - **EmissionsController**: Mints EIGEN at a fixed inflation rate per epoch and distributes via gauge weights (bips 0-10,000) - **Permissionless Trigger**: Anyone can call `pressButton()` to process epoch emissions—no trusted keeper required - **5 Distribution Types**: - `RewardsForAllEarners` — Protocol-wide rewards for all delegated stake - `OperatorSetTotalStake` — Rewards proportional to total stake in operator set - `OperatorSetUniqueStake` — Rewards proportional to unique stake allocations - `EigenDA` — Special pathway for EigenDA (pre-OperatorSets AVS) - `Manual` — Off-chain computed distributions sent directly to Incentives Committee - **Silent Failure Handling**: Distribution failures don't block other distributions (except reentrancy/OOG attacks) - **Protocol Fee Mechanism**: Opt-in 20% fee on reward submissions in RewardsCoordinator - Disabled by default (backward compatible) - Submitters opt-in via `setOptInForProtocolFee()` - Fee recipient configurable by owner **Governance & Roles** - **Protocol Council**: Sets Incentives Committee address via `setIncentiveCouncil()` - **Incentives Committee**: - Configure distributions: `addDistribution()`, `updateDistribution()` - Receive swept tokens via `sweep()` - **AVSs**: Must grant EmissionsController permission for OperatorSet distributions **Key Design Points** - **Epoch-Based**: EIGEN minted once per epoch at `EMISSIONS_INFLATION_RATE` - **Future-Only Updates**: Distributions can only be added/updated for future epochs - **Immutable Config**: Inflation rate, start time, and epoch length set at deployment - **Pausable**: Both `pressButton()` and `sweep()` respect `PAUSED_TOKEN_FLOWS` flag - **Missed Epochs Skipped**: No accumulation—if `pressButton()` isn't called during an epoch, those emissions are permanently lost # Changelog - feat(incentives): add interface [#1678](#1678) - feat(incentives): add implementation [#1681](#1681) - feat(incentives): add protocol fee [#1691](#1691) - feat(incentives): add deploy scripts [#1699](#1699) - fix: internal review changes [#1703](#1703) - feat: add EigenDA rewards submission type [#1705](#1705) # Scope **New Contracts:** - `EmissionsController.sol` — Main implementation - `EmissionsControllerStorage.sol` — Storage layout - `IEmissionsController.sol` — Interface **Modified Contracts:** - `RewardsCoordinator.sol` — Added protocol fee mechanism and `createEigenDARewardsSubmission()` - `RewardsCoordinatorStorage.sol` — Added `PROTOCOL_FEE_BIPS`, `isOptedInForProtocolFee`, `feeRecipient`, `emissionsController`
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation:
The
RewardsCoordinatorneeds to support a special pathway for EigenDA rewards submissions that can be initiated by the EmissionsController. Currently, all AVS rewards submissions go through the samecreateAVSRewardsSubmissionfunction which doesn't distinguish between different reward submission sources or allow for privileged callers. This creates a need for a dedicated mechanism that allows the EmissionsController to submit EigenDA rewards on behalf of the EigenDA AVS.Modifications:
emissionsControlleras an immutable storage variable inRewardsCoordinatorStoragecreateEigenDARewardsSubmissionfunction that accepts an AVS address parameter and can only be called by the EmissionsControllercreateAVSRewardsSubmissionto use a new internal helper function_createAVSRewardsSubmissionto avoid code duplicationEmissionsControllerto callcreateEigenDARewardsSubmissioninstead ofcreateAVSRewardsSubmissionfor EigenDA distribution typeResult:
The
RewardsCoordinatornow has a dedicated pathway for EigenDA rewards submissions from the EmissionsController.