Skip to content

Commit 5662ee4

Browse files
0xClandestineypatil12
authored andcommitted
feat(draft): AllocationManager redistribution support (#1346)
**Motivation:** Add support for redistributing slashed funds to specified recipients instead of burning them, while optimizing code size and improving test coverage. **Modifications:** Added a new redistribution system that allows AVSs to specify recipients for slashed funds. Code optimizations were made to reduce codesize, including consolidating repeated logic and a small `PermissionControllerMixin` refactor. **Result:** Slashed funds can now be redirected to specified recipients instead of being burned, with improved code efficiency and test coverage. feat: simplify removeDepositShares in StrategyManager (#1373) **Motivation:** the _removeDepositShares() returns a bool which is not of any meaning. simplify removeDepositShares in StrategyManager by removing that returned value **Modifications:** simplify _removeDepositShares() by removing returned extra bool **Result:** _removeDepositShares() is simplified and binary size is reduced feat: add `SlashingWithdrawalRouter` (#1358) **Motivation:** We want to hold slashed funds in escrow temporarily to maintain protocol security (prevent malicious actors from draining the contracts). **Modifications:** - Add `SlashingWithdrawalRouter`. **Result:** The `SlashingWithdrawalRouter` contract is added for managing slashed funds in the EigenLayer protocol. It provides a mechanism to handle the burning or redistribution of slashed shares after a delay period, ensuring proper handling of slashed funds while maintaining protocol security. --------- Co-authored-by: Yash Patil <[email protected]> test(redistribution): add unit tests (#1383) **Motivation:** We want to ensure `SlashingWithdrawalRouter` has appropriate unit test coverage. **Modifications:** - Add more unit tests. **Result:** 90% coverage. refactor: remove `v` prefix from `SemVerMixin` (#1385) **Motivation:** Slashing was deployed with using a `v` prefix, thus we're simply going to drop the prefix moving forward. **Modifications:** Prefix removed, and tests updated. **Result:** SemVerMixin no longer requires a `v` prefix. feat: escrow funds in unique clone contracts (#1387) **Motivation:** Current implementation is broken by rebase tokens. **Modifications:** - Rename SWR -> `SlashEscrowFactory`. - Add factory logic that deploys clones unique to their slash ID. **Result:** Funds will now be stored in clone contracts unique to their slash ID. fix: review issues (#1391) **Motivation:** We want to resolve any review issues that arise. **Modifications:** - Use larger of strategy or global delay: @non-fungible-nelson - Fix storage overrides noted from `Deprecated_OwnableUpgradeable` @wadealexc - Use `EnumerableSet` instead of `EnumerableSetUpgradaeable` since it doesn't contain storage - Add missing event in `initialize()`. - Prevent `address(0)` during `createRedistributableOperatorSets` for event sanitation. - Improve check legibility @wadealexc **Result:** Current review concerns have been addressed. fix: storage checker (#1394) **Motivation:** Storage checker didn't have ALM added. Also we needed to fix the deprecated ownable mixing. **Modifications:** Fix mixing to inherit from `ContextUpgradeable`. Add ALM to storage-diff.json. **Result:** Correct storage checks. --------- Co-authored-by: Yash Patil <[email protected]> chore: use internal getters; update `isOperatorRedistributable` (#1401) **Motivation:** We want to use internal getters wherever possible for style. **Modifications:** - Use `getRedistributionRecipient` in `isOperatorRedistributable` - Update `isOperatorRedistributable` to get all allocated/registered sets and then check if slashable and redistributable set for each - More comprehensive unit tests **Result:** Cleaner code + tests passing chore: rename burnable -> burnOrRedistributable; fix storage gap; remove poc code (#1397) **Motivation:** Burn shares naming is confusing, since shares are burnOrRedistributable **Modifications:** - For the new withdrawal path, call it `burnOrRedistributable`, so `burnOrRedistributableSharesIncreased` or `burnOrRedistributableSharesDecreased` - Bring back `burnableSharesDecreased` event for the legacy burn path - Rename `_operatorSetBurnableShares` to `_burnOrRedistributableShares` - Fix the storage gap, since `_burnOrRedistributableShares` is a mapping pointing to an enumerable map, not an enumerable map - Remove POC withdrawal queue code from the DM **Result:** Cleaner Redistribution code chore: remove dm/alm code size optimizations (#1398) **Motivation:** We have several code size optimizations in the DM/ALM. These are not needed anymore with the ownable deprecation. We can add in future upgrade if we want. **Modifications:** Remove all internal `_check` and modifiers. Make `slashOperatorShares` in the DM return to the original non-arrayified method. **Result:** Smaller code diff for redistribution. test: full coverage `SlashEscrowFactory` + `SlashEscrow` (#1403) **Motivation:** We want to ensure we have full coverage unit tests for `SlashEscrowFactory` and `SlashEscrow` in preparation for audits. **Modifications:** - Adds checks for all view methods. **Result:** Brings coverage up to 100% for all branches/fns/etc. chore: decrease dm diff further (#1404) **Motivation:** We want to minimize the diff between slashing. **Modifications:** Revert calldata/memory types in DM. **Result:** Smaller diff fix: enumerable map overwrite (#1399) **Motivation:** Currently, there's a bug in the `SM` where if you loop through the burnable shares queue, you may not clear all due to swap and pop of an Enumerable Map. Furthermore, we also are constrained by a token transfer taking too much gas and blocking transfer out of funds. **Modifications:** - Iterate backwards on `decreaseBurnOrRedistributableShares ` - Overloaded `decreaseBurnableShares` with a version to pass in an index. This function will escrow a single share (called by above too). Now, we do not need a max strategy per opSet requirement - Unit tests for both `increaseBurnOrRedistributableShares` and `decreaseBurnOrRedistributableShares` - Added the following introspection: -- `getBurnOrRedistributableShares(operatorSet, slashId) returns (Strategy[] Strats, uint256[] shares) -- `getBurnOrRedistributableShares(operatorSet, slashId, strategy) returns (shares) -- `getBurnOrRedistributableCount(operaotrSet, slashed) returns (count)` **Result:** Correct code with unit tests feat: simplify escrow delay; add convenience functions (#1406) **Motivation:** The escrow delay currently always you to complete escrows for a portion of strategies if there exists a strategy with a larger delay. This makes our codebase more complex. We also want to have a view function for offchain cronjob that needs to be called only once. **Modifications:** - Update `releaseEscrow` to obey the maximum delay across all strategies for a slash - Add a `getBurnOrRedistributionDelay` view function - Add a convenience view function `getPendingEscrows` for offchain burn job. This returns all pending operatorSets, and their associated redistribution status, slashIds, and completeBlocks - Standardize `uint32` for delay everywhere - Make `deploySlashEscrow` a public function **Result:** Simpler & correct code. chore: update naming (#1408) **Motivation:** We use `burnOrRedistributable` everywhere. Let's just use escrow instead. Much simpler. **Modifications:** `burnOrRedistributable -> escrow`. **Result:** Better readability. --------- Co-authored-by: clandestine.eth <[email protected]> fix: enumerable map ovewrite chore: format chore: address rebase issues test: increase burnable shares chore: add tests feat: simplify escrow delay chore: format chore: clarify natspec chore: fix typos feat: add convenience view functions (#1407) chore: remove commented code chore: format chore: format chore: naming docs: alm docs: dm docs: epm docs: strateby ase docs: sm chore: interface docs: sef chore: fix test chore: format fix: fmt and build chore: fix test chore: format
1 parent 94ad76c commit 5662ee4

16 files changed

+397
-79
lines changed

docs/core/AllocationManager.md

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Libraries and Mixins:
1111
| File | Notes |
1212
| -------- | -------- |
1313
| [`PermissionControllerMixin.sol`](../../src/contracts/mixins/PermissionControllerMixin.sol) | account delegation |
14+
| [`Deprecated_OwnableUpgradeable`](../../src/contracts/mixins/Deprecated_OwnableUpgradeable.sol) | deprecated ownable logic |
1415
| [`Pausable.sol`](../../src/contracts/permissions/Pausable.sol) | |
1516
| [`SlashingLib.sol`](../../src/contracts/libraries/SlashingLib.sol) | slashing math |
1617
| [`OperatorSetLib.sol`](../../src/contracts/libraries/OperatorSetLib.sol) | encode/decode operator sets |
@@ -170,13 +171,14 @@ mapping(address avs => EnumerableSet.UintSet) internal _operatorSets;
170171
mapping(bytes32 operatorSetKey => EnumerableSet.AddressSet) internal _operatorSetMembers;
171172
```
172173

173-
Every `OperatorSet` corresponds to a single AVS, as indicated by the `avs` parameter. On creation, the AVS provides an `id` (unique to that AVS), as well as a list of `strategies` the `OperatorSet` includes. Together, the `avs` and `id` form the `key` that uniquely identifies a given `OperatorSet`. Operators can register to and deregister from operator sets. In combination with allocating slashable magnitude, operator set registration forms the basis of operator slashability (discussed further in [Allocations and Slashing](#allocations-and-slashing)).
174+
Every `OperatorSet` corresponds to a single AVS, as indicated by the `avs` parameter. On creation, the AVS provides an `id` (unique to that AVS), as well as a list of `strategies` the `OperatorSet` includes. Together, the `avs` and `id` form the `key` that uniquely identifies a given `OperatorSet`. Operators can register to and deregister from operator sets. In combination with allocating slashable magnitude, operator set registration forms the basis of operator slashability (discussed further in [Allocations and Slashing](#allocations-and-slashing)). There are two types of operatorSets, redistributing and non-redistributing.
174175

175176
**Concepts:**
176177
* [Registration Status](#registration-status)
177178

178179
**Methods:**
179180
* [`createOperatorSets`](#createoperatorsets)
181+
* [`createRedistributingOperatorSets`](#createredistributingoperatorsets)
180182
* [`addStrategiesToOperatorSet`](#addstrategiestooperatorset)
181183
* [`removeStrategiesFromOperatorSet`](#removestrategiesfromoperatorset)
182184
* [`registerForOperatorSets`](#registerforoperatorsets)
@@ -237,7 +239,7 @@ function createOperatorSets(
237239

238240
_Note: this method can be called directly by an AVS, or by a caller authorized by the AVS. See [`PermissionController.md`](../permissions/PermissionController.md) for details._
239241

240-
AVSs use this method to create new operator sets. An AVS can create as many operator sets as they desire, depending on their needs. Once created, operators can [allocate slashable stake to](#modifyallocations) and [register for](#registerforoperatorsets) these operator sets.
242+
AVSs use this method to create new operator sets. An AVS can create as many operator sets as they desire, depending on their needs. Once created, operators can [allocate slashable stake to](#modifyallocations) and [register for](#registerforoperatorsets) these operator sets. The `redistributionRecipient` is the `DEFAULT_BURN_ADDRESS`, where slashed funds are sent.
241243

242244
On creation, the `avs` specifies an `operatorSetId` unique to the AVS. Together, the `avs` address and `operatorSetId` create a `key` that uniquely identifies this operator set throughout the `AllocationManager`.
243245

@@ -254,6 +256,38 @@ Optionally, the `avs` can provide a list of `strategies`, specifying which strat
254256
* AVS MUST have registered metadata via calling `updateAVSMetadataURI`
255257
* For each `CreateSetParams` element:
256258
* Each `params.operatorSetId` MUST NOT already exist in `_operatorSets[avs]`
259+
260+
#### `createRedistributingOperatorSets`
261+
262+
```solidity
263+
/**
264+
* @notice Allows an AVS to create new redistributing operator sets, defining strategies and the redistribution recipient the operator set uses
265+
*/
266+
function createRedistributingOperatorSets(
267+
address avs,
268+
CreateSetParams[] calldata params,
269+
address[] calldata redistributionRecipients
270+
)
271+
external
272+
checkCanCall(avs)
273+
```
274+
275+
AVSs use this method to create new redistributing operatorSets. Unlike the previous function, slashed funds for this operatorSet are sent to a `redistributionRecipient`. This value is set only once, upon creation. Note that redistributing operatorSets may not have Native ETH, as the protocol does not support native eth redistribution. See [ELIP-006](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-006.md) for additional context.
276+
277+
*Effects*:
278+
* For each `CreateSetParams` element:
279+
* For each `params.strategies` element:
280+
* Add `strategy` to `_operatorSetStrategies[operatorSetKey]`
281+
* Emits `StrategyAddedToOperatorSet` event
282+
* Sets the `redistributionRecipient` of the operatorSet
283+
* Emits the `RedistributionAddressSet`
284+
285+
*Requirements*:
286+
* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
287+
* AVS MUST have registered metadata via calling `updateAVSMetadataURI`
288+
* The `redistributionRecipient` MUST NOT be the 0 address
289+
* For each `CreateSetParams` element:
290+
* Each `params.operatorSetId` MUST NOT already exist in `_operatorSets[avs]`
257291

258292
#### `addStrategiesToOperatorSet`
259293

@@ -287,6 +321,7 @@ This function allows an AVS to add slashable strategies to a given operator set.
287321
* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
288322
* The operator set MUST be registered for the AVS
289323
* Each proposed strategy MUST NOT be registered for the operator set
324+
* If the operatorSet is redistributing, the `BEACONCHAIN_ETH_STRAT` may not be added, since redistribution is not supported for native eth
290325

291326
#### `removeStrategiesFromOperatorSet`
292327

@@ -717,6 +752,9 @@ struct SlashingParams {
717752
* - wadsToSlash: Array of proportions to slash from each strategy (must be between 0 and 1e18).
718753
* - description: Description of why the operator was slashed.
719754
*
755+
* @return slashId The ID of the slash.
756+
* @return shares The amount of shares that were slashed for each strategy.
757+
*
720758
* @dev For each strategy:
721759
* 1. Reduces the operator's current allocation magnitude by wadToSlash proportion.
722760
* 2. Reduces the strategy's max and encumbered magnitudes proportionally.
@@ -734,6 +772,7 @@ function slashOperator(
734772
external
735773
onlyWhenNotPaused(PAUSED_OPERATOR_SLASHING)
736774
checkCanCall(avs)
775+
returns (uint256, uint256[] memory)
737776
```
738777

739778
_Note: this method can be called directly by an AVS, or by a caller authorized by the AVS. See [`PermissionController.md`](../permissions/PermissionController.md) for details._
@@ -748,7 +787,7 @@ There are two edge cases to note for this method:
748787
1. In the process of slashing an `operator` for a given `strategy`, if the `Allocation` being slashed has a `currentMagnitude` of 0, the call will NOT revert. Instead, the `strategy` is skipped and slashing continues with the next `strategy` listed. This is to prevent an edge case where slashing occurs on or around a deallocation's `effectBlock` -- if the call reverted, the entire slash would fail. Skipping allows any valid slashes to be processed without requiring resubmission.
749788
2. If the `operator` has a pending, non-completable deallocation, the deallocation's `pendingDiff` is reduced proportional to the slash. This ensures that when the deallocation is completed, less `encumberedMagnitude` is freed.
750789

751-
Once slashing is processed for a strategy, [slashed stake is burned via the `DelegationManager`](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md#burning-of-slashed-funds).
790+
Once slashing is processed for a strategy, [slashed stake is burned or redistributed via the `DelegationManager`](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md#burning-of-slashed-funds).
752791

753792
*Effects*:
754793
* Given an `operator` and `operatorSet`, then for each `params.strategies` element and its corresponding `allocation`:
@@ -765,6 +804,8 @@ Once slashing is processed for a strategy, [slashed stake is burned via the `Del
765804
* If this list now has a length of 0, remove `operatorSetKey` from `allocatedSets[operator]`
766805
* Calls [`DelegationManager.slashOperatorShares`](./DelegationManager.md#slashoperatorshares)
767806
* Emit an `OperatorSlashed` event
807+
* Increments the `slashId` for the operatorSet
808+
* Returns `slashId` and the number of shares slashed for each strategy
768809

769810
*Requirements*:
770811
* Pause status MUST NOT be set: `PAUSED_OPERATOR_SLASHING`

docs/core/DelegationManager.md

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Libraries and Mixins:
2525

2626
The `DelegationManager` is the intersection between the two sides of the protocol. It (i) allows stakers to delegate/undelegate to/from operators, (ii) handles withdrawals and withdrawal processing for assets in both the `StrategyManager` and `EigenPodManager`, and (iii) manages accounting around slashing for stakers and operators.
2727

28-
When operators are slashed by AVSs, it receives share burning directives from the `AllocationManager`. When stakers deposit assets using the `StrategyManager/EigenPodManager`, it tracks share/delegation accounting changes. The `DelegationManager` combines inputs from both sides of the protocol into a staker's "deposit scaling factor," which serves as the primary conversion vehicle between a staker's _raw deposited assets_ and the _amount they can withdraw_.
28+
When operators are slashed by AVSs, it receives share slashing directives from the `AllocationManager`. When stakers deposit assets using the `StrategyManager/EigenPodManager`, it tracks share/delegation accounting changes. The `DelegationManager` combines inputs from both sides of the protocol into a staker's "deposit scaling factor," which serves as the primary conversion vehicle between a staker's _raw deposited assets_ and the _amount they can withdraw_.
2929

3030
The `DelegationManager's` responsibilities can be broken down into the following concepts:
3131
* [Becoming an Operator](#becoming-an-operator)
@@ -230,7 +230,7 @@ mapping(address staker => EnumerableSet.Bytes32Set withdrawalRoots) internal _st
230230
mapping(bytes32 withdrawalRoot => Withdrawal withdrawal) public queuedWithdrawals;
231231
232232
/// @notice Contains history of the total cumulative staker withdrawals for an operator and a given strategy.
233-
/// Used to calculate burned StrategyManager shares when an operator is slashed.
233+
/// Used to calculate burned/redistributed StrategyManager shares when an operator is slashed.
234234
/// @dev Stores scaledShares instead of total withdrawn shares to track current slashable shares, dependent on the maxMagnitude
235235
mapping(address operator => mapping(IStrategy strategy => Snapshots.DefaultZeroHistory)) internal
236236
_cumulativeScaledSharesHistory;
@@ -396,7 +396,7 @@ Just as with a normal queued withdrawal, these withdrawals can be completed by t
396396
* See [`StrategyManager.removeDepositShares`](./StrategyManager.md#removedepositshares)
397397
* _Deposit shares_ are converted to _withdrawable shares_ (See [Slashing Factors and Scaling Shares](#slashing-factors-and-scaling-shares)). These are decremented from the operator's delegated shares.
398398
* _Deposit shares_ are converted to _scaled shares_ (See [Shares Accounting - Queue Withdrawals](./accounting/SharesAccounting.md#queue-withdrawal)), which are stored in the `Withdrawal` struct
399-
* _Scaled shares_ are pushed to `_cumulativeScaledSharesHistory`, which is used for burning slashed shares
399+
* _Scaled shares_ are pushed to `_cumulativeScaledSharesHistory`, which is used for burning or redistributing slashed shares
400400
* The `Withdrawal` is saved to storage
401401
* The hash of the `Withdrawal` is marked as "pending"
402402
* The hash of the `Withdrawal` is set in a mapping to the `Withdrawal` struct itself
@@ -487,7 +487,7 @@ For each `QueuedWithdrawalParams` passed as input, a `Withdrawal` is created in
487487
* The raw _deposit shares_ are removed from the staker's deposit share balance in the corresponding share manager (`EigenPodManager` or `StrategyManager`).
488488
* _Scaled shares_ are calculated by applying the staker's _deposit scaling factor_ to their _deposit shares_. Scaled shares:
489489
* are stored in the `Withdrawal` itself and used during withdrawal completion
490-
* are added to the operator's `cumulativeScaledSharesHistory`, where they can be burned if slashing occurs while the withdrawal is in the queue
490+
* are added to the operator's `cumulativeScaledSharesHistory`, where they can be burned or redistributed if slashing occurs while the withdrawal is in the queue
491491
* _Withdrawable shares_ are calculated by applying both the staker's _deposit scaling factor_ AND any appropriate _slashing factor_ to the staker's _deposit shares_. These "currently withdrawable shares" are removed from the operator's delegated shares (if applicable).
492492

493493
Note that the `QueuedWithdrawalParams.__deprecated_withdrawer` field is ignored. Originally, this was used to create withdrawals that could be completed by a third party. This functionality was removed during the M2 release due to growing concerns over the phish risk this presented. Until the slashing release, this field was explicitly checked for equivalence with `msg.sender`; however, at present it is ignored. All `Withdrawals` are created with `withdrawer == staker` regardless of this field's value.
@@ -499,7 +499,7 @@ Note that the `QueuedWithdrawalParams.__deprecated_withdrawer` field is ignored.
499499
* See [`StrategyManager.removeDepositShares`](./StrategyManager.md#removedepositshares)
500500
* _Deposit shares_ are converted to _withdrawable shares_ (See [Slashing Factors and Scaling Deposits](#slashing-factors-and-scaling-shares)). These are decremented from their operator's delegated shares (if applicable)
501501
* _Deposit shares_ are converted to _scaled shares_ (See [Shares Accounting - Queue Withdrawals](./accounting/SharesAccounting.md#queue-withdrawal)), which are stored in the `Withdrawal` struct
502-
* If the caller is delegated to an operator, _scaled shares_ are pushed to that operator's `_cumulativeScaledSharesHistory`, which may be burned if slashing occurs.
502+
* If the caller is delegated to an operator, _scaled shares_ are pushed to that operator's `_cumulativeScaledSharesHistory`, which may be burned or redistributed if slashing occurs.
503503
* The `Withdrawal` is saved to storage
504504
* The hash of the `Withdrawal` is marked as "pending"
505505
* The hash of the `Withdrawal` is set in a mapping to the `Withdrawal` struct itself
@@ -644,40 +644,46 @@ These methods are all called by other system contracts: the `AllocationManager`
644644

645645
```solidity
646646
/**
647-
* @notice Decreases the operators shares in storage after a slash and increases the burnable shares by calling
647+
* @notice Decreases the operators shares in storage after a slash and increases the burn or redistributable shares by calling
648648
* into either the StrategyManager or EigenPodManager (if the strategy is beaconChainETH).
649649
* @param operator The operator to decrease shares for
650+
* @param operatorSet The OperatorSet to decrease shares for
651+
* @param slashID The slashID to decrease shares for
650652
* @param strategy The strategy to decrease shares for
651653
* @param prevMaxMagnitude the previous maxMagnitude of the operator
652654
* @param newMaxMagnitude the new maxMagnitude of the operator
653655
* @dev Callable only by the AllocationManager
654656
* @dev Note: Assumes `prevMaxMagnitude <= newMaxMagnitude`. This invariant is maintained in
655657
* the AllocationManager.
658+
* @return depositSharesToSlash The total deposit shares to slash (burn or redistribute).
656659
*/
657660
function slashOperatorShares(
658661
address operator,
662+
OperatorSet calldata operatorSet,
663+
uint256 slashId,
659664
IStrategy strategy,
660665
uint64 prevMaxMagnitude,
661666
uint64 newMaxMagnitude
662667
)
663668
external
664669
onlyAllocationManager
665670
nonReentrant
671+
returns (uint256 depositSharesToSlash)
666672
```
667673

668674
_See [Shares Accounting - Slashing](https://github.com/Layr-Labs/eigenlayer-contracts/blob/slashing-magnitudes/docs/core/accounting/SharesAccounting.md#slashing) for a description of the accounting in this method._
669675

670676
This method is called by the `AllocationManager` when processing an AVS's slash of an operator. Slashing occurs instantly, with this method directly reducing the operator's delegated shares proportional to the slash.
671677

672-
Additionally, any _slashable shares_ in the withdrawal queue are marked for burning according to the same slashing proportion (shares in the withdrawal queue remain slashable for `MIN_WITHDRAWAL_DELAY_BLOCKS`). For the slashed strategy, the corresponding share manager (`EigenPodManager/StrateyManager`) is called, increasing the burnable shares for that strategy.
678+
Additionally, any _slashable shares_ in the withdrawal queue are marked for burn or redistribution according to the same slashing proportion (shares in the withdrawal queue remain slashable for `MIN_WITHDRAWAL_DELAY_BLOCKS`). For the slashed strategy, the corresponding share manager (`EigenPodManager/StrateyManager`) is called, increasing the burn or redistributable shares for that operatorSet, slashId, and strategy combination.
673679

674-
**Note**: native ETH does not currently possess a burning mechanism, as this requires Pectra to be able to force exit validators. Currently, slashing for the `beaconChainETHStrategy` is realized by modifying the amount stakers are able to withdraw.
680+
**Note**: native ETH does not currently possess a burn/redistribution mechanism, as this requires Pectra to be able to force exit validators. Currently, slashing for the `beaconChainETHStrategy` is realized by modifying the amount stakers are able to withdraw.
675681

676682
*Effects*:
677683
* The `operator's` `operatorShares` are reduced for the given `strategy`, according to the proportion given by `prevMaxMagnitude` and `newMaxMagnitude`
678-
* Any slashable shares in the withdrawal queue are marked for burning according to the same proportion
679-
* See [`StrategyManager.increaseBurnableShares`](./StrategyManager.md#increaseBurnableShares)
680-
* See [`EigenPodManager.increaseBurnableShares`](./EigenPodManager.md#increaseBurnableShares)
684+
* Any slashable shares in the withdrawal queue are marked for burning or redistribution according to the same proportion
685+
* See [`StrategyManager.increaseBurnOrRedistributableShares`](./StrategyManager.md#increaseBurnableShares)
686+
* See [`EigenPodManager.increaseBurnOrRedistributableShares`](./EigenPodManager.md#increaseBurnableShares)
681687

682688

683689
*Requirements*:

0 commit comments

Comments
 (0)