You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Once registered as an Operator, Operators can use an AVS's contracts to register with a specific AVS. The AVS will call these functions on the Operator's behalf:
Allows the caller (an AVS) to register an `operator` with itself, given the provided signature is valid.
121
+
122
+
*Effects*:
123
+
* Sets the `operator's` status to `REGISTERED` for the AVS
124
+
125
+
*Requirements*:
126
+
* Pause status MUST NOT be set: `PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS`
127
+
*`operator` MUST already be a registered Operator
128
+
*`operator` MUST NOT already be registered with the AVS
129
+
*`operatorSignature` must be a valid, unused, unexpired signature from the `operator`
130
+
131
+
*As of M2*:
132
+
* Operator registration/deregistration does not have any sort of consequences for the Operator or its shares. Eventually, this will tie into payments for services and slashing for misbehavior.
Allows the caller (an AVS) to deregister an `operator` with itself
145
+
146
+
*Effects*:
147
+
* Sets the `operator's` status to `UNREGISTERED` for the AVS
148
+
149
+
*Requirements*:
150
+
* Pause status MUST NOT be set: `PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS`
151
+
*`operator` MUST already be registered with the AVS
152
+
153
+
*As of M2*:
154
+
* Operator registration/deregistration does not have any sort of consequences for the Operator or its shares. Eventually, this will tie into payments for services and slashing for misbehavior.
155
+
156
+
---
157
+
105
158
### Delegating to an Operator
106
159
107
160
Stakers interact with the following functions to delegate their shares to an Operator:
@@ -348,7 +401,7 @@ Called by either the `StrategyManager` or `EigenPodManager` when a Staker's shar
*Effects*: If the Staker in question is delegated to an Operator, the Operator's shares for the `strategy` are increased.
@@ -372,7 +425,7 @@ function decreaseDelegatedShares(
372
425
Called by the `EigenPodManager` when a Staker's shares decrease. This method is called to ensure that if the Staker is delegated to an Operator, that Operator's share count reflects the decrease.
373
426
374
427
*Entry Points*: This method may be called as a result of the following top-level function calls:
375
-
*`EigenPod.verifyBalanceUpdate`
428
+
*`EigenPod.verifyBalanceUpdates`
376
429
*`EigenPod.verifyAndProcessWithdrawals`
377
430
378
431
*Effects*: If the Staker in question is delegated to an Operator, the Operator's delegated balance for the `strategy` is decreased by `shares`
Copy file name to clipboardExpand all lines: docs/core/EigenPodManager.md
+17-12Lines changed: 17 additions & 12 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -20,7 +20,7 @@ The `EigenPodManager` is the entry point for this process, allowing Stakers to d
20
20
21
21
`EigenPods` serve as the withdrawal credentials for one or more beacon chain validators controlled by a Staker. Their primary role is to validate beacon chain proofs for each of the Staker's validators. Beacon chain proofs are used to verify a validator's:
22
22
*`EigenPod.verifyWithdrawalCredentials`: withdrawal credentials and effective balance
*`EigenPod.verifyAndProcessWithdrawals`: withdrawable epoch, and processed withdrawals within historical block summary
25
25
26
26
See [/proofs](./proofs/) for detailed documentation on each of the state proofs used in these methods. Additionally, proofs are checked against a beacon chain block root supplied by Succinct's Telepathy protocol ([docs link](https://docs.telepathy.xyz/)).
@@ -77,7 +77,7 @@ To complete the deposit process, the Staker needs to prove that the validator's
77
77
#### `EigenPodManager.createPod`
78
78
79
79
```solidity
80
-
function createPod() external
80
+
function createPod() external onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) returns (address)
81
81
```
82
82
83
83
Allows a Staker to deploy an `EigenPod` instance, if they have not done so already.
@@ -110,6 +110,7 @@ function stake(
110
110
)
111
111
external
112
112
payable
113
+
onlyWhenNotPaused(PAUSED_NEW_EIGENPODS)
113
114
```
114
115
115
116
Allows a Staker to deposit 32 ETH into the beacon chain deposit contract, providing the credentials for the Staker's beacon chain validator. The `EigenPod.stake` method is called, which automatically calculates the correct withdrawal credentials for the pod and passes these to the deposit contract along with the 32 ETH.
@@ -119,7 +120,7 @@ Allows a Staker to deposit 32 ETH into the beacon chain deposit contract, provid
119
120
* See [`EigenPod.stake`](#eigenpodstake)
120
121
121
122
*Requirements*:
122
-
*If deploying an `EigenPod`, pause status MUST NOT be set: `PAUSED_NEW_EIGENPODS`
123
+
*Pause status MUST NOT be set: `PAUSED_NEW_EIGENPODS`
123
124
* See [`EigenPod.stake`](#eigenpodstake)
124
125
125
126
##### `EigenPod.stake`
@@ -213,29 +214,29 @@ For each validator the Pod Owner wants to verify, the Pod Owner must supply:
213
214
At this point, a Staker/Pod Owner has deployed their `EigenPod`, started their beacon chain validator, and proven that its withdrawal credentials are pointed to their `EigenPod`. They are now free to delegate to an Operator (if they have not already), or start up + verify additional beacon chain validators that also withdraw to the same `EigenPod`.
214
215
215
216
The primary method concerning actively restaked validators is:
Anyone (not just the Pod Owner) may call this method with a valid balance update proof to record an balance update in one of the `EigenPod's` validators.
233
+
Anyone (not just the Pod Owner) may call this method with one or more valid balance update proofs to record beacon chain balance updates in one or more of the `EigenPod's` validators.
233
234
234
235
A successful balance update proof updates the `EigenPod's` view of a validator's [effective balance](https://eth2book.info/capella/part2/incentives/balances/). If the validator's effective balance has changed, the difference is sent to `EigenPodManager.recordBeaconChainETHBalanceUpdate`, which updates the Pod Owner's shares. If the Pod Owner is delegated to an Operator, this delta is also sent to the `DelegationManager` to update the Operator's delegated beacon chain ETH shares.
235
236
236
237
Note that if a validator's effective balance has decreased, this method will result in shares being removed from the Pod Owner in `EigenPodManager.recordBeaconChainETHBalanceUpdate`. This may cause the Pod Owner's balance to go negative in some cases, representing a "deficit" that must be repaid before any withdrawals can be processed. One example flow where this might occur is:
237
238
* Pod Owner calls `DelegationManager.undelegate`, which queues a withdrawal in the `DelegationManager`. The Pod Owner's shares are set to 0 while the withdrawal is in the queue.
238
-
* Pod Owner's beacon chain ETH balance decreases (maybe due to slashing), and someone provides a proof of this to `EigenPod.verifyBalanceUpdate`. In this case, the Pod Owner will have negative shares in the `EigenPodManager`.
239
+
* Pod Owner's beacon chain ETH balance decreases (maybe due to slashing), and someone provides a proof of this to `EigenPod.verifyBalanceUpdates`. In this case, the Pod Owner will have negative shares in the `EigenPodManager`.
239
240
* After a delay, the Pod Owner calls `DelegationManager.completeQueuedWithdrawal`. The negative shares are then repaid out of the withdrawn assets.
240
241
241
242
For the validator whose balance should be updated, the caller must supply:
@@ -610,7 +611,7 @@ If the Pod Owner is not in undelegation limbo and is delegated to an Operator, t
610
611
611
612
*Entry Points*:
612
613
*`EigenPod.verifyWithdrawalCredentials`
613
-
*`EigenPod.verifyBalanceUpdate`
614
+
*`EigenPod.verifyBalanceUpdates`
614
615
*`EigenPod.verifyAndProcessWithdrawals`
615
616
616
617
*Effects*:
@@ -690,6 +691,7 @@ function withdrawNonBeaconChainETHBalanceWei(
690
691
)
691
692
external
692
693
onlyEigenPodOwner
694
+
onlyWhenNotPaused(PAUSED_NON_PROOF_WITHDRAWALS)
693
695
```
694
696
695
697
Allows the Pod Owner to withdraw ETH accidentally sent to the contract's `receive` function.
@@ -703,6 +705,7 @@ Withdrawals from this function are sent via the `DelayedWithdrawalRouter`, and c
703
705
* Sends `amountToWithdraw` wei to [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal)
704
706
705
707
*Requirements:*
708
+
* Pause status MUST NOT be set: `PAUSED_NON_PROOF_WITHDRAWALS`
706
709
* Caller MUST be the Pod Owner
707
710
*`amountToWithdraw` MUST NOT be greater than the amount sent to the contract's `receive` function
708
711
* See [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal)
@@ -717,6 +720,7 @@ function recoverTokens(
717
720
)
718
721
external
719
722
onlyEigenPodOwner
723
+
onlyWhenNotPaused(PAUSED_NON_PROOF_WITHDRAWALS)
720
724
```
721
725
722
726
Allows the Pod Owner to rescue ERC20 tokens accidentally sent to the `EigenPod`.
@@ -725,5 +729,6 @@ Allows the Pod Owner to rescue ERC20 tokens accidentally sent to the `EigenPod`.
725
729
* Calls `transfer` on each of the ERC20's in `tokenList`, sending the corresponding `amountsToWithdraw` to the `recipient`
726
730
727
731
*Requirements:*
732
+
* Pause status MUST NOT be set: `PAUSED_NON_PROOF_WITHDRAWALS`
728
733
*`tokenList` and `amountsToWithdraw` MUST have equal lengths
0 commit comments