Supplier-Index Inflation / Empty-Market Rebasing-Reserve Capture

  • Name: supplier-index inflation / empty-market rebasing-reserve capture
  • Category: exploit pattern / lending-market accounting failure / rebasing-reserve inflation / empty-market collateral printing
  • Summary: This exploit family appears when a lending system represents supplier claims through a rebasing index or accumulator — liquidityIndex, lending_accumulator, or another global supplier scaler — and then lets reserve-side value growth socialize over a denominator that is still attacker-owned dust. Instead of the classic Compound-style exchangeRateStored donation attack, the printed variable here is the supplier-side multiplier itself. The attacker first drives a reserve into a fresh, dormant, or effectively empty state, keeps almost all scaled or raw supplier state, then injects reserve-side value through flash-loan premiums, over-repayments, donations, or other off-path balance growth. Because there are no meaningful outside suppliers to dilute that growth, the next unit of reserve-side value accrues almost entirely to the attacker through the index. If the wider protocol then treats the inflated rebasing balance as immediate collateral truth, the reserve’s own accounting becomes a cross-market solvency printer.
  • What it is:
    • A lending reserve tracks supplier value as scaledBalance * liquidityIndex, raw_balance * lending_accumulator, or a similar multiplier-based claim rather than a fixed-share token with a directly queried exchange rate.
    • Reserve-side value can increase without minting proportional new supplier state: flash-loan premiums, over-repayments, direct transfers, fee accrual, reserve drips, or other accounting-side inflows.
    • In a healthy reserve those gains are socialized across a broad supplier denominator, so no single actor captures all of them.
    • In an empty, fresh, or dormant reserve the denominator is tiny enough that one attacker can own almost all scaled or raw supplier state.
    • The attacker therefore captures almost the entire next increment of liquidityIndex / accumulator growth.
    • Downstream collateral logic then mistakes the rebasing balance increase for ordinary, money-good supplier value.
    • The later cash-out may involve ordinary borrowing, self-liquidation, dust-state withdraw rounding, or recovery of the seed position, but the printed solvency starts at the supplier index.
  • Typical preconditions:
    • The target reserve can be fresh, dormant, or driven back to an economically empty state where one actor controls nearly all meaningful supplier state.
    • Supplier claims are expressed through a global scaler such as liquidityIndex or lending_accumulator rather than only through fixed-share balances.
    • Some reserve-side inflow can increase that scaler without minting proportional new supplier claims.
    • The protocol lets the resulting rebasing or multiplied balance become collateral, liquidation value, or borrow power quickly enough to monetize the distortion.
    • The attacker can recycle flash-loan volume, over-repayments, or direct transfers cheaply relative to the value printed through the dust denominator.
    • The reserve’s tiny-supply state does not automatically trigger collateral-factor demotion, fee-routing changes, or quarantine.
  • Common vulnerable surfaces:
    • Aave v2 / v3 forks whose fresh or dormant reserves can socialize flash-loan premiums over almost no scaled supply
    • accumulator-based lending systems where raw balance * global multiplier defines collateral-visible value
    • reserve designs that treat direct transfers or over-repayments as ordinary reserve growth even when supplier breadth has collapsed
    • thin markets whose rebasing supplier token is accepted as full collateral elsewhere in the same protocol
    • systems whose withdrawal or burn math lets the attacker preserve a dust seed position while repeatedly monetizing the printed balance
    • fresh listings, duplicate reserves, and long-unused markets that look operationally live but are still economically launch-state
  • Exploit sequence:
    1. The attacker targets a reserve with almost no meaningful suppliers, or actively drives an older reserve back into a dust-supply state.
    2. They retain a tiny scaled or raw supplier position that dominates the denominator over which the next unit of reserve-side value will be socialized.
    3. They inject reserve-side value without minting proportional new supplier claims: flash-loan premiums, over-repayments, direct transfers, fee accrual, or another reserve inflow.
    4. The reserve updates liquidityIndex, lending_accumulator, or equivalent supplier-scaler state.
    5. Because supplier breadth is microscopic, the attacker’s dust position captures almost all of that index growth.
    6. The protocol publishes the resulting rebasing or multiplied balance as ordinary supplier truth.
    7. Cross-market collateral, borrow, liquidation, or withdrawal logic accepts that printed balance as money-good authority.
    8. The attacker borrows stronger assets, self-liquidates, or recovers the seed position while leaving bad debt behind.
  • Variants:
    • Fresh-reserve index capture — a newly listed reserve reaches collateral relevance before any meaningful supplier breadth exists.
    • Dormant-reserve replay — an older reserve drifts back into dust supply, effectively re-entering launch-state economics months later.
    • Flash-loan premium concentration — repeated flash-loan loops leave premium in the reserve, and the attacker captures nearly all of it through the dust denominator.
    • Over-repayment / donation accumulator inflation — direct surplus reserve inflow increases an accumulator or index rather than a classic exchange rate.
    • Actual-balance / scaled-liquidity split — direct transfers enlarge real reserve balance or flash-loanable inventory while scaled supplier state stays tiny, magnifying later index growth.
    • Dust-seed preservation cash-out — the attacker needs low-unit burn or withdraw behavior to keep enough seed state alive while monetizing the printed collateral.
    • Cross-market drain — the manipulated reserve never needed deep local liquidity because sibling markets honor the printed supplier balance as broader borrowing power.

