Skip to main contentSkip to data table
Pharos
PHAROSlive stablecoin signals

Methodology

How Pharos grades stablecoins: transparent scoring across safety, peg stability, liquidity, yield, and contagion 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.

View

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.

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? Four base dimensions answer different parts of that question. Liquidity / Exit (30%) measures whether you can leave at all. Dependency Risk (25%) measures whether something else has to hold for this one to hold. Resilience (20%) measures the quality of what backs the coin and who is allowed to touch it. Decentralization (15%) measures whether anyone can switch the lights off. We weight them in that order because, in every real depeg we have studied, the exit was already gone before the press release went out.

The peg score does not sit alongside the four base dimensions. It multiplies them. After the weighted base score is computed, we apply (pegScore / 100)0.40 as a power curve. The exponent is deliberate. At 1.0, a ten-point drop in peg score would erase ten points of safety, which punishes mid-quality pegs more than the data supports. At 0.0, the peg would not constrain the grade at all, which would let a structurally fine asset with a chronically wobbly peg coast on collateral quality. Forty splits the difference: a peg score of 90 takes about four percent off; a peg score of 10 takes sixty percent off. Strong pegs are nearly untouched, broken pegs are sharply demoted, and the curve does the work without a cliff.

Dependency Risk is the dimension that most often surprises issuers. A wrapper that lives entirely inside a parent stablecoin cannot, by construction, be safer than its parent. We enforce that with a variant overall cap, not by averaging the parent in. Averaging would let a well-built wrapper around a weak base settle at some middle grade that no one should rely on; capping says the downstream cannot escape the upstream, which is how the dependency actually behaves under stress. The same logic produces family-specific wrapper ceilings for risk-absorption, strategy vaults, and bond-maturity variants. The cap is honest about what the asset is: a claim on something else.

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, May 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 three lifecycle phases. The phase determines which surfaces ingest, score, and read back the coin's data. Scoring methodologies always operate over the active subset; pre-launch and frozen coins are 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.

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

Every tracked coin (active + pre-launch + frozen). Used for canonical-ID lookups, registry validation, and static stablecoin detail routes.

ACTIVE

Active subset only. Used by every write-side cron and live aggregate.

READABLE

Active + frozen. Used by readback/archive surfaces that should preserve frozen assets while excluding pre-launch assets.

FROZEN

Frozen subset only. Drives the cemetery merge and the dataset export.

See also: Cemetery · Upcoming launches · Operator runbook: docs/freezing-stablecoins.md

Pricing Pipeline Methodology

v6.15Version history →

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 rows use upstream last_updated_atwhen it is present and are rejected when that upstream 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.

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)

Exchanges

BN (w2), KR (w2), CB (w2), BS (w1)

Oracles

Pyth (w2), RS (w1)

On-chain

Curve (w3), DEX/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 medians

Authoritative Overrides

Protocol redemption (cUSD, iUSD) after market probes

Enrichment Pipeline

5-pass fallback with Jupiter before DexScreener

Price Validation + Confidence

high / single-source / low / fallback

Source Weights

SourceWeightTypeNotes
CoinGecko2AggregatorPrimary market data via /simple/price
CoinGecko ticker2Exchange tickerCurated ticker corroboration path for tracked exchange pairs
DefiLlama (list)1AggregatorIndependent stablecoins list price via stablecoins.llama.fi
Pyth Network2OracleHermes endpoint with confidence intervals
Binance2CEXSingle batch call for all spot tickers
Kraken2CEXExplicit pair mapping with alias-safe response handling
Bitstamp1CEXLower-weight corroboration via the all-tickers endpoint
Coinbase2CEXPer-symbol spot prices
RedStone1OraclePer-venue breakdown; requires at least 2 venues and 60% agreement
Curve on-chain3On-chainStableSwap implied prices via explicit direct, one-hop, and opt-in chained-hop get_dy() routes
Curve oracle3On-chainAdditional primary-consensus voice for crvusd-curve
DEX pools1On-chainAggregate DEX voice, withheld only when an overlapping protocol-level DEX bridge lane is admitted
Protocol DEX APIs2-3On-chain / pool-state APIPrimary-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.
GeckoTerminal1On-chainPool-level cross-check for weak CG / DL-list soft-source outcomes (≥$10K TVL)
Exact-address providers1Market / on-chainTargeted DexScreener, DexPaprika, CoinGecko Onchain, Alchemy Prices, Moralis, and Solana Birdeye quotes for missing, below-depth, or low-confidence assets; exact chain+address only and non-depeg-authoritative on their own

Consensus Algorithm

The consensus engine clusters all available source prices for an asset and picks the most reliable result:

  1. Collect all source prices with non-failed circuit breakers
  2. Find the largest fully pairwise cluster of sources that agree within 50 bps (fixed pegs) or 500 bps (NAV tokens)
  3. Break equal-size clusters by total weight, then stronger trust tier, then tighter spread, then peg proximity when available
  4. If the winning cluster has 2+ members, publish its median price and separately keep the best cluster member for provenance
  5. Choose that internal selected source by weight, then trust tier, then peg proximity, then source key
  6. If no cluster of 2+ forms, fixed pegs stay on fixed-peg rules and fall back to the best trusted single source
  7. 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 to low, 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 ≤ thresholdBps

Authoritative 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 PYUSD pricing because base USDAI is treated as an instantly redeemable PYUSD wrapper
  • iUSD (Initia) / USDCx: inherit tracked AUSD or USDC pricing when the parent rail is fresh and replay-safe
  • USDK / XO / USDnr: inherit tracked wM pricing 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() or virtualPrice() 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. 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:

  1. Pass 1: Canonical tracked contract identity → DefiLlama coins API, but only prices that pass peg-aware validation can resolve the asset
  2. Pass 1b: Tracked alternate deployment fallback only (no synthetic same-address cross-chain probing; same validation gate as pass 1)
  3. Pass 2: CoinMarketCap batch listings (slug first; symbol fallback only when the tracked symbol is unique, rate-limited to 1 call/hour)
  4. 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)
  5. Pass 4: DexScreener exact token-address pools only; the older unique-symbol search fallback is retired, and the pass remains capped at 10 actual exact-address requests per run
  6. Pass 5: Allowlisted low-volume CoinGecko recovery for selected DefiLlama-listed assets, published only with fallback confidence

Confidence Levels

LevelConditionDownstream effect
highIndependent agreeing cluster survives list-aggregator downgrade and pool challengePublished as the agreeing cluster median; depeg detection still checks authoritative-source trust before skipping confirmation
single-sourceOne usable source, or a non-independent list-aggregator cluster treated as one sourceDepeg detection requires pending confirmation
lowSources disagree beyond threshold, or pool challenge firedPool challenge: TVL-weighted pool price used; otherwise closest to peg reference; depeg requires confirmation
fallbackAll primary sources down; enrichment or cache usedDepeg 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

Commodity tokens (gold, silver) 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.

Stability Index Methodology

v3.4Version history →

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.

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

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 latest DEWS row set

Required sources

Market-cap totals, active depeg inputs (current stablecoins price, or recent replay-safe price_cache fallback for already-open depegs), and latest DEWS stress-signal rows 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 + trend

The 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

ComponentRangeFormulaPurpose
Severity0–68min(68, Σ(abs(bps)/100 × share × log2(1+mcap/1B) × 60 × factor))Magnitude-weighted depeg damage with extra emphasis on mega-cap instability
Breadth0–17min(17, Σ(sqrt(mcap/1B) × 3 × factor))How widely depegs are spreading across unique coins
Stress Breadth0–5min(5, dewsStressBreadth)Early-warning pressure from DEWS stress signals before full depegs
Trend−5 to +5clamp(-5, 5, mcap7dChangePct)7-day stablecoin market-cap momentum (supports or offsets penalties)

Depeg Handling Rules

  • 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 over 120 days.
factor = ageDays ≤ 30 ? 1.0 : max(0.25, 1.0 − (ageDays − 30)/120)

Condition Bands

RangeBandMeaning
90–100BEDROCKNear-ideal market stability
75–89STEADYNormal conditions with minor stress
60–74TREMORMeaningful instability emerging
40–59FRACTUREBroad, significant market stress
20–39CRISISContagion-level instability
0–19MELTDOWNSystemic peg failure conditions

Safety Scores Grading Methodology

v7.291Version history →

