Skip to content

feat: add EigenDA rewards submission type#1705

Merged
elhajin merged 4 commits intorelease-dev/incentive-councilfrom
feat/new-rewards-type
Jan 22, 2026
Merged

feat: add EigenDA rewards submission type#1705
elhajin merged 4 commits intorelease-dev/incentive-councilfrom
feat/new-rewards-type

Conversation

@0xClandestine
Copy link
Copy Markdown
Member

@0xClandestine 0xClandestine commented Jan 22, 2026

Motivation:

The RewardsCoordinator needs to support a special pathway for EigenDA rewards submissions that can be initiated by the EmissionsController. Currently, all AVS rewards submissions go through the same createAVSRewardsSubmission function 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:

  • Added emissionsController as an immutable storage variable in RewardsCoordinatorStorage
  • Created new createEigenDARewardsSubmission function that accepts an AVS address parameter and can only be called by the EmissionsController
  • Refactored existing createAVSRewardsSubmission to use a new internal helper function _createAVSRewardsSubmission to avoid code duplication
  • Updated EmissionsController to call createEigenDARewardsSubmission instead of createAVSRewardsSubmission for EigenDA distribution type

Result:

The RewardsCoordinator now has a dedicated pathway for EigenDA rewards submissions from the EmissionsController.

@0xClandestine 0xClandestine changed the base branch from main to release-dev/incentive-council January 22, 2026 03:24
@elhajin elhajin merged commit 4287d2f into release-dev/incentive-council Jan 22, 2026
9 of 15 checks passed
@elhajin elhajin deleted the feat/new-rewards-type branch January 22, 2026 16:21
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`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants