Skip to content

Repository files navigation

Catalysis Core Contracts

Catalysis Core is the restaking middleware layer that powers the Catalysis coverage marketplace. It abstracts protocol-specific complexity across EigenLayer, Symbiotic, and other restaking networks, turning slashable collateral into uniform coverage capacity that the coverage layer can programmatically slash and reward.

Overview

  • Unified restaking abstraction: A single API surface (SSPRouter) routes reward distributions and slashing operations to the correct protocol adapter, so the coverage layer never deals with EigenLayer or Symbiotic directly.
  • USD-normalised accounting: All stake and slash amounts are converted to USD via Chainlink price feeds, enabling consistent cross-collateral calculations regardless of which token backs a vault.
  • Committee model: Each CoverPool in the coverage layer is backed by a committee — a binding between one operator, one pool, and N vaults. StakeManager owns the lifecycle of every committee.
  • UUPS upgradeable: All contracts are deployed as UUPS proxies with DEFAULT_ADMIN_ROLE-gated upgrade authority, suitable for governance-controlled upgrades.

Architecture

Contract Purpose
StakeManager Operator registration, committee management, USD-normalized stake tracking
RewardsManager Routes premium rewards to operators via SSPRouter
SlashingManager Executes slashing requests, returns collateral to recipients
SSPRouter Routes operations to correct adapters, maintains committee-vault mappings
SymbioticAdapter Vault rewarders, slasher integration for Symbiotic
EigenAdapter Merkle rewards, operator set slashing for EigenLayer
OraclePriceFeed USD price data for stake normalization

Seven contracts deployed as UUPS proxies, plus two adapter implementations:

Contract Description
StakeManager Operator registration, committee lifecycle, and vault associations. Single source of truth for which vaults back a given committee.
RewardsManager Receives premium rewards from PremiumManager (coverage layer); routes distributions via SSPRouter to the appropriate adapter.
SlashingManager Receives slash requests from ClaimManager (coverage layer); routes execution via SSPRouter; is Pausable.
SSPRouter Central dispatcher — routes reward and slash calls to SymbioticAdapter or EigenAdapter based on vault registration.
OraclePriceFeed USD price data for stake normalization
Adapters/SymbioticAdapter Symbiotic-specific vault rewarder and slasher integration.
Adapters/EigenAdapter EigenLayer Merkle rewards distribution and operator set slashing integration.

External dependencies from the coverage layer:

Dependency Description
ClaimManager Initiates slashing via SlashingManager.executeSlashing().
PremiumManager Distributes premiums via RewardsManager.distributeRewards().
PolicyManager Queries operator and committee state from StakeManager.
CoverPoolFactory Creates committees via StakeManager.setCommitteeVaults().

Libraries & Extensions (src/contracts/)

Contract Description
libraries/SortingLib Utility library for sorting vault arrays used in committee operations.
extensions/RoleActivationTimelock Timelock extension for sensitive role activations.

Mocks (test/mocks/)

Contract Description
MockOraclePriceFeed Configurable price feed for unit tests.
MockCoverPoolFactory Stub ICoverPoolFactory for committee creation tests.
MockVault ERC-4626-style vault with controllable balances.
MockDurationVault Vault with configurable epoch duration for Symbiotic tests.
MockSlasher Stub Symbiotic slasher for slash execution tests.
MockSymbioticAdapter Full mock of ISymbioticAdapter for SSPRouter isolation tests.
MockDelegator Stub EigenLayer delegator for operator set tests.
MockERC20 Standard mintable ERC-20 for reward and stake token tests.

Quick Start

git clone https://github.com/0xcatalysis/core.git
cd core-contracts/core

make setup        # add pre-commit hooks (fmt-check + lint + test)
cp .env.example .env

make build
make test

Development

make setup                                # add pre-commit hook (fmt-check + lint + test)
make build                                # compile with default profile
make build-prod                           # compile with production profile (optimised, via_ir)
make sizes                                # report contract bytecode sizes (EIP-170 check)
make test                                 # run all unit tests (-vvv --fail-fast)
make test-ci                              # full suite with CI profile (higher fuzz runs)
make test-vv                              # run tests with -vv verbosity
make test-vvv                             # run tests with -vvv verbosity
make test-match MATCH=<pattern>           # run tests matching a name pattern
make test-contract CONTRACT=<name>        # run all tests for a specific contract
make gas                                  # gas report
make cover                                # summary coverage report
make cover-lcov                           # LCOV + HTML artifacts (requires genhtml)
make fmt                                  # enforce forge fmt style
make fmt-check                            # check formatting without modifying files
make lint                                 # compile with --deny-warnings
make docs                                 # regenerate NatSpec docs into docs/
make snapshot                             # capture gas snapshot baseline
make snapshot-check                       # verify gas usage against baseline
make slither                              # static analysis
make clean                                # remove build artifacts, broadcasts, and coverage files
make help                                 # list all targets with descriptions

Deployment

All deployment scripts extend Deploy.s.sol, which handles contract deployment in dependency order (OraclePriceFeed → adapters → SSPRouter → managers), cross-contract role configuration via setManagerAddresses(), and result logging.

make deploy-anvil           # local Anvil deployment (seeds CreateX, uses well-known account 0)
make deploy-sepolia         # Sepolia testnet deployment
make deploy                 # target chain deployment (RPC_URL + CHAIN_ID from .env)

