File | Type | Proxy? |
---|---|---|
EjectionManager.sol |
Singleton | Transparent proxy |
The EjectionManager
facilitates automated ejection of operators from the SlashingRegistryCoordinator
under a configurable rate limit. It allows authorized ejectors to remove operators from quorums.
This document or:
- Owner: a permissioned role that can configure quorum ejection parameters, manage ejectors, and eject operators without rate limiting
- Ejector: a permissioned role that can eject operators under the configured rate limits
The ejection rate limit system prevents too many operators from being ejected in a short time period, which could potentially destabilize the system. Rate limits are configured per quorum.
function setQuorumEjectionParams(
uint8 quorumNumber,
QuorumEjectionParams memory _quorumEjectionParams
) external onlyOwner
Allows the Owner to set the rate limit parameters for a specific quorum.
Effects:
- Updates the quorum's ejection parameters, including the rate limit window and the percentage of stake that can be ejected within that window
Requirements:
- Caller MUST be the Owner
quorumNumber
MUST be less thanMAX_QUORUM_COUNT
function amountEjectableForQuorum(
uint8 quorumNumber
) public view returns (uint256)
Calculates the amount of stake that can currently be ejected from a quorum, based on the quorum's ejection parameters and recent ejection history.
Return Value:
- The amount of stake that can be ejected at the current
block.timestamp
Calculation Logic:
- Determines the total ejectable stake as a percentage of the quorum's total stake, using
quorumEjectionParams[quorumNumber].ejectableStakePercent
- Calculates the stake already ejected during the current rate limit window
- Returns the difference between the total ejectable stake and the stake already ejected, or 0 if more stake has been ejected than the limit allows
These methods are used to manage which addresses have the ability to eject operators under the rate limits:
function setEjector(address ejector, bool status) external onlyOwner
Allows the Owner to add or remove an address from the list of authorized ejectors.
Effects:
- Sets the address' ejector status to the provided value
- Emits an
EjectorUpdated
event
Requirements:
- Caller MUST be the Owner
These methods allow ejection of operators from quorums:
function ejectOperators(
bytes32[][] memory operatorIds
) external
Ejects operators from quorums, respecting the rate limits if called by an ejector (not the owner).
The method processes operators for each quorum sequentially. For each quorum, it attempts to eject operators in the order provided, stopping if the rate limit is reached. The owner can bypass rate limits.
Effects:
- For each quorum, ejects as many operators as possible prioritizing operators at lower indexes
- If called by an ejector (not the owner), records the stake ejected to keep track of rate limits
- Emits an
OperatorEjected
event for each ejected operator - Emits a
QuorumEjection
event for each quorum with the number of ejected operators and whether the rate limit was hit
Requirements:
- Caller MUST be either an ejector or the owner
Implementation Details:
- If called by the owner, rate limits are not enforced, allowing emergency ejections
- If called by an ejector, operators are ejected until the rate limit is hit
The contract is initialized with the following parameters:
function initialize(
address _owner,
address[] memory _ejectors,
QuorumEjectionParams[] memory _quorumEjectionParams
) external initializer
Effects:
- Sets the contract owner
- Configures the initial set of ejectors
- Sets up the ejection parameters for quorums
Requirements:
- Can only be called once due to the
initializer
modifier