-
Notifications
You must be signed in to change notification settings - Fork 0
03 core integration
Actions edited this page Mar 16, 2026
·
51 revisions
Coverage uses Core as the execution and accounting substrate for restaked security. The boundary is strict:
- Coverage defines underwriting, policy semantics, premium routing, and claim intent.
- Core executes committee-level stake, reward distribution, and slashing on SSP adapters.
This separation keeps restaking platform complexity out of Coverage contracts.
| Coverage Contract | Core Contract | Function | Purpose |
|---|---|---|---|
PolicyManager |
StakeManager |
createCommittee(policyId, pool, duration) |
Create policy-scoped committee; auto-assigns pool curator as operator |
CoverPool |
StakeManager |
setCommitteeVaults(policyId, vaults[], coverageLimit) |
Bind selected vaults/strategies backing policy; sets EigenLayer TVL caps |
PolicyManager |
StakeManager |
getCommitteeVaults(policyId) |
Verify vault backing exists before bind finalization |
PolicyManager |
StakeManager |
getCommitteeTokenStakes(policyId) |
Retrieve per-vault token-native stakes for USD sufficiency check at bind |
PolicyManager |
ChainlinkPriceFeed |
getUSDValue(token, amount) |
Convert stake and coverageLimit to USD for bind-time sufficiency check |
PremiumManager |
RewardsManager |
distributeRewards(policyId, operator, amount, token, taskId) |
Trigger Core reward fan-out; SSPRouter pulls restaker share from PremiumManager |
ClaimManager |
SlashingManager |
previewSlashing(policyId, operator) |
Query per-vault token-native stake data before computing slash amounts |
ClaimManager |
SlashingManager |
executeSlashing(policyId, operator, vaultSlashes[], taskId) |
Execute policy-scoped token-native slashing and retrieve collateral |
Note: EigenLayer operator setup (depositing stake, allocating magnitude, and registering to the committee's operator set) is performed off-chain by the restaker before bind. See Restaker Setup for the full sequence.
Coverage enforces policyId == committeeId across all cross-layer calls.
Implications:
- Committee is created with duration at policy request (no USD capacity parameter).
- Vault assignment is attached to the same id at bind time.
- Stake sufficiency is verified at bind time against the quote's
coverageLimitvia USD conversion. - Rewards and slashing are naturally scoped to the policy's committee.
Typical covered-vault actor mapping:
-
buyer: covered vault or cover adapter. -
claimer: cover adapter (withdrawal-triggered claim path). -
beneficiary: cover adapter for atomic shortfall make-whole, then forwarded to covered vault/user path.
Sequence:
- Curator invokes
CoverPoolFactory.createCoverPool(params). - Factory deploys and initializes a pool clone with curator as owner.
Outcome:
- Curator is pool owner and holds
DEFAULT_ADMIN_ROLEon the pool. - Pool is tracked in factory for
coverPoolExists()validation.
Sequence:
- Covered vault (or its adapter acting as buyer) calls
PolicyManager.requestCoverage(...). - Manager creates draft and increments
policyId. - Manager calls
StakeManager.createCommittee(policyId, pool, duration).createCommitteeauto-assigns the pool's curator as the committee operator internally.
Outcome:
- Draft exists in Coverage.
- Committee scaffold exists in Core with policy-aligned id and curator as operator.
Sequence:
- Curator calls
CoverPool.bindPolicyForRequest(...)with quote and vaults. - Pool calls
StakeManager.setCommitteeVaults(policyId, vaults, quote.coverageLimit). -
PolicyManager.bindPolicy(...)checks:- committee has at least one vault (
getCommitteeVaults), - total stake (USD) ≥ coverage limit (USD) by calling
getCommitteeTokenStakesandChainlinkPriceFeed.getUSDValuefor each token.
- committee has at least one vault (
Outcome:
- Policy transitions to bound/active state only when Core backing is present and stake in USD covers the quote's
coverageLimit.
Sequence:
-
PremiumCollectorredeems covered-vault shares to underlying. -
PremiumManager.distributePremium(...)computes fee splits. - Coverage calls
RewardsManager.distributeRewards(policyId, operator, amount, token). -
SSPRouterpulls the restaker share directly fromPremiumManager(approved viaapproveSpender).
Outcome:
- Coverage specifies policy/operator reward intent.
- Core executes final per-SSP reward distribution.
Sequence:
- During covered-vault withdrawal, adapter detects shortfall and files claim.
-
ClaimManagercallsSlashingManager.previewSlashing(policyId, operator)to retrieve per-vault token-native stakes. -
ClaimManagercomputes aVaultSlash[]array: proportional token-native slash amounts per vault, with per-vault upward slippage inflation derived fromSwapper.quoteSwap(...). -
ClaimManagercallsSlashingManager.executeSlashing(policyId, operator, vaultSlashes[], taskId). - Core returns collateral token arrays.
- Coverage swaps or directly transfers to beneficiary (adapter in this integration model).
Outcome:
- Core performs SSP slashing mechanics using token-native amounts per vault.
- Coverage performs beneficiary-facing settlement, then adapter completes make-whole transfer flow.
No-shortfall withdrawal path:
- If adapter deallocation returns sufficient assets, no claim is filed and no Core slashing call is made.
- Slash inputs to Core are token-native per vault (no USD conversion at claim time).
- Bind-time stake sufficiency check uses USD conversion via
ChainlinkPriceFeedinPolicyManager. - Coverage payouts are token-denominated by
payoutToken.
Coverage assumptions about Core:
- committee state and stake reads are correct and timely,
- reward/slash execution either succeeds or reverts atomically,
- token arrays returned from slashing are valid and aligned.
Failure patterns:
- If Core stake is insufficient at bind check, policy bind reverts.
- If slashing returns empty arrays or all zero amounts, claim payout reverts.
- If
ChainlinkPriceFeedis unset or stale, bind-time stake sufficiency check fails.
- Keep
policyIdand committee references consistent in all off-chain orchestration. - Ensure restakers have deposited into the committee's duration vault before bind. Duration vaults act as EigenLayer operators — no separate magnitude allocation or operator-set registration is needed. See Restaker Setup.
- Register and verify vault module mappings in Core (
SSPRouter.registerVaultModule) before bind. - Configure swap routes for expected collateral → payout token pairs before claims.
-
ChainlinkPriceFeedmust be configured onPolicyManagerwith price feeds for all supported payout and collateral tokens before bind.