Skip to content

Conversation

@0xClandestine
Copy link
Member

@0xClandestine 0xClandestine commented Jan 21, 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
  • feat(incentives): add implementation #1681
  • feat(incentives): add protocol fee #1691
  • feat(incentives): add deploy scripts #1699
  • fix: internal review changes #1703
  • feat: add EigenDA rewards submission type #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

0xrajath and others added 8 commits January 14, 2026 11:09
**Motivation:**

We need to support Rewards v2.2 :
- Rewards that are linear to allocated unique stake (Needs to be both
retroactive and future-looking).
- Rewards that are linear to total stake (Needs to be both retroactive
and future-looking).

TDD:
https://www.notion.so/eigen-labs/PRD-Rewards-v2-2-Operator-Set-Rewards-with-Unique-Total-Stake-28513c11c3e080cbb856e41ddc6362f5

**Modifications:**

Updates in `RewardsCoordinator`:
- New `createUniqueStakeRewardsSubmission` function with
`UniqueStakeRewardsSubmissionCreated` event emission
- New `PAUSED_UNIQUE_STAKE_REWARDS_SUBMISSION` constant
- New `isUniqueStakeRewardsSubmissionHash` mapping
- New `createTotalStakeRewardsSubmission` function with
`TotalStakeRewardsSubmissionCreated` event emission
- New `PAUSED_TOTAL_STAKE_REWARDS_SUBMISSION` constant
- New `isTotalStakeRewardsSubmissionHash` mapping
- Updated storage gap to 33 slots (from 35 slots)

Updated Bindings

**Result:**

Support for Rewards v2.2
**Motivation:**

We need approval on initial design of the upcoming incentives council
feature release. Historically, we've used
[EigenHopper](https://github.com/Layr-Labs/EigenHopper/tree/master) for
token emissions. Now we're looking to make some improvements.

**Modifications:**

- Drafted a consolidated interface that combines the two `EigenHopper`
contracts into a single new contract.

**Result:**

Single consolidated interface with hopper functionality and proposed
ELIP-012 functionality.
**Motivation:**

We need to implement the ELIP-012 proposed implementation.

**Modifications:**

- Adds new `EmissionsController`.

**Result:**

New contract with owner who sets incentive council, an address
privileged with configuring EIGEN emissions.
**Motivation:**

We want to add a configurable protocol fee mechanism to the
RewardsCoordinator contract to enable revenue generation. This allows
reward submitters to opt into paying fees while maintaining backward
compatibility with existing integrations.

**Modifications:**

- Added protocolFee (fixed constant amount) and feeRecipient state
variables
- Implemented setOptInProtocolFee() for submitters to opt into fee
payments
- Implemented setFeeRecipient() (owner-only) to set the fee destination
address

**Result:**

Submitters can voluntarily enable protocol fees on their reward
distributions. When opted in, the fixed fee amount is deducted and sent
to the designated recipient. Existing integrations continue working
unchanged since fees are disabled by default.
**Motivation:**

This upgrade improves programmatic incentives for the EigenLayer
protocol through a new EmissionsController that gives the Incentive
Council flexible control over EIGEN token emissions and distribution. It
also adds fee functionality to the RewardsCoordinator to support
protocol fees.

**Modifications:**

- Deploy EmissionsController implementation and proxy, plus new
RewardsCoordinator implementation with fee support.
- Upgrade and initialize EmissionsController proxy.
- Upgrade and reinitialize RewardsCoordinator with new feeRecipient
parameter.
- Register EmissionsController in ProtocolRegistry.
- Transfer minting rights from old hopper to EmissionsController.
- Complete the upgrade after timelock delay and validate all changes.

**Result:**

EmissionsController becomes the sole bEIGEN minter, and
RewardsCoordinator has opt-in fees.

---------

Co-authored-by: Rajath Alex <rajathalex@gmail.com>
**Motivation:**

*Explain here the context, and why you're making that change. What is
the problem you're trying to solve.*

**Modifications:**

*Describe the modifications you've done.*

**Result:**

*After your change, what will change.*
@0xClandestine 0xClandestine marked this pull request as ready for review January 21, 2026 22:12
**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 title feat: EmissionsController + opt-in RewardsCoordinator fees feat: gauge weighted incentives and opt-in rewards fee Jan 22, 2026
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.

3 participants