Skip to content

Conversation

ypatil12
Copy link
Collaborator

@ypatil12 ypatil12 commented Jul 10, 2025

v1.4.0 MultiChain/MiddlewareV2

The multichain/middlewareV2 release enables AVSs to launch their services and make verified Operator outputs available on any EVM chain, meeting their customers where they are. AVSs can specify custom operator weights to be transported to any destination chain. The release has 3 components:

  1. Core Contracts
  2. AVS Contracts
  3. Offchain Infrastructure

The below release notes cover AVS Contracts. For more information on the end to end protocol, see our docs, core contract docs, and ELIP-008.

Release Manager

@ypatil12 @eigenmikem

Highlights

This multichain release only introduces new standards and contracts. As a result, there are no breaking changes or deprecations. All new contracts are in the middlewareV2 folder.

🚀 New Features – Highlight major new functionality

  • AVSRegistrar: The primary interface for managing operator registration and deregistration within an AVS. It integrates with core EigenLayer contracts to ensure operators have valid keys and are properly registered in operator sets
  • OperatorTableCalculator: Responsible for calculating stake weights of operator. These stake weights are aggregated and transported using the Eigenlayer Multichain Protocol. In order to utilize the multichain protocol, an AVS MUST deploy an OperatorTableCalculator and register it in the CrossChainRegistry in EigenLayer core. See our core documentation for this process.

🔧 Improvements – Enhancements to existing features.

  • The multichain protocol has protocol-ized several AVS-deployed contracts, enabling an simpler AVS developer experience. These include:
    • KeyRegistrar: Manages BLS and ECDSA signing keys. AVSs no longer have to deploy a BLSAPKRegistry
    • CertificateVerifier: Handles signature verification for BLS and ECDSA keys. AVSs no longer have to deploy a BLSSignatureChecker
    • Offchain Multichain Transport: AVSs no longer have to maintain avs-sync to keep operator stakes fresh

Changelog

  • test: ecdsa stake reg/bls sig checker utils PR #500
  • test: table calc PR #499
  • fix: avs registrar as identifier PR #494
  • fix: table calc interface PR #493
  • docs: middlewareV2/multichain PR #489
  • chore: add avs registrar interfaces PR #491
  • chore: remove unused imports PR #490
  • feat: add table calculators PR #488
  • chore: remove interfaces PR #485
  • chore: bump up ecdsa dependency PR #487
  • chore: bump up eigenlayer-contracts dependency PR #486
  • feat: avs registrar PR #484
  • refactor: singleton cv combining ECDSA and BN254 PR #479
  • feat: multichain interfaces PR #477

ypatil12 and others added 14 commits July 10, 2025 13:56
**Motivation:**

Initial interfaces for multi chain. 

**Modifications:**

***TableCalculator***

The separation here is designed to decouple
- Curve-Specific Calculation
- Generic Table Calculation Getters (applicable for all curve types)
- Weighting. `IOperatorWeightCalculator` is a calculation contract that
defines how to weigh stakes of an operatorSet. This contract may or may
not be stateless. In practice, this can be an external contract or
library.

```mermaid
classDiagram
    IOperatorWeightCalculator <-- IOperatorTableCalculator : uses many
    IOperatorTableCalculator <|-- IECDSATableCalculator : implements
    IOperatorTableCalculator <|-- IBN254TableCalculator : implements

    
    class IOperatorWeightCalculator {
        +getOperatorWeights(OperatorSet)
    }
    
    class IOperatorTableCalculator {
        +setOperatorWeightCalculator(OperatorSet, IOperatorWeightCalculator)
        +calculateOperatorTableBytes(OperatorSet) returns (bytes)
        +getOperatorWeightCalculator(OperatorSet) returns (IOperatorWeightCalculator)
    }
    
    class IECDSATableCalculator {
        +calculateOperatorTable(OperatorSet) returns (ECDSAOperatorInfo[])
    }
    
    class IBN254TableCalculator {
        +calculateOperatorTable(OperatorSet) returns (BN254OperatorSetInfo)
        +getOperatorInfos(OperatorSet) returns (BN254OperatorInfo[])
    }
```

***CertificateVerifier***

The `CertificateVerifier` decouples setting of the table and
verification. See below:

```mermaid
classDiagram
    ICertificateVerifier <|-- IBN254CertificateVerifier: implements
    IBN254TableManager <|-- IBN254CertificateVerifier: implements
    
    class ICertificateVerifier {
        <<interface>>
        +setOperatorTableUpdater(address)
        +setEjector(address)
        +setMaxOperatorTableStaleness(uint32)
        +operatorSet() returns (OperatorSet)
        +operatorTableUpdater() returns (address)
        +ejector() returns (address)
        +maxOperatorTableStaleness() returns (uint32)
        +latestReferenceTimestamp() returns (uint32)
    }
    
    class IBN254TableManager {
        <<interface>>
        +updateOperatorTable(OperatorSet, uint32, BN254OperatorSetInfo)
        +ejectOperators(OperatorSet, uint32, uint32[], BN254OperatorInfoWitness[])
    }
    
    class IBN254CertificateVerifier {
        <<interface>>
        +verifyCertificate(BN254Certificate) returns (uint96[])
        +verifyCertificateProportion(BN254Certificate, uint16[]) returns (bool)
        +verifyCertificateNominal(BN254Certificate, uint96[]) returns (bool)
    }
```

***Migration Story***
We want a migration path to store all tables in a singleton core
contract. In order to do so, we future-proofed the _transportation_
interface to pass in an `operatorSet` when updating an operatorTable.
Permissions setting can be done by an EOA, so we don't need to make that
forwards compatible. If all the tables live in a single contract, then
for Bn254 caching, the verification must cache stakes in the singleton.

**Result:**

Initial Interfaces. I see these changing for the following reasons:

- Encoding leafs with a salt
- Table generation-based trusted operator table updates
- Multiquorum sig support (but EigenDA can build their own)
**Motivation:**

Redesigning to have a singleton CertificateVerifier that is deployed per
destination chain where the AVSs utilizing this contract trust the
`globalOperatorTableRoot` is valid and the EigenDA operatorSet which
configures this in a timely basis.

**Modifications:**

- Combined the ECDSACertificateVerifier and the BN254CertificateVerifier
interfaces into CertificateVerifier.
- OperatorSet configuration parameters are now configured on the L1 via
a `CrossChainRegistry` contract and transported by the following
functions.
- `ICertificateVerifier.updateECDSAOperatorTable` or
`ICertificateVerifier.updateBN254OperatorTable`

**Result:**

Standarizing interface with a canonical CertVerifier contract and less
deployment duplication from AVSs.
**Motivation:**

We want to update the AVS registrar to be minimal & modular. 

**Modifications:**

Add a new `AVSRegistrar` with first class support with the
`KeyRegistrar`. We also have the following modules:
1. `SocketRegistry`
2. `AllowList`

The above modules are _abstract_ and are inherited by `AVSRegistrars` in
the `presets` folder: `AVSRegistrarWithAllowlist` and
`AVSRegistrarWithSocket`.

**Result:**

Simple AVSRegistrar. Note that we are still pending on the
`KeyRegistrar` interface update:
Layr-Labs/eigenlayer-contracts#1421
**Motivation:**

We need to pin the `eigenlayer-contracts` dependency to use the
`release-dev/multichain` and pull the latest changes.

**Modifications:**

* Pinned `eigenlayer-contracts` dependency to use the
`release-dev/multichain` in `.gitmodules`
* Updated affected Mocks and tests (due to MOOCOW and Redistribution
changes)

**Result:**

Middleware now has the latest `eigenlayer-contracts` multichain changes
**Motivation:**

We need to pull in the latest ecdsa changes from the
`eigenlayer-contracts` repo.

**Modifications:**

* Bumped up `eigenlayer-contracts` dependency
* Fixed multiple build warnings.

**Result:**

Access to ECDSA changes in the Middleware repo.
**Motivation:**

All interfaces for CertVerifier, TableCalc, and Registry are in core. 

**Modifications:**

Remove interfaces

**Result:**

Cleaner code
**Motivation:**

The `BN254` and `ECDSA` table calculators are AVS-deployed contracts.
They should live in the middleware repo.

**Modifications:**

- Add `EDSATableCalculator.sol`
- Add `BN254TableCalculator.sol`
- Add tests for both & tree files

**Result:**

Proper separation of contracts
**Motivation:**

The `AVSRegistrarAsIdentifier` had unnecessary imports

**Modifications:**

- Remove `Initializable` and `SocketRegistry`

**Result:**

Cleaner code
**Motivation:**

We want interfaces for AVS registrars 

**Modifications:**

Added: 
- `IAVSRegistrarWithSocket`
- `IAVSRegistrarWithAllowlist`

**Result:**

Cleaner integration
**Motivation:**

We want docs for middlewareV2/multichain 

**Modifications:**

Add docs for:

- `AVSRegistrar`
- `ECDSACertificateVerifier`
- `BN254CertificateVerifier`


**Result:**

Complete docs

---------

Co-authored-by: Nadir Akhtar <nadir-akhtar@users.noreply.github.com>
**Motivation:**

Update the interface in the table calculator for `getOperatorSetWeights`
and `getOperatorWeights`
**Modifications:**

- `getOperatorWeights` -> `getOperatorSetWeights`
- `getOperatorWeight` -> `getOperatorWeights`, and now returns an array
of weights
- Bump on core version and fix integration test setup

**Result:**

Correct code
**Motivation:**

The AVS registrar was not properly initializing the AVS in core

**Modifications:**

- Made `avs` variable internal
- Update `supportAVS` in `AVSRegistrarAsIdentifier`
- Add a public view function for the avs

**Result:**

Correct code
**Motivation:**

We need a changelog for middleware

**Modifications:**

Add changelog for multichain. Add contribution guideline

**Result:**

Working changelog
Update core submodule to same commit as `v1.7.0` release
ypatil12 added 4 commits July 10, 2025 14:16
**Motivation:**

Add tests for the implemented table calculators 

**Modifications:**

Add tests for the `_getOperatorWeights` function

**Result:**

Sufficient coverage. More will be added in integration
Bring up coverage for ecdsa stake registry
@ypatil12 ypatil12 merged commit 084485e into dev Jul 11, 2025
4 of 5 checks passed
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.

4 participants