Two reserve-ledger seams that often combine here

  1. Who captures the next unit of reserve-side value?

    • This is the denominator question: which scaled balances, raw balances, or supplier shares will receive the next premium, over-repayment, donation, or reserve-side accrual?
    • Radiant and HopeLend are the cleanest same value path, broken denominator cases: the reserve’s own fee-socialization rule remained live after supplier breadth had collapsed to one meaningful position.
    • If this seam is broken, even economically legitimate reserve income can become attacker-authored collateral because the socialization base is no longer socially broad.
  2. Which ledger starts honoring that value, and for what powers?

    • This is the ledger-adoption question: actual token balance, recognized reserve liquidity, flash-loanable inventory, supplier index, and borrow-side collateral truth do not always move together.
    • dTRINITY and ZeroLend are especially useful because the attacker did not only own the denominator; direct-transfer or actual-balance drift also changed which reserve objects downstream code was willing to honor.
    • If this seam is broken, the exploit stops being only attacker captured fee growth and becomes different reserve readers are spending against different balance-sheet stories.

Keeping these seams separate helps reviewers avoid an overly simple flash-loan fees inflated liquidityIndex summary. The deeper question is whether the protocol first let the attacker author the next unit of supplier-side value and then let some broader set of liquidity readers, collateral engines, or withdraw paths spend against that authored value.

Three reserve-index promotions reviewers should not collapse

  1. Reserve-side value arrived somehow

    • Premiums, over-repayments, direct transfers, or fee accrual left more value in the reserve.
    • This is only a local inventory or accounting fact. It is weaker than existing suppliers deserved that value, and much weaker than the wider protocol should already treat the resulting rebasing balance as spendable solvency truth.
  2. That reserve-side value was socialized into canonical supplier truth

    • The protocol updated liquidityIndex, lending_accumulator, or another multiplier that turns scaled or raw balances into live supplier balances.
    • Radiant, HopeLend, Starlay, zkLend, ZeroLend, and dTRINITY each break here in different ways: the reserve was still empty enough that the attacker effectively owned the denominator receiving the next unit of reserve-side value.
  3. That locally published supplier truth still deserved immediate monetary authority elsewhere

    • The wider lending system treated the inflated rebasing balance as collateral, liquidation value, or borrow power.
    • This is a third and stronger promotion than the reserve updated its index correctly according to local rules. Healthy designs stage local supplier accounting changed separately from sibling pools must now spend against it.

The recurring review mistake is to flatten these into one sentence like fees increased the index. The hard question is who owned the denominator, what kind of reserve-side inflow was being socialized, and why the resulting printed balance still retained immediate cross-market solvency authority.

  • Detection heuristics:
    • Ask which exact variable turns supplier dust into large live balances: liquidityIndex, lending_accumulator, reserve-normalized balanceOf, or some wrapper around those.
    • Trace every path that can increase that variable without minting proportional new supplier state: flash-loan premiums, over-repayments, direct transfers, reserve drips, fee settlement, or operator sync.
    • Simulate a reserve with one dominant scaled supplier and repeatedly inject reserve-side value. If the resulting rebasing balance becomes meaningful collateral before outside supply can dilute it, the design is still vulnerable.
    • Review fresh, dormant, and effectively-fresh reserves separately from mature ones. reserve deployed or reserve used before is not proof that the supplier denominator is socially broad.
    • Stress-test withdraw, burn, and redemption math after index inflation. Many exploits only become fully monetizable because the attacker can preserve the dust seed while cashing out other assets.
    • Compare actual balance, recognized reserve liquidity, scaled supply, flash-loanable inventory, and collateral-visible supplier value. If these objects can diverge, the exploit family often widens.
    • Split who captured the next unit of reserve-side value? from which reserve ledger or collateral reader spent against it? If both answers are unclear, the exploit surface is probably wider than the local index math suggests.
    • Treat any same-block or same-loop path from index moved to borrow elsewhere as a red flag; healthy systems usually need a slower admission step.
  • Defenses:
    • Keep fresh, dormant, and dust-supply reserves behind collateral-factor 0, tiny caps, or equivalent borrow-side quarantine until supplier breadth is real and durable.
    • Do not socialize flash-loan premiums, over-repayments, or off-path reserve growth through supplier indexes when the denominator is attacker-ownable dust; reroute, quarantine, or cap that value instead.
    • Make reserve-local supplier accounting weaker than cross-market solvency truth. A rebasing balance can exist before it deserves collateral authority.
    • Seed non-burnable supplier state or enforce irreversible reserve-initialization floors so the denominator cannot collapse back into attacker-owned launch-state conditions.
    • Keep actual reserve balance, recognized liquidity, and supplier-denominator state on one coherent ledger story, or explicitly quarantine the differences.
    • Separate supplier-socialization rules from broader liquidity adoption rules. A value inflow that is locally recognized for accounting should not automatically become flash-loanable inventory, withdrawable backing, or cross-market collateral in the same state transition.
    • Review dust-state burn and withdraw math with the index family in mind. If the attacker can print the multiplier and still cheaply keep the seed alive, the loop remains cash-outable.
    • Add monitoring for impossible reserve states: one meaningful supplier, sudden index jumps, reserve-side value growth without broad supply, or a fresh reserve whose rebasing token suddenly becomes valuable collateral.

What sound design looks like

  • A healthy rebasing reserve keeps four things separate and explicitly staged: reserve-side value arrival, canonical supplier-index publication, collateral admission, and cross-market borrowing authority. Value can reach the reserve without immediately deserving supplier socialization, and supplier accounting can update locally without immediately becoming protocolwide solvency truth.
  • Supplier-denominator ownership is treated as a first-class security object. If one actor can plausibly own the scaled supply or raw balance that will capture the next premium, over-repayment, or fee unit, the reserve is not yet mature no matter how old the deployment is. The strongest design companion there is supplier-denominator integrity and thin-market fee socialization.
  • Reserve-local multiplier state is not a free oracle for the rest of the protocol. liquidityIndex or lending_accumulator may still be useful for local accounting while cross-market collateral engines apply seasoning, caps, haircuts, or outright quarantine. The sharper borrow-side companion is collateral-admission lag and borrow-side quarantine.
  • Reserve balance, recognized liquidity, and supplier claims stay on one reconciled ledger story. If flash loans, direct transfers, over-repayments, or rescue flows can change one ledger without the others, the healthier answer is to name that split and fail closed instead of letting downstream readers improvise. The main coherence companion there is actual-balance and scaled-liquidity ledger coherence discipline.
  • Freshness is lifecycle state, not deployment age. A dormant reserve, a duplicate market, or an emergency-drained market can become economically fresh again and should fall back into quarantine automatically. The lifecycle companions are fresh-market seeding and activation discipline and effective-freshness reclassification and dormant-market quarantine.
  • Off-path reserve growth is explicitly classified before it affects supplier truth. Overpayments, fee leftovers, direct transfers, and rescue inventory are not silently promoted into borrower-facing collateral value. The accounting companion is unexpected-balance quarantine and explicit recognition discipline.
  • The clean target invariant is simple: no actor should be able to control the denominator receiving the next unit of reserve-side value and simultaneously have the resulting printed supplier balance count as immediate borrow power against deeper liquidity.

Failure-prevention checklist

  • Define separate gates for reserve-side value arrived, supplier index published, and that published balance may now support collateral or borrowing elsewhere.
  • Inventory every path that can increase supplier-index inputs without minting proportional new supplier claims: flash-loan premiums, over-repayments, direct transfers, reserve drips, fee harvests, operator syncs, and rescue flows.
  • Enforce reserve maturity in code, not in launch playbooks. Fresh or effectively-fresh reserves need seeded non-burnable breadth, collateral-disable defaults, and explicit graduation criteria.
  • Reclassify dormant or dust-supply reserves automatically. If one actor can own the meaningful denominator again, the reserve should lose ordinary supplier-index socialization privileges.
  • Quarantine or reroute reserve-side value in thin markets. Do not let flash-loan premiums or donation-like inflows immediately compound liquidityIndex or accumulator state when supplier breadth is not socially safe.
  • Keep actual balance, recognized reserve liquidity, scaled supply, and collateral-visible supplier value on one coherent state machine. If they can diverge, document the divergence and make downstream consumers fail closed.
  • Test the full exploit loop, not isolated math: dust reserve setup, reserve-side value injection, index growth, collateral admission, sibling-market borrowing, and seed-preservation withdrawal behavior.
  • Fuzz at pathological denominators and low-decimal edges. If one scaled unit or raw-balance unit becomes economically large, floor rounding becomes solvency policy.
  • Add monitors for one-supplier reserves, abrupt multiplier growth, reserve-side inflows without matching supply growth, and fresh reserves whose rebasing token suddenly outruns plausible earned yield.
  • Put blast-radius controls beneath the reserve anyway: temporary collateral factor 0, borrow caps, recursive-borrow suppression, and pause paths should stop one printed balance from draining the rest of the book.

Audit prompts

  • What exact variable turns supplier dust into live collateral-visible value here: liquidityIndex, accumulator, rebasing balanceOf, or a wrapper around one of those?
  • Which reserve-side inflows can move that variable without minting proportional new supplier state?
  • Can a reserve become economically fresh again after launch through redemptions, dormancy, rescue operations, or low-breadth collapse, and what exact state transition recognizes that?
  • If one actor owns most scaled or raw supplier state, why is the next flash-loan premium, over-repayment, or donation still being socialized as if the reserve were mature?
  • Does the protocol distinguish local rebasing balance changed from that balance now deserves collateral, liquidation, or recursive-borrow authority elsewhere, or are those states fused?
  • Can direct transfers or actual-balance drift enlarge flash-loanable or withdrawable reserve inventory while the supplier denominator stays tiny?
  • What exact burn or withdraw behavior lets the attacker preserve the seed position after index inflation, and has it been tested at dust-unit granularity?
  • Which controls would stop the exploit after index growth but before sibling-market borrowing: collateral-factor quarantine, caps, seasoning windows, impossible-growth alerts, or automatic reserve demotion?
  • What invariant proves that no actor can both author the next unit of reserve-side value and capture nearly all of it through an attacker-owned denominator?
  • If this reserve’s index jumped 5x in one block, what would stop that locally published move from becoming same-window borrow power?

