Overview
EigenLayerVerifier is a custom ICustomVerifier implementation tailored to securely authorize calls to EigenLayer contracts like DelegationManager, StrategyManager, and RewardsCoordinator. It uses strict role-based gating, exact calldata matching, and entity-specific validation to ensure that only authorized vaults and bots can interact with EigenLayer staking, delegation, withdrawal, and rewards workflows.
Purpose
This verifier protects EigenLayer operations by:- Ensuring only whitelisted entities (vaults, strategies, operators) can execute actions
- Verifying target contracts and function selectors precisely
- Enforcing exact calldata encoding to eliminate any ambiguity or abuse
Role Definitions
Constructor
- Setting immutable references to EigenLayer’s:
DelegationManagerStrategyManagerRewardsCoordinator
- Inheriting access control via
OwnedCustomVerifier
verifyCall
General Preconditions
whomust haveCALLER_ROLEvaluemust be 0 (no ETH allowed)callData.length >= 4(valid selector)
Validated Targets & Selectors
1. StrategyManager – depositIntoStrategy
depositIntoStrategy(IStrategy, address asset, uint256 shares)- Strategy must have
STRATEGY_ROLE - Asset must have
ASSET_ROLE - Shares must be non-zero
- Calldata must match
- Strategy must have
2. DelegationManager
delegateTo(address operator, SignatureWithExpiry signature, bytes32 salt)- Operator must have
OPERATOR_ROLE - Calldata must match
- Operator must have
queueWithdrawals(QueuedWithdrawalParams[] params)- Only one
params.length == 1allowed - Param must include:
- One strategy with
STRATEGY_ROLE - One deposit share > 0
- One strategy with
- Calldata must match
- Only one
completeQueuedWithdrawal(Withdrawal, address[] tokens, bool receiveAsTokens)receiveAsTokensmust betrue- Withdrawal must:
- Have only one strategy with
STRATEGY_ROLE - Have
stakerwithMELLOW_VAULT_ROLE
- Have only one strategy with
tokens.length == 1and token must haveASSET_ROLE- Calldata must match
3. RewardsCoordinator – processClaim
- Selector:
processClaim(RewardsMerkleClaim claimData, address receiver) - Checks:
claimData.earnerLeaf.earnermust haveMELLOW_VAULT_ROLEreceivermust haveRECEIVER_ROLE- Calldata must match
Security Properties
- Role enforcement: Prevents unauthorized usage of EigenLayer functions
- Exact calldata match: Avoids incorrect encoding or maliciously crafted data
- Zero ETH transfers: Disallows unexpected native token usage
- Single param enforcement (withdrawals): Minimizes complexity and risk surface