Methodology
How Pharos grades stablecoins: transparent scoring across safety, peg stability, mint authority, liquidity, yield, and dependency risk.
Treat this page like a reference manual, not a marketing explainer. All scoring methodologies operate over the active subset of tracked stablecoins; pre-launch and frozen coins are excluded from new computations and live aggregates.
Reader Guide
Reader mode keeps summaries up front. Switch to Analyst for formulas, caveats, and worked examples.
Page rhythm: summary, quick facts, worked example, technical notes.
Summary
Model purpose and the core signal to scan first.
Quick Facts
Cadence, score range, dependencies, and failure behavior.
Worked Examples
Real inputs run through the same functions used in production.
Technical Notes
Expanded formulas, caveats, and changelog links when you need them.
Reader Guide
Reader mode keeps summaries up front. Switch to Analyst for formulas, caveats, and worked examples. Use the jump rail toggle to switch modes without losing your place in the page.
New to stablecoin design? Learn how each stablecoin design produces its peg before the scoring formulas.
Editorial Preface
How Pharos grades every stablecoin, and what it refuses to grade.
Every safety grade Pharos publishes is the answer to one question: if this stablecoin started bleeding tomorrow, how much of the loss would the holder eat before the system stopped it? V9 answers through three material pillars. Backing (40%) measures the assets and loss-absorption structure behind the claim. Exit (35%) measures whether holders can leave through executable market or redemption routes. Economic Control (25%) measures who can change, freeze, mint, or otherwise impair that claim.
V9 does not let a strong unrelated pillar average away a weak material path. Its bounded aggregation grants limited headroom above the weakest pillar, then peg behavior, evidence sufficiency, track record, structural caps, dependencies, and wrapper-local risks can only constrain the published result. A missing required fact returns NR unless a reviewed bounded policy states exactly why the remaining uncertainty is rateable.
Dependencies are causal inputs rather than a standalone score. A serial wrapper cannot escape its parent; basket exposure is weighted and bounded according to reviewed materiality. Wrapper-local custody, control, transfer, and redemption facts remain visible alongside the inherited limit, so the downstream claim can be worse than its parent but cannot become safer by averaging in unrelated strengths.
Yield tokens get flagged, not folded. Pharos tracks yield-bearing and NAV tokens through a separate yield-risk pipeline because the failure modes are different in kind, not just degree. A holder of a $1.00 stablecoin and a holder of a $1.04 wrapper are not running the same trade. The wrapper carries source risk, sustainability risk, and benchmark drift that have no analog in the underlying peg. Until those signals are sourced to a standard we will publish against, we surface them on the yield page and leave the safety score honest about what it does and does not measure. Configured NAV wrappers can still inherit peg risk from a referenced base; pure fund-share tokens with no peg reference receive a peg multiplier of 1.0 and are graded on the structural dimensions alone.
— Pharos, July 2026
Stablecoin Lifecycle Phases
Lifecycle phase is a data-collection policy. No per-domain methodology version is bumped when a coin transitions between phases.
Every tracked stablecoin is in one of five lifecycle phases. The phase determines which surfaces ingest, score, and read back the coin's data. Scoring methodologies always operate over the active subset; every non-active phase is excluded from new computations and live aggregates.
Active
Default state. Full worker ingestion (supply, price, blacklist, mint/burn, DEX liquidity, yield), full inclusion in PSI, DEWS, Safety Scores, Liquidity Score, Bank Run Gauge, and all live aggregates. Listed in the homepage table, search, compare picker, and sitemap.
Pre-launch
Tracked for visibility before launch. No live data yet, so the coin is excluded from score computations and live aggregates. Surfaced on /upcoming with milestone metadata and on its own pre-launch detail page; not in the homepage table, active taxonomy pages, portfolio picker, or live comparison picker.
Quarantined
Temporarily withheld after a reviewed inability to establish positive circulating supply or market cap. The static profile, reason, and review date remain public, but providers are not refreshed and the record is excluded from live surfaces. Missing price coverage or a genuine depeg alone does not trigger quarantine; those remain active monitoring failures.
Delisted
Reviewed as outside the listing scope. The canonical static profile and sourced decision remain readable. Delisted records never enter live aggregates, alerts, or score recomputation.
Frozen
The coin is effectively defunct (issuer abandonment, supply trending to zero, irrecoverable depeg, regulatory shutdown) but its historical data and detail page are preserved as an archive. No new data is collected, and the coin is excluded from PSI, DEWS, Safety Score recomputations, Bank Run Gauge, and other live aggregates. Frozen entries appear in the cemetery with an "archived data available" link to the preserved detail page. The report card shows an all-F stub matching the existing dead-stablecoin pattern.
TRACKED
The complete catalog across all five phases. Used for canonical identity, validation, and static detail routes.
ACTIVE
Active subset only. Used by every write-side cron and live aggregate.
READABLE
Every post-launch record: active, quarantined, delisted, and frozen. Historical/read-only use only.
FROZEN
Frozen subset only. Drives the cemetery merge and the dataset export.
See also: Cemetery · Upcoming launches · Listing policy · Operator runbook: docs/freezing-stablecoins.md
Version increments when price sources, consensus algorithm, enrichment passes, or validation rules change.
Every score Pharos computes starts with a price. The pricing pipeline collects quotes from more than a dozen live voices, requires fully pairwise agreement inside each cluster, and publishes the highest-confidence result with explicit source-freshness semantics.
Source diversity. Kraken and Bitstamp extend the direct venue set. Fresh RedStone prices need timestamped multi-venue breakdowns and are attributed only to configured canonical stablecoin IDs. The primary promoted DEX bridge now spans Fluid, Balancer, Curve, Uniswap V3, Uniswap V4, Raydium, Orca, Meteora, PancakeSwap, Aerodrome Slipstream, and Velodrome Slipstream, with structured source-filter telemetry and DEX lane confidence profiles attached when those lanes participate. Targeted exact-address augmentation can add DexScreener, DexPaprika, CoinGecko Onchain, Alchemy Prices, Moralis, and Solana Birdeye quotes for assets with missing prices or below-target source depth or weak confidence. DEX bridge and address-provider identity are canonical-only at runtime, so addressed unknown tokens are dropped instead of being reinterpreted by symbol, promoted protocol DEX prices only enter consensus when they are corroborated or no non-DEX voices exist, rejected protocol lanes no longer suppress a valid aggregate DEX fallback, and direct-API quote legs prefer tracked live stablecoin prices instead of unconditional $1 symbol assumptions.
Pool challenge. A pool challenge guard downgrades confidence and replaces the price with a protocol-aware TVL-weighted median only when large DEX pools from at least two independent protocols diverge from soft consensus, with divergence evaluated from one TVL-weighted median per protocol so a single rogue pool cannot make an otherwise agreeing protocol count as corroborating disagreement. A high-TVL multi-protocol path can also replace a near-peg soft price when at least two protocol medians each carry $5M+ TVL, are depeg-sized in the same direction, and agree with each other inside the pool-challenge bps band. A narrow one-protocol exception remains limited to cases where that protocol median is depeg-sized, carries at least $5M TVL, and agrees with a hard primary candidate within the normal consensus threshold, including DEX-inclusive soft clusters unless an exempt hard source is present. NAV tokens are excluded because their wide clustering threshold makes pool-level divergence a poor signal for redeemable-at-NAV assets. When the guard replaces a price, the replacement is now also reflected in the per-source candidate list so downstream corroboration continuity uses the replacement mark rather than the superseded candidate. Corroborated severe downside from multiple candidate sources including a depeg-authoritative source can be downgraded by pool challenge, but its price is preserved and the same evidence satisfies the temporal-jump guard. Dead blocked DEX slugs such as Bunni are excluded upstream and never qualify as challenger or DEX-bridge inputs.
Overrides & FX. Protocol-level redemption prices override market data for wrapper assets. Chainlink refreshes supported FX and commodity reference rates, and the dated secondary FX mirror can temporarily carry the wider fiat reference stack when Frankfurter is unavailable, with ExchangeRate-API as a tertiary daily fallback if both primary FX paths are down. If those live FX fetches still fail but the last published daily references remain within cadence, Pharos carries those dated references forward as a healthy refresh. Even cached-fallback FX runs keep probing the independent OXR, Chainlink, and metals paths, so a recovered intraday subset can promote the lane back to live without waiting for the full Frankfurter stack.
Freshness tracking. The live payload distinguishes true upstream observation timestamps from locally stamped fetch-time freshness via priceObservedAtMode, so a hard single-source print only becomes depeg-authoritative when its freshness is source-native rather than inferred from local collection time. The source registry now also records each provider's freshness kind, maximum trusted age, and whether it truly supports upstream timestamps. CoinGecko simple-price requests use precision=full and rows use upstream last_updated_atwhen it is present, so threshold logic receives the unrounded quote and rejects it when that timestamp is outside the trusted freshness window. Bitstamp, Coinbase, and Curve on-chain reads now publish upstream-observed freshness provenance rather than stamping rows at local fetch time, and the crvUSDCurve oracle feed enforces a 5-minute on-chain staleness guard using the aggregator block timestamp and records against its own dedicated circuit breaker. Replay cache now enforces each source's native max trusted age alongside the composite 6-hour cap.
Recovery scope. Live protocol-override work is limited to the exact active registry, so frozen and quarantined assets cannot consume the shared recovery budget. Optional already-priced refresh failures do not poison a route-specific recovery circuit while a usable incumbent price exists, and unresolved assets remain fail-closed until an admitted pricing lane resolves them.
Native-peg corroboration. For supported non-USD fiat assets with a reliable native-market quote, the pipeline now derives a fresh native quote × FX reference USD mark during post-enrichment. That lane can correct materially divergent weak or mixed-source live USD publications, fill a missing live price for supported assets, and still veto or resolve downstream depeg mutations when the direct native pair disagrees with a derived USD price / FX reference move. It remains a fresh validation lane rather than a replay-safe primary consensus voice, so it does not become cached continuity on later runs.
Historical replay parity. Supported non-USD fiat backfills now prefer direct CoinGecko native-fiat history and compare that series to the native 1.0 peg before falling back to USD-denominated market history. That removes long synthetic depeg streaks created only by replay-time USD / FX mismatch.
Enrichment & confidence. A 6-pass enrichment pipeline fills gaps for long-tail coins. Each asset is tagged with a confidence level so downstream systems can react to data quality, and severe fixed-peg downside publication now requires corroboration unless it comes from an explicit protocol redemption or pool-challenge replacement mark. Two-source clusters composed only of list-style aggregators (CoinGecko, DefiLlama, DefiLlama-list) are now downgraded to single-source regardless of which two combine, closing the CoinGecko + DefiLlama-detail tautology alongside the existing CG + DL-list downgrade. Cluster tiebreak also prefers hard-tier clusters over equal-weight soft-tier clusters before falling through to spread and peg-proximity rules. A lone promoted DEX protocol is admitted only when no non-DEX source exists, or when a hard market/oracle/protocol source agrees within threshold. Corroborating candidate prices now stay attached through later validation when the selected primary result is unchanged, so a real severe depeg is not cleared as a single-source mark. When a confirmed severe depeg briefly loses corroboration, the pipeline preserves trusted continuity from fresh replay-safe price_cache rows instead of letting the asset flap to N/A. DefiLlama contract fallbacks must now pass the same peg-aware plausibility gates before they can resolve an asset, and weak fallback/search-family address-provider quotes must stay within 500 bps of a fixed peg unless a stronger source corroborates the move, so a noisy address print falls through to exact-contract enrichment instead of publishing a false depeg. DexScreener symbol search is retired so addressless assets are not probed through noisy symbol-only identity. DefiLlama /coins contract-price fallback and DexScreener dex-liquidity and dex-discovery paths now record against their own dedicated circuit breakers instead of reusing unrelated breaker state, and the same provider diagnostics and GeckoTerminal probe statistics collected during each run are now surfaced on /api/status for operator visibility.
Update cadence
15m refresh
Sources
20+ live voices
Output
Price + confidence tag per asset
Preconditions & Failure Modes
Minimum data
At least 1 source must return a price; consensus requires 2+ for high confidence
Circuit breakers
Most live upstream families are breaker-gated: opens after 3 failures, probes every 30 min
Failure behavior
Degraded sources are excluded from consensus; enrichment pipeline fills remaining gaps; stale cache used as last resort
Worked example: USDC price consensus across 7 sources
Sources: CoinGecko=1.0001 (w2), DL-list=0.9999 (w1), Pyth=1.0002 (w2), Binance=1.0001 (w2), Kraken=1.0000 (w2), Coinbase=0.9998 (w2), Curve=1.0003 (w3)
Peg ref=1.0, threshold=50 bps. All 7 within 50 bps of each other → single cluster of 7.
Published price = cluster median = 1.0001. Internal selected source for provenance = Curve (highest-weight member).
Result: price 1.0001, confidence “high”, source label from the full agreeing cluster.
Technical details: source weights, consensus algorithm, overrides, enrichment, and validation
Aggregators
CG (w2), DL-list (w1)CoinGecko (w2)
DL list (w1)
Exchanges
BN (w2), KR (w2), CB (w2), BS (w1)Binance (w2), Kraken (w2)
Coinbase (w2), Bitstamp (w1)
Oracles
Pyth (w2), RS (w1)Pyth (w2)
RedStone (w1)
On-chain
Curve (w3), DEX/address (w1), protocol DEX (w2-w3), GT (w1)Curve (w3)
DEX agg/address (w1), protocol DEX (w2-w3), GT (w1)
N-Source Consensus
Pairwise clusters; publish cluster median, keep best member for provenance
Pool Challenge
Soft-only → replace with protocol-aware weighted mediansSoft-only consensus challenged; replacement uses protocol-aware weighted medians
Authoritative Overrides
Protocol redemption (cUSD, iUSD) after market probes
Enrichment Pipeline
5-pass fallback with Jupiter before DexScreener5-pass fallback with Solana-native Jupiter recovery
Price Validation + Confidence
high / single-source / low / fallback
Source Weights
| Source | Weight | Type | Notes |
|---|---|---|---|
| CoinGecko | 2 | Aggregator | Primary market data via /simple/price |
| CoinGecko ticker | 2 | Exchange ticker | Curated ticker corroboration path for tracked exchange pairs |
| DefiLlama (list) | 1 | Aggregator | Independent stablecoins list price via stablecoins.llama.fi |
| Pyth Network | 2 | Oracle | Hermes endpoint with confidence intervals |
| Binance | 2 | CEX | Single batch call for all spot tickers |
| Kraken | 2 | CEX | Explicit pair mapping with alias-safe response handling |
| Bitstamp | 1 | CEX | Lower-weight corroboration via the all-tickers endpoint |
| Coinbase | 2 | CEX | Per-symbol spot prices |
| RedStone | 1 | Oracle | Per-venue breakdown; requires at least 2 venues and 60% agreement |
| Curve on-chain | 3 | On-chain | StableSwap implied prices via explicit direct, one-hop, and opt-in chained-hop get_dy() routes |
| Curve oracle | 3 | On-chain | Additional primary-consensus voice for crvusd-curve |
| DEX pools | 1 | On-chain | Aggregate DEX voice, withheld only when an overlapping protocol-level DEX bridge lane is admitted |
| Protocol DEX APIs | 2-3 | On-chain / pool-state API | Primary-consensus protocol promotion currently supports Fluid, Balancer, Curve, Uniswap V3, Uniswap V4, Raydium, Orca, Meteora, PancakeSwap, Aerodrome Slipstream, and Velodrome Slipstream when the protocol lane survives registry, TVL, freshness, and corroboration gates. |
| GeckoTerminal | 1 | On-chain | Pool-level cross-check for weak CG / DL-list soft-source outcomes (≥$10K TVL) |
| Exact-address providers | 1 | Market / on-chain | Optional targeted DexScreener, DexPaprika, CoinGecko Onchain, Alchemy Prices, Moralis, and Solana Birdeye quotes; currently disabled in production Worker config for quarter-hour sync headroom |
Consensus Algorithm
The consensus engine clusters all available source prices for an asset and picks the most reliable result:
- Collect all source prices with non-failed circuit breakers
- Collapse repeated quotes from one source to their median, then count each registered provider family as one independent voice by retaining its strongest representative
- Find the largest fully pairwise cluster of sources that agree within
50 bps(fixed pegs) or500 bps(NAV tokens) - Break equal-size clusters by total weight, then stronger trust tier, then tighter spread, then peg proximity when available
- If the winning cluster has 2+ members, publish its median price and separately keep the best cluster member for provenance
- Choose that internal selected source by weight, then trust tier, then peg proximity, then source key
- If no cluster of 2+ forms, fixed pegs stay on fixed-peg rules and fall back to the best trusted single source
- Pool challenge: if all agreeing sources are challenge-eligible (CG, DL-list, DEX average, or promoted protocol DEX sources without a hard-source corroborator), check each large priced DEX pool (≥$100K TVL) from the published challenger snapshot built from the full retained pool set. If any protocol-level median diverges beyond the peg-type-aware threshold (500 bps for USD pegs,
min(2 × depeg threshold, 500)for non-USD pegs), downgrade tolow, and replace the price when at least two independent protocol-level medians corroborate that divergence unless severe-downside preservation applies. A high-TVL multi-protocol replacement can also use the peg depeg threshold when the published price is inside that threshold and at least two $5M+ protocol medians are depeg-sized in the same direction and mutually coherent inside the pool-challenge bps band. A one-protocol replacement remains allowed only when the protocol median has at least $5M TVL, the DEX median crosses the peg depeg threshold, and a hard primary candidate agrees within the normal consensus threshold
agree(a,b) = |a.price − b.price| / midpoint(a,b) × 10000 ≤ thresholdBpsAuthoritative Price Overrides
For wrapper-style assets whose executable value is set by direct protocol redemption, or by an instantly redeemable tracked base asset, rather than by secondary-market liquidity, the pipeline switches to an authoritative redemption-based mark:
- cUSD (Cap):
getBurnAmount()— cUSD → USDC redemption rate - iUSD (infiniFi):
receiptToAsset()— iUSD → USDC redemption rate - USDai: inherits tracked
PYUSDpricing because base USDAI is treated as an instantly redeemable PYUSD wrapper - iUSD (Initia) / USDCx: inherit tracked
AUSDorUSDCpricing when the parent rail is fresh and replay-safe - USDK / XO / USDnr: inherit tracked
wMpricing because Pharos treats them as instantly redeemable M0 extension units rather than free-floating market-priced assets - Scoped par references: source-reviewed USD and FX redeemables can use fresh/static FX references when active supply is observable
- ERC-4626 NAV wrappers: audited vaults such as Spark Savings, Gauntlet, Steakhouse, Yearn, Avant, Noon, Yuzu, and Aave Umbrella use
convertToAssets()multiplied by a fresh trusted tracked parent price - sGHO / Idle tranches: protocol-specific
previewRedeem()orvirtualPrice()reads price assets whose executable value is not represented by thin secondary markets - crvUSD (Curve):
PriceAggregator.price()enters primary consensus as a live market voice, not a protocol override
These overrides set priceSource = "protocol-redeem" and priceConfidence = "high" when the quote validates against peg bounds, and they are applied after the GeckoTerminal probe so later market checks cannot overwrite them. Recovery scheduling treats a current price as usable only when it is positive and carries publishable source and observation-time provenance, and each live candidate has a bounded slice of the shared budget so one stalled wrapper cannot skip the remaining active gaps. Parent trust is judged on the composite's replay-safe core, so an agreeing non-replay-safe corroborator that joins a parent's consensus label can neither strip trust from a high-confidence parent nor upgrade one the gate would otherwise reject. Vault NAV routes persist their last-good on-chain rate, and a failed live read can publish that cached rate times the fresh trusted parent price as an explicit low-confidence protocol-redeem-cached-rate source — bounded to 24 hours, never replacing a live price, and never depeg-authoritative. Audited wrapper exceptions can use a fresh high-confidence same-run parent consensus for live pricing while keeping historical replay on replay-safe sources.
Enrichment Pipeline (6-pass fallback)
Assets still missing prices after primary consensus go through a staged enrichment pipeline:
- Pass 1: Canonical tracked contract identity → DefiLlama coins API, but only prices that pass peg-aware validation can resolve the asset
- Pass 1b: Tracked alternate deployment fallback only (no synthetic same-address cross-chain probing; same validation gate as pass 1)
- Pass 2: CoinMarketCap category plus exact-slug quotes; truncated category pages ignore returned rows until the exact targeted lane validates active status, contracts, volume, freshness, and peg bounds
- Pass 3: Jupiter Price API for tracked Solana mints (authenticated when configured, block-freshness checked, peg-aware, and able to add bounded soft evidence to agreeing low-depth Solana prices)
- Pass 4: DexScreener exact token-address pools only; the older unique-symbol search fallback is retired, and each run makes at most one same-chain batch of 30 exact addresses with rotating chain and within-chain coverage
- Pass 5: Allowlisted low-volume CoinGecko recovery for selected DefiLlama-listed assets, published only with fallback confidence
Confidence Levels
| Level | Condition | Downstream effect |
|---|---|---|
| high | Independent agreeing cluster survives list-aggregator downgrade and pool challenge | Published as the agreeing cluster median; depeg detection still checks authoritative-source trust before skipping confirmation |
| single-source | One usable source, or a non-independent list-aggregator cluster treated as one source | Depeg detection requires pending confirmation |
| low | Sources disagree beyond threshold, or pool challenge fired | Pool challenge: TVL-weighted pool price used; otherwise closest to peg reference; depeg requires confirmation |
| fallback | All primary sources down; enrichment or cache used | Depeg mutations blocked; stale banner shown on frontend |
Price Validation
Every price is validated before entering the replay cache. Validation is context-aware with four modes:
- Authoritative primary: can admit deep downside for fixed pegs, but publication still requires corroboration unless the mark is protocol redemption or a pool-challenge replacement
- Fallback enrichment: rejects isolated bad prints below a lower bound
- DEX observation: requires consistent $50K post-confidence TVL floor
- Historical backfill: validates against per-timestamp peg references
USD and fiat-FX pegs share the same upside tolerance ratio when a usable reference exists, while commodity tokens (gold, silver) keep the broader 2x reference band and scale references by commodityOunces for gram- and 1/1000-ounce assets. NAV tokens use broad positive-price checks. Replay-safe cache storage is limited to strong, replayable prices and now expires after 6 hours.
Version increments when PSI formula, caps, bands, component definitions, or other score-affecting input semantics change.
The Pharos Stability Index (PSI) is a market-level 0–100 health score for the stablecoin ecosystem. It is recomputed every 30 minutes from live depeg conditions and stress signals, then aggregated into daily history snapshots. Its monetary aggregate contains active core stablecoins and cash equivalents; tracked variants and stable-value investment products remain browsable but do not count as independent supply.
See also: PegScore + DEWS · Safety Scores
Update cadence
30m refresh
Score range
0-100 market health
Main use
Bands: BEDROCK to MELTDOWN
Preconditions & Failure Modes
Aggregate universe
Active core stablecoins and cash equivalents, plus PSI-only shadows for historical continuity; variants and stable-value investments are excluded
Minimum data
Scorer accepts empty depeg and zero warning-band DEWS stress rows, but the cron requires total market cap > 0 plus readable active-depeg inputs and a fresh non-empty published DEWS generation
Required sources
Market-cap totals, active depeg inputs (current stablecoins price, or recent replay-safe price_cache fallback for already-open depegs), and exact DEWS stress-signal rows from the published generation pointer no older than two compute-dews intervals
Failure behavior
Returns null when market-cap input is missing/<=0; the cron also skips publication when active-depeg or DEWS inputs are unavailable, empty, or stale, and the API serves the last valid value
Historical replay
Backfills score any depeg overlapping the UTC day, canonicalize legacy depeg IDs into the current PSI universe, use same-day supply_history prices when they capture the move, cap replayed daily deviation at the event peak, and keep peak event deviation as a start-day floor only when the depeg stayed open through the UTC close and the daily snapshot misses the move
Worked example (verified against computeStabilityIndex)
Inputs: bps=-120, depegMcap=$2B, totalMcap=$200B, age=10d, trend=+1.2, stressBreadth=1.5
severity=1.141, breadth=4.243, score=100-1.141-4.243-1.5+1.2=94.316→94.3
Result: PSI 94.3 (BEDROCK).
Technical details: formula, component math, depeg handling, and condition bands
Scoring Formula
Score = 100 − severity − breadth − stressBreadth + trendThe final value is clamped to [0, 100] and rounded to one decimal.
Severity
0–68
Breadth
0–17
Stress Breadth
0–5
Trend
−5 to +5
Compute PSI
100 − penalties + trend
Condition Band
BEDROCK through MELTDOWN
Components
| Component | Range | Formula | Purpose |
|---|---|---|---|
| Severity | 0–68 | min(68, Σ(abs(bps)/100 × share × log2(1+mcap/1B) × 60 × factor)) | Magnitude-weighted depeg damage with extra emphasis on mega-cap instability |
| Breadth | 0–17 | min(17, Σ(sqrt(mcap/1B) × 3 × factor)) | How widely depegs are spreading across unique coins |
| Stress Breadth | 0–5 | min(5, dewsStressBreadth) | Early-warning pressure from DEWS stress signals before full depegs |
| Trend | −5 to +5 | clamp(-5, 5, mcap7dChangePct) | 7-day stablecoin market-cap momentum (supports or offsets penalties) |
Depeg Handling Rules
- Core-universe boundary: tracked variants and stable-value investment products do not contribute market cap, trend, depeg penalties, or DEWS stress breadth; their detail and research surfaces remain available.
- Per-coin deduplication: active events are grouped by coin; each coin contributes once using the worst current deviation.
- Historical rebuild parity:completed-day backfills score any depeg overlapping the UTC day, canonicalize legacy depeg IDs into the current PSI universe, replay same-day deviation from `supply_history.price` when possible, never exceed the event's recorded `peak_deviation_bps`, and keep `peak_deviation_bps` as a start-day floor only when the event remained active through the UTC close and a daily snapshot misses the move. Replay days whose restored daily price is back inside the configured threshold drop out entirely, and restore jobs also repair replay-critical daily price coverage, including PSI-only shadow assets, before the PSI rebuild is rerun.
- Age-aware depreciation: fresh depegs get full weight for 30 days, then decay linearly to a 25% floor by asset age 120 days.
factor = ageDays ≤ 30 ? 1.0 : max(0.25, 1.0 − (ageDays − 30)/120)Condition Bands
| Range | Band | Meaning |
|---|---|---|
| 90–100 | BEDROCK | Near-ideal market stability |
| 75–89 | STEADY | Normal conditions with minor stress |
| 60–74 | TREMOR | Meaningful instability emerging |
| 40–59 | FRACTURE | Broad, significant market stress |
| 20–39 | CRISIS | Contagion-level instability |
| 0–19 | MELTDOWN | Systemic peg failure conditions |
V9 is the sole active publication and consumer contract. V8.17 remains available only in version history.
Safety Score V9 is the active model for identity-aware consumers. It evaluates three material risk pillars: Backing (40%), Exit (35%), and Economic Control (25%). The aggregation allows bounded headroom above the weakest material path, then applies peg behavior, structural ceilings, evidence sufficiency, track record, dependencies, and wrapper-local risk. A strong unrelated pillar therefore cannot erase a weak material failure path.
V9 distinguishes measured adverse evidence from issuer non-disclosure, unsupported methodology, missing integration, and transient producer failure. Bounded gaps can remain rateable under explicit ceilings; an unbounded required fact remains NR. F is reserved for causally attributed measured danger, while a D requires measured weakness or traceable policy-bounded uncertainty.
Responsibility follows causal provenance instead of the nearest processing stage. An explicit reason-level owner is authoritative; inherited reserve gaps, unavailable upstream pillars, and missing parent scores carry every originating owner downstream. Every attributed root receives a causal-root-qualified score path even when it is the only root, so adding another root cannot rename an existing public fact; only unattributed fallbacks retain aggregate base paths, and ownership never becomes part of fact identity. Applicable but unpublished mechanism metrics remain issuer-undisclosed rather than measured-adverse. A reviewed external exit output whose identity is known but cannot be valued is attributed to producer failure, while an issuer-undisclosed settlement asset stays issuer-undisclosed; neither becomes scoreable. Date-only dispositions enter replay only after their reviewed UTC day. Partial control reviews retain the controls that were actually reviewed while unresolved surfaces remain bounded and fail closed. Strategy-vault wrapper loss-control facts can use those reviewed local controls as wrapper evidence, but risk-transfer credit remains zero unless a separate enforceable parent-loss backstop is reviewed. Subthreshold unrecognized chain-label supply pools are tolerated by the bridge-materiality proof and no longer surface as public evidence-responsibility facts; material unmatched bridge supply still fails closed. Coverage that no supported adapter can observe is unsupported methodology rather than producer failure: deployment census coverage is reported per chain instead of all or nothing, an exit surface whose census remainder is unsupported reports unsupported route evidence, and an unreviewed dependency set on an asset with no live-reserve adapter is unsupported rather than failed. An asset with no usable price whose tracked peg record is already adverse is measured adverse, while a clean record with no usable price stays a quiet observation and its deviation is never coerced to zero. These are provenance and evidence-retention changes: pillar weights, score math, and grade thresholds are unchanged.
Governance access posture treats a reviewed global mint-domain contract as immutable when it has no privileged capabilities, no applicable cap, no claim-impairment path, and access-only scope. A contract address alone identifies protocol machinery rather than a concentrated administrator; deployment-scoped bridge controls remain separate.
Publication is fail-closed. If a score-bearing producer is stale, unavailable, or would create a new infrastructure-attributed downgrade or NR transition, Pharos retains the last accepted V9 ratings and exposes the publication as held. Active consumers do not recompute or fall back to V8.
See also: Safety Score changelog · PegScore + DEWS · Liquidity Score · Infrastructure
Model shape
3 pillars + bounded aggregation
Grade output
A+ to F, with NR
Publication state
Current or held; never V8 fallback
Preconditions & Failure Modes
Minimum data
Mechanism-appropriate required facts for all material pillars
Required sources
Backing, exit, control, peg, dependency, and evidence-provenance inputs
Failure behavior
Unbounded evidence gaps return NR; transient producer failures hold the last accepted publication
Historical V8.17 methodology: dimensions, formulas, thresholds, and caveats
Exit Liquidity
30%
Resilience
20%
Decentralization
15%
Dep. RiskDependency Risk
25%
Weighted Average
base score
× Peg Multiplier
(pegScore / 100)0.40
× No-Liquidity Penalty
0.9× if no DEX or redemption signal
Final Grade
A+ through F
Base Dimensions (weighted average)
| Dimension | Weight | Source | Description |
|---|---|---|---|
| Exit Liquidity | 30% | DEX liquidity + redemption backstop | Best-path model: exit quality = best available path (DEX or redemption) + diversification bonus for having both |
| Resilience | 20% | Collateral, custody | 2-factor solvency measure; blacklist capability reported descriptively only |
| Decentralization | 15% | Governance type, chain risk, branch-aware CDP oracle setup, bridge route, mint authority | Governance structure with chain-risk, oracle, bridge-route, and privileged-mint penalties |
| Dependency Risk | 25% | Upstream grades, collateral weights | Inherited risk from upstream stablecoins, weighted by exposure |
Redemption Backstop and Effective Exit
The standalone Liquidity Score remains a pure DEX market-depth metric. Safety Scores use an effective exit score for the Liquidity dimension, built on a best-path model: exit quality equals the best available exit path after redemption is adjusted for current executable capacity and route confidence.
Before that blend, the DEX input is bounded by its retained evidence: reserve-based AMM simulation caps at 85, generic TVL proxy evidence at 60, synthetic or fallback evidence at 55, and provider-inaccessible-only deployment coverage at 45. Older snapshots without these evidence fields and rows explicitly marked legacy remain neutral. The public standalone Liquidity Score is not rewritten by this Safety Score policy.
modeledExitUsd = min(max(supplyUsd × 0.05, 100000), 25000000)
adjustedRedemption = redemption × capacityFactor × confidenceFactor
effectiveExit = round(min(100, max(dex, adjustedRedemption) + independentBonus))
capacityFactor is capped at 1.0 from current executable capacity divided by the modeled exit size. Confidence factors are 1.0 for high-confidence routes, 0.75 for medium-confidence routes, and 0.35 for low-confidence routes. The 10% secondary-path bonus is only applied when the redemption rail is independent from the DEX liquidity path, such as an issuer primary-market rail.
Live reserve metadata counts as executable capacity only when it isolates assets immediately available to the holder route. Mixed reserve or accounting buckets remain backing context and cannot override a reviewed fallback; for example, USDe retains its 0.5% hot-buffer fallback because Ethena's aggregate Liquid Cash category does not isolate route-executable assets.
Queue-style live telemetry may count only when the adapter proves both a current route buffer and the queued liability from the same evidence set. For DUSD, the Makina path scores only idle Ethereum USDC left after subtracting the USDC value of DUSD already locked in the AsyncRedeemer; its whitelist is represented as issuer-discretionary access rather than a route-status impairment.
If only DEX liquidity exists, it is used directly. Eligible immediate, live, or queue-style redemption can stand alone when DEX liquidity is absent, with route family caps and component scoring as guardrails. Documented offchain issuer routes with eventual-only capacity do not replace missing DEX liquidity; they can only add the independent primary-market bonus when DEX liquidity already exists.
Redemption backstops are scored across access, settlement, execution certainty, capacity, output-asset quality, and cost. Low-confidence redemption routes stay visible on the site but do not uplift the Safety Score liquidity dimension. Documented offchain issuer exits with eventual-only capacity can add a primary-market bonus only when DEX liquidity already exists; they do not replace missing DEX liquidity. Severe active depegs also disable static or non-live-direct redemption uplift unless current live-open redemption evidence exists. Last-known DEX inputs still feed effective-exit scoring when the liquidity cron is stale, with staleness surfaced through liquidityStale / inputFreshness.dexLiquidity.stale. Materially stale or missing redemption snapshots are suppressed from Safety Score liquidity; normal 4-hourly redemption-sync lag remains inside the scoring freshness runway. Unknown route status remains low confidence for proxy-only or weaker evidence, but reviewed documented-bound routes can retain medium confidence when the rest of the evidence gates pass. Same-run live adapter telemetry can also carry token-specific route status and capacity for Liquity-style systems, wrappers, PSMs, Yearn V3 strategy-queue exits, and instant-redemption vaults. Redemption metadata emitted by a live reserve adapter ages out with the reserve snapshot; if it is stale or degraded, the route stays visible but does not score as current capacity.
Current route coverage includes reviewed issuer rails, on-chain collateral redemptions, protocol NAV wrappers, and queued vault exits; newly reviewed wrappers and Nest-style vaults follow the same route-family caps and confidence gates as older configured routes.
Peg Stability Multiplier
After computing the base score, peg stability is applied as a power-curve multiplier: final = base × (pegScore / 100)0.40. Coins with strong pegs (90+) are barely affected (~4% penalty), while coins with broken pegs are sharply penalized (e.g. pegScore 10 → 60% penalty). Pure NAV fund-share tokens with no configured peg reference keep pegScore = NR and receive multiplier 1.0, while configured NAV wrappers can inherit peg risk from a referenced base stablecoin. The peg dimension passes through the computed peg score directly; severe active depegs are hard-capped after the multiplier using the open event's peak deviation: ≥ 2500 bps (25%+) caps the overall score at F, ≥ 1000 bps (10%+) caps at D.
No-Liquidity-Data Penalty
A further 0.9× multiplier is applied when a coin has no exit-liquidity signal at all — neither DEX liquidity nor redemption-backstop coverage. Weights are redistributed across available dimensions; this 0.9× multiplier is then applied to the final score to correct for the missing liquidity data by applying a flat 10% penalty.
Resilience Scoring
Average of two equally-weighted sub-factors (50% each): Collateral Quality and Custody Model. Chain infrastructure is scored exclusively in the Decentralization dimension. Blacklist capability is reported descriptively but does not affect the Resilience score.
| Sub-factor | What it measures | Scoring |
|---|---|---|
| Collateral Quality | Reserve composition risk | Weighted avg of curated reserve slices: Very Low (100), Low (75), Medium (50), High (25), Very High (5). Falls back to enum scoring for coins without curated reserves. |
| Custody Model | Who controls the economic backing? | Fully on‑chain (100), Top‑tier custodian (80), Regulated custodian (55), Unregulated custodian (30), Sanctioned custodian (5), CEX / off‑exchange custody (0) |
Tokenized RWA collateral is scored by the ultimate reserve or legal custody layer, not only by the smart-contract location of a wrapper token.
Collateral quality is derived from reserve compositions when available. The default source is curated metadata. A live reserve snapshot replaces it only when the current report-card snapshot can prove the feed is fresh, authoritative, independent, and clean. In coverage tables this is the difference between a reserve view being configured and a score-grade live reserve actually being used. For report-card scoring, the live snapshot must carry scoring-eligible freshness evidence: either a verified timestamp path or an explicit on-chain latest-state not-applicable freshness mode. Direct one-bucket on-chain reserve proofs such as Liquity v1 can qualify when the adapter is classified as independent, but weak probe families do not qualify just because they are on-chain. Detail-only static-validated and weak-live-probe feeds remain visible on reserve surfaces, but they never override curated collateral scoring. Each reserve slice is classified into one of five risk tiers and the score is their weighted average. Direct ETH and canonical WETH slices share the same Very Low tier, while ETH liquid staking tokens remain Low. Delta-neutral wording is evaluated by structure: transparent spot or wrapped exposure can stay Medium, but externally managed market-neutral, basis, perp, LP, private-deal, or custody-dependent strategy books are High unless stronger granular evidence shows the slice is only a liquid stablecoin or cash-equivalent buffer. For coins without usable reserve compositions, a coarser enum-based fallback is used. Explicit overrides exist for coins where defaults are incorrect (e.g., protocols on Solana, coins with CEX custody).
Decentralization Scoring
Base score from governance quality tier, then a chain-risk penalty for protocols on less decentralized chains — governance decentralization is undermined when the underlying chain has centralisation concerns — followed by a branch-aware CDP-only oracle setup blend (v8.11), reviewed bridge-route blend (v8.12), and the penalty-only Mint Authority blend (v8.0):
- Immutable code— 100 (no admin keys, no upgrade path — e.g. LUSD, BOLD). Exempt from chain-risk penalty
- DAO governance— 85 (e.g. DAI)
- Multisig— 55 (e.g. GHO, FRAX)
- Regulated entity— 40 (named regulator, license, and independent audit — e.g. USDC, USDT)
- Single entity— 20 (unregulated or unverified issuer)
- Wrapper— inherits tracked parent Decentralization with a wrapper-kind haircut; unresolved wrappers fall back to 10
Resolvable wrappers use the wrapped asset's chain-adjusted, pre-blend Decentralization score: savings wrappers subtract 3, strategy-vault and risk-absorption wrappers subtract 5, and bond-maturity wrappers subtract 8. For example, yBOLD and sBOLD inherit from BOLD, while sfrxUSD inherits from frxUSD.
CDP oracle setup blend (v8.11):
Crypto-backed CDP stablecoins can carry reviewed oracleRisk metadata. When present, the score applies min(score, round(score × 0.75 + oracle × 0.25))after governance and chain infrastructure. Robust setups never lift a score; weak, single-source, laggy, or opaque feeds can drag it down. Missing oracle reviews and non-CDP assets are unchanged. The current tier scores are oracleless/internal 100, redundant failover 95, medianized delay 85, standard external 75, single-source/laggy 45, and opaque/unknown 20.
Since v8.11, reviews can include provenance plus branch rows for collateral markets or chains. If branch rows are present, the weakest branch/profile tier supplies the oracle score. Wrappers and savings variants display inherited parent oracle exposure without adding a separate wrapper-side oracle penalty.
Bridge route blend (v8.12):
Reviewed bridgeRouteRisk metadata can capture issuer-native, canonical, external bridge, lockbox, liquidity, or intent routes. When present, the score applies min(score, round(score × 0.80 + bridge × 0.20)) after oracle scoring and before Mint Authority. Strong issuer-native or canonical routes never lift a score; missing reviews stay neutral; weak external lock/mint, liquidity/intent, or opaque routes can drag it down.
Current tier scores are single-chain/native 100, issuer burn/mint 90, canonical bridge 85, issuer lock/mint 80, external validated network 65, liquidity/intent route 55, external lock/mint 40, and opaque/unknown 20. L2BEAT Interop is used as static review evidence, not as a live scoring dependency.
Mint Authority blend (v8.0):
A rated Mint Authority Score applies as the final stage: min(score, round(score × 0.65 + MAS × 0.35)). The blend only drags the dimension down — a weak privileged-mint path undermines a decentralization claim, while a strong one never lifts it. Coins without a rated Mint Authority Score are unchanged, wrappers take the drag once on their inherited pre-blend score (capped at the parent's blended score), and a Mint authority detail row appears when the drag binds.
Chain-risk penalty (DAO and multisig governance — exempt for immutable-code, wrapper, regulated-entity, single-entity):
- Combined score ≥80 — no penalty
- Combined score ≥60 — −10
- Combined score ≥40 — −25
- Combined score ≥20 — −40
- Combined score <20 — −60
Example: hyUSD (DAO governance, Solana, combined score 45) = 85 − 25 = 60. USDB (multisig, Blast L2, combined score 66) = 55 − 10 = 45.
Dependency Risk Scoring
Dependency scoring runs after upstream report cards are available and uses a topological order across the active dependency graph, so transitive stablecoin exposure is scored from upstreams before downstream coins are finalized.
- Self-backed coins— score by governance baseline: decentralized 90, centralized-dependent 75, centralized 95
- With mapped dependencies— blended score: each upstream's grade is weighted by its collateral fraction, and the self-backed portion (non-stablecoin collateral) scores vary by governance type (decentralized 90, centralized-dependent 75, centralized 95). A −10 penalty applies if any upstream dependency scores below 75
- Unavailable upstream scores— every unavailable weight is scored at 70 inside the same blend, including when every upstream is unavailable. It still triggers the weak dependency penalty and remains subject to wrapper or mechanism ceilings
- Variants and self-holdings— a tracked variant has one serial wrapper dependency on its parent. Mirrored parent reserves do not add parallel weight, and a coin's own treasury-held token remains reserve evidence without becoming a self-dependency
The Worker diagnoses the complete effective graph before traversal. Static cycles require explicit review; live-created cycle members fall back to curated dependency sets, and a graph that remains cyclic is rejected before snapshot and grade-history publication. The dimension payload records raw and normalized contributions, availability, self-backed share, the weak penalty, and any binding ceiling.
Dependency type ceilings— each dependency is classified as wrapper, mechanism, or collateral(default). Legacy wrappers (e.g., syrupUSDC → USDC) are capped at upstream − 3. Tracked parent-linked variants keep the same wrapper edge but use family-specific ceilings: savings −3, strategy-vault −5, risk-absorption −5, bond-maturity −8. Mechanism dependencies (e.g., DAI → USDC via PSM) are essential to the peg — score is capped at the upstream's score. Collateral dependencies use the blended formula with no ceiling.
Self-backed scores vary by governance type: centralized-dependent coins score 75 (systemic coupling risk), decentralized coins 90, and centralized coins 95. Centralized-dependent coins score lower because their peg mechanisms depend on upstream stablecoin infrastructure even for non-stablecoin collateral.
Grade Thresholds
| Grade | Score Range |
|---|---|
| A+ | 87–100 |
| A | 83–86 |
| A− | 80–82 |
| B+ | 75–79 |
| B | 70–74 |
| B− | 65–69 |
| C+ | 60–64 |
| C | 55–59 |
| C− | 50–54 |
| D | 40–49 |
| F | 0–39 |
| NR | Not enough data |
Key Design Decisions
- NR (Not Rated)is used when fewer than 2 base dimensions have data — no misleading partial grades
- Weight is redistributed proportionally among rated base dimensions when some are NR
- Peg stability acts as a multiplier, not a base dimension — maintaining a peg is table stakes, not a differentiator
- Cemetery (defunct) coins receive a permanent F
- Decentralization score is structural, not a value judgment
- Blacklist capability is reported descriptively only and does not affect the Resilience score. Explicit mutable-contract overrides still surface as “possible”. Reserve-side stablecoins, custodied wrappers, issuer-seizable tokenized collateral, custody/CEX rails, and tracked parent-asset exposures now resolve to “inherited” blacklist risk instead of sharing the “possible” bucket.
Dependency Ceilings
When a stablecoin depends on another (wrapper, mechanism, or collateral relationship), its dependency risk score is capped relative to its upstream:
- Wrapper dependency: legacy wrappers and tracked savings variants cap at upstream score minus 3; strategy-vault/risk-absorption variants cap at minus 5; bond-maturity variants cap at minus 8
- Mechanism dependency: capped at upstream score
- Collateral dependency: blended into dependency risk dimension via weighted average
If any upstream dependency scores below 75, a 10-point penalty is applied. These ceilings prevent a wrapped token from outscoring its underlying asset.
Limitations
- Peg stability only reflects price data — can't detect coins “stable” because nobody trades them
- Decentralization is structural, not a value judgment
- Dependency inputs come from score-grade live reserve slices when available, then curated reserve links, then manual dependency metadata; unmapped collateral relationships may still be missed
Mint Authority Score
v1.2Version increments when weights, route/controller scores, caps, bands, inheritance, or NR semantics change.
Mint Authority Score measures how much durable stablecoin supply can be created, authorized, expanded, or routed by privileged actors. It focuses on mint paths such as issuer minters, allowlisted minters, cap admins, proxy admins, facilitators, bridges, off-chain attestation systems, backend signers, governance, Safes/multisigs, custodians, and wrapper inheritance.
Score range
0-100, with NR for missing or unresolved review data
Main risk
Privileged durable supply creation or mint-route expansion
Safety Score role
V9 evaluates the underlying reviewed control facts directly
| Component | Weight | Meaning |
|---|---|---|
| Route | 30% | Structural mint route family, from immutable user collateral to bridges, backend signers, or issuer-direct minting. |
| Controller | 40% | Weakest mint-capable controller across direct minters, minter admins, cap admins, proxy admins, bridge admins, and upgrade paths. |
| Bounds | 15% | Whether mint-capable routes are quantitatively capped, and whether a privileged actor can raise those caps. |
| Posture | 15% | Reviewed authority posture, from no privileged route through bounded, concentrated, or unbounded/compromised authority. |
Worked example: compromised privileged mint route
Inputs: route=40, controller=15, bounds=30, posture=5
rawScore=round(40*0.30 + 15*0.40 + 30*0.15 + 5*0.15)=23
Because the profile records an unbounded or compromised posture with a privileged-mint incident, the incident cap limits the final score to 10/100 (Exposed).
Technical details: caps, inheritance, and bands
Caps
- Bounds: cap-limited controls receive the immutable-cap bonus only when every cap-limited mint-capable control explicitly records that its cap cannot be raised. Unknown or omitted cap-mutability evidence stays bounded, but does not score as immutable.
- Incident cap: unbounded or compromised authority with a recorded mint incident is capped by the age of the most recent incident — 10 when under 2 years old, 15 at 2-4 years, 20 at 4+ years. Decay is purely time-based and always stays below the no-incident unbounded cap.
- Unbounded cap: unbounded or compromised authority without a recorded incident is capped at 25.
- EOA cap: a non-issuer-context EOA that can mint or authorize minting without MPC/HSM attestation is capped at 40.
- Confidence cap: verified caps at 100, probable at 90, manual-review at 85, and unknown returns NR.
Wrapper inheritance
`wrapped-or-variant-inherited` rows inherit from `inheritedFrom`. If the parent is scoreable, the wrapper score is the lower of the parent score and a blend of 60% parent score plus 40% weakest wrapper-control score. Missing parents, cycles, unresolved parents, and depth-limit cases return NR.
| Band | Range | Meaning |
|---|---|---|
| Hardened | 80-100 | No resolved privileged mint path or strongly bounded, high-confidence controls. |
| Governed | 65-79 | Governance or admin controls exist, but they are comparatively bounded or slow. |
| Managed | 50-64 | Active mint management exists with some controls or route limits. |
| Concentrated | 35-49 | A small operator, backend, custodian, bridge, or low-threshold route can affect supply. |
| Exposed | 0-34 | Unbounded, compromised, single-key, or otherwise weak authority dominates the score. |
| NR | Not rated | Missing, unknown, inherited-but-unresolved, or insufficient review data. |
Infrastructure Tagging
Infrastructure identifies the shared technical foundation a stablecoin was built on. Pharos currently recognises three values: Liquity v1, Liquity v2, and M0. The tag answers the question: what shared technology does this coin inherit risk from?
Liquity v1 and Liquity v2 are code lineages— coins that fork the original Liquity CDP implementation (v1) or its newer BOLD-style design (v2). Forks share source code but operate independently with their own reserves, governance, and Stability Pools. A vulnerability in the upstream Liquity codebase potentially affects every fork in that branch, even though the forks have no operational relationship.
M0 is an issuance-platform lineage— coins built on M0's smart-contract rails (minter governance, the SwapFacility, and the MExtension.sol contract pattern). M0 provides the issuance machinery; the reserve composition is set by the issuer and may or may not include the underlying $M token. Some M0-built coins are simple $M wrappers; others manage diversified collateral via M0's infrastructure. A governance issue at the M0 protocol level potentially affects every M0-built coin, even though their day-to-day operations and reserves are independent.
Storage
Array field on each StablecoinMeta entry
Cardinality
Zero, one, or many infrastructures per coin
Surfaces
Detail badge, homepage filter, taxonomy pages, methodology
Version increments when liquidity formula weights, source inclusion rules, or TVL normalization logic changes.
Composite 0–100 score measuring DEX liquidity depth per stablecoin, updated every 30 minutes. Aggregates pool data across all major DEXes and chains.
Dead or explicitly blocked DEX slugs such as Bunni are excluded upstream from crawl intake, retained pools, challenger snapshots, and DEX-implied price publication instead of being treated as low-quality live venues.
Pool Matching & Deduplication
Dedicated protocol-native sources (Fluid, Balancer, Raydium, Orca, Meteora, PancakeSwap V3, Aerodrome Slipstream, and Velodrome Slipstream) are treated as primary-grade inputs and enter scoring before staged or fallback discovery sources are merged.
Discovery coverage is less page-fragile now: CoinGecko Onchain and GeckoTerminal token crawls read multiple bounded pages, and fallback enrichment can activate for weak partial coverage instead of waiting for a strict zero-pool outcome. Secondary discovery rows with non-finite, negative, or impossible pool TVL are rejected before staging and skipped again at scoring merge time if stale bad data is already present.
Matching is chain-aware: `chain + address` resolves first, and symbol fallback is only allowed when it is unique on that chain for addressless tokens. If an upstream token already supplies an unknown address, it is dropped instead of being remapped by symbol. Pool dedupe uses exact ids plus conservative derived identity keys, so legitimate same-pair pools are not collapsed just because their token set matches. Balancer direct pools now key exact identity off the API's real pool `address`, not the 32-byte vault pool id. Provider-specific ids with underscores or suffixes are normalized into canonical protocol families before identity matching.
Direct-source precedence is also measurement-aware now. A protocol-native pool only replaces an overlapping DeFiLlama row when it has measured non-zero 24h volume, which means Slipstream pool-state rows can expand Base and Optimism coverage without displacing stronger overlapping DL rows when volume telemetry is absent. Exact pool ids from protocol-native sources still stay reserved for later staged-source dedupe even when the direct row itself is too small to score, so discovery feeds cannot re-add the same address with incompatible TVL semantics.
Discovery rows also need authoritative confirmation when they claim a protocol family that already has a clean protocol-native fetch on that chain. In practice, GT/CG/DS staging cannot invent new Balancer, Fluid, Raydium, Orca, Meteora, PancakeSwap, Aerodrome, or Velodrome pools after the native source succeeded; if that native fetch is degraded or unavailable, the scorer fails open and still allows staged recovery rows through.
For identity-poor DeFiLlama UUID rows, staged discovery can use the narrow optional-metadata wildcard only when both sides are unique on chain, protocol, token set, and pool-shape family. That lets one staged exact-pool-id row collapse against one primary row without collapsing parallel same-pair pools.
When protocol-native sources expose pool inventory, Balancer, Raydium, Orca, Meteora, PancakeSwap V3, and the Slipstream integrations now contribute measured balances and fee detail instead of neutral placeholders. Balancer weighted pools are normalized against target token weights before the balance ratio is computed. Fluid reads reserves and fee detail from the official DexReservesResolver on Ethereum, Arbitrum, Base, and Polygon, while Aerodrome and Velodrome Slipstream read pool state from the on-chain Sugar view contracts on Base and Optimism.
Canonical Ethereum Uniswap V2 and BSC PancakeSwap V2 pools can publish exact constant-product execution only after their factory runtime and exact `getPair` binding are verified. Token order, reserves, and decimals must resolve at the same pinned block; other V2 forks and any identity, factory, reserve, price, or read failure stay capability-gated instead of inheriting executable depth.
Classic Aerodrome execution is limited to volatile pools already present in the Base Aerodrome census. Exact models require same-block reviewed factory and implementation runtimes, an exact `getPool(token0, token1, false)` binding, `stable = false`, an unpaused factory, and the pool's dynamic fee. This does not admit generic Solidly forks or deployments on Avalanche, Linea, or Sonic.
Base Aerodrome Slipstream pools can also publish measured exact-execution profiles. Each profile pins the reviewed factory and QuoterV2 runtimes, proves the retained pool through the factory's exact token and tick-spacing binding, and revalidates identity, prices, freshness, capacity monotonicity, and the retained TVL ceiling before scoring. Mature fresh profiles remain route-only if a pool temporarily rotates out of the display shortlist; they never re-enter aggregate liquidity, price consensus, target publication, or V8 scoring. Optimism Uniswap V3 has been retired from the maintained source and measured-execution lanes. The reviewed wM/USDC Raydium direction still captures its pool state and exactly replays the direct quote, but its score eligibility is paused after the first post-activation scoring consumers exceeded the Worker memory limit. Generic Raydium, Orca Whirlpool, Meteora, and unlisted native routes also remain shadow-only.
SunSwap V2 routes on Tron remain shadow-only and score-ineligible while target and quote collection continue for revalidation. The producer proves the canonical factory and pair runtimes, exact pair binding and reserves, the reviewed 0.3% constant-product output, and a bounded latest-state block bracket. It prefers a direct SUN Smart Router path. When that service's three returned candidates are all clean V2 multi-hop paths, it may use the pinned on-chain V2 Router only after proving its runtime, factory binding, exact two-token path, and identical raw output. An invalid direct Smart Router candidate still fails closed. Missing, stale, failed, or identity-mismatched evidence remains capability-gated per target. The SunSwap census still does not enter aggregate liquidity, price consensus, direct-source precedence, visible pool selection, P4 capacity or completeness, or aggregate liquidity inputs.
Repeated sightings of the same physical pool across direct API, staged, and fallback sources are collapsed before DEX price aggregation. Exact direct price evidence can rejoin only when the same canonical pool survives final scoring and both records clear the price-observation floor; derived or mismatched identities remain excluded. A separate challenger snapshot preserves the full retained pool set for depeg checks, instead of relying on the visible top-pools subset. Balancer stablecoin pools also get a narrow stable-pair identity fallback when DeFiLlama omits the subtype in `balancer-v3`, preventing direct-API stable pools from being double-counted as faux weighted rows.
Orderbook fallback rows now validate observable ticker quality directly. CoinGecko deprecated `trust_score`, so Pharos filters those tickers by freshness flags, finite USD price/volume, exchange identity, and USD-equivalent quote assets instead of relying on a legacy badge. The scoring-cron orderbook fallback is reserved for absent, no-price, or tiny DEX coverage; weak but already-covered DEX assets stay on the on-chain repair path instead of receiving time-budget-dependent centralized synthetic books.
PancakeSwap V3 volume now uses a bounded trailing-hour window from the official subgraph's `poolHourDatas.volumeUSD` buckets instead of the latest `poolDayDatas` row, so intraday volume no longer decays toward zero between UTC day rollovers.
Large retained pools must clear the minimum 24h volume floor even when volume is marked unmeasured. After bad pools are filtered and secondary-source TVL caps are applied, every exported aggregate and score input is rebuilt from the retained pool set.
Curve balance, registry, token-price, and metapool TVL enrichment is applied only to Curve DeFiLlama rows. Non-Curve rows that share the same token symbols as a Curve pool keep their own mechanism type and TVL.
Address-grade plain Curve StableSwap-NG pools with rate-bearing inputs can publish a route model only after fresh same-block state verifies `get_balances`, amplification, stored rates, ordered coins, and static fee state. Rate scaling adjusts both balances and references; Curve deducts its captured static fee after the full-input invariant. Stale, unpinnable, identity-mismatched, or dynamic-fee state remains capability-gated. Metapools, CryptoSwap, legacy pools, and all other unreviewed Curve shapes are not widened.
Coverage confidence is measurement-aware. Instead of a fixed score by source family, Pharos now weights how much retained TVL has measured balances and prices, how broad the protocol mix is, and how much of the row depends on synthetic or freshness-decayed fallback liquidity.
Update cadence
30m refresh
Signal mix
5 weighted liquidity components
Output
0-100 DEX depth score
Preconditions & Failure Modes
Minimum data
No hard minimum in scorer; missing stability history defaults to neutral 50 sub-scores
Required sources
Pool TVL/volume/chain data plus mechanism and pair-quality metadata
Failure behavior
If both DEX liquidity and eligible redemption evidence are unavailable, the report-card Liquidity / Exit dimension is NR
Worked example (verified against computeLiquidityScore)
Inputs: effectiveTVL=$10M, TVL=$20M, marketCap=$100M, volume24h=$1M, qualityTVL=$12M, durability=70, pools=8
depthRatio=10M/100M=10%, tvlDepth=35×log10(0.10/0.0007)=75
vtRatio=1M/20M=5%, volume=38×(log10(0.05)+3)=65
retention=12M/20M=60%, quality=(0.60−0.15)/0.65×100=69
diversity=min(100,8×5)=40
score=round(0.30×75+0.20×65+0.20×69+0.20×70+0.10×40)=67
Result: Liquidity score 67.
Technical details: component weights, TVL scaling, and quality adjustments
TVL DepthTVL Depth
30%
Vol. ActivityVolume Activity
20%
Pool QualityPool Quality
20%
DurabilityDurability
20%
DiversityDiversity
10%
Liquidity Score
0–100
Components
| Component | Weight | How it works |
|---|---|---|
| TVL Depth | 30% | Effective TVL relative to market cap (log-scale): 35xlog10(depthRatio/0.0007). ~0.5%->30, ~1.5%->47, ~6%->67, ~14%->80, ~25%+->90+. Falls back to absolute TVL scale when market cap is unavailable. |
| Volume Activity | 20% | Log-scale V/T ratio: 38x(log10(vtRatio)+3). ~0.3%->18, ~3.5%->59, ~19%->86, ~32%+->100 |
| Pool Quality | 20% | Venue quality retention: qualityAdjustedTvl/totalTvl, rescaled from the realistic 15-80% range to 0-100. Measures mechanism multiplier x balance health; pair quality is captured in TVL Depth via effectiveTvl. |
| Durability | 20% | TVL stability (35%), volume consistency (25%), pool maturity (25%), organic fee fraction with sqrt curve (15%) |
| Diversity | 10% | Pool count with diminishing returns: min(100, poolCount x 5) |
Pool Quality Adjustments
- Balance health— continuous ratio (not binary threshold): pools with imbalanced reserves score lower
- Pair quality— co-token scored by Pharos governance classification (CeFi→1.0, DeFi→0.9, CeFi-Dep→0.8) plus static map for volatile assets (WETH→0.65, WBTC→0.6); composite Curve LP aliases such as 3Crv inherit the best quality of their underlying stablecoin basket
- Metapool dedup— uses TVL excluding base pool to prevent double-counting across Curve metapools
- Retained-pool recomputation— HHI, depth, volume, and balance/organic/durability inputs are all recomputed from the same retained pool set before the UI truncates to the top 10 displayed pools
Version increments when flow scoring logic, tracked event semantics, or ingestion attribution policies change.
Pharos tracks on-chain mint and burn events for major stablecoins via Alchemy JSON-RPC (Transfer mints/burns plus USDT Issue/Redeem). These raw events are aggregated into hourly buckets and exposed as two separate signals: raw net flow for current direction, and a baseline-relative pressure score for context. Counted flow excludes bridge transfers, review-required burns, and atomic roundtrips.
Data source
On-chain mint + burn events
Primary score
Pressure Shift vs 30D
Main outputs
Net flow, gauge, and FtQ
Preconditions & Failure Modes
Minimum data
Pressure Shift vs 30D requires at least 7 days of flow history per coin
Required sources
24h mint/burn totals plus 30-day baseline aggregates
Failure behavior
Pressure shift can be null (NR); gauge is null when no weighted inputs contribute; FtQ needs ±$100M dual threshold
Counted rows
Economic-flow aggregates count standard rows only, which in practice means non-bridge mints plus effective burns
Worked example (verified against computeFlowIntensity)
Inputs: currentNet=-$0.2M, baselineNet=-$7.5M, baselineAbs=$40M
denominator=max(40M*0.3,1M)=12M; z=(-0.2M-(-7.5M))/12M=0.608
pressureShift=clamp(-100,100,z*50)=30.4
Result: still burning today, but much lighter than its baseline.
Technical details: two-signal pipeline, pressure formula, and gauge bands
Mints
Transfer from 0x0
Burns
Transfer to 0x0
Hourly Buckets
Trailing 30 closed daily issuance-chain buckets
Net Flow 24h
Current mint minus burn direction
Pressure Shift vs 30D
-100 worsening · 0 baseline · +100 improving
Bank Run Gauge
market-cap weighted
Flight-to-Quality
dual threshold detection
Mints
Transfer from 0x0
Burns
Transfer to 0x0
Hourly Buckets
Trailing 30 closed daily issuance-chain buckets
Net Flow 24h
Current mint minus burn direction
Pressure Shift vs 30D
-100 worsening · 0 baseline · +100 improving
Bank Run Gauge
market-cap weighted
Flight-to-Quality
dual threshold
Net Flow 24h
Net Flow answers the first question directly: is a coin minting or burning right now? It is the raw 24-hour mint volume minus burn volume.
- Minting— `netFlow24hUsd > 0`
- Burning— `netFlow24hUsd < 0`
- Flat— `netFlow24hUsd = 0` with activity
- No activity— no 24h mint/burn events in the window
- Invariant— minting vs burning always comes from raw net flow, never from the pressure score sign
Pressure Shift vs 30D
This is the existing Flow Intensity formula under clearer naming. It measures how far current 24-hour flow pressure deviates from the coin's own trailing 30 fully closed daily configured issuance-chain baseline.
denominator = max(baselineDailyAbs × 0.3, $1M)
z = (currentDailyNet − baselineDailyNet) / denominator
pressureShift = clamp(-100, 100, z × 50)
- Baseline period— trailing 30 fully closed UTC days of configured issuance-chain daily net flows and absolute volumes, excluding the current partial day
- Minimum data— requires 7 days of history; returns null (NR) otherwise
- Activity gate— windows with no 24h mint/burn activity or less than $50K absolute 24h flow are marked NR and excluded from gauge weighting
- Ingestion safety— sync state advances only to the shared safe coverage frontier when some event definitions or block timestamps are incomplete; established coverage is marked lagging by cadence-derived block progress, or unknown when the current chain head is unavailable. For quiet assets, completed block-scan span proves window maturity even when the oldest event row has aged out of retention
- Floor— denominator is floored at $1M to prevent noise in low-volume coins
- Interpretation— above +10 = improving vs baseline, between -10 and +10 = stable vs baseline, below -10 = worsening
Bank Run Gauge
Market-cap-weighted composite of all tracked coins' pressure-shift values, producing a single ecosystem-wide configured issuance-chain flow-pressure reading. Gauge weights use each coin's canonical tracked-chain circulating supply. The gauge score maps to one of seven condition bands:
| Band | Score Range | Meaning |
|---|---|---|
| CRISIS | −100 to −70 | Severe below-baseline redemption pressure across major coins |
| STRESS | −70 to −40 | Worsening coordinated pressure versus normal conditions |
| CAUTIOUS | −40 to −10 | Mild but broad pressure deterioration |
| NEUTRAL | −10 to 10 | Close to 30D norms across the market |
| HEALTHY | 10 to 40 | Improving aggregate pressure versus baseline |
| CONFIDENT | 40 to 70 | Strong positive pressure shift across major coins |
| SURGE | 70 to 100 | Exceptional improvement versus recent norms |
Returns null only when all tracked coins are NR (for example, insufficient history or no 24h mint/burn activity). Coins with null pressure-shift values are skipped from the market-cap-weighted composite.
Flight-to-Quality Detection
Detects capital rotation from lower-scored to higher-scored tracked mint/burn stablecoins — a pattern typically seen during market stress when holders move funds out of weaker assets and into stronger safety-score cohorts.
- Safe classification— tracked mint/burn coins with report-card score ≥65; risky coins are tracked mint/burn coins with score <50. Classification is unavailable when the report-card cache is unavailable or stale
- Dual threshold— active when risky coins have >$100M net outflows AND safe coins have >$100M net inflows simultaneously over 24h
- Intensity scaling— min(100, |riskyOutflows| / $1B × 100), reflecting the magnitude of the rotation
Version increments when APY source resolution, source arbitration, history semantics, PYS scoring logic, or eligibility rules for discovered yield sources change.
Pharos tracks native stablecoin yield plus selected lending opportunities and computes a risk-adjusted ranking via the Pharos Yield Score (PYS). Core rankings publish hourly using a source-aware APY resolution strategy, while slower supplemental-source families refresh on a separate four-hour lane. Alternative sources are retained when multiple valid yield paths exist, address-first identity is used before symbol fallback, curated exact-pool overrides can cover named non-stablecoin venues, confidence-weighted arbitration selects the primary row, and published lending suggestions exclude Resolv / USR-linked venues so broken wrapper ecosystems do not surface as recommended base-asset routes. Eligible tracked wrapper variants can also surface their native/wrapper sources as linked parent routes, so parent assets such as BOLD can show yBOLD and sBOLD context without removing the variants' own rows. The curated auto-discovery lane also pins current Felix, Sovryn, Loopscale, Resupply, Sovryn XUSD, and Anzens exact venues when they pass the normal source-quality gates, and the allowlist now includes reviewed Tier C venues such as AutoFinance, Neverland, Metrom, Mystic Finance, Bitway, and Frankencoin. Future allowlist rounds start from the monthly unmatched-high-TVL audit queue and protocol-category gate rather than broad protocol hunting. Rate-derived coverage includes cgUSD, USDN, BENJI, WTGXX, USTBL, EUTBL, and wiTRY, while commodity exact-pool coverage includes XAUT on Lista Lending and PAXG on Hydration. Published lending-opportunity rows now also require observable venue TVL and a size floor of at least 0.1% of the tracked stablecoin's current supply before they can become the live recommendation. PYS is benchmark-aware and source-risk-aware, with missing source-risk evidence treated as neutral. Royco Dawn structured-tranche rows now attach senior and junior opportunities to the tracked underlying stablecoin when the deposit token resolves, using opportunity-level tranche safety for PYS without changing the underlying Report Card score. Re Protocol yield now uses reUSD's official daily Basis-Plus APY and NAV feed; the separate junior reUSDe Insurance Alpha product is not a reUSD yield variant. Midas mMEV has a curated NAV-oracle row, and Curve Savings crvUSD follows the active on-chain profit-unlock stream instead of a trailing exchange-rate delta; pre-launch assets remain manifest-visible as intentional gaps but cannot publish into the live leaderboard before launch.
Source-family and benchmark freshness are eligibility rules applied before confidence arbitration. Expired evidence remains visible as NR context, but it cannot carry an exact current PYS. Every benchmark used by a published row is evaluated independently so a healthy USD lane cannot mask a stale local-currency benchmark.
See also: Safety Scores · Liquidity Score
Update cadence
1h publish / 4h supplemental
APY priority
Confidence-weighted across deterministic, curated, and fallback sources
Output
PYS (0-100)
Preconditions & Failure Modes
Minimum data
Need one resolved APY source; deterministic exchange-rate rows can publish from current state, but need prior source-specific history for a nonzero exchange-rate-derived APY
Required sources
Direct on-chain reads, curated DeFiLlama pools, curated protocol-native APIs, rate-derived benchmark inputs, or 7-45d price history
Failure behavior
No resolved source skips coin update; PYS returns 0 when apy30d <= 0 or the benchmark-adjusted effective yield is non-positive. Expired source or benchmark evidence remains visible with PYS NR rather than an exact score. A fresh row with 40 / NR fallback safety or incomplete external-opportunity evidence retains an explicitly estimated PYS and warning; missing source-risk penalty resolves to neutral 1
Adapter manifest
The adapter manifest is the canonical machine-readable source list for every yield-bearing asset Pharos tracks. It enumerates the deterministic on-chain readers, curated DeFiLlama pools, protocol-API venues, rate-derived benchmark fallbacks, price-derived NAV fallbacks, auto-discovery lending overrides, and intentional coverage gaps that feed the ranking pipeline, along with each entry's lifecycle (`active`, `quarantined`, `intentional-gap`, `experimental`). The manifest is published at /api/yield-adapter-manifest with a 5-minute cache, stamped with the current methodology version on every entry.
Worked example (verified against computePYS)
Inputs: apy30d=8.4, benchmarkRate=4.25, safetyScore=72, sourceRisk.sourceRiskPenalty=1.2, apyVarianceScore=0.18, scalingFactor=8
benchmarkSpread=8.4-4.25=4.15; effectiveYield=max(0,8.4+0.25*4.15)=9.44; riskPenalty=max(0.5,(101-72)/20)=1.45; sourceRiskPenalty=1.2; rowUtility=9.44/1.2=7.87; adjustedPenalty=1.45^1.75=1.92; yieldEfficiency=7.87/1.92=4.10; sustainability=1-0.18=0.82
PYS=clamp(round(4.10*0.82*8),0,100)=27
Result: PYS 27.
Technical details: APY source resolution, confidence arbitration, PYS formula, NAV handling, and limits
Tier 1
Direct on-chain reads
Tier 2
Curated pools + protocol APIs
Tier 3 / 4
Price- or rate-derived fallback
Effective Yield
APY + 25% benchmark spread
Row Utility
Effective yield ÷ source risk
Yield Efficiency
Row utility ÷ curved safety penalty
Sustainability
penalises high variance
PYS Score
0–100
Tier 1
On-chain reads
Tier 2
Curated venues
Tier 3 / 4
Fallbacks
Effective Yield
APY + 25% benchmark spread
Row Utility
yield ÷ source risk
Efficiency
utility ÷ safety
Sustainability
penalises variance
PYS Score
0–100
APY Resolution and Source Arbitration
- Tier 1 — Direct on-chain reads: reads protocol state directly, either as an exchange-rate delta (e.g. sUSDe), a conservative reward-only estimator (e.g. LUSD B.Protocol Stability Pool, LQTY only), or scrvUSD's Yearn V3 profit-unlock current-rate reader
- Tier 2 — DeFiLlama pools: matches the coin to a DeFiLlama yield pool via static mapping, chain-scoped wrapper rules, and address-first fallback matching, while explicitly preserving wrapper pools that upstream marks as non-stablecoin when they are configured as relevant yield sources, allowing exact-pool curated overrides for assets such as XAUT, and TVL-weighting exact pool groups when one tracked asset maps to chain-isolated wrapper vaults. Wrapper-over-native venues such as BOLD/yBOLD stay classified as native yield rather than governance-set when the wrapper is just packaging the protocol's own Stability Pool return
- Tier 2.5 — Protocol-native venues: ingests curated protocol-owned APIs and protocol-specific on-chain venue readers when the canonical savings path is not representable as a reliable DeFiLlama pool; these rows stay in the curated tier rather than inheriting Tier 1 deterministic precedence reserved for native wrapper readers. Royco Dawn senior and junior tranches publish here as
structured-trancherows keyed byroyco-dawn:<chainId>:<marketId>:<side>, while Midas mMEV publishes a NAV-appreciation row from the issuer-listed mMEV/USD oracle - Tier 3 — Price-derived: for NAV tokens only, derives APY from 7-45 day price appreciation in `supply_history`
- Tier 4 — Rate-derived: for dividend-distributing and Treasury-tracking tokens, derives APY from the selected benchmark registry entry net of known fee spreads, using USD by default, product-specific EFFR where configured, 3-month compounded €STR for EUR pegs, 3-month compounded SARON for Swiss-franc pegs, the CBR key rate for RUB pegs, and BIST TLREF for TRY pegs. Rate-derived rows can also carry an explicit benchmark override for PYS/excess-yield provenance without changing the APY derivation benchmark
Deterministic and curated paths can all contribute rows, then a confidence-weighted arbitration layer chooses the best row. Divergent discovered or fallback sources can be demoted or rejected when a canonical source disagrees materially. Protocol-native supplemental lending venues such as Aave V3 do not outrank stronger native wrapper yields purely because they query protocol state directly. Within a confidence tier, candidates compare source-risk-adjusted utility after source-risk penalty resolution before falling back to APY and TVL tie-breakers, and Resolv / USR-linked lending-opportunity venues are excluded from publication entirely. Published lending-opportunity rows also need observable venue TVL and must clear the higher of the absolute TVL floor or 0.1% of the tracked stablecoin's current supply. Linked tracked-variant rows can become parent alternatives when they represent native/wrapper yield, while third-party lending-opportunity rows stay on the asset that owns the venue, and explicit lending overrides only publish for active assets.
Yield-bearing coverage is now explicitly inventoried per asset. If no reliable runtime source exists, the asset is marked as an intentional gap rather than silently disappearing from audit coverage.
Royco Dawn tranche rows are opportunity rows, not stablecoin registry additions. Senior rows are capped at or below the underlying Safety Score; junior rows receive first-loss, utilization, coverage, market-status, drawdown, TVL, withdrawal, explicit access, and venue-posture penalties. These tranche scores are used by PYS for the opportunity row only.
Deterministic rows keep their own source identity (`onchain:<stablecoinId>`) rather than sharing a pool UUID with curated sources, so source-aware history and previous-rate lookups stay isolated when both paths coexist. Linked variants and protocol-specific on-chain rows also preserve their exact modern keys; only pre-source-key history and the named LUSD legacy alias normalize to a parent deterministic key.
Trailing APY metrics are computed from source-specific history rather than a mixed coin-level series, so source switches no longer contaminate the displayed 7d/30d averages.
Read-time data-stale warnings are also cadence-aware: hourly families attach only after three missed sync-yield-data intervals (about 3 hours at the current publisher), while price-derived rows wait 36 hours because they are backed by daily supply_history snapshots and rate-derived rows wait 48 hours for the daily benchmark producer. Ordinary exchange-rate anchors expire after 14 days; price-derived and Midas/Ondo NAV anchors remain valid through their configured 45-day comparison window.
Freshness eligibility is applied before confidence arbitration. A stale deterministic candidate cannot beat a fresh curated candidate, and every benchmark used by a published row is evaluated independently. Fallback benchmarks remain score-bearing but degraded while they are within the 48-hour scoring TTL; expired source or benchmark evidence is retained for audit with an NR PYS and explicit provenance.
Calculation mode and evidence class are separate. Exchange-rate math can be deterministic while the product estimate remains a modeled proxy; fresh direct first-party, on-chain, and curated observations therefore outrank a modeled proxy on evidence quality. Rankings label evidence as rated, estimated, partial, or NR. Missing critical freshness or Safety evidence cannot produce an exact PYS.
Pharos Yield Score (PYS)
benchmarkSpread = apy30d − benchmarkRate
effectiveYield = max(0, apy30d + benchmarkSpread × 0.25)
sourceRiskPenalty = deriveOrResolve(sourceRisk, neutral=1, max=2.5)
rowUtility = effectiveYield / sourceRiskPenalty
riskPenalty = max(0.5, (101 − safetyScore) / 20)
yieldEfficiency = rowUtility / (riskPenalty ^ 1.75)
sustainability = max(0.3, 1.0 − apyVarianceScore)
PYS = clamp(round(yieldEfficiency × sustainability × scalingFactor), 0, 100)
- Effective yieldkeeps raw APY as the anchor, then adds 25% of the row's benchmark spread so tighter local-currency cash hurdles can lift the score without turning PYS into a pure excess-yield ranker
- Source-risk penaltyuses nested source-risk evidence from measured reward share, source depth, freshness, source switching, bootstrap history, and sourced venue tier where available. History maturity counts distinct UTC observation days rather than raw hourly samples, then clamps the combined penalty to 1–2.5 while treating missing evidence as neutral
- Yield efficiencyrewards higher APY relative to the opportunity and coin risk profile — source-risk-adjusted row utility is divided by the curved safety penalty so weaker safety grades need much more effective yield to compete
- Sustainability multiplier penalizes volatile yields (high variance over 30 days), favouring consistent returns
- Scaling factoris a global constant that normalises scores into a readable 0–100 range after the steeper safety curve is applied
NAV Token Handling
NAV-appreciating tokens (e.g. sDAI, wUSDM, BUIDL) use live report-card scores when the safety framework has enough data for them, including NAV-aware report-card coverage. The default safety baseline of 40 (NR) is a conservative missing-safety fallback with an explicit provenance reason; fresh rows retain an estimated PYS until report-card hydration supplies a full safety assessment.
See the mechanism explainers for tokenized Treasury (T-bill) designs and tokenized credit funds.
Limitations
- Trailing averages require sufficient history — newly tracked coins retain a limited-history penalty until 7 distinct UTC observation days accumulate
- History before v8.31 lacks the full benchmark, source-risk, and scaling input snapshot and is labeled legacy-partial; later points store versioned inputs for exact PYS recomputation
- Rows carrying `safety-unrated` or `opportunity-evidence-missing` remain estimated until the missing safety or market-risk evidence is reviewed; stale source and benchmark evidence remains PYS NR
- Some DeFiLlama and protocol-native surfaces still depend on upstream asset metadata completeness; the resolver now drops ambiguous candidates rather than guessing across duplicate symbols
- The LUSD B.Protocol Stability Pool row is conservative by design: it includes projected LQTY incentives only and excludes ETH liquidation gains
- Price-derived APY (Tier 3) can be noisy for low-liquidity NAV tokens
Version increments when depeg thresholds, confirmation policy, peg-score formula terms, or DEWS signal composition or score-affecting input semantics change.
PegScore observes the past and present by scoring realized peg behavior, while DEWS is forward-looking and scores pre-price and live-market depeg stress signals.
Depeg Tracker combines live event detection with a universal 15-minute onset confirmation window, source-trust rules, and a per-coin peg score that penalizes time off peg, event severity, active depegs, and unstable event spread. Pending depeg confirmation checks sustained same-direction observations, independent CoinGecko evidence when the primary does not already use CoinGecko, supported native-peg quotes, Binance tickers, trusted aggregate DEX prices, and large challenger pools before promoting or rejecting candidates.
Depeg Confirmation & Trust Gates
When a live event is later contradicted across the peg by a low-confidence primary price, the detector now retires the stale live row immediately and routes the replacement move through pending confirmation instead of leaving the wrong direction active.
Pending incidents are no longer write-once snapshots. While a candidate is waiting for confirmation, Pharos now preserves the original first-seen timestamp, refreshes the current last-seen state, tracks the worst same-direction move, and resets the pending row cleanly if the market flips to the opposite side of the peg.
DEX cross-validation uses explicit trust gates: detection and pending confirmation only trust fresh DEX rows with at least $1M of aggregate source TVL, while the public DEX Price Check UI requires a lighter but still non-trivial floor of $250K. Aggregate DEX rows also need deeper corroboration before they can mutate live event state: recoveries/suppression and pending confirmation now require at least two protocol-level DEX groups, and ambiguous-primary recoveries are vetoed when a large challenger pool still shows the old depeg direction. Pool challenger confirmation counts distinct protocol/source-family groups, with the documented $5M single-pool exception preserved. For already-open depegs, same-direction aggregate DEX disagreement is advisory rather than a synthetic recovery signal, so events stay continuous until the normal recovery path confirms the coin is back inside threshold.
Every onset waits beyond the full trigger threshold for at least 15 minutes, even when multiple sources already agree. Pending confirmation chooses off-chain confirmers by source family from the primary agreeSources set. CoinGecko-family primary evidence cannot be confirmed by CoinGecko again, and Pharos does not treat DefiLlama's coingecko:{id} mirror as independent. Promoted rows store canonical keys such as temporal:15m, coingecko-confirm, and dex:curve for auditability.
Extreme moves of 50% or more, small-cap assets, and fresh multi-source clusters all use the same minimum 15-minute onset window. Independent source agreement can satisfy the source rule after that window, but it never bypasses temporal confirmation.
Non-USD fiat pegs use the live fiat FX rate as their primary reference whenever it is available, even when three or more same-peg assets are tracked. A peer median is only a fallback and must contain at least three contributors; thinner peer groups or an empty peer set fail closed. The same authority gate covers the displayed deviation: while no trustworthy reference is available, peg surfaces report the current deviation as reference unavailable instead of quoting a self-referential number. Once a live row is already open, a fresh non-cached multi-source primary cluster can retire it after recovery even if that source mix is still too soft to open brand-new events directly.
For supported fiat pairs with a CoinGecko native-currency quote, depeg routing checks that quote before trusting a derived USD-versus-FX move. That means BRZ-style BRL reference drift can no longer open, sustain, or confirm a live depeg when the fresh BRZ/BRL quote is near parity; conversely, the native quote can initiate a pending candidate when the USD-versus-FX path masks the native discount. Historical backfill follows the same principle for supported non-USD fiat assets: when CoinGecko exposes a native fiat pair, replay prefers that native history and compares it directly to the native 1.0 peg before falling back to USD-plus-FX reconstruction. In that native-replay mode, Pharos uses daily points plus a two-point confirmation window across 36 hours so thin hourly native prints do not manufacture long false historical depeg streaks.
Resolution uses hysteresis and persistence rather than the onset boundary. A live event enters recovery only at half the trigger threshold, then must remain there for 15 minutes before closing; a move back into the deadband or depeg range resets that recovery timer. This prevents near-boundary prices from repeatedly closing and reopening one incident.
Live depeg events still require at least $1M of current circulating supply. Historical replay applies the same floor from historical supply snapshots, or from current stablecoins-cache supply when historical supply is absent; if neither supply source exists, backfill preserves existing rows. Below that floor, the detail page may still show the current price deviation from peg, but it labels live event coverage as limited instead of implying the coin held peg.
PegScore begins at a reviewed replay-coverage anchor when one is curated for the asset; otherwise it uses the documented age and first-observation fallbacks. Detail and tracker surfaces distinguish projected incidents from their constituent threshold crossings and publish a recent 90-day peg view whose denominator contains only observed coverage.
DEWS (Depeg Early Warning System) computes forward-looking stress every 30 minutes from market, liquidity, confidence, blacklist, flow, and yield signals, with optional PSI-based amplification during systemic stress. Blacklist activity is attributed through the tracker config's canonical stablecoin ID, so same-symbol siblings do not inherit one issuer's freeze events. Its divergence input now reuses the live depeg DEX trust floor, so fresh-but-thin DEX rows stay visible for analytics but do not affect the score unless they pass the same `$1M` aggregate-TVL gate. The Mint/Burn Flow signal separates 30-day baseline coverage from source freshness: a fresh zero-volume 24-hour row is calm, while a mature baseline with no fresh 24-hour row is unavailable and recorded as stale.
Historical DEWS daily snapshots do not retain the underlying DEX trust metadata needed to replay that gate exactly. When operators remediate the old thin-DEX window, the repair path refreshes current rows and prunes unrecomputable daily history back to the Mar 9, 2026 trust-floor boundary before new snapshots are published under the stricter rule.
See also: Mint/Burn Flow · Liquidity Score
PegScore focus
History: realized peg behavior
DEWS focus
Forward stress score
Refresh
Peg 15m / DEWS 30m
Preconditions & Failure Modes
Minimum data
PegScore requires >=7 tracking days; DEWS requires >=2 available signals (total weight >=0.30) plus fresh core source tables
Required sources
Peg events + tracking window inputs; DEWS consumes supply/liquidity/price plus optional flow/blacklist/yield signals
Failure behavior
PegScore can be null; DEWS returns null when signal coverage is below threshold; stablecoins-cache failure aborts writes, while other source failures or stale DEX liquidity/mint-burn freshness publish partial rows and mark the cron degraded
Worked examples (verified against computePegScore and computeDEWS)
PegScore input: 100-day tracking window, 1 event (2 days, 220 bps, inactive)
pegPct=98.0, severityScore=99.86, spread=0, activePenalty=0 → pegScore=99
DEWS input signals: supply=40, pool=55, liq=25, price=0, diverg=10 (others unavailable), psiScore=70
base=(0.25*40+0.2*55+0.15*25+0.15*0+0.15*10)/0.9=29.17; PSI amplifier=1.02 → DEWS=30
Result: PegScore 99 and DEWS 30 (WATCH).
Technical details: PegScore formula, DEWS signals, weights, and threat bands
PegScore
Composite 0–100 score measuring how faithfully a stablecoin holds its peg. The tracking window spans up to 4 years and first honors a reviewed replay-coverage anchor when one is curated for the asset. Without that verified anchor, PegScore prefers a curated launch date, then the earliest supply snapshot, then the first durable Pharos valid-price observation for priced assets without supply-history coverage. Young coins are not diluted across history they didn't exist for, and unobserved pre-coverage days are not silently treated as stable. Requires at least 7 days of tracking data; returns null otherwise. Scores based on 7–30 days are marked as “Early score” to signal limited history. The API additionally publishes a coverage-aware 90-day view with observed days, incidents, constituent threshold crossings, and peg percentage.
PegScore Formula
pegScore = 0.5 × pegPct + 0.5 × severityScore − activeDepegPenalty − spreadPenalty
Time-at-Peg
50%
Event Severity
50%
− Penalties
active depeg + spread
PegScore
0–100
PegScore Components
| Component | Weight | Range | How it works |
|---|---|---|---|
| Time-at-Peg (pegPct) | 50% | 0–100 | Percentage of time spent at peg. Overlapping depeg intervals are merged to avoid double-counting |
| Event Severity | 50% | 0–100 | Penalizes magnitude, duration, and recency of each depeg event. Per-event penalty: max(durationPenalty, magnitudeFloor), where durationPenalty = (peakBps / 100) × (durationDays / 30) × recencyWeight, magnitudeFloor = (peakBps / 2000) × recencyWeight. The floor ensures even brief depegs carry a minimum penalty proportional to their severity. Recency weight = 1 / (1 + yearsAgo) so recent events count more. Duration capped at 90 days |
| Active Depeg Penalty | subtracted | 5–50 | Applied only if an ongoing depeg exists (no end date). Scales with severity: clamp(absBps / 50, 5, 50) |
| Spread Penalty | subtracted | 0–15 | Standard deviation of peak deviations across events, scaled. Penalizes erratic, unpredictable depeg behaviour. Only applies when ≥2 events exist |
DEWS
DEWS is a per-coin, forward-looking stress score (0–100) for depeg stress. It is not a calibrated probability. It is computed every 30 minutes from 8 sub-signals. Only signals with available data participate; weights are redistributed proportionally across available signals.
Bootstrap tolerance is one-time only. Missing optional tables can be ignored before the first successful publication. After that, stale or missing core liquidity inputs are recorded as source failures. The cron still writes rows that meet signal coverage, then marks the run degraded instead of treating the missing input as startup noise.
Mint/Burn Flow requires both a mature 30-day baseline and a fresh 24-hour hourly row. Fresh zero-volume rows remain available as calm flow evidence, while stale baseline-only input is recorded as a source-freshness failure and its signal weight is redistributed.
The Yield Anomaly sub-signal combines legacy warning strings with populated Yield Intelligence source-risk, source-switch, and rank-attribution stress evidence. Neutral, missing, or malformed structured yield rows remain unavailable rather than adding zero-stress signal weight.
Supply Velocity
0.25
Pool Balance Drift
0.20
Liquidity Erosion
0.15
Price Confidence
0.15
Cross-Source Divergence
0.15
Blacklist Activity
0.10
Mint/Burn Flow
0.10
Yield Anomaly
0.05
DEWS
Σ(W⋅S) / Σ(W)
0–100
CALM
0–15
WATCH
16–35
ALERT
36–55
WARNING
56–75
DANGER
76–100
Supply Velocity
0.25
Pool Balance Drift
0.20
Liquidity Erosion
0.15
Price Confidence
0.15
Cross-Source Div.
0.15
Blacklist Activity
0.10
Mint/Burn Flow
0.10
Yield Anomaly
0.05
DEWS
Σ(W⋅S) / Σ(W) — 0–100
CALM
0–15
WATCH
16–35
ALERT
36–55
WARN
56–75
DANGER
76–100
Score Formula
base = sum(W_i × S_i) / sum(W_i); psiAmp = PSI < 75 ? 1 + ((75 - PSI) / 75) × 0.3 : 1; contagionAmp = same-peg first-pass bump, clamped to 1.2; DEWS = round(clamp(0, 100, base × psiAmp × contagionAmp))
At least 2 available signal sources (total weight ≥ 0.30) are required; otherwise DEWS returns null.
Sub-Signals & Weights
- Supply Velocity (0.25) — rapid redemptions (bank run), measured from 1-day and 7-day supply contraction rates
- Pool Balance Drift (0.20) — one-sided selling pressure in DEX pools, blending balance stress, pool stress, and worst-pool imbalance
- Liquidity Erosion (0.15) — LPs fleeing, measured from 7-day changes in liquidity score and TVL
- Price Confidence (0.15) — N-source consensus failures across CoinGecko, DefiLlama list, GeckoTerminal, Pyth, Binance, Coinbase, RedStone, Curve on-chain, and DEX prices; maps confidence levels (high/single-source/low/fallback) to stress values
- Cross-Source Divergence (0.15) — fragmented pricing between multi-source consensus price, DEX price, and peg reference
- Blacklist Activity (0.10) — issuer emergency freeze surges for canonical stablecoin IDs with direct blacklist-tracker coverage
- Mint/Burn Flow (0.10) — redemption surge vs minting from on-chain Transfer event data; requires at least 7 baseline days and a fresh 24-hour mint/burn row, with fresh zero-volume rows contributing zero flow stress
- Yield Anomaly (0.05) — warning-signal and structured source-risk accumulation from yield spikes, divergence, TVL outflows, negative trends, reward-heavy regimes, thin/stale sources, source switches, and source-risk rank drivers
Threat Bands
- CALM (0–15) — no stress signals detected
- WATCH (16–35) — mild stress on 1-2 indicators
- ALERT (36–55) — multiple indicators elevated
- WARNING (56–75) — strong stress signals, depeg plausible
- DANGER (76–100) — severe stress across available weighted signals
Edge Cases
- NAV tokens are excluded entirely (price appreciates, not pegged)
- Non-USD pegs: cross-source divergence is dampened by 0.7 (noisier FX pricing)
- Small coins (<$50M): supply velocity is dampened via a logarithmic size factor
- Missing or stale DEX and mint/burn freshness stays unavailable; zero-current rows retire; aggregate freshness uses the newest current row while the body exposes oldest-row lag
DDR v4 updates the resolution rubric, duration landmarks, incident lifecycle, support gates, and reviewer audit contract.
When Pharos confirms an active depeg, the Depeg Duration Resolver answers two questions in order at the public forecast lock: will it come back, and if so, when. Stage 1 emits an ordinal Resolution Outlook — Recovery Likely, At Risk, Recovery Unlikely, or Insufficient Signal — from five kill signals (supply weaponization, backing impairment, freeze/seizure, reflexive death-spiral, exit collapse) and five recovery anchors (non-inflatable supply, hard collateral with live redemption, no supply anomaly, no single freeze point, proven mean-reversion), each shown with the factors that drove it.
DDRv4 uses a forecast-readiness-or-72h public contract. Active confirmed incidents show live facts before the lock, then freeze exactly one official prediction or no-call on the first healthy run with readiness score strictly greater than 0.75, or on the first healthy run at or after the 72h backstop. Health failures defer the lock instead of creating a no-call, and later current-price movement is shown as live status beside the frozen prediction rather than rewriting it.
Stage 1 is a calibrated mechanistic rubric, not fitted machine learning. The terminal-label corpus is roughly 90 mostly month-precision deaths that do not join to a clean feature vector at the depeg moment, so the thresholds are tuned and backtested against that corpus, DDRR reviewed outcomes, and the recovered-event set rather than learned as weights. DDRv4 adds issuer wind-down evidence, mechanism-gated backing impairment, V9 grade context, and event-time mint/burn context to the terminality read. Forecast readiness is a publication trigger, not a probability or confidence level.
Stage 2 runs only when Stage 1 is not terminal-leaning. It is an empirical landmark-survival estimate over the clean corpus of recovered incidents, conditioned on the depeg’s structural stratum (depth, direction, structural class, and peg currency) most-dependable-first. Labels follow canonical incident grouping, and comparable histories are deduplicated by coin. It reports a median time-to-repeg with a typical range (15th-85th percentile) plus per-horizon (6h / 24h / 7d / 30d) resolution-likelihood cells, support-gated and Wilson-bounded so thin cells show their support state instead of a fabricated number.
The Depeg Duration Resolver Reviewer (DDRR) is the companion audit layer. It scores only frozen outcomes that reached first publication, while coverage metrics keep no-calls, pre-lock recoveries, missed locks, publication retries/failures, data-quality gaps, and invalidated predictions visible. Recovery-likelihood and duration accuracy are computed only where a public frozen prediction can fairly be reviewed. Rollout-active incidents that predate the DDRv2 public contract use that public-contract boundary for coverage classification, so historical terminal evidence is not counted as live missed-lock debt, and old sticky 24h policy rows remain auditable with their original lock metadata. Review rows also retain repaired and regime-split lineage, with expected-versus-observed horizon calibration shown alongside realized outcomes.
DDR consumes the same confirmed depeg events as the detection pipeline; it does not run its own detection. It is a forecast from historical data, not investment advice and not a credit rating — a Recovery Unlikely verdict is a structural read, not a guarantee, and vice versa.
Trigger
Forecast readiness >0.75 or first healthy run at/after 72h
Readouts
Immutable DDR forecasts/no-calls + DDRR coverage and first-publication review
Update frequency
Precomputed in the sync-stablecoins flow; served from D1 cache
Technical details: limitations and backtest gates
Supply history is daily and mint/burn coverage is partial (about 141 of 400 coins), so coins with neither usable source degrade to Insufficient Signal on supply-dependent kill signals rather than guessing. The depeg-event provenance side-table is unpopulated in production, so audit-verdict gating is not used; corpus quality comes from incident grouping, quarantine of flappy coins, and a minimum-severity floor. Terminal truth derives from cemetery/frozen status and the live deep-and-sustained-open pattern, never from the presence of a recovery price on a backfilled row.
Acceptance gates: Stage 1 must score Recovery Unlikely on clearly-attributable deaths (UST, IRON, USR) and must not on major recoveries (USDC during SVB, DAI on Black Thursday, LUSD/BOLD wobbles); Stage 2 median and typical ranges must contain realized resolution times at the documented coverage rate, with leave-one-coin stability and a stable canonical lineage hash. Abandoned slow-deaths that never present a sharp depeg are out of scope. The full methodology, limitations, and backtest plan live in docs/depeg-resolver.md.
DDRR does not replay today’s resolver over historical rows. It compares the frozen first-published DDR outcome with the later event outcome, keeps append-only errata visible, preserves immutable trigger/readiness metadata, and separates policy-universe coverage from scoreable recovery/duration accuracy. If a health deferral is followed by recovery or reliable terminal evidence before a healthy lock, the row remains a pre-lock coverage outcome rather than a retroactive forecast. Rollout-active incidents that already existed before DDRv2 use the public-contract effective timestamp as the fairness boundary for the same pre-lock coverage test.
Version increments when tracked contracts, event parsing rules, cursor semantics, or amount-enrichment logic change.
The Blacklist Tracker monitors issuer intervention events across USDC, USDT, PAXG, XAUT, PYUSD, USD1, USDG, RLUSD, U, USDtb, A7A5, FDUSD, BRZ, AUSD, EURI, USDQ, USDO, USDX, AID, TGBP, EURC, BUIDL, USDP, TUSD, NUSD, EURCV, USDA, USAT, AEUR, XUSD, XAUm, JPYC, FRXUSD, and FIDD contracts, including blacklist, unblacklist, block/unblock, account pause/unpause, and destroy/wipe actions across supported EVM and Tron networks.
Methodology revisions document changes to event coverage, cross-chain decoding behavior, cursor safety policies, event-time amount attribution rules, and the separate freeze-ledger snapshot used for the public summary and quarterly chart, including the reconciled `kyc.rip` / `stables.rip` bootstrap for ETH USDC, ETH USDT, and TRON USDT. Non-USD or commodity-denominated assets use coin-specific price-cache entries when Pharos reports USD frozen value.
Public frozen totals are last-known successful freeze-ledger snapshots rather than live balance guarantees. Provider refresh failures preserve the previous successful value and surface data-quality context. New snapshot identities are contract/config scoped, while older rows can use legacy symbol/chain/address fallback until remediation catches them up.
Blacklistability uses the report-card four-status model: Yes, Upstream, Possible, and No. Any reserve, custody, backing, parent-asset, or CEX/custody-rail exposure resolves as Upstream; Possible is reserved for curated direct token or vault controls that are not confirmed direct blacklist controls.
Data sources
Etherscan v2, chain RPC / dRPC log scans, and TronGrid
Tracked events
Freeze, Unfreeze, Wipe (AddedBlackList, RemovedBlackList, DestroyedBlackFunds)
Chains
Ethereum, Tron, + supported EVM L2s
Update frequency
Every 6 hours (`3 */6 * * *`) + backlog reconciliation
Preconditions & Failure Modes
- Minimum data
- At least one indexed block range per chain
- Required sources
- Block explorer event logs with valid ABI decoding
- Failure behavior
- Preserves last-known snapshots; stale/provider-failed status shown
Worked example: blacklist event reconciliation
Event: AddedBlackList(0xabc...def) on USDT (Ethereum), block 19,234,567
Ledger update: +1 frozen address, total frozen balance recalculated from on-chain balanceOf
Cross-chain: Tron USDT freeze count unchanged → combined freeze count increments by 1
Result: Dashboard shows updated freeze count and reconciled total across chains.
Technical details: freeze ledger reconciliation
The blacklist tracker stores event-time rows separately from a persistent freeze-ledger snapshot. Each cron run processes new events since the last indexed block; new blacklist rows refresh last-known snapshots, while later unblacklist events do not delete historical ledger rows.
Backlog sync handles gaps from missed cron runs or RPC failures by replaying events from the last confirmed cursor. Tron events use a separate ingestion path due to the TRC-20 event format differences, and missing Tron account/token-balance data remains provider-missing rather than being converted to zero.
The public-facing freeze totals combine per-chain counts into a single figure. Destroy/seize events can overwrite the stored amount when they provide better seized-value evidence, and the public summary reads the persistent ledger rather than treating unfreeze rows as historical deletion. The legacy active fields remain available for the local net-active state machine, but public freeze exposure should use the tracked ledger fields.
Version increments when factor weights, tier assignments, or sub-factor formulas change.
The Chain Health Score is a 0–100 composite that rates each blockchain’s stablecoin ecosystem across five weighted factors. It answers: how healthy, diverse, and resilient is the stablecoin mix on this chain?
See also: Liquidity Score
Score range
0–100 (null when safety-score coverage < 50%)
Refresh cadence
15-minute stablecoins cache cadence; `/api/chains` freshness budget is 1800 seconds
Dependencies
DefiLlama supply, Pharos Safety Scores, peg rates, L2BEAT chain-risk snapshot
Formula & Weights
Composite formula
healthScore =
0.30 × quality
+ 0.20 × chainEnvironment
+ 0.20 × concentration
+ 0.20 × pegStability
+ 0.10 × backingDiversity| Factor | Weight | What it measures |
|---|---|---|
| Quality | 30% | Supply-weighted average of Pharos Safety Scores for stablecoins on the chain. Unrated coins default to 40. Returns null if rated supply < 50% of total. |
| Chain Environment | 20% | Rates the chain’s own infrastructure quality with L2BEAT first for matched scaling projects, using stage plus Sequencer Failure, State Validation, Data Availability, Exit Window, and Proposer Failure. Unmatched chains fall back to the Pharos resilience tier model. |
| Concentration | 20% | 100 × (1 − HHI) where HHI = Σ(market share)². A single stablecoin scores 0; perfectly even N coins score 100×(1−1/N). |
| Peg Stability | 20% | Supply-weighted average of per-coin peg proximity: 100 − deviationBps/5. Coins without a price get a neutral 50. |
| Backing Diversity | 10% | Normalized Shannon entropy across the two active backing types (RWA-backed and crypto-backed). 0 for monoculture, 100 for an even split. |
Chain Environment Sources
The same stablecoin can have different security properties on different chains. A fully on-chain, censorship-resistant stablecoin on Ethereum mainnet may lose those guarantees on an L2 with a centralized sequencer. The chain environment factor captures this.
Matched L2BEAT scaling projects use a static snapshot of L2BEAT stage and risk rows. The environment score blends 40% stage score with 60% average risk sentiment across the five L2BEAT fields. L2BEAT is not fetched live during request handling.
| Component | Mapping |
|---|---|
| Stage | Stage 2 = 100, Stage 1 = 80, Stage 0 = 55, not applicable or under review = 50 |
| Risk fields | Sequencer Failure, State Validation, Data Availability, Exit Window, Proposer Failure |
| Risk sentiment | Good = 100, warning = 60, bad = 20, neutral or under review = 50 |
Chains without a matched L2BEAT snapshot continue to use the fallback tiers below.
| Tier | Score | Criteria | Examples |
|---|---|---|---|
| Tier 1 | 100 | Highly decentralized, battle-tested, censorship-resistant L1 | Ethereum |
| Tier 2 | 60 | Established chains with moderate centralization (default for unlisted chains) | Solana, BSC, Tron, Avalanche |
| Tier 3 | 20 | Unproven, known centralization issues, or compromised security | PulseChain, Harmony, BitTorrent |
Health Bands
| Band | Score Range | Interpretation |
|---|---|---|
| Robust | 80–100 | Strong, diversified stablecoin ecosystem on quality infrastructure |
| Healthy | 60–79 | Good ecosystem with room for improvement |
| Mixed | 40–59 | Moderate concerns — concentration, quality gaps, or chain risk |
| Fragile | 20–39 | Significant ecosystem weaknesses |
| Concentrated | 0–19 | Minimal diversity or critically weak infrastructure |
Worked example: Ethereum vs PulseChain
Ethereum (Tier 1)
quality = 72 (supply-weighted safety scores across ~190 coins)
environment = 100 (tier 1 — gold standard for decentralization)
concentration= 66 (USDT ~48%, USDC ~33% → HHI ≈ 0.34)
pegStability = 98 (most coins very close to peg)
diversity = 35 (overwhelmingly RWA-backed)
health = 0.30×72 + 0.20×100 + 0.20×66 + 0.20×98 + 0.10×35
= 21.6 + 20 + 13.2 + 19.6 + 3.5 = 77.9 → 78 (healthy)PulseChain (Tier 3)
quality = 72 (DAI + unrated coins defaulting to 40)
environment = 20 (tier 3 — unproven, centralized)
concentration= 67 (DAI ~39%, rest ~12% each)
pegStability = 98 (coins on peg)
diversity = 61 (mixed backing types)
health = 0.30×72 + 0.20×20 + 0.20×67 + 0.20×98 + 0.10×61
= 21.6 + 4 + 13.4 + 19.6 + 6.1 = 64.7 → 65 (healthy)
→ Chain environment alone creates a 16-point gap vs Ethereum.