The Hard DataThe Hard DataCRYPTO RESEARCH
ChartsResearchToolsAbout
Subscribe
Charts/Stablecoin Depeg History: USDT, USDC and DAI

How deeply and for how long did USDT, USDC and DAI depeg?

Quick answerSnapshot

Between Jan 1, 2020 and Jul 20, 2026, the deepest displayed event was DAI, reaching 12.91% above $1 on Mar 11, 2020. The longest displayed event was DAI at 70 hours.

Loading chart

Stablecoin Depeg History: USDT, USDC and DAI

The reviewed source identified 404 rule-qualified asset-level events for three fixed Ethereum contracts from 2020-01-01 through 2026-07-20; this is a source- and rule-specific count, not a market-wide depeg frequency. This chart displays the three deepest observed events per asset—9 rows across 7 event dates. The deepest displayed deviations were USDT +6.2% on 2020-03-12 for 7 hours, USDC -9.8% on 2023-03-11 for 46 hours, and DAI +12.9% on 2020-03-11 for 52 hours.
Stablecoin Depeg History: USDT, USDC and DAI underlying data rows. Showing 9 rows.
EventPeak deviation (Peak deviation from $1)DurationSideStarted
DAI · Mar 11, 2020 · 52h12.9%52 hourspremiumMar 11, 2020
DAI · Mar 14, 2020 · 70h9.3%70 hourspremiumMar 14, 2020
USDT · Mar 12, 2020 · 7h6.2%7 hourspremiumMar 12, 2020
USDT · Oct 26, 2021 · 21h4.5%21 hourspremiumOct 26, 2021
USDC · Mar 17, 2020 · 8h-5.3%8 hoursdiscountMar 17, 2020
USDT · Mar 20, 2020 · 3h-5.4%3 hoursdiscountMar 20, 2020
USDC · Mar 20, 2020 · 3h-5.6%3 hoursdiscountMar 20, 2020
DAI · Mar 11, 2023 · 44h-9.5%44 hoursdiscountMar 11, 2023
USDC · Mar 11, 2023 · 46h-9.8%46 hoursdiscountMar 11, 2023
Source: Dune prices_external.hour (Coinpaprika) · as of Jul 20, 2026
Last checked: Jul 20, 2026

About the data

What is counted

Historical price deviations for the Ethereum contracts of USDT, USDC, and DAI, based on Dune's hourly Coinpaprika price feed.

Coverage and comparison
  • Fixed-rule historical event comparison: Jan 1, 2020 to Jul 20, 2026, expressed in deviation from $1 (%) and duration (hours).
  • The comparison covers rule-qualified events across the three fixed contracts and one hourly price source. The chart shows selected events rather than the full set.
  • The source contains 404 rule-qualified asset-level events. This page shows 9, covering USDT, USDC, and DAI.
  • An event starts after two consecutive hourly prices at least 1% away from $1. A one-hour move is included only when the deviation reaches 3%.
What this does not show

This page does not rank stablecoin safety or explain why a price moved. It cannot assess reserves, solvency, redemption capacity, liquidity, regulatory compliance, or the risk of a future depeg. Coverage is limited to the Ethereum contracts for USDT, USDC, and DAI and one hourly price source.

Event context

Read the historical changes alongside dated source documents and reporting definitions.

March 2020: DAI traded above $1 during market stress

Observed: The deepest DAI premium in this dataset reached +12.9% on March 11 and remained part of a 52-hour rule-qualified event.

Context: During the same market-stress window, ETH fell sharply and Ethereum became congested. Glassnode's reconstruction of MakerDAO reports delayed price updates, liquidation stress, zero-bid auctions, and about $4.5 million of unbacked DAI. This is surrounding context, not proof of a single cause for the observed premium.

Sources: Glassnode: What Really Happened to MakerDAO

March 2023: USDC and DAI discounted together

Observed: USDC reached -9.8% in a 46-hour event on March 11; DAI reached -9.5% in a 44-hour event beginning the same day.

Context: California's financial regulator closed Silicon Valley Bank on March 10 and the FDIC was named receiver. Circle disclosed that $3.3 billion of USDC reserves had been held there. Federal Reserve research also documents DAI's one-for-one USDC conversion mechanism and describes the two assets as depegging in a strikingly similar pattern. These links explain why the dates merit comparison, but price data alone cannot isolate causality.

Sources: FDIC: Silicon Valley Bank closure · Circle: USDC reserve update · Federal Reserve: Stablecoin primary and secondary markets

Common questions

How many events are included in this stablecoin depeg history?

The reviewed source contains 404 rule-qualified asset-level events for three fixed Ethereum contracts between Jan 1, 2020 and Jul 20, 2026. This count is specific to this source and rule, not the wider stablecoin market. This page shows 9 events across 7 dates.

How does this chart define a stablecoin depeg event?

It requires at least two consecutive hourly prices 1% or more below or above $1. A one-hour event is kept only when the absolute deviation reaches 3%.

Does this chart rank stablecoin safety?

No. It reports historical price events from one external hourly source and cannot establish reserve quality, solvency, liquidity, redemption capacity, or future depeg risk.

Sources & methodology

Source

Dune Analytics

Dune prices_external.hour (Coinpaprika)

Cadence
Event-driven reviewed refresh
Data through
Jul 20, 2026
Checked
Jul 20, 2026
Open source query

Each row is a rule-qualified price-deviation event for one of three fixed Ethereum stablecoin contracts.

Verification details

Method

  • An event begins when the fixed Ethereum contract price is at least 1% below or above $1 for two consecutive hourly observations.
  • A one-hour event is retained only when the absolute deviation reaches 3%.
  • Missing hours, a return inside the band, or a direction change ends the event.
  • The board shows the three deepest observed events per asset from Jan 1, 2020 through Jul 20, 2026.
Source execution
chart_assets:6643dfac-1aba-4667-86bd-e9ac70697adc
View SQL
Source query
-- Candidate only: stablecoin_depeg_event_history.v1
-- Fixed scope: Ethereum USDT, USDC and DAI using Coinpaprika-backed hourly
-- observations from prices_external.hour. This query does not score reserves,
-- solvency, redemption capacity or future depeg probability.

WITH asset_registry(asset, blockchain, contract_address) AS (
  VALUES
    ('USDT', 'ethereum', 0xdac17f958d2ee523a2206206994597c13d831ec7),
    ('USDC', 'ethereum', 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48),
    ('DAI', 'ethereum', 0x6b175474e89094c44da98b954eedeac495271d0f)
),
event_policy AS (
  SELECT
    CAST(1.0 AS DOUBLE) AS peg_usd,
    CAST(1.0 AS DOUBLE) AS threshold_pct,
    CAST(2 AS BIGINT) AS minimum_consecutive_hours,
    CAST(3.0 AS DOUBLE) AS severe_single_hour_threshold_pct
),
price_points AS (
  SELECT
    r.asset,
    r.blockchain,
    r.contract_address,
    p.timestamp,
    p.price AS price_usd
  FROM prices_external.hour p
  JOIN asset_registry r
    ON p.blockchain = r.blockchain
   AND p.contract_address = r.contract_address
  WHERE p.blockchain = 'ethereum'
    AND p.contract_address IN (
      0xdac17f958d2ee523a2206206994597c13d831ec7,
      0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48,
      0x6b175474e89094c44da98b954eedeac495271d0f
    )
    AND p.timestamp >= TIMESTAMP '2020-01-01 00:00:00'
    AND p.timestamp < CAST(date_trunc('hour', current_timestamp) AS timestamp)
    AND p.price IS NOT NULL
    AND p.price > 0
),
coverage AS (
  SELECT
    asset,
    blockchain,
    contract_address,
    MIN(timestamp) AS observed_start_utc,
    MAX(timestamp) AS observed_through_utc
  FROM price_points
  GROUP BY 1, 2, 3
),
classified AS (
  SELECT
    p.*,
    CASE
      WHEN p.price_usd <= e.peg_usd * (1 - e.threshold_pct / 100)
        THEN 'discount'
      WHEN p.price_usd >= e.peg_usd * (1 + e.threshold_pct / 100)
        THEN 'premium'
      ELSE NULL
    END AS event_side
  FROM price_points p
  CROSS JOIN event_policy e
),
sequenced AS (
  SELECT
    c.*,
    LAG(c.timestamp) OVER (
      PARTITION BY c.asset
      ORDER BY c.timestamp
    ) AS previous_timestamp,
    LAG(c.event_side) OVER (
      PARTITION BY c.asset
      ORDER BY c.timestamp
    ) AS previous_event_side,
    LEAD(c.timestamp) OVER (
      PARTITION BY c.asset
      ORDER BY c.timestamp
    ) AS next_timestamp,
    LEAD(c.event_side) OVER (
      PARTITION BY c.asset
      ORDER BY c.timestamp
    ) AS next_event_side
  FROM classified c
),
flagged AS (
  SELECT
    s.*,
    CASE
      WHEN s.event_side IS NOT NULL
       AND (
         s.previous_event_side IS DISTINCT FROM s.event_side
         OR s.previous_timestamp IS NULL
         OR date_diff('hour', s.previous_timestamp, s.timestamp) <> 1
       )
        THEN 1
      ELSE 0
    END AS event_start_flag
  FROM sequenced s
),
grouped AS (
  SELECT
    f.*,
    SUM(f.event_start_flag) OVER (
      PARTITION BY f.asset
      ORDER BY f.timestamp
      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) AS event_group
  FROM flagged f
  WHERE f.event_side IS NOT NULL
),
event_aggregates AS (
  SELECT
    asset,
    blockchain,
    contract_address,
    event_side,
    event_group,
    MIN(timestamp) AS event_start_utc,
    MAX(timestamp) AS event_end_utc,
    COUNT(*) AS observation_count,
    MIN(price_usd) AS min_price_usd,
    MAX(price_usd) AS max_price_usd
  FROM grouped
  GROUP BY 1, 2, 3, 4, 5
),
qualified_events AS (
  SELECT
    a.*,
    date_diff('hour', a.event_start_utc, a.event_end_utc) + 1
      AS duration_hours,
    CASE
      WHEN a.event_side = 'discount'
        THEN (e.peg_usd - a.min_price_usd) / e.peg_usd * 100
      ELSE (a.max_price_usd - e.peg_usd) / e.peg_usd * 100
    END AS peak_abs_deviation_pct
  FROM event_aggregates a
  CROSS JOIN event_policy e
  WHERE a.observation_count >= e.minimum_consecutive_hours
     OR CASE
          WHEN a.event_side = 'discount'
            THEN (e.peg_usd - a.min_price_usd) / e.peg_usd * 100
          ELSE (a.max_price_usd - e.peg_usd) / e.peg_usd * 100
        END >= e.severe_single_hour_threshold_pct
),
coverage_records AS (
  SELECT
    'coverage' AS record_type,
    c.asset,
    c.blockchain,
    CONCAT('0x', LOWER(TO_HEX(c.contract_address))) AS contract_address,
    c.observed_start_utc,
    c.observed_through_utc,
    CAST(NULL AS VARCHAR) AS event_side,
    CAST(NULL AS TIMESTAMP) AS event_start_utc,
    CAST(NULL AS TIMESTAMP) AS event_end_utc,
    CAST(NULL AS TIMESTAMP) AS recovery_timestamp_utc,
    CAST(NULL AS BIGINT) AS duration_hours,
    CAST(NULL AS BIGINT) AS observation_count,
    CAST(NULL AS DOUBLE) AS min_price_usd,
    CAST(NULL AS DOUBLE) AS max_price_usd,
    CAST(NULL AS DOUBLE) AS peak_abs_deviation_pct,
    CAST(NULL AS BOOLEAN) AS recovered_to_band,
    e.threshold_pct,
    e.minimum_consecutive_hours,
    e.severe_single_hour_threshold_pct,
    'coinpaprika' AS price_source,
    'dune:prices_external.hour' AS source,
    'stablecoin_depeg_event_history.v1' AS source_contract_version
  FROM coverage c
  CROSS JOIN event_policy e
),
event_records AS (
  SELECT
    'event' AS record_type,
    q.asset,
    q.blockchain,
    CONCAT('0x', LOWER(TO_HEX(q.contract_address))) AS contract_address,
    c.observed_start_utc,
    c.observed_through_utc,
    q.event_side,
    q.event_start_utc,
    q.event_end_utc,
    CASE
      WHEN endpoint.next_timestamp = date_add('hour', 1, q.event_end_utc)
       AND endpoint.next_event_side IS NULL
        THEN endpoint.next_timestamp
      ELSE NULL
    END AS recovery_timestamp_utc,
    q.duration_hours,
    q.observation_count,
    q.min_price_usd,
    q.max_price_usd,
    q.peak_abs_deviation_pct,
    CASE
      WHEN endpoint.next_timestamp = date_add('hour', 1, q.event_end_utc)
       AND endpoint.next_event_side IS NULL
        THEN TRUE
      ELSE FALSE
    END AS recovered_to_band,
    e.threshold_pct,
    e.minimum_consecutive_hours,
    e.severe_single_hour_threshold_pct,
    'coinpaprika' AS price_source,
    'dune:prices_external.hour' AS source,
    'stablecoin_depeg_event_history.v1' AS source_contract_version
  FROM qualified_events q
  JOIN coverage c
    ON q.asset = c.asset
  JOIN sequenced endpoint
    ON q.asset = endpoint.asset
   AND q.event_end_utc = endpoint.timestamp
  CROSS JOIN event_policy e
)
SELECT
  record_type,
  asset,
  blockchain,
  contract_address,
  observed_start_utc,
  observed_through_utc,
  event_side,
  event_start_utc,
  event_end_utc,
  recovery_timestamp_utc,
  duration_hours,
  observation_count,
  min_price_usd,
  max_price_usd,
  peak_abs_deviation_pct,
  recovered_to_band,
  threshold_pct,
  minimum_consecutive_hours,
  severe_single_hour_threshold_pct,
  price_source,
  source,
  source_contract_version
FROM coverage_records
UNION ALL
SELECT
  record_type,
  asset,
  blockchain,
  contract_address,
  observed_start_utc,
  observed_through_utc,
  event_side,
  event_start_utc,
  event_end_utc,
  recovery_timestamp_utc,
  duration_hours,
  observation_count,
  min_price_usd,
  max_price_usd,
  peak_abs_deviation_pct,
  recovered_to_band,
  threshold_pct,
  minimum_consecutive_hours,
  severe_single_hour_threshold_pct,
  price_source,
  source,
  source_contract_version
FROM event_records
ORDER BY asset, record_type, event_start_utc;
The Hard DataThe Hard Data

Each chart page should stand on its own: one evidence object, one reading path, and enough method to check the claim.

Research

ResearchChartsToolsMethod

Desk

AboutContactPrivacy

The Hard Data publishes crypto research, data charts, and visual explanations for informational use only. It does not provide investment advice, trading signals, or paid market promotion.

CHART PAGE // source-visible artifact and method attached.
Source = Dune prices_external.hour (Coinpaprika)Data through = Jul 20, 2026Last checked = Jul 20, 2026