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.
- 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.
StakeManagerowns 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.
| 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(). |
| Contract | Description |
|---|---|
libraries/SortingLib |
Utility library for sorting vault arrays used in committee operations. |
extensions/RoleActivationTimelock |
Timelock extension for sensitive role activations. |
| 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. |
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 testmake 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 descriptionsAll 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 implementationAfter 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 modulemake 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 allocationStep-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. |
See .env.example for all variables with inline documentation. Key groups:
Network & tooling — DEPLOYER_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 |
The smart contracts are released under the Business Source License 1.1 (BUSL-1.1).