Version increments when weights, thresholds, or dimension definitions change.

Pharos synthesizes multiple data signals into a single transparent grade per stablecoin. The overall score is computed in two steps: first, a weighted average of four base dimensions (exit liquidity, resilience, decentralization, dependency risk), then a peg stability multiplier that penalizes coins with poor pegs while barely affecting well-pegged ones. The exit-liquidity dimension blends raw DEX liquidity with redemption-backstop quality only when the route has usable current evidence. Reserve data is a separate resilience input: live reserve sync can improve collateral quality only when the latest snapshot is fresh, independent, clean, and score-grade. When some base dimensions lack data (NR), their weight is redistributed proportionally among rated ones. Active depeg caps use the open event's peak deviation, while the peg dimension itself remains a direct pegScore passthrough.

See also: PegScore + DEWS · Liquidity Score · Infrastructure

Model shape

4 dimensions + peg multiplier

Grade output

A+ to F, with NR

Key caveat

No exit signal = 10% penalty

Preconditions & Failure Modes

Minimum data

At least 2 rated non-peg dimensions

Required sources

Peg summary, DEX liquidity/redemption data, and dependency/metadata inputs

Failure behavior

NR if peg is missing on non-NAV coins; no-liquidity penalty when both DEX and redemption evidence are unavailable; live reserve adapters stay detail-visible when they are stale, degraded, or proof-only

Three Reserve-Related Signals

These labels are easy to conflate. They do different jobs, and only two can affect the Safety Score.

SignalWhat it meansScore use
Reserve viewA detail-page reserve display exists: live, curated-validated, proof, curated, or estimated.Informational unless it also passes the score-grade live-reserve gates.
Score-grade live reserveThe current report-card snapshot used a fresh, clean, independent live reserve snapshot for collateral quality.Can replace curated collateral slices inside Resilience.
Redemption telemetryA live reserve adapter emitted current redemption capacity, fee, freshness, or route-status metadata.Can feed Redemption Backstop capacity or fee scoring; it does not automatically change collateral quality.
Worked example (verified against computeOverallGrade)

Inputs: DEX 30, Redemption 88, Exit 91, Res 70, Decen 60, Dep 75, Peg 92

base=(91*0.30+70*0.20+60*0.15+75*0.25)/0.90=76.72

final=round(base*(92/100)^0.40)=round(76.72*0.9672)=74

Result: Score 74 (grade B).

Interactive calculator: explore how weights and thresholds shape the grade

Interactive: Try your own inputs

Scores below use the same overall combiner, weights, and thresholds as production. It does not model NAV exceptions, stale-input gates, active-depeg caps, or dependency derivation — use it to explore the grade math, not to predict a specific coin's grade.

Computed grade:58 / 100(base 58.9, peg multiplier applied)
Technical details: full pipeline, dimension formulas, thresholds, and caveats

Exit Liquidity

30%

Resilience

20%

Decentralization

15%

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

DimensionWeightSourceDescription
Exit Liquidity30%DEX liquidity + redemption backstopBest-path model: exit quality = best available path (DEX or redemption) + diversification bonus for having both
Resilience20%Collateral, custody2-factor solvency measure; blacklist capability reported descriptively only
Decentralization15%Governance type, chain riskGovernance structure with chain-risk penalty
Dependency Risk25%Upstream grades, collateral weightsInherited 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.

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.

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. 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-factorWhat it measuresScoring
Collateral QualityReserve composition riskWeighted 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 ModelWho 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:

  • 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 already chain-adjusted 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.

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— falls back to 70 when all dependency scores are unavailable; partially unavailable upstream weights are scored at 70 instead of being treated as self-backed

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

GradeScore Range
A+87–100
A83–86
A−80–82
B+75–79
B70–74
B−65–69
C+60–64
C55–59
C−50–54
D40–49
F0–39
NRNot 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

Infrastructure Tagging

v1.0

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

Liquidity Score

v5.8Version history →

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.

Repeated sightings of the same physical pool across direct API, staged, and fallback sources are collapsed before DEX price aggregation. 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.

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. That keeps filtered or downscaled pools from lingering in the final score through stale pre-filter totals.

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.

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 Depth

30%

Vol. Activity

20%

Pool Quality

20%

Durability

