Skip to content

Commit 9a95f5a

Browse files
feat(release): redistribution (#1355)
**Motivation:** Update core contracts to support redistribution. **Modifications:** We add a new contract, `SlashingWithdrawalRouter`, which handles the redistribution withdrawal queue. **AllocationManager**: - Inherit `Deprecated_OwnableUpgradeable` - Add a `createRedistributableOperatorSet` function, which creates an operatorSet with a 1-time settable `redistributionRecipient`. Normal operator sets have a `redistributionRecipient` of the default Burna address - `slashOperator` now aggregates all magnitudes and then make a _single_ call to the `DelegationManager` for a slash - New view functions for introspection: -- `getRedistributionRecipient`: gets the `redistributionRecipient` of an operatorSet. Non-redistributing operatorSets will return the `defaultBurnAddress` -- `isRedistributingOperatorSet`: whether an operatorSet is redistributable -- `getSlashCount`: the number of slashes an operatorSet has done -- `isOperatorRedistributable`: whether an operator is registered to a redistributable operatorSet **DelegationManager:** - Update internal method of `slashOperator` to take in `slashId` and `operatorSet`. **ShareManager (SM, EPM):** - `IncreaseBurnableShares` function is updated to take in an `operatorSet`, `slashId` **StrategyBase:** - Return `amountOut` upon withdrawal. This enables programmatic handling of redistributed funds **SemVerMixin:** - Update to only return the first character for `majorVersion` **General Size Modifications:** - The `AllocationManager` and `DelegationManager` inherit from `Deprecated_OwnableUpgradeable`, which saves ~400B from both of these contracts. - The `DelegationManager` and `AllocationManager` use internal methods to conserve space. We likely can get rid of these modifications due to the `Deprecated_OwnableUpgradeable` handling the majority of these **Result:** *After your change, what will change.*
2 parents 6314970 + da4de65 commit 9a95f5a

File tree

131 files changed

+15729
-3492
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

131 files changed

+15729
-3492
lines changed

.github/configs/storage-diff.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
{
22
"contracts": [
3+
{
4+
"name": "AllocationManager",
5+
"address": "0x948a420b8CC1d6BFd0B6087C2E7c344a2CD0bc39"
6+
},
37
{
48
"name": "AVSDirectory",
59
"address": "0x135dda560e946695d6f155dacafc6f1f25c1f5af"

.github/workflows/foundry.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ jobs:
6666
- name: Run ${{ matrix.suite }} tests
6767
run: |
6868
case "${{ matrix.suite }}" in
69-
Unit) forge test --no-match-contract Integration ;;
70-
Integration) forge test --match-contract Integration ;;
71-
Fork) forge test --match-contract Integration ;;
69+
Unit) forge test --no-match-contract Integration -vvv ;;
70+
Integration) forge test --match-contract Integration -vvv ;;
71+
Fork) forge test --match-contract Integration -vvv ;;
7272
esac
7373
env:
7474
FOUNDRY_PROFILE: ${{ matrix.suite == 'Fork' && 'forktest' || 'medium' }}

.gitmodules

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
[submodule "lib/ds-test"]
22
path = lib/ds-test
33
url = https://github.com/dapphub/ds-test
4-
[submodule "lib/forge-std"]
5-
path = lib/forge-std
6-
url = https://github.com/foundry-rs/forge-std
74
[submodule "lib/openzeppelin-contracts-v4.9.0"]
85
path = lib/openzeppelin-contracts-v4.9.0
96
url = https://github.com/OpenZeppelin/openzeppelin-contracts
@@ -13,3 +10,6 @@
1310
[submodule "lib/zeus-templates"]
1411
path = lib/zeus-templates
1512
url = https://github.com/Layr-Labs/zeus-templates
13+
[submodule "lib/forge-std"]
14+
path = lib/forge-std
15+
url = https://github.com/foundry-rs/forge-std

CHANGELOG/CHANGELOG-1.5.0.md

Lines changed: 69 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,85 @@
11
# v1.5.0 Redistribution
22

3-
**Use this template to draft changelog and submit PR to review by the team**
4-
53
## Release Manager
64

7-
@0xClandestine
8-
5+
@0xClandestine @ypatil12
96

107
## Highlights
118

12-
🚀 New Features – Highlight major new functionality
13-
- ...
14-
- ...
9+
🚀 New features
1510

