Converge.fi
The Stablecoin Reserve Monitoring Circuit Breaker That Never Sleeps
What it is
What is it?
It is a Continuous reserve risk monitoring for stablecoins. Powered by ACTUS · Chainlink CRE · On-chain enforcement.
What problem does it solve?
Stablecoins Break Because Of Inadequate Systemic Risk Modeled Forward
The 2008 crisis exposed a systemic failure: no machine-readable language for financial contracts. CDOs, derivatives, mortgage-backed securities — all opaque to regulators until collapse. The same blind spots are now moving to digital assets. 609 stablecoin depeg events on record. Luna/UST: $40 billion erased in May 2022. USDC depegged in March 2023 when SVB collapsed — its reserves were disclosed as a monthly PDF, not a forward-looking cashflow simulation. Traditional monitoring checks balances — it does not simulate whether reserves will cover redemptions when they come due. A stablecoin can be 103% backed and only 1.1% liquid. No one catches maturity mismatch until it's too late.
How does it work?
Converge.fi operates in three layers:
Layer 1 — ACTUS Simulation: Every reserve asset (T-bills, cash deposits, corporate bonds) is modeled as a standardized PAM contract using ACTUS (Algorithmic Contract Types Unified Standards). ACTUS was built by former Chief Data Officers of the Federal Reserve Bank of New York, Citibank, and Bank of America. The FDIC awarded ACTUS a Rapid Phased Prototyping contract. It runs as a Docker service on AWS, called via HTTP from our risk engine.
Layer 2 — Chainlink CRE: A Chainlink Compute Runtime Environment workflow runs on a cron schedule every hour. It calls our Express risk engine, which calls ACTUS, computes 8 risk metrics, and returns a CRE-formatted JSON response. The CRE workflow ABI-encodes the 8 metrics as a signed 256-byte report and writes it on-chain to our MultiAttributeConvergeRiskConsumer contract on Ethereum Sepolia.
Layer 3 — On-Chain ACE Enforcement: The 8 metrics fan out to MultiAttributeRiskPolicy.sol, which stores them and enforces 4 hard gates in isHealthy(). When ConvergeStablecoin.mint() is called, it reads the pre-computed stored state — no off-chain call at mint time. Zero latency. If any gate fails, the transaction reverts in the same block. Automatic.
The deterministic forward based cash simulation is much beyond total reserves and total supply with very rich market risk factors and behavioral risk factor models. This helps all parties in compliance and reduces exposure to RISKS.
The 4 Hard Gates (on-chain, isHealthy()):
- Backing Ratio ≥ 100% — GENIUS Act §4(a)(1): reserves on 'at least 1 to 1 basis'
- Liquidity Ratio ≥ 30% — MiCA Article 54: 'at least 30% of funds received in credit institution deposits'
- Risk Score ≤ 70 / 100 — Converge.fi 6-factor composite (backing, liquidity, T-bill concentration, maturity, asset eligibility, custodian diversity)
- Asset Eligibility = 100% — GENIUS Act §4(a)(1)(A): 'may only consist of' permitted assets. Zero tolerance.
The 8 Stored Metrics:
- backingPct — total reserves / token supply × 100
- liquidityPct — cash reserves / total reserves × 100
- riskScore — 6-factor weighted composite (0–100)
- maturityGapDays — weighted average maturity of locked assets
- assetEligibilityPct — eligible reserves / total reserves × 100
- custodianDiversityScore — HHI-based score (0–100)
- timestamp — unix timestamp of off-chain computation
- scenarioId — keccak256 of the ACTUS scenario name
How it Works
Smart Contracts — Solidity 0.8.24, OpenZeppelin v5, Ethereum Sepolia
- MultiAttributeRiskPolicy.sol (0x61dc9d5904094829fFcBAf7f1970b9d387Dc1d71) — stores all 8 risk metrics, enforces 4 hard gates, owner-configurable thresholds
- MultiAttributeConvergeRiskConsumer.sol (0x904b5C81705918b4B00439468a7e1d97dF2b6934) — inherits Chainlink ReceiverTemplate, receives signed CRE reports, decodes 256-byte ABI payload
- ConvergeStablecoin.sol (0x19b6B9434D077DF9DFcE82be3568b4c0B39e6568) — ERC20 (cvUSD) with deposit tracking and circuit breaker mint gate
- RiskReportExtractor.sol — Solidity library, abi.decode(bytes → RiskReport struct), exact type sync: (uint16, uint16, uint16, uint16, uint40, bytes32, uint16, uint16) = 256 bytes
Risk Engine — TypeScript / Express, port 3001
- Calls ACTUS simulation engine (port 8083) and ACTUS risk data service (port 8082) running on AWS
- 28 ACTUS simulation JSON files (Postman Collection v2.1.0 format)
- /api/v1/cre-report: runs ACTUS simulation → computes 8 metrics → returns CRE-ready JSON
- /api/demo/health-check?phase=A/B/C: serves pre-computed verified phase data for demo
- /api/chat: AI Risk Chat powered by Anthropic claude-sonnet-4-6, stablecoin-risk-scoped
- computeMetrics.ts: converts ACTUS cashflow events → backingPct, liquidityPct, riskScore, concentrationHHI, assetQualityScore, maturityGapDays
Dashboard — React + Vite + Tailwind + Recharts, port 5173
- 8 monitoring panels: ReserveHealthPanel, CashflowChart, RiskTimelineChart, MaturityLadderView, MintBlockStatus, SimulationPanel, AlertHistory, EventTable
- AI Risk Chat panel: RiskChat, ChatMessage, ChatInput, ChatSuggestions
- Reads on-chain state via ethers.js + reads risk engine API
CRE Workflows (4 total)
- risk-monitoring/ — cron (every 1hr) → ACTUS → on-chain report (Primary: Risk & Compliance track)
- reserve-health-check/ — multi-simulation composite health score (DeFi & Tokenization track)
- privacy-reserve-check/ — Confidential HTTP to risk engine (Privacy track)
- vlei-ai-risk-agent/ — ACTUS data + LLM interpretation → on-chain (CRE & AI track)
ACTUS — External Service (not in repo, called via HTTP)
- actus-server-rf20 (port 8083): simulation engine — runs PAM contract simulations
- actus-riskserver-ce (port 8082): risk data service — stores reference indexes, behavioral models, scenarios
- mongodb (port 27018): data storage
- Verified simulation: StableCoin-BackingRatio-RedemptionPressure-30d returns 63 events (60 PP + 1 IED + 1 IP + 1 MD)
ABI Encoding Chain (end-to-end verified):
Express JSON → workflow.ts encodeAbiParameters → 256 bytes → ReceiverTemplate unwraps → RiskReportExtractor.sol abi.decode → MultiAttributeRiskPolicy storage. All 4 layers use identical type order: (uint16, uint16, uint16, uint16, uint40, bytes32, uint16, uint16).
Links
Created by
- Balamurughan G
- Sathyakrishnasamy
- kaarunyan
- Ashajasmin
- Thirumaran