Skip to content

Conversation

@0xClandestine
Copy link
Member

@0xClandestine 0xClandestine commented Oct 9, 2025

Motivation:

We want a centralized way to track protocol contracts, semantic versioning, and improve our pausing procedures.

Modifications:

The main addition is ProtocolRegistry which has the following methods:
- ship() - Batch deployment registration with semantic versioning and configuration flags (only admin).
- configure() - Configure an existing deployment (only admin).
- pauseAll() - Emergency pausing across all pausable contracts via single transaction (only pauser).
- version() - Get the semantic version of the protocol.
- majorVersion() - Get the major version of the protocol.
- getAddress() - Get deployment address by contract name.
- getDeployment() - Get complete deployment info (address, implementation, config) by name.
- getAllDeployments() - Get all deployments with full information.
- totalDeployments() - Get total number of registered deployments.

Result:

A registry enabling easy introspection of protocol contracts, improved emergency response capabilities, and centralized semantic versioning (lowering the codesize burden on most of our contracts).

import "../interfaces/IPausable.sol";
import "./storage/ProtocolRegistryStorage.sol";

contract ProtocolRegistry is Initializable, AccessControlEnumerableUpgradeable, ProtocolRegistryStorage {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Notes for Upgrade:

  1. We would ideally want deployment address to be the same across all chains
  2. Need to add protocolRegistry as a pauser to the PauserRegistry

@0xClandestine 0xClandestine force-pushed the feat/add-protocol-registry branch from f6d9d32 to 17b45c5 Compare October 15, 2025 18:27
@0xClandestine 0xClandestine changed the base branch from refactor/split-alm to release/slashing-ux-improvements October 15, 2025 18:28
@0xClandestine 0xClandestine force-pushed the feat/add-protocol-registry branch from 17b45c5 to c6861c2 Compare October 15, 2025 18:33
@0xClandestine 0xClandestine changed the base branch from release/slashing-ux-improvements to release-dev/slashing-ux-improvements October 15, 2025 18:34
@ypatil12 ypatil12 force-pushed the release-dev/slashing-ux-improvements branch from bce9cbb to c572ec5 Compare October 15, 2025 18:39
oops

feat: Add ProtocolRegistry + one-click pause

cleanup

more introspection

cleanup

gap

mv storage

don't track impls

no semver history

events provide this

add IProxyAdmin

integrate proxy admin for impl lookup

single `ship` fn

don't pause if deprecated

add getAddress

use enumerable map

prevents duplicates

cleanup

cleanup

test

make fmt

gap

add `AccessControlEnumerable` (to differ pauser and admin)

also opens the door to pausing procedure improvements

unused immutable

remove impl introspection

cleanup

doc name format

hardcode ci

stable now includes 1.4.0 which breaks forge fmt

add SemanticVersionUpdated
@0xClandestine 0xClandestine force-pushed the feat/add-protocol-registry branch from 994c644 to 2336ee5 Compare October 15, 2025 18:41
@0xClandestine 0xClandestine merged commit 1359137 into release-dev/slashing-ux-improvements Oct 15, 2025
9 checks passed
@0xClandestine 0xClandestine deleted the feat/add-protocol-registry branch October 15, 2025 19:52
ypatil12 pushed a commit that referenced this pull request Nov 6, 2025
**Motivation:**

We want a centralized way to track protocol contracts, semantic
versioning, and improve our pausing procedures.

**Modifications:**

The main addition is `ProtocolRegistry` which has the following methods:
- `ship()` - Batch deployment registration with semantic versioning and
configuration flags (only admin).
	- `configure()` - Configure an existing deployment (only admin).
- `pauseAll()` - Emergency pausing across all pausable contracts via
single transaction (only pauser).
	- `version()` - Get the semantic version of the protocol.
	- `majorVersion()` - Get the major version of the protocol.
	- `getAddress()` - Get deployment address by contract name.
- `getDeployment()` - Get complete deployment info (address,
implementation, config) by name.
	- `getAllDeployments()` - Get all deployments with full information.
	- `totalDeployments()` - Get total number of registered deployments.

**Result:**

A registry enabling easy introspection of protocol contracts, improved
emergency response capabilities, and centralized semantic versioning
(lowering the codesize burden on most of our contracts).
ypatil12 added a commit that referenced this pull request Dec 2, 2025
# v1.9.0 Slashing UX Improvements

## Release Manager

@ypatil12 @eigenmikem @0xClandestine

# Overview

The Slashing UX improvement release is a tech debt-focused release that
improves key parts of the Eigenlayer Core UX. This release will upgrade
every core contract.

The below release notes cover Core Contracts.

## Highlights

🚀 New Features

- The `AllocationManager` has been split into two contracts to address
size limitations of the contract. The main contract handles
state-mutating operations, while `AllocationManagerView` handles all
read-only view functions. **This is not a breaking change for
introspection as previous introspection calls fallback to `delegateCall`
into the `AllocationManagerView` contract.**. For more information, see
the [contract
architecture](../docs/core/AllocationManager.md#contract-architecture).
- The `ProtocolRegistry` is a new contract that stores all proxy
contract addresses, global semver, and has the ability to pause the
entire protocol. This contract will be deployed on all chains.
- Two new `createOperatorSets` functions (for redistributing and non
redistributing operatorSets) have been added that take in a slasher
address. This address is the *only* address that can slash an
operatorSet. Changing the address is behind a
`ALLOCATION_CONFIGURATION_DELAY` (17.5 days on mainnet).

⛔ Breaking Changes

- The slasher permissions are set and stored in the `AllocationManager`
instead of the `PermissionController`. Only one address can slash an
operatorSet; the address is initially set upon creation of the
operatorSet. OperatorSets created prior to this release will have their
slasher migrated based on the following rules:
- If there is no slasher set or the slasher in the
`PermissionController` is the 0 address, the AVS address will be set as
the slasher
- If there are multiple slashers set in the `PermissionController`, the
first address will be set as the slasher
- Semver (`SemverMixin.sol`) has been removed from all contracts, except
from those that inherit the `SignatureUtilsMixin`. The version of the
core protocol can be introspected via the `ProtocolRegistry`.

📌 Deprecations

The old `createOperatorSets` functions in the leftmost column will be
deprecated in Q2 2026 in favor of the newly specified functions. The old
functions do not pass in a slasher. The new functions do pass in a
slasher. If the old function is used, the slasher of the operatorSet is
set to the avs address.

| Function | MigrateTo | Notes |
| -------- | -------- | -------- |
| `createOperatorSets(avs, CreateSetParams[])` |
`createOperatorSets(address avs, CreateSetParamsV2[])` | New function
takes in a slasher address |
| `createRedistributingOperatorSets(avs, CreateSetParams[],
redistributionRecipients[])` | `createRedistributingOperatorSets(avs,
CreateSetParamsV2[], redistributionRecipients[])` | New function takes
in a slasher address |

🔧 Improvements

- Added a non-revert `_canCall` in the `PermissionControllerMixin` for
space savings. This function is used in the `AllocationManager` and
`DelegationManager`.
- The allocation delay for a newly created operator is active
immediately. This allows operators to make allocations instantly after
registering in the core.
- The internal `SlashingLib.scaleForBurning` function has been
deprecated in favor of `SlashingLib.calcSlashedAmount`, standardizing
the calculation of slashed shares across the withdrawal queue and
storage. See [PR
#1502](#1502) for
more information.


# Changelog

- feat: re-enable forge fmt + foundry v1.5.0 [PR
#1669](#1669)
- feat: substitute calcSlashedAmount for scaleForBurning [PR
#1502](#1502)
- fix: `v1.9.0` upgrade script [PR
#1666](#1666)
- feat: `v1.9.0` upgrade scripts + reusable upgrade helpers [PR
#1665](#1665)
- chore: update interface natspec for DM [PR
#1664](#1664)
- feat: slashing commitments [PR
#1645](#1645)
- feat: remove semver + minor optimizations [PR
#1654](#1654)
- feat: split `AllocationManager` [PR
#1643](#1643)
- feat: add protocol registry [PR
#1655](#1655)
- feat: instant alloc delay from dm [PR
#1646](#1646)
- chore: remove holesky [PR
#1662](#1662)
- chore: hardcode foundry ci to v1.3.5 [PR
#1658](#1658)
- chore: hardcode foundry to v1.3.5 in ci [PR
#1657](#1657)
- feat(audit): publish Hourglass + Multichain + RMS audit reports [PR
#1644](#1644)
- docs: add transport frequency for multichain [PR
#1642](#1642)
- chore: update readMe for multichain/hourglass [PR
#1637](#1637)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants