Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: slashing magnitude poc #672

Closed
wants to merge 43 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
d7c6f3f
Feat/operator sets (#579)
ypatil12 Jun 26, 2024
80857d4
fix: remove unused immutable
0xClandestine Jul 9, 2024
f803295
chore: run `forge fmt src/contracts`
0xClandestine Jul 9, 2024
5ed166f
nit: improve comments
0xClandestine Jul 9, 2024
d44f280
refactor: remove isOperatorSetAVS mapping
0xClandestine Jul 9, 2024
dea2473
refactor: remove unused beaconChainETHStrategy constant
0xClandestine Jul 9, 2024
2d60939
refactor: storage optimization/overhaul
0xClandestine Jul 9, 2024
8d67ab8
nit: move updateStandbyParams fn
0xClandestine Jul 9, 2024
5867547
fix: variable name consistency
0xClandestine Jul 10, 2024
da8077f
chore: improve comments + naming
0xClandestine Jul 10, 2024
b54fc08
feat: remove simp mode
0xClandestine Jul 11, 2024
e0cf6fd
refactor: rename isOperatorInOperatorSet -> isMember
0xClandestine Jul 11, 2024
a51f94d
chore: forge fmt
0xClandestine Jul 12, 2024
71bc740
feat: forced opset dereg
0xClandestine Jul 12, 2024
3af0eda
chore: forge fmt src/contracts
0xClandestine Jul 12, 2024
02fff3d
test: forced opset dereg
0xClandestine Jul 12, 2024
776611d
refactor: remove OperatorSet struct
0xClandestine Jul 12, 2024
819fea8
feat: add missing interface fns
0xClandestine Jul 15, 2024
c246585
feat: add missing interface fns
0xClandestine Jul 15, 2024
7d4c2cf
feat: operator set initialization
0xClandestine Jul 16, 2024
555bf98
test: operator set initialization
0xClandestine Jul 16, 2024
7d1d1e7
feat: operator set migration; completely separate legacy and opset re…
ypatil12 Jul 22, 2024
8940535
feat: operator commission bips (#627)
8sunyuan Jul 22, 2024
4ec0a16
fix: compiling from conflict fix
8sunyuan Jul 23, 2024
c0396ca
feat: track total members and sets (#649)
0xClandestine Aug 6, 2024
d6da053
feat: operator set rewards (#663)
ypatil12 Aug 8, 2024
3decaea
feat: remove storage (#667)
ypatil12 Aug 8, 2024
21e5330
chore: address comments
ypatil12 Aug 8, 2024
e71a0b8
chore: update gap
ypatil12 Aug 8, 2024
88a4829
chore: bindings
ypatil12 Aug 8, 2024
3e36c1b
fix: deployers
ypatil12 Aug 8, 2024
e957fed
fix: deploy config
ypatil12 Aug 8, 2024
191e7fe
fix: fix operator commission tests (#673)
8sunyuan Aug 9, 2024
cfca835
Feat: enumerating sets operators are in (#662)
0xClandestine Aug 9, 2024
c4a4ed0
feat: draft with pending todos
8sunyuan Aug 9, 2024
d795e1c
chore: rename back to checkpoints
8sunyuan Aug 12, 2024
0408749
feat: partial withdrawal batching (#515)
wadealexc Aug 9, 2024
7a35c7b
Feat/operator sets (#579)
ypatil12 Jun 26, 2024
7dac94e
fix: remove unused immutable
0xClandestine Jul 9, 2024
86a2397
feat: operator commission bips (#627)
8sunyuan Jul 22, 2024
080372e
feat: operator set rewards (#663)
ypatil12 Aug 8, 2024
74e4bee
fix: fix operator commission tests (#673)
8sunyuan Aug 9, 2024
ab78633
chore: compilation & bindings
ypatil12 Aug 12, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -183,10 +183,10 @@ You can view the deployed contract addresses below, or check out the code itself
| -------- | -------- | -------- | -------- |
| [`DelegationManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/DelegationManager.sol) | [`0xA44151489861Fe9e3055d95adC98FbD462B948e7`](https://holesky.etherscan.io/address/0xA44151489861Fe9e3055d95adC98FbD462B948e7) | [`0x83f8...0D76`](https://holesky.etherscan.io/address/0x83f8F8f0BB125F7870F6bfCf76853f874C330D76) | Proxy: [`[email protected]`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/StrategyManager.sol) | [`0xdfB5f6CE42aAA7830E94ECFCcAd411beF4d4D5b6`](https://holesky.etherscan.io/address/0xdfB5f6CE42aAA7830E94ECFCcAd411beF4d4D5b6) | [`0x59f7...3a18`](https://holesky.etherscan.io/address/0x59f766A603C53f3AC8Be43bBe158c1519b193a18) | Proxy: [`[email protected]`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`EigenPodManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/pods/EigenPodManager.sol) | [`0x30770d7E3e71112d7A6b7259542D1f680a70e315`](https://holesky.etherscan.io/address/0x30770d7E3e71112d7A6b7259542D1f680a70e315) | [`0x5265...4a7B`](https://holesky.etherscan.io/address/0x5265C162f7d5F3fE3175a78828ab16bf5E324a7B) | Proxy: [`[email protected]`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`EigenPodManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/pods/EigenPodManager.sol) | [`0x30770d7E3e71112d7A6b7259542D1f680a70e315`](https://holesky.etherscan.io/address/0x30770d7E3e71112d7A6b7259542D1f680a70e315) | [`0x91A6...CCc5`](https://holesky.etherscan.io/address/0x91A6525a4a843F5a5B633905300c33F79413CCc5) | Proxy: [`[email protected]`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`AVSDirectory`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/AVSDirectory.sol) | [`0x055733000064333CaDDbC92763c58BF0192fFeBf`](https://holesky.etherscan.io/address/0x055733000064333CaDDbC92763c58BF0192fFeBf) | [`0xEF5B...3e3a`](https://holesky.etherscan.io/address/0xEF5BA995Bc7722fd1e163edF8Dc09375de3d3e3a) | Proxy: [`[email protected]`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`Slasher`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/Slasher.sol) | [`0xcAe751b75833ef09627549868A04E32679386e7C`](https://holesky.etherscan.io/address/0xcAe751b75833ef09627549868A04E32679386e7C) | [`0x9971...345A`](https://holesky.etherscan.io/address/0x99715D255E34a39bE9943b82F281CA734bcF345A) | Proxy: [`[email protected]`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`RewardsCoordinator`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/RewardsCoordinator.sol) | [`0xAcc1fb458a1317E886dB376Fc8141540537E68fE`](https://holesky.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE) | [`0x123C...3D02`](https://holesky.etherscan.io/address/0x123C1A3543DBCA3f704E703dDda7FAAaA8e43D02) | Proxy: [`[email protected]`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`RewardsCoordinator`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/RewardsCoordinator.sol) | [`0xAcc1fb458a1317E886dB376Fc8141540537E68fE`](https://holesky.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE) | [`0xe546...7f97`](https://holesky.etherscan.io/address/0xe54625095656206AC1B42819875343453c447f97) | Proxy: [`[email protected]`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |

###### Strategies

Expand Down Expand Up @@ -227,9 +227,8 @@ The following strategies differ significantly from the other strategies deployed

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`EigenPod (beacon)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/pods/EigenPod.sol) | [`0x7261C2bd75a7ACE1762f6d7FAe8F63215581832D`](https://holesky.etherscan.io/address/0x7261C2bd75a7ACE1762f6d7FAe8F63215581832D) | [`0xe98f...641c`](https://holesky.etherscan.io/address/0xe98f9298344527608A1BCC23907B8145F9Cb641c) | - Beacon: [`BeaconProxy`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/beacon/BeaconProxy.sol) <br />- Pods: [`UpgradeableBeacon`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/beacon/UpgradeableBeacon.sol) |
| [`EigenPod (beacon)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/pods/EigenPod.sol) | [`0x7261C2bd75a7ACE1762f6d7FAe8F63215581832D`](https://holesky.etherscan.io/address/0x7261C2bd75a7ACE1762f6d7FAe8F63215581832D) | [`0x10ad...319c`](https://holesky.etherscan.io/address/0x10ad7e30e3F52076C8462D573530f4461377319c) | - Beacon: [`BeaconProxy`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/beacon/BeaconProxy.sol) <br />- Pods: [`UpgradeableBeacon`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/beacon/UpgradeableBeacon.sol) |
| [`DelayedWithdrawalRouter`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/pods/DelayedWithdrawalRouter.sol) | [`0x642c646053eaf2254f088e9019ACD73d9AE0FA32`](https://holesky.etherscan.io/address/0x642c646053eaf2254f088e9019ACD73d9AE0FA32) | [`0xcE8b...3407`](https://holesky.etherscan.io/address/0xcE8b8D99773a718423F8040a6e52c06a4ce63407) | Proxy: [`[email protected]`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`EigenLayerBeaconOracle`](https://github.com/succinctlabs/eigenlayer-beacon-oracle/blob/main/contracts/src/EigenLayerBeaconOracle.sol) | - | [`0x4C11...8f25`](https://holesky.etherscan.io/address/0x4C116BB629bff7A8373c2378bBd919f8349B8f25) | Provided by [Succinct](https://succinct.xyz/) |

###### EIGEN/bEIGEN

Expand Down
Binary file not shown.
3 changes: 1 addition & 2 deletions certora/harnesses/EigenPodHarness.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@ contract EigenPodHarness is EigenPod {

constructor(
IETHPOSDeposit _ethPOS,
IDelayedWithdrawalRouter _delayedWithdrawalRouter,
IEigenPodManager _eigenPodManager,
uint64 _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR,
uint64 _GENESIS_TIME
)
EigenPod(_ethPOS, _delayedWithdrawalRouter, _eigenPodManager, _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, _GENESIS_TIME) {}
EigenPod(_ethPOS, _eigenPodManager, _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, _GENESIS_TIME) {}

function get_validatorIndex(bytes32 pubkeyHash) public view returns (uint64) {
return _validatorPubkeyHashToInfo[pubkeyHash].validatorIndex;
Expand Down
2 changes: 1 addition & 1 deletion certora/scripts/core/verifyStrategyManager.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ solc-select use 0.8.12

certoraRun certora/harnesses/StrategyManagerHarness.sol \
lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol \
src/contracts/pods/EigenPodManager.sol src/contracts/pods/EigenPod.sol src/contracts/pods/DelayedWithdrawalRouter.sol \
src/contracts/pods/EigenPodManager.sol src/contracts/pods/EigenPod.sol \
src/contracts/strategies/StrategyBase.sol src/contracts/core/DelegationManager.sol \
src/contracts/core/Slasher.sol src/contracts/permissions/PauserRegistry.sol \
--verify StrategyManagerHarness:certora/specs/core/StrategyManager.spec \
Expand Down
36 changes: 17 additions & 19 deletions certora/scripts/pods/verifyEigenPod.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,21 @@ then
RULE="--rule $2"
fi

solc-select use 0.8.12
# solc-select use 0.8.12

certoraRun certora/harnesses/EigenPodHarness.sol \
src/contracts/core/DelegationManager.sol src/contracts/pods/EigenPodManager.sol \
src/contracts/core/Slasher.sol src/contracts/permissions/PauserRegistry.sol \
src/contracts/core/StrategyManager.sol \
src/contracts/strategies/StrategyBase.sol \
lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol \
lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol \
--verify EigenPodHarness:certora/specs/pods/EigenPod.spec \
--solc_via_ir \
--solc_optimize 1 \
--optimistic_loop \
--prover_args '-recursionEntryLimit 3' \
--optimistic_hashing \
--parametric_contracts EigenPodHarness \
$RULE \
--loop_iter 1 \
--packages @openzeppelin=lib/openzeppelin-contracts @openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable \
--msg "EigenPod $1 $2" \
# certoraRun certora/harnesses/EigenPodHarness.sol \
# src/contracts/core/DelegationManager.sol src/contracts/pods/EigenPodManager.sol \
# src/contracts/core/Slasher.sol src/contracts/permissions/PauserRegistry.sol \
# src/contracts/core/StrategyManager.sol \
# src/contracts/strategies/StrategyBase.sol \
# lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol \
# lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol \
# --verify EigenPodHarness:certora/specs/pods/EigenPod.spec \
# --optimistic_loop \
# --prover_args '-recursionEntryLimit 3' \
# --optimistic_hashing \
# --parametric_contracts EigenPodHarness \
# $RULE \
# --loop_iter 1 \
# --packages @openzeppelin=lib/openzeppelin-contracts @openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable \
# --msg "EigenPod $1 $2" \
28 changes: 13 additions & 15 deletions certora/scripts/pods/verifyEigenPodManager.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,17 @@ then
RULE="--rule $2"
fi

solc-select use 0.8.12
# solc-select use 0.8.12

certoraRun certora/harnesses/EigenPodManagerHarness.sol \
src/contracts/core/DelegationManager.sol src/contracts/pods/EigenPod.sol src/contracts/strategies/StrategyBase.sol src/contracts/core/StrategyManager.sol \
src/contracts/core/Slasher.sol src/contracts/permissions/PauserRegistry.sol \
--verify EigenPodManagerHarness:certora/specs/pods/EigenPodManager.spec \
--solc_via_ir \
--solc_optimize 1 \
--optimistic_loop \
--optimistic_fallback \
--optimistic_hashing \
--parametric_contracts EigenPodManagerHarness \
$RULE \
--loop_iter 3 \
--packages @openzeppelin=lib/openzeppelin-contracts @openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable \
--msg "EigenPodManager $1 $2" \
# certoraRun certora/harnesses/EigenPodManagerHarness.sol \
# src/contracts/core/DelegationManager.sol src/contracts/pods/EigenPod.sol src/contracts/strategies/StrategyBase.sol src/contracts/core/StrategyManager.sol \
# src/contracts/core/Slasher.sol src/contracts/permissions/PauserRegistry.sol \
# --verify EigenPodManagerHarness:certora/specs/pods/EigenPodManager.spec \
# --optimistic_loop \
# --optimistic_fallback \
# --optimistic_hashing \
# --parametric_contracts EigenPodManagerHarness \
# $RULE \
# --loop_iter 3 \
# --packages @openzeppelin=lib/openzeppelin-contracts @openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable \
# --msg "EigenPodManager $1 $2" \
3 changes: 0 additions & 3 deletions certora/specs/core/Slasher.spec
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,6 @@ methods {
// external calls to EigenPod
function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true);

// external calls to DelayedWithdrawalRouter (from EigenPod)
function _.createDelayedWithdrawal(address, address) external => DISPATCHER(true);

// external calls to PauserRegistry
function _.isPauser(address) external => DISPATCHER(true);
function _.unpauser() external => DISPATCHER(true);
Expand Down
3 changes: 0 additions & 3 deletions certora/specs/core/StrategyManager.spec
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,6 @@ methods {

// external calls to EigenPod
function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true);

// external calls to DelayedWithdrawalRouter (from EigenPod)
function _.createDelayedWithdrawal(address, address) external => DISPATCHER(true);

// external calls to PauserRegistry
function _.isPauser(address) external => DISPATCHER(true);
Expand Down
1 change: 0 additions & 1 deletion certora/specs/pods/EigenPod.spec
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ methods {
function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) external returns (IEigenPod.ValidatorInfo) envfree;
function provenWithdrawal(bytes32 validatorPubkeyHash, uint64 slot) external returns (bool) envfree;
function validatorStatus(bytes32 pubkeyHash) external returns (IEigenPod.VALIDATOR_STATUS) envfree;
function delayedWithdrawalRouter() external returns (address) envfree;
function nonBeaconChainETHBalanceWei() external returns (uint256) envfree;

// harnessed functions
Expand Down
2 changes: 0 additions & 2 deletions certora/specs/pods/EigenPodManager.spec
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ methods {

// external calls to EigenPod
function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true);

// external calls to PauserRegistry
function _.isPauser(address) external => DISPATCHER(true);
function _.unpauser() external => DISPATCHER(true);
Expand All @@ -36,7 +35,6 @@ methods {
function getPod(address podOwner) external returns (address) envfree;
function ethPOS() external returns (address) envfree;
function eigenPodBeacon() external returns (address) envfree;
function beaconChainOracle() external returns (address) envfree;
function getBlockRootAtTimestamp(uint64 timestamp) external returns (bytes32) envfree;
function strategyManager() external returns (address) envfree;
function slasher() external returns (address) envfree;
Expand Down
28 changes: 12 additions & 16 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[middleware-repo]: https://github.com/Layr-Labs/eigenlayer-middleware/

## EigenLayer M2 Docs
## EigenLayer Docs - v0.4.0 Release

This repo contains the EigenLayer core contracts, which enable restaking of liquid staking tokens (LSTs) and beacon chain ETH to secure new services, called AVSs (actively validated services). For more info on AVSs, check out the EigenLayer middleware contracts [here][middleware-repo].

Expand Down Expand Up @@ -33,16 +33,14 @@ This document provides an overview of system components, contracts, and user rol
| -------- | -------- | -------- |
| [`EigenPodManager.sol`](../src/contracts/pods/EigenPodManager.sol) | Singleton | Transparent proxy |
| [`EigenPod.sol`](../src/contracts/pods/EigenPod.sol) | Instanced, deployed per-user | Beacon proxy |
| [`DelayedWithdrawalRouter.sol`](../src/contracts/pods/DelayedWithdrawalRouter.sol) | Singleton | Transparent proxy |
| [`succinctlabs/EigenLayerBeaconOracle.sol`](https://github.com/succinctlabs/telepathy-contracts/blob/main/external/integrations/eigenlayer/EigenLayerBeaconOracle.sol) | Singleton | UUPS proxy | [`0x40B1...9f2c`](https://goerli.etherscan.io/address/0x40B10ddD29a2cfF33DBC420AE5bbDa0649049f2c) |

These contracts work together to enable native ETH restaking:
* Users deploy `EigenPods` via the `EigenPodManager`, which contain beacon chain state proof logic used to verify a validator's withdrawal credentials, balance, and exit. An `EigenPod's` main role is to serve as the withdrawal address for one or more of a user's validators.
* Users deploy `EigenPods` via the `EigenPodManager`, which contain beacon chain state proof logic used to verify a validator's withdrawal credentials and current balances. An `EigenPod's` main role is to serve as the fee recipient and/or withdrawal credentials for one or more of a user's validators.
* The `EigenPodManager` handles `EigenPod` creation and accounting+interactions between users with restaked native ETH and the `DelegationManager`.
* The `DelayedWithdrawalRouter` imposes a 7-day delay on completing partial beacon chain withdrawals from an `EigenPod`. This is primarily to add a stopgap against a hack being able to instantly withdraw funds (note that all withdrawals from EigenLayer -- other than partial withdrawals earned by validators -- are initiated via the `DelegationManager`).
* The `EigenLayerBeaconOracle` provides beacon chain block roots for use in various proofs. The oracle is supplied by Succinct's Telepathy protocol ([docs link](https://docs.telepathy.xyz/)).

See full documentation in [`/core/EigenPodManager.md`](./core/EigenPodManager.md).
See full documentation in:
* [`/core/EigenPodManager.md`](./core/EigenPodManager.md)
* [`/core/EigenPod.md`](./core/EigenPod.md)

#### StrategyManager

Expand Down Expand Up @@ -123,8 +121,7 @@ Stakers can restake any combination of these: a Staker may hold ALL of these ass
* Stakers **withdraw** assets via the DelegationManager, *no matter what assets they're withdrawing*
* Stakers **delegate** to an Operator via the DelegationManager

Unimplemented as of M2:
* Stakers earn yield by delegating to an Operator as the Operator provides services to an AVS
*Unimplemented as of v0.4.0:*
* Stakers are at risk of being slashed if the Operator misbehaves

##### Operator
Expand All @@ -136,8 +133,7 @@ An Operator is a user who helps run the software built on top of EigenLayer (AVS
* Operators can **deposit** and **withdraw** assets just like Stakers can
* Operators can opt in to providing services for an AVS using that AVS's middleware contracts. See the [EigenLayer middleware][middleware-repo] repo for more details.

*Unimplemented as of M2:*
* Operators earn fees as part of the services they provide
*Unimplemented as of v0.4.0:*
* Operators may be slashed by the services they register with (if they misbehave)

---
Expand Down Expand Up @@ -170,18 +166,18 @@ This flow is mostly useful if a Staker wants to change which Operator they are d

Completing a queued withdrawal as tokens is roughly the same for both native ETH and LSTs.

However, note that *before* a withdrawal can be completed, native ETH stakers will need to perform additional steps, detailed in the "Withdrawal Processing" diagrams below.
However, note that *before* a withdrawal can be completed, native ETH stakers will need to perform additional steps, detailed in the diagrams below.

![.](./images/Staker%20Flow%20Diagrams/Complete%20Withdrawal%20as%20Tokens.png)

##### Withdrawal Processing: Validator Exits
##### `EigenPods`: Processing Validator Exits

If a Staker wants to fully withdraw from the beacon chain, they need to perform these additional steps before their withdrawal is completable:

![.](./images/Staker%20Flow%20Diagrams/Validator%20Exits.png)

##### Withdrawal Processing: Partial Beacon Chain Withdrawals
##### `EigenPods`: Processing Validator Yield

If a Staker wants to withdraw consensus rewards from the beacon chain, they do NOT go through the `DelegationManager`. This is the only withdrawal type that is not initiated in the `DelegationManager`:
As the Staker's `EigenPod` accumulates consensus layer or execution layer yield, the `EigenPod's` balance will increase. The Staker can Checkpoint their validator to claim this yield as shares, which can either remain staked in EigenLayer or be withdrawn via the `DelegationManager` withdrawal queue:

![.](./images/Staker%20Flow%20Diagrams/Partial%20Withdrawals.png)
![.](./images/Staker%20Flow%20Diagrams/Validator%20Yield.png)
Loading
Loading