16-
⛔ Breaking Changes – Call out backward-incompatible changes.
17-
- ...
18-
- ...
11+
- Redistribution is a feature that gives Service Builders a means to not just burn, but repurpose slashed funds.
12+
- We introduce a new operatorSet creation mechanism: [`AllocationManager.createRedistributingOperatorSets`](../docs/core/AllocationManager.md#createredistributingoperatorsets), which allows slashed funds to be redistributed to a `RedistributionRecipient`. *Note: The redistribution recipient can be set only once and is immutable*.
13+
- *All slashed funds will now be routed to individual `SlashEscrow` contracts.* The release of funds from escrow is gated by the `SlashEscrowFactory`. The `SlashEscrowFactory` deploys individual `SlashEscrow` contracts per slash, enforces a global delay for all escrowed funds, and handles pausing/unpausing of escrowed funds.
14+
- The original `createOperatorSets` function still exists. This function creates operatorSets whose slashed funds will eventually be burned. There is no mechanism to convert an operatorSet to be redistributing.
15+
- See [ELIP-006](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-006.md) for a full description.
1916

20-
📌 Deprecations – Mention features that are being phased out.
21-
- ...
22-
- ...
17+
⛔ Breaking changes
18+
- Funds marked for burning now go through a 4-day escrow period via `SlashEscrow` contracts. These funds are burned by calling [`SlashEscrowFactory.releaseSlashEscrow`](../docs/core/SlashEscrowFactory.md#releaseslashescrow).
2319

24-
🛠️ Security Fixes – Specify patched vulnerabilities.
25-
- ...
26-
- ...
20+
📌 Future Deprecations
21+
- The pre-redistribution burn pathway [`StrategyManager.decreaseBurnableShares`](../docs/core/StrategyManager.md#burnshares) will be deprecated in an upgrade *after* the redistribution release. This function can still be used to burn shares that have been slashed at any point prior to the redistribution upgrade.
2722

28-
🔧 Improvements – Enhancements to existing features.
29-
- ...
30-
- ...
23+
🛠️ Security Updates
24+
- The slashing of burned funds is no longer instantaneous. All slashed funds (burned or redistributed) now go through a 4-day escrow delay. The eventual burning or redistribution of slashed funds can be paused by the `PauserMultisig`.
25+
- The upgradability of the `SlashEscrowFactory` is controlled by the `CommunityMultisig`. The contract will have a separate `ProxyAdmin` from the rest of the EigenLayer core protocol. Each individual `SlashEscrow` contract is an immutable clone.
3126

32-
🐛 Bug Fixes – List resolved issues.
33-
- ...
34-
- ...
27+
🔧 Improvements
28+
- The [`AllocationManager.slashOperator`](../docs/core/AllocationManager.md#slashoperator) function now returns a `slashId` and array of `shares` to be burned/redistributed. **The function selector remains the same.**
29+
- OperatorSets now have a `slashCount` field, which returns the number of slashes completed by the operatorSet. This value only reflects the number of slashes after the redistribution upgrade.
30+
- `StrategyBase` returns an `amountOut` upon withdrawal to comply with standard ERC-4626 vaults.
31+
- The `AllocationManager` and `DelegationManager` no longer use ownable. Thus, they now inherit the `Deprecated_OwnableUpgradeable` mixin in its place to reduce codesize.
3532

33+
🐛 Bug Fixes
34+
- `SemVerMixin` is updated to only return the first character of `majorVersion`. We currently return `1.` and will return `1` after this upgrade.
3635

37-
## Changelog
38-
39-
Copy the one that's auto generated from github by default to here, and submit PR for review
4036

37+
## Changelog
4138

42-
- merged PRs in diff from last release
43-
- contributors
44-
- etc
39+
- feat(draft): `AllocationManager` redistribution support [PR #1346](https://github.com/layr-labs/eigenlayer-contracts/pull/1346)
40+
- feat: redistribution upgrade script [PR #1396](https://github.com/layr-labs/eigenlayer-contracts/pull/1396)
41+
- chore: bindings [PR #1422](https://github.com/layr-labs/eigenlayer-contracts/pull/1422)
42+
- test: redistribution upgrade [PR #1410](https://github.com/layr-labs/eigenlayer-contracts/pull/1410)
43+
- test: redistribution integration [PR #1415](https://github.com/layr-labs/eigenlayer-contracts/pull/1415)
44+
- docs: redistribution [PR #1409](https://github.com/layr-labs/eigenlayer-contracts/pull/1409)
45+
- chore: address redistribution nits [PR #1420](https://github.com/layr-labs/eigenlayer-contracts/pull/1420)
46+
- chore: style updates [PR #1416](https://github.com/layr-labs/eigenlayer-contracts/pull/1416)
47+
- perf: avoid binary search [PR #1417](https://github.com/layr-labs/eigenlayer-contracts/pull/1417)
48+
- feat: release escrow by strategy [PR #1412](https://github.com/layr-labs/eigenlayer-contracts/pull/1412)
49+
- refactor: review changes [PR #1411](https://github.com/layr-labs/eigenlayer-contracts/pull/1411)
50+
- refactor: `decreaseBurnOrRedistributableShares` [PR #1414](https://github.com/layr-labs/eigenlayer-contracts/pull/1414)
51+
- feat: deploy escrow in `initiateSlashEscrow` [PR #1413](https://github.com/layr-labs/eigenlayer-contracts/pull/1413)
52+
- chore: update naming [PR #1408](https://github.com/layr-labs/eigenlayer-contracts/pull/1408)
53+
- feat: simplify escrow delay; add convenience functions [PR #1406](https://github.com/layr-labs/eigenlayer-contracts/pull/1406)
54+
- fix: enumerable map overwrite [PR #1399](https://github.com/layr-labs/eigenlayer-contracts/pull/1399)
55+
- chore: decrease dm diff further [PR #1404](https://github.com/layr-labs/eigenlayer-contracts/pull/1404)
56+
- test: full coverage `SlashEscrowFactory` + `SlashEscrow` [PR #1403](https://github.com/layr-labs/eigenlayer-contracts/pull/1403)
57+
- chore: remove dm/alm code size optimizations [PR #1398](https://github.com/layr-labs/eigenlayer-contracts/pull/1398)
58+
- chore: rename burnable -> burnOrRedistributable; fix storage gap; remove poc code [PR #1397](https://github.com/layr-labs/eigenlayer-contracts/pull/1397)
59+
- chore: use internal getters; update `isOperatorRedistributable` [PR #1401](https://github.com/layr-labs/eigenlayer-contracts/pull/1401)
60+
- fix: storage checker [PR #1394](https://github.com/layr-labs/eigenlayer-contracts/pull/1394)
61+
- fix: review issues [PR #1391](https://github.com/layr-labs/eigenlayer-contracts/pull/1391)
62+
- feat: escrow funds in unique clone contracts [PR #1387](https://github.com/layr-labs/eigenlayer-contracts/pull/1387)
63+
- refactor: remove `v` prefix from `SemVerMixin` [PR #1385](https://github.com/layr-labs/eigenlayer-contracts/pull/1385)
64+
- test(redistribution): add unit tests [PR #1383](https://github.com/layr-labs/eigenlayer-contracts/pull/1383)
65+
- feat: add `SlashingWithdrawalRouter` [PR #1358](https://github.com/layr-labs/eigenlayer-contracts/pull/1358)
66+
- feat: simplify removeDepositShares in StrategyManager [PR #1373](https://github.com/layr-labs/eigenlayer-contracts/pull/1373)
67+
- feat(draft): `AllocationManager` redistribution support [PR #1346](https://github.com/layr-labs/eigenlayer-contracts/pull/1346)
68+
- ci: add explicit permissions to workflows to mitigate security concerns [PR #1392](https://github.com/layr-labs/eigenlayer-contracts/pull/1392)
69+
- ci: remove branch constraint for foundry coverage job
70+
- docs: add release managers to changelogs
71+
- docs: add templates for changelog and release notes [PR #1382](https://github.com/layr-labs/eigenlayer-contracts/pull/1382)
72+
- docs: add doc for steps to write deploy scripts [PR #1380](https://github.com/layr-labs/eigenlayer-contracts/pull/1380)
73+
- ci: add testnet envs sepolia and hoodi to validate-deployment-scripts [PR #1378](https://github.com/layr-labs/eigenlayer-contracts/pull/1378)
74+
- docs: update MAINTENANCE to include practices of merging multiple release-dev branches
75+
- docs: updating readme for dead links, readability, new language, and more [PR #1377](https://github.com/layr-labs/eigenlayer-contracts/pull/1377)
76+
- docs: bump deployment matrix to top of README [PR #1376](https://github.com/layr-labs/eigenlayer-contracts/pull/1376)
77+
- ci: add CI to auto validate deployment scripts [PR #1360](https://github.com/layr-labs/eigenlayer-contracts/pull/1360)
78+
- chore: update readme for v1.4.1 [PR #1361](https://github.com/layr-labs/eigenlayer-contracts/pull/1361)
79+
- ci: add cron to auto remove stale branches [PR #1348](https://github.com/layr-labs/eigenlayer-contracts/pull/1348)
80+
- chore: Update README for Holesky v1.4.2 release [PR #1351](https://github.com/layr-labs/eigenlayer-contracts/pull/1351)
81+
- docs: remove fork-pr instructions from CONTRIBUTING.md and MAINTENANCE.md
82+
- ci: disable delete unauthorized branches
83+
- docs: update addresses for mainnet [PR #1341](https://github.com/layr-labs/eigenlayer-contracts/pull/1341)
84+
- docs: enrich MAINTENANCE.md re: release branches [PR #1340](https://github.com/layr-labs/eigenlayer-contracts/pull/1340)
85+
- ci: enable auto delete branch upon eigengit launch [PR #1339](https://github.com/layr-labs/eigenlayer-contracts/pull/1339)

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`

0 commit comments

Comments
 (0)