Skip to content

feat(incentives): add deploy scripts#1699

Merged
0xClandestine merged 2 commits intorelease-dev/incentive-councilfrom
feat/deploy-incentives-council
Jan 21, 2026
Merged

feat(incentives): add deploy scripts#1699
0xClandestine merged 2 commits intorelease-dev/incentive-councilfrom
feat/deploy-incentives-council

Conversation

@0xClandestine
Copy link
Copy Markdown
Member

@0xClandestine 0xClandestine commented Jan 13, 2026

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.

@0xClandestine 0xClandestine marked this pull request as ready for review January 13, 2026 19:48
@0xClandestine 0xClandestine force-pushed the release-dev/incentive-council branch from b7a78d0 to 051a5b9 Compare January 14, 2026 16:10
**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
@0xClandestine 0xClandestine force-pushed the feat/deploy-incentives-council branch from 9e2cae4 to 32df02d Compare January 14, 2026 16:34
add deploy scripts

cleanup

more checks

make fmt

rebase error

wip

correct ms

fix

fix

fix

fix
@0xClandestine 0xClandestine force-pushed the feat/deploy-incentives-council branch from cf9a9ed to 80c924e Compare January 15, 2026 20:10
@0xClandestine 0xClandestine merged commit d040988 into release-dev/incentive-council Jan 21, 2026
9 of 21 checks passed
@0xClandestine 0xClandestine deleted the feat/deploy-incentives-council branch January 21, 2026 20:25
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.

4 participants