20%

Diversity

10%

Liquidity Score

0–100

Components

ComponentWeightHow it works
TVL Depth30%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 Activity20%Log-scale V/T ratio: 38x(log10(vtRatio)+3). ~0.3%->18, ~3.5%->59, ~19%->86, ~32%+->100
Pool Quality20%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.
Durability20%TVL stability (35%), volume consistency (25%), pool maturity (25%), organic fee fraction with sqrt curve (15%)
Diversity10%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)
  • 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

Mint/Burn Flow Scoring

v6.17Version history →

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

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
  • 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:

BandScore RangeMeaning
CRISIS−100 to −70Severe below-baseline redemption pressure across major coins
STRESS−70 to −40Worsening coordinated pressure versus normal conditions
CAUTIOUS−40 to −10Mild but broad pressure deterioration
NEUTRAL−10 to 10Close to 30D norms across the market
HEALTHY10 to 40Improving aggregate pressure versus baseline
CONFIDENT40 to 70Strong positive pressure shift across major coins
SURGE70 to 100Exceptional 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

Yield Intelligence

v8.29Version history →

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. Midas mMEV now has a curated NAV-oracle row, and Curve Savings crvUSD now 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.

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 (safety defaults to 40 / NR if live report-card hydration is missing; missing source-risk penalty resolves to neutral 1), while degraded benchmark or safety inputs are surfaced in provenance

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

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-tranche rows keyed by royco-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, 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.

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 rather than hourly source observations.

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, then clamps it 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 only a missing-safety fallback, so a NAV token's PYS can still reflect a full safety assessment when report-card hydration succeeds.

See the mechanism explainers for tokenized Treasury (T-bill) designs and tokenized credit funds.

Limitations

  • Trailing averages require sufficient history — newly tracked coins may show unstable scores until 7 days of data accumulate
  • 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

PegScore and Depeg Early Warning Score (DEWS)

v6.08Version history →

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, secondary-source confirmation rules for large-cap assets, low-confidence primary prices, and extreme moves, plus a per-coin peg score that penalizes time off peg, event severity, active depegs, and unstable event spread. Pending depeg confirmation checks same-direction off-chain sources (CoinGecko or DefiLlama), 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.

Pending confirmation chooses off-chain confirmers by source family from the primary agreeSources set. CoinGecko-family primary evidence cannot be confirmed by CoinGecko again, DefiLlama-family evidence cannot be confirmed by DefiLlama again, and promoted rows store canonical keys such as coingecko-confirm, dex:curve, and pool:curve:gecko_terminal for auditability.

Thin non-USD fiat peg groups also fail closed when the live peg reference would have to rely on a 1–2 coin peer median or an empty peer set instead of cached FX. The same authority gate covers the displayed deviation: while the reference is too thin to verify, 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 clean native-market quote, depeg routing now also checks that direct native 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 direct BRZ/BRL quote is already back near parity. Historical backfill now 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 now 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.

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.

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.

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 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 but is capped at the coin's actual age. PegScore now prefers a curated launch date when one is available, 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 priced assets no longer stay unrated solely because no supply snapshot has been written. 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.

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

ComponentWeightRangeHow it works
Time-at-Peg (pegPct)50%0–100Percentage of time spent at peg. Overlapping depeg intervals are merged to avoid double-counting
Event Severity50%0–100Penalizes 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 Penaltysubtracted5–50Applied only if an ongoing depeg exists (no end date). Scales with severity: clamp(absBps / 50, 5, 50)
Spread Penaltysubtracted0–15Standard 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.

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

0.15

Blacklist Activity

0.10

Mint/Burn Flow

0.10

Yield Anomaly

0.05

DEWS

Σ(W⋅S) / Σ(W) — 0–100

CALM

015

WATCH

1635

ALERT

3655

WARN

5675

DANGER

76100

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; mature 30-day coverage stays available even when the latest 24-hour window is quiet, contributing zero flow stress instead of disappearing
  • 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 (015) no stress signals detected
  • WATCH (1635) mild stress on 1-2 indicators
  • ALERT (3655) multiple indicators elevated
  • WARNING (5675) strong stress signals, depeg plausible
  • DANGER (76100) 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 DEX data stays unavailable; zero-current rows retire; aggregate freshness uses the newest current row while the body exposes oldest-row lag