Lessons that should already be standard

  • liquidityIndex and accumulator are just alternate names for a supplier-side truth object. Review them with the same paranoia as exchange rate.

  • Thin reserves do not deserve ordinary fee socialization. If one actor owns the denominator, the next premium unit is already attacker-directed issuance.

  • Freshness is about denominator ownership, not deployment timestamp. An old reserve with dust supply is a fresh reserve again for security purposes.

  • Reserve-local accounting coherence is still weaker than cross-market solvency authority. A printed rebasing balance should not become immediate collateral just because the reserve can explain it locally.

  • Over-repayments, flash-loan leftovers, and direct reserve inflows are part of the solvency model. Treating them as harmless accounting noise is how protocols let attacker-authored reserve growth become borrow truth.

  • Low-unit burn behavior matters more in index systems than teams expect. If the attacker can keep the dust seed alive, index inflation can be replayed or monetized much longer than the postmortem summary suggests.

  • Empty-market lending bugs are variable-name agnostic. exchange rate, liquidityIndex, and accumulator are the same family once one actor owns the denominator that captures the next unit of reserve-side value.

  • A reserve that still returns a mathematically valid rebasing balance may still be far from safe collateral. Publication and admission should be different security states.

  • High-signal incidents:

    • [[../../../incidents/lending-liquidations/radiant-capital-native-usdc-empty-market-liquidityindex-exploit-2024-01-02|Radiant Capital native USDC empty-market liquidityIndex exploit (2024-01-02)]] — the clean fresh-reserve Aave-v2-style case: the first meaningful supplier monopolized scaled rUSDC, flash-loan premiums socialized through liquidityIndex, and the resulting rebasing balance was immediately accepted as WETH-borrowing collateral.
    • [[../../../incidents/lending-liquidations/hopelend-hethwbtc-empty-market-liquidityindex-exploit-2023-10-18|HopeLend hETHWBTC empty-market liquidityIndex exploit (2023-10-18)]] — the dormant-reserve replay: an old but unused reserve was driven down to one tiny hToken unit, LP-fee income concentrated into that dust denominator, and WBTC-granularity burn truncation helped turn the printed index into extracted ETH.
    • [[../../../incidents/lending-liquidations/starlay-finance-acala-usdc-empty-market-liquidityindex-exploit-2024-02-08|Starlay Finance Acala USDC empty-market liquidityIndex exploit (2024-02-08)]] — the fresh-reserve replay on Acala: an empty lUSDC market plus unsafe collateral and liquidation conditions let a dust supplier recycle reserve-side value and turn distorted liquidityIndex accounting into borrowed DOT and LDOT.
    • [[../../../incidents/lending-liquidations/dtrinity-dlend-cbbtc-fresh-market-liquidityindex-inflation-exploit-2026-03-17|dTRINITY dLEND cbBTC fresh-market liquidityIndex inflation exploit (2026-03-17)]] — the modern Aave-style hybrid: a less-than-week-old cbBTC reserve with zero organic supply let direct reserve transfer plus premium socialization inflate liquidityIndex over dust supply and unlock dUSD borrowing.
    • [[../../../incidents/lending-liquidations/zerolend-pt-lbtc-actual-balance-scaled-liquidity-liquidityindex-exploit-2025-02-23|ZeroLend PT-LBTC actual-balance / scaled-liquidity liquidityIndex exploit (2025-02-23)]] — the strongest actual balance and scaled supplier ledger drift case: direct PT-LBTC transfers enlarged real reserve inventory while scaled supplier state stayed tiny, so later premium routing and rayDiv() windows printed outsized supplier value.
    • zkLend wstETH empty-market accumulator-inflation exploit (2025-02-11) — the accumulator-form cousin: raw_balance * lending_accumulator replayed the same family without Aave naming, proving the exploit is about denominator ownership and reserve-side value socialization rather than one specific variable name.

Internal linkages

Control surface