make compute-addresses      # compute deterministic CREATE2 addresses before deployment

make upgrade-all            # upgrade all core proxy implementations
make upgrade-single         # upgrade a single proxy implementation

Protocol Setup (Phase 1b)

After initial deployment, run these in order to wire the system:

make set-adapters           # wire Symbiotic + EigenLayer adapters into SSPRouter
make register-tokens        # whitelist acceptable ERC-20 reward tokens
make register-price-feed    # register Chainlink price feeds for collateral/payout tokens
make register-vault-module  # register each vault with its adapter module

Operator & Committee Setup

make register-operator                    # register operator in Symbiotic + EigenLayer
make register-operator-to-network         # opt operator into Symbiotic network
make set-allocation-delay                 # set EigenLayer allocation delay
make deploy-vaults                        # deploy and register Symbiotic + EigenLayer vaults
make create-committee                     # create committee and add vaults
make add-operator                         # add operator to committee
make deposit-stake                        # deposit collateral into vaults
make delegate-stake                       # configure EigenLayer magnitude allocation

Testing Scripts (src/script/testing/)

Step-by-step scripts that exercise the full operator and committee lifecycle:

Script Description
RegisterAcceptableTokens.s.sol Whitelists ERC-20 reward tokens in SSPRouter.
RegisterPriceFeed.s.sol Registers a Chainlink aggregator for a collateral or payout token.
RegisterVaultModule.s.sol Registers a vault address with its adapter module in SSPRouter.
SetAdapters.s.sol Sets the Symbiotic and EigenLayer adapter addresses on SSPRouter.
RegisterAVS.s.sol Registers AVS metadata URI in EigenAdapter.
RegisterNetwork.s.sol Registers the Catalysis network in Symbiotic's NetworkRegistry.
RegisterOperatorInProtocols.s.sol Registers an operator in both Symbiotic and EigenLayer.
RegisterOperatorToNetwork.s.sol Opts an operator into the Symbiotic network.
SetAllocationDelay.s.sol Sets the EigenLayer allocation delay for an operator.
GenerateRegisterOperatorParams.s.sol Generates registration calldata for operator onboarding (dry-run).
DeployAndRegisterVaults.s.sol Deploys Symbiotic and EigenLayer vaults and registers them in SSPRouter.
CreateCommitteeAndAddVaults.s.sol Creates a committee in StakeManager and associates vaults.
AddOperatorToCommittee.s.sol Adds an operator to an existing committee.
SetVaultsToCommittee.s.sol Updates the vault list for an existing committee.
DepositStakeInVaults.s.sol Deposits collateral tokens into deployed vaults.
DelegateStakeToOperator.s.sol Configures EigenLayer magnitude allocation for an operator.
DistributeRewards.s.sol Triggers a reward distribution through RewardsManager.
CompleteDistributeRewards.s.sol Completes a pending EigenLayer Merkle reward distribution.
ExecuteSlashing.s.sol Executes a slash through SlashingManager.

Environment Variables

See .env.example for all variables with inline documentation. Key groups:

Network & toolingDEPLOYER_ADDRESS, KEYSTORE, RPC_URL, CHAIN_ID, ETHERSCAN_API_KEY

EigenLayer protocol addresses (required for Deploy.s.sol):

Variable Description
EIGEN_DELEGATION_MANAGER EigenLayer DelegationManager — handles operator delegation
EIGEN_ALLOCATION_MANAGER EigenLayer AllocationManager — manages operator set allocations
EIGEN_REWARDS_COORDINATOR EigenLayer RewardsCoordinator — coordinates reward distribution
EIGEN_STRATEGY_MANAGER EigenLayer StrategyManager — manages strategy deposits
EIGEN_STRATEGY_FACTORY EigenLayer StrategyFactory — deploys new strategies

Symbiotic protocol addresses (both groups must be set together, or both omitted to skip SymbioticAdapter):

Variable Description
SYMBIOTIC_OPERATOR_REGISTRY Symbiotic operator registry
SYMBIOTIC_NETWORK_OPT_IN Symbiotic network opt-in service
NETWORK_REGISTRY_ADDRESS Symbiotic network registry
NETWORK_MIDDLEWARE_SERVICE_ADDRESS Symbiotic network middleware service
VAULT_CONFIGURATOR_ADDRESS Symbiotic vault configurator
OPERATOR_VAULT_OPT_IN_SERVICE_ADDRESS Symbiotic operator-vault opt-in service
BURNER_ROUTER_FACTORY_ADDRESS Symbiotic burner router factory

Role overrides (all default to ADMIN if unset):

Variable Description
ADMIN DEFAULT_ADMIN_ROLE holder on all contracts (use a Gnosis Safe on mainnet)
STAKE_MANAGER_CONFIG_ROLE Config role on StakeManager
REWARDS_MANAGER_CONFIG_ROLE Config role on RewardsManager
SLASHING_MANAGER_CONFIG_ROLE Config role on SlashingManager
POLICY_MANAGER_ROLE Coverage-layer policy manager address
CLAIM_MANAGER_ROLE Coverage-layer claim manager address
PAUSER_ROLE Address permitted to pause SlashingManager

License

The smart contracts are released under the Business Source License 1.1 (BUSL-1.1).

Releases

Packages

Used by

Contributors

Languages