-
Notifications
You must be signed in to change notification settings - Fork 0
01 system overview
Catalysis Coverage is the application layer that turns restaked collateral into programmable protection. It sits on top of Catalysis Core, which abstracts Symbiotic and EigenLayer operations such as committee creation, stake tracking, reward distribution, and slashing.
Coverage contracts manage:
- pool creation and underwriting policy terms,
- policy request and binding lifecycle,
- premium collection and fee routing, and
- claim adjudication and payout settlement.
Core contracts manage:
- committee capacity and stake accounting,
- operator and vault connectivity to restaking platforms,
- reward fan-out to restaking adapters, and
- slashing execution and collateral return.
Coverage and Core share a canonical identifier:
-
policyId(Coverage) is the same value ascommitteeId(Core). - committee-level capacity in Core is set from the
coverageLimitin the bound quote. - slashing is executed by committee, which means per policy.
Coverage request actor mapping:
- The
buyerfield in policy metadata is themsg.senderofPolicyManager.requestCoverage; in theCoveredVaultWrappermodel,buyermust be the wrapper owner (EOA or multisig), not the wrapper contract itself.CoveredVaultWrapper._validatePolicyBindingenforces this with a hard revert. - The
claimeris a separately authorized address that can file claims for that policy; in theCoveredVaultWrappermodel,claimeris the wrapper itself. - The
beneficiaryreceives the claim payout; in theCoveredVaultWrappermodel,beneficiaryis also the wrapper, which tops up the user's withdrawal atomically.
This 1:1 mapping keeps capacity, accounting, and loss handling aligned across layers.
graph TB
subgraph Users
CURATOR[Curator / Operator]
COVERED[Covered Vault / Adapter]
CLAIMER[Authorized Claimer]
USER[End User Depositor]
end
subgraph Coverage Layer
CPF[CoverPoolFactory]
CP[CoverPool clones]
PM[PolicyManager]
PRM[PremiumManager]
CM[ClaimManager]
SR[SpecRegistry]
SW[Swapper]
end
subgraph Core Layer
SM[StakeManager]
RM[RewardsManager]
SLM[SlashingManager]
PF[OraclePriceFeed]
end
subgraph Restaking
SYM[Symbiotic vaults]
EIG[EigenLayer strategies]
end
subgraph Morpho Integration
CVW[CoveredVaultWrapper]
MV[Morpho Vault]
end
CURATOR --> CPF
CPF --> CP
CPF --> SM
COVERED --> PM
PM --> SM
PM --> CP
CURATOR --> CP
CP --> SR
CP --> PM
CP --> SM
PRM --> RM
CLAIMER --> CM
CM --> SR
CM --> SLM
CM --> SW
PM --> PF
SM --> SYM
SM --> EIG
RM --> SYM
RM --> EIG
SLM --> SYM
SLM --> EIG
USER --> CVW
CVW --> MV
CVW --> PRM
CVW --> CM
For Morpho-style integrations, the insured product is a single CoveredVaultWrapper:
- CoveredVaultWrapper: UUPS-upgradeable ERC-4626 vault wrapping a Morpho V2 vault; user-facing and premium-bearing.
- Morpho Vault (underlying): yield source; the wrapper is its sole depositor.
Key behaviors:
- premiums accrue continuously on depositor principal via an on-chain accumulator;
collectPremium()flushes them toPremiumManager, - on normal withdrawal, if the Morpho vault has suffered a loss the wrapper detects the shortfall against the user's insured basis and calls
ClaimManager.fileClaim(...)atomically, - the payout is received from
ClaimManagerand forwarded directly to the withdrawing user, -
emergency exit (
emergencyRedeem/emergencyWithdraw): users may explicitly waive insurance coverage to exit immediately without triggering a claim, even when a shortfall exists. This is a user-controlled escape hatch, not an insurance bypass.
Each CoverPool is curator-controlled and has:
- its own quote signer (
QUOTE_SIGNER_ROLE), - independent fee settings (
poolFeeBps,feeRecipient), and - policy binding authority via pool admin role.
This isolates underwriting strategy and economics across pools.
Policies are requested first, then bound later:
-
PolicyManager.requestCoverage()creates a draft and committee. - Curator binds via
CoverPool.bindPolicyForRequest(...)once delegation is ready. -
PolicyManager.bindPolicy(...)stores immutable-like policy metadata for claims.
Coverage does not slash or distribute rewards directly on restaking protocols. Instead, Coverage calls Core:
- premium reward routing:
PremiumManager -> RewardsManager, - claim-driven slashing:
ClaimManager -> SlashingManager.
This keeps SSP-specific complexity in Core adapters.
Claim logic is delegated to registered ISpec implementations:
- pool registers
(pool, specId) -> specinSpecRegistryat bind time, - claim path resolves spec from registry and runs
spec.evaluate(context).
- Curator creates a pool through
CoverPoolFactory. - Factory deploys pool clone; Core
StakeManagercommittee is created on coverage request. - The wrapper owner (EOA/multisig) requests coverage through
PolicyManager(draft created, owner recorded asbuyer). - Core committee is created with
committeeId = policyId; operator assigned. - Restakers delegate stake in supported vaults/strategies.
- Curator binds policy with signed quote and committee vault list.
- Premiums accrue continuously in
CoveredVaultWrapperagainst depositor principal. - Anyone calls
CoveredVaultWrapper.collectPremium(); it flushes accrued premium directly toPremiumManager.distributePremium(), which splits fees (platform, pool, restaker), transfers platform and pool shares immediately, and routes the restaker share toRewardsManagervia an ephemeral per-callforceApprove— no standing allowance setup is required. - On user withdrawal:
- no shortfall:
CoveredVaultWrapperredeems from Morpho and returns assets, - shortfall: wrapper calls
ClaimManager.fileClaim(...)atomically, receives payout, and tops up the user's exit.
- no shortfall:
- If claim is payable,
ClaimManagercallsSlashingManager.previewSlashing+executeSlashing(token-nativeVaultSlash[]), swaps collateral if needed, and pays theCoveredVaultWrapperwhich forwards to the user.