Skip to content

abailey81/eqCAT-parametric-catbond

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

eqCAT
Parametric Earthquake Catastrophe Bond

Solidity Hardhat OpenZeppelin Tests License Network

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


Table of Contents

  1. Overview
  2. Key Design Decisions
  3. Bond Parameters
  4. Bond Lifecycle
  5. Earthquake Scenarios
  6. Getting Started
  7. Project Structure
  8. Test Suite
  9. Security Architecture
  10. On-Chain Actuarial Pricing
  11. Deployed Contracts
  12. References

Overview

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.

Asset → Token → Market → Risk

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).

Key Design Decisions

#FeatureRationaleTrade-off
1Linear payout interpolationEliminates 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
2Multi-parameter triggerMagnitude + depth + Haversine distance provides an objective, rapidly available proxy for destructiveness.Requires oracle depth data
3Cumulative triggerEarthquake swarms aggregate via Kanamori energy relation. Events within a 30-day window contribute E ∝ 10^(1.5M).Increases oracle complexity
4Verification windowUSGS revises magnitude ±0.2 Mw in 24h. Downward-only revision cap rejects manipulation. 7-day timeout prevents stuck state.24h settlement delay
5Trustless escrowSponsor deposits full coupon upfront. activate() validates pool covers stated rate. Contract replaces SPV trust structure.Capital inefficiency for sponsor
6Permissionless triggerAnyone can call checkTrigger(). No single party can suppress execution. Censorship-resistant.Gas cost for callers
7Funding withdrawalInvestors can exit during FUNDING. Aligns with FCA consumer duty principles.Sponsor capital uncertainty
8KYC whitelistToggleable whitelist enforced via ERC-20 _update(). Enables FCA/MiCA compliance.Restricts liquidity when enabled
9On-chain actuarial pricingView functions compute expected loss, fair spread, and mark-to-market. Enables DeFi composability.Simplified models
10Transfer lock (VERIFYING)Tokens frozen during 24h verification. Prevents informed front-running.Temporary illiquidity

Bond Parameters

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

Bond Lifecycle

                              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.

Pre-loaded Earthquake Scenarios

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

Getting Started

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 monitor

Project Structure

eqCAT-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

Test Suite

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

Security Architecture

Five independent security audit rounds completed. All critical and code-fixable findings resolved.

Protection Mechanisms

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

Known Design Limitations

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

On-Chain Actuarial Pricing

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 via redemptionValue().


Deployed Contracts

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.


References

  1. Braun, A. and Kousky, C. (2021) Catastrophe Bonds: A Primer and Retrospective, Wharton Risk Center
  2. Froot, K.A. (2001) The Market for Catastrophe Risk: A Clinical Examination, Journal of Financial Economics
  3. Kanamori, H. (1977) The Energy Release in Great Earthquakes, Journal of Geophysical Research
  4. Lane, M. (2000) Pricing Risk Transfer Transactions, ASTIN Bulletin
  5. Swiss Re (2024) Insurance-Linked Securities Market Report
  6. Artemis.bm (2026) Catastrophe Bond and ILS Market Data
  7. USGS Earthquake Hazards Program — earthquake.usgs.gov
  8. EIP-20 (2015) ERC-20 Token Standard, Ethereum Foundation
  9. Chainlink (2024) Parametric Insurance Documentation
  10. FCA (2025) CP25/28: Progressing Fund Tokenisation

License

MIT — Tamer Atesyakar, 2026

About

eqCAT — Tokenised Parametric Earthquake Catastrophe Bond | ERC-20 smart contract enabling fractional on-chain access to the $64B insurance-linked securities market | Solidity 0.8.24 • OpenZeppelin • Hardhat

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors