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.
Reader Guide
Reader mode keeps summaries up front. Switch to Analyst for formulas, caveats, and worked examples.
Page rhythm: summary, quick facts, worked example, technical notes.
Reader Guide
Reader mode keeps summaries up front. Switch to Analyst for formulas, caveats, and worked examples. Use the jump rail toggle to switch modes without losing your place in the page.
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. The protocol-level DEX bridge now spans Fluid, Balancer, Raydium, Orca, Meteora, PancakeSwap, Aerodrome Slipstream, and Velodrome Slipstream. DEX bridge identity is 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, 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, including DEX-inclusive soft clusters unless an exempt hard source is present. 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.
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 5-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. 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 DexScreener symbol search is reserved for addressless assets rather than downgrading exact-token candidates to symbol-only identity.
Update cadence
15m refresh
Sources
14+ 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
Each source has its own breaker: 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
CoinGecko (w2)
DL list (w1)
Exchanges
Binance (w2), Kraken (w2)
Coinbase (w2), Bitstamp (w1)
Oracles
Pyth (w2)
RedStone (w1)
On-chain
Curve (w3)
DEX agg (w1), protocol DEX (w2-w3), GT (w1)
N-Source Consensus
Pairwise clusters; publish cluster median, keep best member for provenance
Pool Challenge
Soft-only consensus challenged; replacement uses protocol-aware weighted medians
Authoritative Overrides
Protocol redemption (cUSD, iUSD) after market probes
Enrichment Pipeline
5-pass fallback with Solana-native Jupiter recovery
Price Validation + Confidence
high / single-source / low / fallback
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 agg (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
| Source | Weight | Type | Notes |
|---|---|---|---|
| CoinGecko | 2 | Aggregator | Primary market data via /simple/price |
| CoinGecko ticker | 2 | Exchange ticker | Curated ticker corroboration path for tracked exchange pairs |
| DefiLlama (list) | 1 | Aggregator | Independent stablecoins list price via stablecoins.llama.fi |
| Pyth Network | 2 | Oracle | Hermes endpoint with confidence intervals |
| Binance | 2 | CEX | Single batch call for all spot tickers |
| Kraken | 2 | CEX | Explicit pair mapping with alias-safe response handling |
| Bitstamp | 1 | CEX | Lower-weight corroboration via the all-tickers endpoint |
| Coinbase | 2 | CEX | Per-symbol spot prices |
| RedStone | 1 | Oracle | Per-venue breakdown; requires at least 2 venues and 60% agreement |
| Curve on-chain | 3 | On-chain | StableSwap implied prices via get_dy() |
| Curve oracle | 3 | On-chain | Additional primary-consensus voice for crvusd-curve |
| DEX pools | 1 | On-chain | Aggregate DEX voice, but withheld when overlapping protocol-level DEX bridge data exists |
| Protocol DEX APIs | 2-3 | On-chain / pool-state API | One aggregated source per protocol from Fluid, Balancer, Raydium, Orca, Meteora, PancakeSwap, Aerodrome Slipstream, and Velodrome Slipstream; only promoted when corroborated or when no non-DEX voice exists |
| GeckoTerminal | 1 | On-chain | Pool-level cross-check for weak CG / DL-list soft-source outcomes (≥$10K TVL) |
Consensus Algorithm
The consensus engine clusters all available source prices for an asset and picks the most reliable result:
- Collect all source prices with non-failed circuit breakers
- Find the largest fully pairwise cluster of sources that agree within
50 bps(fixed pegs) or500 bps(NAV tokens) - Break equal-size clusters by total weight, then tighter spread, then peg proximity when available
- If the winning cluster has 2+ members, publish its median price and separately keep the best cluster member for provenance
- Choose that internal selected source by weight, then trust tier, then peg proximity, then source key
- If no cluster of 2+ forms, fixed pegs stay on fixed-peg rules and fall back to the best trusted single source
- Pool challenge: if all agreeing sources are challenge-eligible (CG, DL-list, DEX average, or promoted protocol DEX sources without a hard-source corroborator), check each large priced DEX pool (≥$100K TVL) from the published challenger snapshot built from the full retained pool set. If any diverges ≥500 bps from the weak result, downgrade to
low, and only replace the price when at least two independent protocol-level medians corroborate that divergence — on-chain liquidity is a more honest signal when aggregators share upstream data, but a single protocol or a single rogue pool can still be wrong
agree(a,b) = |a.price − b.price| / midpoint(a,b) × 10000 ≤ thresholdBpsAuthoritative Price Overrides
For wrapper-style assets whose executable value is set by direct protocol redemption, or by an instantly redeemable tracked base asset, rather than by secondary-market liquidity, the pipeline switches to an authoritative redemption-based mark:
- cUSD (Cap):
getBurnAmount()— cUSD → USDC redemption rate - iUSD (infiniFi):
receiptToAsset()— iUSD → USDC redemption rate - USDai: inherits tracked
PYUSDpricing because base USDAI is treated as an instantly redeemable PYUSD wrapper - 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.
Enrichment Pipeline (5-pass fallback)
Assets still missing prices after primary consensus go through a staged enrichment pipeline:
- Pass 1: Canonical tracked contract identity → DefiLlama coins API, but only prices that pass peg-aware validation can resolve the asset
- Pass 1b: Tracked alternate deployment fallback only (no synthetic same-address cross-chain probing; same validation gate as pass 1)
- Pass 2: CoinMarketCap batch listings (slug first; symbol fallback only when the tracked symbol is unique, rate-limited to 1 call/hour)
- Pass 3: Jupiter Price API for tracked Solana mints (liquidity-gated)
- Pass 4: DexScreener exact token-address pools first; unique-symbol search is reserved for addressless assets and stays filtered by >$50K liquidity, capped at 10 actual requests per run while the pass walks the full prioritized missing set so skipped non-unique rows do not crowd out later valid candidates
Confidence Levels
| Level | Condition | Downstream effect |
|---|---|---|
| high | ≥2 sources agree within threshold | Published as the agreeing cluster median; full trust for depeg detection and scoring |
| single-source | Only 1 source returned a price | Depeg detection requires pending confirmation |
| low | Sources disagree beyond threshold, or pool challenge fired | Pool challenge: TVL-weighted pool price used; otherwise closest to peg reference; depeg requires confirmation |
| fallback | All primary sources down; enrichment or cache used | Depeg mutations blocked; stale banner shown on frontend |
Price Validation
Every price is validated before entering the replay cache. Validation is context-aware with four modes:
- Authoritative primary: can admit deep downside for fixed pegs, but publication still requires corroboration unless the mark is protocol redemption or a pool-challenge replacement
- Fallback enrichment: rejects isolated bad prints below a lower bound
- DEX observation: requires consistent $50K post-confidence TVL floor
- Historical backfill: validates against per-timestamp peg references
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.
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.
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 sets, but the cron requires total market cap > 0 and an available active-depeg input query
Required sources
Market-cap totals + active depeg inputs (current stablecoins price, or recent replay-safe price_cache fallback for already-open depegs; DEWS breadth optional)
Failure behavior
Returns null when market-cap input is missing/<=0; the cron also skips publication when active-depeg inputs are unavailable, and the API serves the last valid value
Historical replay
Backfills score any depeg overlapping the UTC day, canonicalize legacy depeg IDs into the current PSI universe, use same-day supply_history prices when they capture the move, cap replayed daily deviation at the event peak, and keep peak event deviation as a start-day floor only when the depeg stayed open through the UTC close and the daily snapshot misses the move
Worked example (verified against computeStabilityIndex)
Inputs: bps=-120, depegMcap=$2B, totalMcap=$200B, age=10d, trend=+1.2, stressBreadth=1.5
severity=1.141, breadth=4.243, score=100-1.141-4.243-1.5+1.2=94.316→94.3
Result: PSI 94.3 (BEDROCK).
Technical details: formula, component math, depeg handling, and condition bands
Scoring Formula
Score = 100 − severity − breadth − stressBreadth + trendThe final value is clamped to [0, 100] and rounded to one decimal.
Severity
0–68
Breadth
0–17
Stress Breadth
0–5
Trend
−5 to +5
Compute PSI
100 − penalties + trend
Condition Band
BEDROCK through MELTDOWN
Severity
0–68
Breadth
0–17
Stress Breadth
0–5
Trend
−5 to +5
Compute PSI
100 − penalties + trend
Condition Band
BEDROCK through MELTDOWN
Components
| Component | Range | Formula | Purpose |
|---|---|---|---|
| Severity | 0–68 | min(68, Σ(abs(bps)/100 × share × log2(1+mcap/1B) × 60 × factor)) | Magnitude-weighted depeg damage with extra emphasis on mega-cap instability |
| Breadth | 0–17 | min(17, Σ(sqrt(mcap/1B) × 3 × factor)) | How widely depegs are spreading across unique coins |
| Stress Breadth | 0–5 | min(5, dewsStressBreadth) | Early-warning pressure from DEWS stress signals before full depegs |
| Trend | −5 to +5 | clamp(-5, 5, mcap7dChangePct) | 7-day stablecoin market-cap momentum (supports or offsets penalties) |
Depeg Handling Rules
- 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
| Range | Band | Meaning |
|---|---|---|
| 90–100 | BEDROCK | Near-ideal market stability |
| 75–89 | STEADY | Normal conditions with minor stress |
| 60–74 | TREMOR | Meaningful instability emerging |
| 40–59 | FRACTURE | Broad, significant market stress |
| 20–39 | CRISIS | Contagion-level instability |
| 0–19 | MELTDOWN | Systemic peg failure conditions |
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 when a direct exit path exists. When some base dimensions lack data (NR), their weight is redistributed proportionally among rated ones.
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; pure NAV tokens stay neutral when peg tracking is genuinely not applicable, while configured NAV wrappers can inherit peg risk from a referenced base stablecoin; 0.9 penalty applies when exit liquidity is NR (no DEX data and no redemption backstop signal available)
Worked example (verified against computeOverallGrade)
Inputs: DEX 30, Redemption 88, Exit 56, Res 70, Decen 60, Dep 75, Peg 92
base=(56*0.30+70*0.20+60*0.15+75*0.25)/0.90=65.06
final=round(base*(92/100)^0.40)=round(65.06*0.9672)=63
Result: Score 63 (grade C+).
Interactive calculator: explore how weights and thresholds shape the grade
Interactive: Try your own inputs
Scores below use the same formula, weights, and thresholds as production. In practice each dimension is derived from on-chain data, not chosen directly — use this to explore how the grading math works, not to predict a specific coin's grade.
Technical details: full pipeline, dimension formulas, thresholds, and caveats
Exit Liquidity
30%
Resilience
20%
Decentralization
15%
Dependency 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
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)
| Dimension | Weight | Source | Description |
|---|---|---|---|
| Exit Liquidity | 30% | DEX liquidity + redemption backstop | Best-path model: exit quality = best available path (DEX or redemption) + diversification bonus for having both |
| Resilience | 20% | Collateral, custody | 2-factor solvency measure; blacklist capability reported descriptively only |
| Decentralization | 15% | Governance type, chain risk | Governance structure with chain-risk penalty |
| Dependency Risk | 25% | Upstream grades, collateral weights | Inherited risk from upstream stablecoins, weighted by exposure |
Redemption Backstop and Effective Exit
The standalone Liquidity Score remains a pure DEX market-depth metric. Safety Scores use an effective exit score for the Liquidity dimension, built on a best-path model: exit quality equals the best available exit path, with a modest diversification bonus for having a second viable path.
effectiveExit = min(100, max(dex, redemption) + min(dex, redemption) × 0.10)
If only DEX liquidity exists, it is used directly. If only a redemption backstop exists, its score is used directly — route family caps (offchain-issuer ≤ 65, queue-redeem ≤ 70) and component scoring remain the guardrails against inflation.
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, stale DEX inputs are not used for effective exit, and stale live reserve metadata ages out instead of staying resolved indefinitely.
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. Severe active depegs are also hard-capped: ≥ 2500 bps (25%+) caps the overall score at F, ≥ 1000 bps (10%+) caps at D.
No-Liquidity-Data Penalty
A further 0.9× multiplier is applied when a coin has no exit-liquidity signal at all — neither DEX liquidity nor redemption-backstop coverage. Weights are redistributed across available dimensions; this 0.9× multiplier is then applied to the final score to correct for the missing liquidity data by applying a flat 10% penalty.
Resilience Scoring
Average of two equally-weighted sub-factors (50% each): Collateral Quality and Custody Model. Chain infrastructure is scored exclusively in the Decentralization dimension. Blacklist capability is reported descriptively but does not affect the Resilience score.
| Sub-factor | What it measures | Scoring |
|---|---|---|
| Collateral Quality | Reserve composition risk | Weighted avg of curated reserve slices: Very Low (100), Low (75), Medium (50), High (25), Very High (5). Falls back to enum scoring for coins without curated reserves. |
| Custody Model | Who holds the collateral? | Fully on‑chain (100), Top‑tier custodian (80), Regulated custodian (55), Unregulated custodian (30), Sanctioned custodian (5), CEX / off‑exchange custody (0) |
Collateral quality is derived from reserve compositions when available — curated metadata by default, or a fresh authoritative independent live reserve snapshot for coins covered by the live reserve sync. For report-card scoring, that live snapshot must also 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. 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— 10 (inherits upstream governance)
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
Two-phase computation ensures upstream scores are available before dependent coins are graded. Phase 1 grades independent coins (centralized & decentralized), then Phase 2 grades CeFi-Dependent coins using Phase 1 results.
- Non-dependent coins— score 95 (no upstream risk)
- 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
- Unmapped dependencies— falls back to 70 when dependencies aren't mapped or scores are unavailable
Dependency type ceilings— each dependency is classified as wrapper, mechanism-critical, or collateral(default). Wrappers (e.g., syrupUSDC → USDC) are thin layers around the upstream — their score is capped at upstream − 3. Mechanism-critical dependencies (e.g., DAI → USDC via PSM) are essential to the peg — score is capped at the upstream's score. Collateral dependencies use the blended formula with no ceiling.
Self-backed scores vary by governance type: centralized-dependent coins score 75 (systemic coupling risk), decentralized coins 90, and centralized coins 95. Centralized-dependent coins score lower because their peg mechanisms depend on upstream stablecoin infrastructure even for non-stablecoin collateral.
Grade Thresholds
| Grade | Score Range |
|---|---|
| A+ | 87–100 |
| A | 83–86 |
| A− | 80–82 |
| B+ | 75–79 |
| B | 70–74 |
| B− | 65–69 |
| C+ | 60–64 |
| C | 55–59 |
| C− | 50–54 |
| D | 40–49 |
| F | 0–39 |
| NR | Not enough data |
Key Design Decisions
- NR (Not Rated)is used when fewer than 2 base dimensions have data — no misleading partial grades
- Weight is redistributed proportionally among rated base dimensions when some are NR
- Peg stability acts as a multiplier, not a base dimension — maintaining a peg is table stakes, not a differentiator
- Cemetery (defunct) coins receive a permanent F
- Decentralization score is structural, not a value judgment
- Blacklist capability is reported descriptively only and does not affect the Resilience score. Explicit mutable-contract overrides still surface as “possible”, but reserve-side stablecoin, custodied-wrapper, issuer-seizable tokenized collateral, and custody/CEX clues can now also resolve to “possible” when exposure is below the inherited threshold. Stablecoins where a majority of reserves (by weight) are backed by directly blacklistable collateral, custodied BTC wrappers, tokenized gold, issuer-seizable tokenized shares/RWAs, or already-blacklistable upstream assets are flagged as “inherited” blacklist risk
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: capped at upstream score minus 3 points
- 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 map is manually maintained — may not capture every collateral relationship
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.
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.
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.
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.
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.
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.
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 liquidity score is null/missing, report-card liquidity 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%
Volume Activity
20%
Pool Quality
20%
Durability
20%
Pair Diversity
10%
Liquidity Score
0–100
TVL Depth
30%
Vol. Activity
20%
Pool Quality
20%
Durability
20%
Pair Diversity
10%
Liquidity Score
0–100
Components
| Component | Weight | How it works |
|---|---|---|
| TVL Depth | 30% | Effective TVL relative to market cap (log-scale): 35×log10(depthRatio/0.0007). ~0.5%→30, ~1.5%→47, ~6%→67, ~14%→80, ~25%+→90+. Falls back to absolute TVL scale when market cap is unavailable. |
| Volume Activity | 20% | Log-scale V/T ratio: 38×(log10(vtRatio)+3). ~0.3%→18, ~3.5%→59, ~19%→86, ~32%+→100 |
| Pool Quality | 20% | Venue quality retention: qualityAdjustedTvl/totalTvl, rescaled from the realistic 15–80% range to 0–100. Measures mechanism multiplier × balance health; pair quality is captured in TVL Depth via effectiveTvl. |
| Durability | 20% | TVL stability (35%), volume consistency (25%), pool maturity (25%), organic fee fraction with sqrt curve (15%) |
| Pair Diversity | 10% | Pool count with diminishing returns: min(100, poolCount × 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
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 Ethereum buckets
Net Flow 24h
Current mint minus burn direction
Pressure Shift vs 30D
-100 worsening · 0 baseline · +100 improving
Bank Run Gauge
market-cap weighted
Flight-to-Quality
dual threshold detection
Mints
Transfer from 0x0
Burns
Transfer to 0x0
Hourly Buckets
Trailing 30 closed daily Ethereum 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 Ethereum 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 Ethereum 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
- 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 Ethereum flow-pressure reading. The gauge score maps to one of seven condition bands:
| Band | Score Range | Meaning |
|---|---|---|
| CRISIS | −100 to −70 | Severe below-baseline redemption pressure across major coins |
| STRESS | −70 to −40 | Worsening coordinated pressure versus normal conditions |
| CAUTIOUS | −40 to −10 | Mild but broad pressure deterioration |
| NEUTRAL | −10 to 10 | Close to 30D norms across the market |
| HEALTHY | 10 to 40 | Improving aggregate pressure versus baseline |
| CONFIDENT | 40 to 70 | Strong positive pressure shift across major coins |
| SURGE | 70 to 100 | Exceptional improvement versus recent norms |
Returns null only when all tracked coins are NR (for example, insufficient history or no 24h mint/burn activity). Coins with null pressure-shift values are skipped from the market-cap-weighted composite.
Flight-to-Quality Detection
Detects capital rotation from risky to safe-haven stablecoins — a pattern typically seen during market stress when holders move funds from algorithmic or less-established coins into fully-backed centralized stablecoins.
- Safe classification— centralized governance with real-world-asset backing (USDT, USDC, FDUSD, PYUSD)
- Dual threshold— active when risky coins have >$100M net outflows AND safe coins have >$100M net inflows simultaneously over 24h
- Intensity scaling— min(100, |riskyOutflows| / $1B × 100), reflecting the magnitude of the rotation
Version increments when APY source resolution, source arbitration, history semantics, PYS scoring logic, or eligibility rules for discovered yield sources change.
Pharos tracks yield-bearing stablecoins 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. 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 now benchmark-aware: it keeps raw APY as the base term, adds a modest slice of row-level benchmark spread, and only then applies the safety and consistency penalties.
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 sources additionally need prior source-specific history
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), while degraded benchmark or safety inputs are surfaced in provenance
Worked example (verified against computePYS)
Inputs: apy30d=8.4, benchmarkRate=4.25, safetyScore=72, 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; adjustedPenalty=1.45^1.75=1.92; yieldEfficiency=9.44/1.92=4.92; sustainability=1-0.18=0.82
PYS=min(100, round(4.92*0.82*8))=32
Result: PYS 32.
Technical details: APY source resolution, confidence arbitration, PYS formula, NAV handling, and limits
Tier 1
Direct on-chain reads
Tier 2
Curated pools + protocol APIs
Tier 3 / 4
Price- or rate-derived fallback
Effective Yield
APY + 25% benchmark spread
Yield Efficiency
Effective yield ÷ curved risk penalty
Sustainability
penalises high variance
PYS Score
0–100
Tier 1
On-chain reads
Tier 2
Curated venues
Tier 3 / 4
Fallbacks
Effective Yield
APY + 25% benchmark spread
Yield Efficiency
Effective yield ÷ curved risk penalty
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) or a conservative reward-only estimator (e.g. LUSD B.Protocol Stability Pool, LQTY only)
- 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 and allowing exact-pool curated overrides for assets such as XAUT. 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
- 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, 3-month compounded €STR for EUR pegs, and 3-month compounded SARON for Swiss-franc pegs
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, 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.
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.
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)
riskPenalty = max(0.5, (101 − safetyScore) / 20)
yieldEfficiency = effectiveYield / (riskPenalty ^ 1.75)
sustainability = max(0.3, 1.0 − apyVarianceScore)
PYS = min(100, yieldEfficiency × sustainability × scalingFactor)
- 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
- Yield efficiencyrewards higher APY relative to the coin's risk profile — the raw safety penalty is raised to a fixed power 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) are not covered by the report card framework's safety grading — they receive a default safety baseline of 40 (NR). Their PYS is therefore derived primarily from APY magnitude and variance rather than a full safety assessment. As the grading framework expands to cover NAV tokens, their PYS will become more nuanced.
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
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 tries to anticipate future depeg risk before it fully manifests.
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.
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 now require at least two protocol-level DEX groups inside threshold, and ambiguous-primary recoveries are vetoed when a large challenger pool still shows the old depeg direction. 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.
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. 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. 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, flow, and yield signals, with optional PSI-based amplification during systemic stress. 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.
PegScore focus
History: realized peg behavior
DEWS focus
Forward stress probability
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, and the cron degrades/no-writes when core source reads fail or dex liquidity is stale
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 and otherwise falls back to the earliest supply snapshot, so young coins are not diluted across history they didn't exist for. 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
Time-at-Peg
50%
Event Severity
50%
− Penalties
active depeg + spread
PegScore
0–100
PegScore Components
| Component | Weight | Range | How it works |
|---|---|---|---|
| Time-at-Peg (pegPct) | 50% | 0–100 | Percentage of time spent at peg. Overlapping depeg intervals are merged to avoid double-counting |
| Event Severity | 50% | 0–100 | Penalizes magnitude, duration, and recency of each depeg event. Per-event penalty: max(durationPenalty, magnitudeFloor), where durationPenalty = (peakBps / 100) × (durationDays / 30) × recencyWeight, magnitudeFloor = (peakBps / 2000) × recencyWeight. The floor ensures even brief depegs carry a minimum penalty proportional to their severity. Recency weight = 1 / (1 + yearsAgo) so recent events count more. Duration capped at 90 days |
| Active Depeg Penalty | subtracted | 5–50 | Applied only if an ongoing depeg exists (no end date). Scales with severity: clamp(absBps / 50, 5, 50) |
| Spread Penalty | subtracted | 0–15 | Standard deviation of peak deviations across events, scaled. Penalizes erratic, unpredictable depeg behaviour. Only applies when ≥2 events exist |
DEWS
DEWS is a per-coin, forward-looking stress score (0–100) estimating depeg 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, but once DEWS has published, stale or missing core liquidity inputs block fresh writes instead of being treated as startup noise.
Supply Velocity
0.25
Pool Balance Drift
0.20
Liquidity Erosion
0.15
Price Confidence
0.15
Cross-Source Divergence
0.15
Blacklist Activity
0.10
Mint/Burn Flow
0.10
Yield Anomaly
0.05
DEWS
Σ(W⋅S) / Σ(W)
0–100
CALM
0–15
WATCH
16–35
ALERT
36–55
WARNING
56–75
DANGER
76–100
Supply Velocity
0.25
Pool Balance Drift
0.20
Liquidity Erosion
0.15
Price Confidence
0.15
Cross-Source Div.
0.15
Blacklist Activity
0.10
Mint/Burn Flow
0.10
Yield Anomaly
0.05
DEWS
Σ(W⋅S) / Σ(W) — 0–100
CALM
0–15
WATCH
16–35
ALERT
36–55
WARN
56–75
DANGER
76–100
Score Formula
DEWS = round(clamp(0, 100, sum(W_i × S_i) / sum(W_i)))
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 USDC, USDT, PAXG, XAUT
- 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 accumulation from yield spikes, divergence, TVL outflows, negative trends, and reward-heavy regimes
Threat Bands
- CALM (0–15)— no stress signals detected
- WATCH (16–35)— mild stress on 1–2 indicators
- ALERT (36–55)— multiple indicators elevated
- WARNING (56–75) — strong stress signals, depeg plausible
- DANGER (76–100)— all precursors firing
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: pool and liquidity signals marked unavailable, weight redistributed
Contagion Stress Test
The stress test simulates dependency failures to reveal systemic concentration risk across the stablecoin ecosystem.
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
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
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, and USD1 contracts, including blacklist, unblacklist, and destroy/wipe actions across 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.
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?
Score range
0–100 (null when safety-score coverage < 50%)
Refresh cadence
Every stablecoins cache refresh (~10 min)
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| Factor | Weight | What it measures |
|---|---|---|
| Quality | 30% | Supply-weighted average of Pharos Safety Scores for stablecoins on the chain. Unrated coins default to 40. Returns null if rated supply < 50% of total. |
| Chain Environment | 20% | Rates the chain’s own infrastructure quality, 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. |
| Concentration | 20% | 100 × (1 − HHI) where HHI = Σ(market share)². A single stablecoin scores 0; perfectly even N coins score 100×(1−1/N). |
| Peg Stability | 20% | Supply-weighted average of per-coin peg proximity: 100 − deviationBps/5. Coins without a price get a neutral 50. |
| Backing Diversity | 10% | Normalized Shannon entropy across the two active backing types (RWA-backed and crypto-backed). 0 for monoculture, 100 for an even split. |
Chain 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.
| Tier | Score | Criteria | Examples |
|---|---|---|---|
| Tier 1 | 100 | Highly decentralized, battle-tested, censorship-resistant L1 | Ethereum |
| Tier 2 | 60 | Established chains with moderate centralization (default for unlisted chains) | Solana, BSC, Arbitrum, Tron, Base, Polygon |
| Tier 3 | 20 | Unproven, known centralization issues, or compromised security | PulseChain, Harmony, BitTorrent |
Health Bands
| Band | Score Range | Interpretation |
|---|---|---|
| Robust | 80–100 | Strong, diversified stablecoin ecosystem on quality infrastructure |
| Healthy | 60–79 | Good ecosystem with room for improvement |
| Mixed | 40–59 | Moderate concerns — concentration, quality gaps, or chain risk |
| Fragile | 20–39 | Significant ecosystem weaknesses |
| Concentrated | 0–19 | Minimal diversity or critically weak infrastructure |
Worked example: Ethereum vs PulseChain
Ethereum (Tier 1)
quality = 72 (supply-weighted safety scores across ~190 coins)
environment = 100 (tier 1 — gold standard for decentralization)
concentration= 66 (USDT ~48%, USDC ~33% → HHI ≈ 0.34)
pegStability = 98 (most coins very close to peg)
diversity = 35 (overwhelmingly RWA-backed)
health = 0.30×72 + 0.20×100 + 0.20×66 + 0.20×98 + 0.10×35
= 21.6 + 20 + 13.2 + 19.6 + 3.5 = 77.9 → 78 (healthy)PulseChain (Tier 3)
quality = 72 (DAI + unrated coins defaulting to 40)
environment = 20 (tier 3 — unproven, centralized)
concentration= 67 (DAI ~39%, rest ~12% each)
pegStability = 98 (coins on peg)
diversity = 61 (mixed backing types)
health = 0.30×72 + 0.20×20 + 0.20×67 + 0.20×98 + 0.10×61
= 21.6 + 4 + 13.4 + 19.6 + 6.1 = 64.7 → 65 (healthy)
→ Chain environment alone creates a 16-point gap vs Ethereum.