Risk Module Integration
Technical detail on Ensuro's Risk Module architecture — contracts, roles, and the SignedQuoteRiskModule workflow.
This page covers the technical integration between Cliff Horizon and Ensuro's protocol. It's aimed at developers and technical partners.
Core Contracts
| Contract | Role |
|---|---|
| PolicyPool | Main protocol contract. Tracks active policies, manages LP deposits/withdrawals, mints ERC721 NFT per policy. |
| EToken | ERC20 LP share token. Represents deposited USDC capital. Tracks locked SCR. Accrues continuous interest for LPs. |
| RiskModule | Partner-facing contract. Delegates pricing to pluggable Underwriter contracts. Submits policies to PolicyPool. |
| PremiumsAccount | Groups Risk Modules for a partner. Accumulates premiums. Manages payouts; borrows from eTokens if premiums exhausted. |
| SignedQuoteRiskModule | Variant for API-based pricing. PRICER signs quotes off-chain; signed quote submitted on-chain to create policy. |
Policy Structure
Each policy is represented as a PolicyData struct:
PolicyData {
id uint256 // Unique policy identifier
payout uint256 // Maximum payout (USDC, 6 decimals)
jrScr uint256 // Junior SCR (locked from junior eToken)
srScr uint256 // Senior SCR (locked from senior eToken)
lossProb uint256 // Loss probability (WAD, 18 decimals) ← ENGINE OUTPUT
purePremium uint256 // Expected loss = payout × lossProb × MoC
ensuroCommission uint256 // Protocol fee
partnerCommission uint256 // Cliff Horizon revenue
jrCoc uint256 // Junior cost of capital
srCoc uint256 // Senior cost of capital
start uint40 // Policy effective timestamp
expiration uint40 // Policy end timestamp
}
The lossProb field is Cliff Horizon's primary output — the engine's calibrated probability converted to WAD units (18 decimal places).
SignedQuoteRiskModule Workflow
This is the integration path for Cliff Horizon:
Step 1: Client requests derivative quote via dashboard
↓
Step 2: Engine calculates lossProb for the trigger event
↓
Step 3: Cliff Horizon API calls Ensuro /quote endpoint
Payload: { payout, lossProb, expiration, jsonData }
↓
Step 4: API returns premium breakdown + cryptographic signature
↓
Step 5: Signed quote submitted on-chain
→ RiskModule.newPolicy(inputData, onBehalfOf)
→ PolicyPool mints policy NFT
→ SCR locked from eTokens
↓
Step 6: At expiry or trigger event:
→ RiskModule.resolvePolicy(policy, payout)
→ Called by RESOLVER role
→ Oracle data feeds resolution
Required Roles
Cliff Horizon needs three roles in the Ensuro protocol:
| Role | Purpose | Who Holds It |
|---|---|---|
| PRICER | Sign quotes with engine's lossProb | Cliff Horizon pricing API |
| RESOLVER | Resolve policies with oracle outcome data | Cliff Horizon oracle service |
| RM Operator | Configure MoC, collateralisation ratios, fee splits | Cliff Horizon admin |
Python SDK
Ensuro provides a Python prototype of the full protocol:
pip install ensuro
The Python SDK runs the same test cases as the Solidity contracts and is usable for simulation and testing. Cliff Horizon uses it for:
- Premium decomposition modelling during product design
- Integration testing before mainnet deployment
- Scenario analysis for new product structures
Deployment
- Network: Polygon mainnet (USDC)
- Testnet: Available for development
- Contract deployment: Ensuro deploys the Risk Module contract; Cliff Horizon configures parameters
Audit Status
| Auditor | Year | Scope |
|---|---|---|
| Quantstamp | 2022, 2025 | Full protocol |
| SlowMist | 2021 | Smart contracts |
| DefiSafety | 2024 | Process quality (93/100) |