Depeg Duration Resolver

v3.01Version history →

Version increments when the resolution rubric, duration stratification, forecast-readiness trigger, incident grouping, support-gate rules, or reviewer scoring/public audit contract changes.

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.

DDRv3 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 plus the recovered-event set rather than learned as weights. 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. It reports a median time-to-repeg with an interquartile band 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, and old sticky 24h policy rows remain auditable with their original lock metadata.

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/IQR bands 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.

Contagion Stress Test

v1.0

The stress test simulates dependency failures to reveal systemic concentration risk across the stablecoin ecosystem.

See also: Safety Scores

Simulation action

Force one coin to grade D

Propagation channel

Dependency channel only

Primary output

Affected coins + supply at risk

Preconditions & Failure Modes

Minimum data

Target coin must have dependents and mapped dependency weights

Required sources

Current report-card scores plus dependency map inputs

Failure behavior

Only direct dependency-risk channel is recomputed (no peg/liquidity/confidence feedback loops)

Worked example (verified against scoreDependencyRisk path used by stress test)

Override upstream score to 40; dependent coin has 60% exposure and decentralized self-backed score 90

blended=0.6*40+0.4*90=60; weak-upstream penalty (score<75) applies -10

dependencyRisk score=50

Result: Dependency dimension falls to 50 before overall grade recomputation.

Technical details: simulation pipeline, scoreboard logic, and limitations

Select Target

pick a coin

Override to D

force downgrade

Recompute Dep. Risk

cascade upstream

Impact Report

coins & $ at risk

Systemic Risk Scoreboard

On page load, the scoreboard pre-computes the five most damaging single-coin failure scenarios. For each targetable coin (one that has dependents), it simulates a downgrade to D, counts the number of affected coins, and sums their market cap as “supply at risk.” Results are sorted by supply at risk descending.

Stress Test

The interactive stress test overrides a target coin's overall score, then recomputes the Dependency Risk dimension for every coin that lists that target as an upstream dependency. This models the direct dependency channel only.

In reality, a major stablecoin failure would also impact peg stability, liquidity, and market confidence simultaneously — the stress test captures only the mechanical dependency impact.

Limitations

  • Collateral weights are researched estimates that may not reflect real-time ratios
  • The stress test models only the dependency risk channel, not second-order market effects

Blacklist Tracker Methodology

v3.997Version history →

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, MNEE, 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.

Chain Health Score

v1.3Version history →

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

Formula & Weights

Composite formula

healthScore =
      0.30 × quality
    + 0.20 × chainEnvironment
    + 0.20 × concentration
    + 0.20 × pegStability
    + 0.10 × backingDiversity
FactorWeightWhat it measures
Quality30%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 Environment20%Rates the chain’s own infrastructure quality, decentralization, and censorship resistance via a resilience tier: Tier 1 (100) for battle-tested, highly decentralized L1s; Tier 2 (60) for established chains with moderate centralization; Tier 3 (20) for unproven or problematic chains.
Concentration20%100 × (1 − HHI) where HHI = Σ(market share)². A single stablecoin scores 0; perfectly even N coins score 100×(1−1/N).
Peg Stability20%Supply-weighted average of per-coin peg proximity: 100 − deviationBps/5. Coins without a price get a neutral 50.
Backing Diversity10%Normalized Shannon entropy across the two active backing types (RWA-backed and crypto-backed). 0 for monoculture, 100 for an even split.
Chain Resilience Tiers

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.

TierScoreCriteriaExamples
Tier 1100Highly decentralized, battle-tested, censorship-resistant L1Ethereum
Tier 260Established chains with moderate centralization (default for unlisted chains)Solana, BSC, Arbitrum, Tron, Base, Polygon
Tier 320Unproven, known centralization issues, or compromised securityPulseChain, Harmony, BitTorrent
Health Bands
BandScore RangeInterpretation
Robust80–100Strong, diversified stablecoin ecosystem on quality infrastructure
Healthy60–79Good ecosystem with room for improvement
Mixed40–59Moderate concerns — concentration, quality gaps, or chain risk
Fragile20–39Significant ecosystem weaknesses
Concentrated0–19Minimal 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.