Chain Health Score is the 0-100 composite used by GET /api/chains, /chains/, and /chains/[chain]/ to summarize the quality and concentration of stablecoin supply on each supported chain.
- Current methodology version:
v1.3 - Runtime source:
shared/lib/chains/health.ts(re-exported byshared/lib/chain-health.ts) - Version source:
shared/lib/chain-health-version.ts - API source:
worker/src/api/chains.ts - Route contract: chains-page.md
- Public changelog route:
/methodology/chain-health-changelog/ - Version timeline: chain-health-timeline.md
Inputs
GET /api/chains loads the strict stablecoins cache, filters it to active non-frozen/non-defunct stablecoins, derives non-USD peg references with derivePegRates(...), and reads the current report-card cache for Safety Score inputs. The endpoint returns 503 if the stablecoins cache is unavailable. Report-card cache misses do not fail the route; they reduce or null out the quality factor depending on coverage.
The compact report-card cache carries a degradedInputs marker. When cached Safety Scores were computed from stale report-card inputs, Chain Health keeps the cached score map available but downgrades _meta.dependencies.reportCards to degraded, switches the response to no-store, and emits a freshness warning.
The frontend chain profile coordinates GET /api/chains with GET /api/stablecoins. It renders top-level summary data from the chain snapshot first, then shows composition, backing breakdown, and stablecoin tables only when both snapshots share the same updatedAt and the stablecoins snapshot includes authoritative freshness metadata.
Formula
Current v1.3 composite:
0.30 * quality
+ 0.20 * chainEnvironment
+ 0.20 * concentration
+ 0.20 * pegStability
+ 0.10 * backingDiversity
The score is null when quality is null; otherwise the weighted total is rounded to the nearest integer.
Factors
| Factor | Weight | Source | Semantics |
|---|---|---|---|
quality | 30% | report-card cache | Supply-weighted Safety Score average. Unrated coins default to 40, but the factor returns null when rated supply is below 50% of chain supply. |
chainEnvironment | 20% | shared/lib/chains/index.ts resilience tier | Tier 1 -> 100, tier 2 -> 60, tier 3 -> 20. |
concentration | 20% | chain supply shares | 100 * (1 - HHI). A single dominant coin scores 0; an even N-way split approaches 100 * (1 - 1/N). |
pegStability | 20% | cached prices + peg rates | Supply-weighted peg proximity. Missing prices contribute neutral 50. |
backingDiversity | 10% | active stablecoin backing flags | Normalized Shannon entropy across the two active backing cohorts: rwa-backed and crypto-backed. Coins without backing metadata are excluded. |
Bands
| Band | Score |
|---|---|
robust | 80-100 |
healthy | 60-79 |
mixed | 40-59 |
fragile | 20-39 |
concentrated | 0-19 |
Update Contract
When Chain Health behavior changes, update these files together:
shared/lib/chains/health.tsand theshared/lib/chain-health.tsfacade if exports changeshared/lib/chain-health-version.tsdocs/chain-health.mddocs/chain-health-timeline.mddocs/chains-page.mddocs/api-reference.md(GET /api/chains)/methodologyChain Health copy and changelog route when user-facing methodology text changes