eqCAT
Parametric Earthquake Catastrophe Bond
Tokenisation of a parametric catastrophe bond as an ERC-20 fungible token,
enabling fractional on-chain access to the $64 billion insurance-linked securities market.
Contract Address (Sepolia): 0x0C257bE1708eDEb211e07ABAE568D6c54C9E135b
Token Symbol: eqCAT
Standard: ERC-20 (18 decimals)
Collateral: USDC (6 decimals)
Deployed: 4 April 2026 | Verified: Etherscan
UCL Institute of Finance & Technology
IFTE0007: Decentralised Finance & Blockchain — Individual Coursework 2025/26
Tamer Atesyakar
- Overview
- Key Design Decisions
- Bond Parameters
- Bond Lifecycle
- Earthquake Scenarios
- Getting Started
- Project Structure
- Test Suite
- Security Architecture
- On-Chain Actuarial Pricing
- Deployed Contracts
- References
A smart contract that tokenises a parametric earthquake catastrophe bond targeting the Tokyo-Kanto seismic zone. Investors deposit USDC and receive fungible eqCAT tokens representing a fractional claim on the collateral pool. If a qualifying earthquake occurs (verified via oracle), collateral pays the sponsor according to a continuous payout function. If maturity is reached without a trigger, investors redeem principal plus coupon.
The contract models cumulative seismic risk via the Kanamori energy relation, so earthquake swarms can aggregate toward the trigger threshold. A 24-hour verification window prevents premature settlement on preliminary USGS data, with a 7-day timeout ensuring the bond never gets stuck. Coupon debt is tracked on transfer with accrued entitlement assignment to prevent secondary market exploitation. Principal accounting uses a dedicated state variable to resist donation attacks. Coupon accrual and total supply are frozen at termination to eliminate post-trigger drift and last-redeemer advantage. On-chain actuarial pricing functions provide transparent, verifiable valuation for DeFi composability.
| Layer | Description |
|---|---|
| Asset | Parametric catastrophe bond — fixed-income instrument where investors earn a coupon for bearing earthquake risk. $64B outstanding market (Artemis.bm, Q1 2026). |
| Token | ERC-20 fungible token. 1 eqCAT = $1 fractional claim on collateral pool + pro-rata coupon entitlement. |
| Market | Primary: deposit USDC → mint eqCAT. Secondary: tradeable on any DEX. On-chain pricing via markToMarket(). |
| Risk | Basis risk, oracle risk, moral hazard, climate non-stationarity, regulatory ambiguity (MiFID II / FCA / MiCA). |
| # | Feature | Rationale | Trade-off |
|---|---|---|---|
| 1 | Linear payout interpolation | Eliminates cliff edges between tiers (e.g., Mw 6.99 → 25% vs Mw 7.00 → 50%). Continuous payout function P(Mw) reduces basis risk variance. | Harder to price analytically |
| 2 | Multi-parameter trigger | Magnitude + depth + Haversine distance provides an objective, rapidly available proxy for destructiveness. | Requires oracle depth data |
| 3 | Cumulative trigger | Earthquake swarms aggregate via Kanamori energy relation. Events within a 30-day window contribute E ∝ 10^(1.5M). | Increases oracle complexity |
| 4 | Verification window | USGS revises magnitude ±0.2 Mw in 24h. Downward-only revision cap rejects manipulation. 7-day timeout prevents stuck state. | 24h settlement delay |
| 5 | Trustless escrow | Sponsor deposits full coupon upfront. activate() validates pool covers stated rate. Contract replaces SPV trust structure. | Capital inefficiency for sponsor |
| 6 | Permissionless trigger | Anyone can call checkTrigger(). No single party can suppress execution. Censorship-resistant. | Gas cost for callers |
| 7 | Funding withdrawal | Investors can exit during FUNDING. Aligns with FCA consumer duty principles. | Sponsor capital uncertainty |
| 8 | KYC whitelist | Toggleable whitelist enforced via ERC-20 _update(). Enables FCA/MiCA compliance. | Restricts liquidity when enabled |
| 9 | On-chain actuarial pricing | View functions compute expected loss, fair spread, and mark-to-market. Enables DeFi composability. | Simplified models |
| 10 | Transfer lock (VERIFYING) | Tokens frozen during 24h verification. Prevents informed front-running. | Temporary illiquidity |
| Parameter | Value | Real Market Context |
|---|---|---|
| Max issuance | 1,000,000 USDC | Real deals: $100M – $500M |
| Maturity | 90 days | Real: 3 – 5 years |
| Coupon | 12% annual (1,200 BPS) | Real: SOFR + 400 – 1,200 BPS |
| Trigger centre | 35.6895°N, 139.6917°E (Tokyo) | Kanto seismic zone |
| Trigger radius | 100 km | Regional parametric standard |
| Min magnitude | Mw 6.5 | USGS damage threshold |
| Max depth | 70 km | Shallow crustal events only |
| Expected loss | ~2.1% (210 BPS) | USGS seismicity data |
| Risk multiple | ~3.5× | Coupon spread / expected loss |
24h verification
┌──────────────────┐
FUNDING ──► ACTIVE ──► VERIFYING ──► TRIGGERED ──► EXPIRED
│ │ ▲
│ └── cancel (7d) ──► ACTIVE│
│ │
└────────────► MATURED ──────────────────┘
(24h grace) (30d window)
| State | Description |
|---|---|
FUNDING |
Accepting deposits. Investors may withdraw freely. Sponsor deposits coupon pool. |
ACTIVE |
Live risk period. Oracle monitoring. Coupons accruing linearly. |
VERIFYING |
Trigger detected. 24h verification window. Transfers disabled. |
TRIGGERED |
Confirmed. Sponsor received payout. Investors redeem reduced principal. |
MATURED |
No trigger (24h grace period for final checks). Full 1:1 redemption + coupon. |
EXPIRED |
Redemption window closed (30 days). Unclaimed funds reclaimable by admin. |
Real data from the USGS Significant Earthquake Archive.
| # | Event | Mw | Coordinates | Depth | Dist. from Tokyo |
|---|---|---|---|---|---|
| 0 | 2024 Noto Peninsula | 7.5 | 37.497°N, 137.243°E | 10 km | ~340 km |
| 1 | 2024 Hyuga-nada Sea | 7.1 | 31.920°N, 132.300°E | 25 km | ~840 km |
| 2 | 2025 Aomori | 7.6 | 40.770°N, 142.610°E | 41 km | ~600 km |
| 3 | 2022 Fukushima | 7.4 | 37.720°N, 141.580°E | 57 km | ~260 km |
| 4 | 2021 Fukushima | 7.1 | 37.727°N, 141.750°E | 51 km | ~280 km |
| 5 | Synthetic: Tokyo direct | 7.2 | 35.690°N, 139.692°E | 15 km | 0 km |
| 6 | Synthetic: Near-miss | 6.8 | 35.500°N, 139.800°E | 12 km | ~25 km |
| 7 | Synthetic: Deep event | 7.8 | 35.700°N, 139.700°E | 150 km | ~2 km |
Prerequisites: Node.js 18 or 22 LTS (even-numbered versions only — Hardhat does not support odd versions like 25).
# macOS: if you have multiple Node versions, use Node 22
export PATH="/usr/local/opt/node@22/bin:$PATH"
# Install dependencies
npm install
# Compile contracts
npx hardhat compile
# Run test suite (99 tests, 20 categories)
npx hardhat test
# Deploy to Sepolia testnet
cp .env.example .env # add Alchemy RPC URL, private key, Etherscan key
npm run deploy # deploys all 3 contracts + auto-verifies on Etherscan
# Lifecycle demo (auto-reads addresses from deployment.json)
npm run interact # mints USDC, deposits, activates, simulates earthquake
# Live USGS data feed (fetches real earthquakes near Tokyo)
npm run fetch-usgs
# Historical trigger backtest (5 years of USGS data)
npm run analysis
# Real-time earthquake monitor (polls USGS every 60s)
npm run monitoreqCAT-parametric-catbond/
│
├── contracts/
│ ├── CatBondToken.sol Main ERC-20 bond token (~1,000 lines)
│ ├── interfaces/
│ │ └── IEarthquakeOracle.sol Oracle interface
│ └── mocks/
│ ├── MockUSDC.sol Test stablecoin (6 decimals)
│ └── MockEarthquakeOracle.sol USGS data simulator (8 scenarios)
│
├── scripts/
│ ├── deploy.js Deployment + Etherscan verification
│ ├── interact.js Full lifecycle demo
│ ├── monitor.js Real-time USGS monitor
│ ├── fetch-usgs.js Live data fetcher
│ └── historical-analysis.js 5-year trigger backtest
│
├── test/
│ └── CatBondToken.test.js 99 tests across 20 categories
│
├── hardhat.config.js
├── package.json
├── .env.example
├── .gitignore
├── LICENSE
└── README.md
99 tests across 20 categories covering every function, state transition, edge case, and security mechanism.
| # | Category | Count | Coverage |
|---|---|---|---|
| 1 | Deployment | 5 | Parameters, roles, state, constructor validation |
| 2 | Funding | 8 | Deposits, caps, coupon, access control, events |
| 3 | Withdrawal | 6 | Full/partial exit, edge cases, event emission |
| 4 | Activation | 5 | State transition, coupon validation, guards |
| 5 | Coupon Accrual | 5 | Linear accrual, proportional distribution, claiming |
| 6 | Maturity | 4 | Full redemption, grace period, events |
| 7 | Trigger Tiers | 6 | Linear interpolation at Mw 6.5 / 6.7 / 7.0 / 7.3 / 7.8 / 8.5 |
| 8 | Multi-Parameter | 6 | Magnitude, depth, distance with real USGS data |
| 9 | Verification | 5 | 24h window, revision, event emission |
| 10 | Event Identity | 3 | Same-event revision, different-event fallback, cumulative skip |
| 11 | Cumulative Trigger | 5 | Energy accumulation, replay protection, window reset |
| 12 | KYC Whitelist | 7 | Enable/disable, transfers, batch limit, events |
| 13 | View Functions | 10 | MTM, expected loss, fair spread, bond terms |
| 14 | Transfer Lock | 3 | VERIFYING freeze, TRIGGERED unlock, coupon debt |
| 15 | Expiry | 4 | Redemption window, EXPIRED state, fund reclaim |
| 16 | Verification Timeout | 2 | 7-day cancel, early rejection |
| 17 | Admin Safety | 5 | Pause/unpause, redemption protection |
| 18 | Oracle | 5 | Scenarios, loading, revision, extensibility |
| 19 | Multi-Investor | 3 | Proportional redemption, contract drainage |
| 20 | Coupon Debt | 2 | Transfer debt inheritance, pool boundary |
Five independent security audit rounds completed. All critical and code-fixable findings resolved.
| Mechanism | Protects Against |
|---|---|
ReentrancyGuard |
Re-entrancy on all state-changing functions |
SafeERC20 |
Non-standard ERC-20 return values |
AccessControl |
Role-based admin/sponsor permissions |
Pausable |
Emergency circuit breaker (blocked during redemption) |
| Transfer lock | Front-running during verification window |
| Coupon debt transfer | Double-claim via secondary market token transfers |
| Accrued entitlement assignment | Free coupon for buyers from never-claimed sellers |
| Event replay protection | Same oracle event inflating cumulative energy |
| Magnitude revision cap | Upward oracle manipulation during verification |
| Coupon freeze + supply snapshot | Post-termination accrual drift, last-redeemer advantage |
| Principal accounting | Donation attacks via direct USDC transfer |
| Coupon pool validation | Activation with insufficient coupon for stated rate |
| Constructor range checks | Invalid latitude, longitude, radius, magnitude, depth |
| Sponsor payout cap | Payout exceeding available balance |
| Maturity grace period | Front-running declareMature() to avoid trigger |
| Verification timeout | Stuck VERIFYING from oracle failure (7-day reset) |
| Cumulative energy reset | Stale energy reuse after rejection or cancellation |
| Limitation | Context | Production Path |
|---|---|---|
| Single oracle | Testnet mock; centralised trust | Chainlink DON with multi-node consensus |
| MEV front-running | Window between oracle update and trigger check | Atomic oracle-trigger via Chainlink Automation |
| Haversine hardcoded for Tokyo | cos(35.7°) = 0.812 | Parameterise cosine in constructor |
| Energy step function | 0.5 Mw resolution lookup table | Finer interpolation or fixed-point Kanamori |
Transparent, verifiable pricing functions enabling DeFi composability.
| Function | Returns | Description |
|---|---|---|
expectedLossBps() |
210 BPS | Annual expected loss (USGS seismicity data) |
fairCouponSpread() |
735 BPS | EL × risk multiple (3.5×) — the "Froot puzzle" premium |
markToMarket() |
USDC | Time-decaying MTM (theta-like decay toward maturity) |
getBondTerms() |
13 values | Full term sheet in one call |
annualCoupon(principal) |
USDC | Annual coupon for given principal |
redemptionValue() |
USDC | Per-token redemption value in current state |
Aave can call
markToMarket()for collateral valuation. Uniswap can anchor AMM pricing viaredemptionValue().
All contracts deployed and verified on Sepolia testnet (4 April 2026).
| Contract | Address | Etherscan |
|---|---|---|
| CatBondToken (eqCAT) | 0x0C257bE1708eDEb211e07ABAE568D6c54C9E135b |
Verified Source |
| MockUSDC | 0x627043A27932275F326BD818022909dD5f6633E1 |
Verified Source |
| MockEarthquakeOracle | 0x6E59FebB3D8e186D86600E0153330a57FDC03041 |
Verified Source |
Lifecycle demo executed on-chain: deposit, coupon funding, activation, earthquake simulation (Mw 7.2 Tokyo direct), and trigger verification — all visible in the deployer transaction history.
- Braun, A. and Kousky, C. (2021) Catastrophe Bonds: A Primer and Retrospective, Wharton Risk Center
- Froot, K.A. (2001) The Market for Catastrophe Risk: A Clinical Examination, Journal of Financial Economics
- Kanamori, H. (1977) The Energy Release in Great Earthquakes, Journal of Geophysical Research
- Lane, M. (2000) Pricing Risk Transfer Transactions, ASTIN Bulletin
- Swiss Re (2024) Insurance-Linked Securities Market Report
- Artemis.bm (2026) Catastrophe Bond and ILS Market Data
- USGS Earthquake Hazards Program — earthquake.usgs.gov
- EIP-20 (2015) ERC-20 Token Standard, Ethereum Foundation
- Chainlink (2024) Parametric Insurance Documentation
- FCA (2025) CP25/28: Progressing Fund Tokenisation
MIT — Tamer Atesyakar, 2026