Health factors are not emitted on chain. Papers rebuild them by replaying an
archive node account by account. This panel is that rebuild, done once.

How it is built

Per-account collateral and debt are reconstructed from aToken and variable-debt
token events, accrued with the protocol’s own ray math, valued at the oracle
prices in force at the block, and combined with the risk parameters governance
had set at that block.

Three behaviour changes in Aave’s history are replicated separately: the Pool
upgrade that changed compounding and rounding, and the TokenMath change that
made balance conversions directed. Each boundary was found by bisecting a real
account and is pinned by a test.

How far it was checked

Against archive eth_call, requiring exact agreement: 180/180 scaled balances,
30/30 indexes, 100/100 oracle prices, 57/57 user configurations, and health
factors matching getUserAccountData across every era.

What it will not tell you

Some accounts are stored with a reason instead of a number:

  • unsupported_price: the asset’s oracle family (LST-ratio and PT adapters)
    isn’t replicated; the page calls this adapter oracle;
  • emode: E-mode category parameters aren’t replicated;
  • gho_debt: GHO’s stkAAVE discount isn’t reproduced;
  • no_risk_params: no governance configuration at that block.

These are published next to the totals, because coverage you can’t see is worse
than coverage you can measure. A wrong health factor is worse than a missing one.

The coverage statement

Every tracking page carries a card headed Coverage and known exclusions,
and it reads the same sentence a referee would ask for:

25,715 of 33,997 accounts computed; skipped: e-mode 1,420, GHO 895, adapter
oracle 5,967.

The sentence is not recounted when the page loads. It is written by the job
that built the cross-section, at the end of its first complete run, and
persisted (protocol_coverages in the data dictionary),
so the page, the CSV and this guide all describe a run that happened. A page
whose job has not completed a run yet says so instead. The same lines open every
CSV downloaded from a tracking page, prefixed with #, so a file carries its own
caveat: read it with comment lines skipped (skip_lines: /^#/ in Ruby,
comment='#' in pandas).

The card also lists the live skip table of the cross-section shown, and, on a
fork’s page, the oracle rule that produced it (see
Aave forks).

How often a cross-section is added

The panel is longitudinal and has two cadences, both in the same table
(dfrds_aave_health, column cadence):

  • Monthly: one dated cross-section roughly every 30 days of blocks, never a
    snapshot that overwrites itself. The build is checked every Sunday at 03:00
    UTC
    for Aave and every Saturday for Spark (Maker’s vault panel on
    Mondays) and runs only once the chain is a full stride past the last snapshot,
    so most weeks it returns within seconds. When a snapshot is due it holds the
    warehouse for up to four hours, resuming the next week if it does not finish;
    the nightly liquidation extractors that find it running that morning record a
    skipped run and catch up the following night.
  • Daily: one compact row per account at the last block of the previous UTC
    day, for every deployment, written every morning at 07:00 UTC by the same
    builder under a three-hour deadline, and partitioned by day. The daily job
    finishes an interrupted day before anything else and never backfills: a day
    it could not complete stays partial, and a partial day is left out of the
    trend rather than plotted as a dip.

The risk over time chart reads the daily series once it holds two complete
days and falls back to the monthly panel until then; the two are never mixed on
one axis. Both cadences share the page’s headline block: whichever complete
cross-section is newest.

Reading the numbers

  • Health factor below 1.0 means liquidatable. An account with no debt has
    none at all, not infinity, not zero.
  • Drop to liquidation is how far the collateral’s value could fall before
    the position becomes liquidatable.
  • Composition per account is derived on demand from the same replayer, so
    you can see what the collateral is, not just how much.
  • A snapshot still being built says so, and its totals are marked partial.