Skip to content

Conversation

@0xClandestine
Copy link
Member

Motivation:

We need approval on initial design of the upcoming incentives council feature release. Historically, we've used EigenHopper 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.

Comment on lines +130 to +134
/// @notice Removes a distribution.
/// @dev Only the Incentive Council can call this function.
/// @dev Ref: Implied by "updateDistribution" and general management of distributions.
/// @param index The index of the distribution to remove.
function removeDistribution(uint256 index) external;
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Open question: Should this mark the distribution as "removed" or outright remove the distribution from storage. Intuition tells me we should simply mark it as removed so it can still be easily audited/introspected in the future (and avoids need for swap/pop enumerable set pattern).

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, agreed

Comment on lines +145 to +147
/// @notice Returns all distributions.
/// @return An append-only array of Distribution structs.
function getDistributions() external view returns (Distribution[] memory);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Append only pending above question. May need to correct.

RewardsForAllEarners,
OperatorSetTotalStake,
OperatorSetUniqueStake,
EigenDA,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't EigenDA just one of the old reward types? createAVSRewardsSubmission

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My interpretation is the intent of that ref is to give the possible types of rewards submissions that can be made? Could be wrong though

struct Distribution {
uint256 weight;
DistributionType distributionType;
bytes strategiesAndMultipliers;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not an array? Have used that in the past

Comment on lines +130 to +134
/// @notice Removes a distribution.
/// @dev Only the Incentive Council can call this function.
/// @dev Ref: Implied by "updateDistribution" and general management of distributions.
/// @param index The index of the distribution to remove.
function removeDistribution(uint256 index) external;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, agreed

/// @dev Ref: "Incentive Council Functions: addDistribution(weight{int}, distribution-type{see below}, strategiesAndMultipliers())"
/// @param weight The weight of the distribution.
/// @param distributionType The type of distribution.
/// @param strategiesAndMultipliers Encoded strategies and multipliers.
Copy link
Collaborator

@ypatil12 ypatil12 Dec 9, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will there be any error handling on the weight? I assume it's a proportion in BPS?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah should've specified in comments, weights are in bips (since easier to manually write out vs wad).

}

/// @notice Configuration for the EmissionsController.
/// @dev Ref: "The amount of EIGEN minted weekly (inflation rate) is set by governance..."
Copy link
Collaborator

@ypatil12 ypatil12 Dec 9, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So my understanding of the ELIP is that we have:

  1. A top-level inflation rate (eg 8%)
  2. Either eth-directed, Eigen-directed, or discretionary reward (eg. x% to ETH)
  3. A per-DistributionType type of above. x1% to rewards all stakers

How is 2 specified? It seems like we only do 3?

/// @notice Triggers the weekly emissions.
/// @dev Ref: "The ActionGenerator today is a contract ... that is triggered by the Hopper. When triggered, it mints new EIGEN tokens..."
/// @dev Permissionless function that can be called by anyone when `canPress()` returns true.
function pressButton() external;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We might have to batch this if the size of the distribution array becomes too large... something to think about for implementation

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good callout, yeah will need to ensure the button is always "pressable".

/// @notice Triggers the weekly emissions.
/// @dev Ref: "The ActionGenerator today is a contract ... that is triggered by the Hopper. When triggered, it mints new EIGEN tokens..."
/// @dev Permissionless function that can be called by anyone when `canPress()` returns true.
function pressButton() external;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, what happens if one of the many reward tx's fail?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need a try-catch for that or do we ensure it doesn't fail at all? How does the current Hopper handle that?

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