Solidity contracts behind ether.fi's liquid staking on Ethereum mainnet. Users deposit ETH
into the LiquidityPool and receive eETH, a rebasing token, or its non-rebasing wrapper weETH.
The protocol runs validators whose withdrawal credentials point at EigenLayer EigenPods.
Docs · Audits · Deployed addresses · weETH cross-chain
| Module | Path | Contracts |
|---|---|---|
| Core | src/core |
LiquidityPool, EETH, WeETH |
| Staking | src/staking |
StakingManager, EtherFiNodesManager, EtherFiNode, AuctionManager, NodeOperatorManager |
| Restaking | src/restaking |
EtherFiRestaker, RestakingRewardsRouter |
| Deposits | src/deposits |
DepositAdapter, Liquifier, LiquidRefer |
| Withdrawals | src/withdrawals |
WithdrawRequestNFT, PriorityWithdrawalQueue, EtherFiRedemptionManager, WeETHWithdrawAdapter |
| Oracle | src/oracle |
EtherFiOracle, EtherFiAdmin |
| Rewards | src/rewards |
EtherFiRewardsRouter, CumulativeMerkleRewardsDistributor |
| Governance | src/governance |
RoleRegistry, EtherFiTimelock, Blacklister, RevokeAdmin, rate limiting |
| Helpers | src/helpers |
AddressProvider, EtherFiViewer |
src/archive holds retired contracts kept for storage-layout reference.
Contract addresses live in the ether.fi docs under Deployed Contracts.
- Every contract sits behind a UUPS proxy. Upgrades go through the upgrade timelock; parameter changes go through the operating timelock.
RoleRegistryowns all role checks. Contracts ask it before running privileged functions.- Each
EtherFiNodeowns one EigenPod.EtherFiNodesManageris the entry point for pod operations: checkpoints, withdrawals, consolidations, and exits. EtherFiOraclereports rewards and validator state.EtherFiAdminapplies those reports to theLiquidityPoolrebase and finalizes withdrawal requests.EtherFiRedemptionManagerhandles instant redemptions under a bucket rate limiter.WithdrawRequestNFTandPriorityWithdrawalQueuehandle queued withdrawals.
Requirements: Foundry (CI pins v1.5.1) and a mainnet RPC URL for fork tests.
git clone https://github.com/etherfi-protocol/smart-contracts.git
cd smart-contracts
git submodule update --init --recursive
forge buildThe build uses Solidity 0.8.27 with 1500 optimizer runs.
export MAINNET_RPC_URL=<your_rpc_url>
forge test # all tests
forge test --match-test <name> # one test
forge test --match-path "test/invariant/*" # invariant suite
forge test --match-path "test/fork-tests/*" --fork-url $MAINNET_RPC_URL| Directory | Contents |
|---|---|
test/*.t.sol |
Unit tests per contract |
test/invariant |
Stateful invariant fuzzing |
test/integration-tests |
Cross-contract flows on a mainnet fork |
test/fork-tests |
Upgrade and migration checks against live state |
test/behaviour-tests |
Validator lifecycle on a mainnet fork |
Fork tests run against the latest block, so assert deltas against the live state you read at setup instead of assuming zero balances.
Certora specs live in certora/specs with run configs in certora/config:
certoraRun certora/config/LiquidityPoolPeg.confConfigs cover LiquidityPool peg and share accounting, EtherFiOracle, and RoleRegistry
authority.
| Path | Purpose |
|---|---|
src/ |
Protocol contracts |
test/ |
Foundry tests |
certora/ |
Formal verification specs and configs |
script/ |
Deploy, upgrade, and operations scripts (Solidity and Python) |
operations/, proposals/ |
Gnosis Safe and timelock transaction batches |
deployment/, release/ |
Deployment artifacts and release records |
audits/ |
Audit reports |
Certora, Zellic, Nethermind, Halborn, Omniscia, Decurity, Solidified, Paladin, CertiK, and
Hats Finance have audited these contracts. Reports sit in audits/; the most
recent is the Certora 26Q2 Security Upgrade review (June 2026).
CI runs the Forge test suite and a storage-layout check on pull requests into master, which
catches upgrades that would shift proxy storage.
Report vulnerabilities through the ether.fi bug bounty program. Do not open public issues for security bugs.
ether.fi is open-source and licensed under the MIT License.
Built with ❤️ by the ether.fi team