Empty-Market Exchange-Rate Inflation / Precision-Loss Redemption
- Name: Empty-market exchange-rate inflation / precision-loss redemption
- Category: exploit pattern / lending-market accounting failure / empty-pool inflation / rounding-loss exploit
- Summary: This exploit family hits lending markets when an attacker can first reduce a market to an almost-empty state, then inflate the accounting value of the remaining receipt tokens, and finally redeem or borrow against that distorted value while precision loss rounds the required receipt-token burn down. In Compound-style forks the printable variable is usually the exchange rate after a direct donation; in Aave-v2-style forks it can be the
liquidityIndexafter fee accrual in an empty reserve; in accumulator-based systems it can be a global collateral scaler such aslending_accumulator. The recurring review mistake is to collapse three different conditions into one vaguemarket is smallstory:the market has become economically empty,one actor now owns the denominator that decides what the next donation / fee event means, andthat printed value is already allowed to matter as redeemable or borrowable system truth. The market is not broken by donation or fee generation alone; it breaks because empty-market state, value-accounting trust, and truncating arithmetic combine into a cash-out path. - What it is:
- A Compound-style market tracks an exchange rate roughly as
(cash + borrows - reserves) / totalSupply, while an Aave-v2-style market credits suppliers through a rebasing index such asliquidityIndex. - Other lending systems store supplier value as a global accumulator times a tiny raw share balance; if the accumulator can be pumped in an empty market, the same exploit family reappears with different variable names.
- When
totalSupplyor effective supplier count is tiny, each remaining receipt-token wei represents an absurd amount of underlying on paper. - In Compound-style forks, direct underlying transfers into the market contract can raise
casheven though no new receipt tokens are minted. - In Aave-v2-style forks, flash-loan fees or other reserve revenue can be concentrated into the attacker’s microscopic position if the reserve is still empty.
- If redemption or burn math later truncates in the attacker’s favor, the protocol may burn fewer receipt tokens than economic reality requires.
- That inflated accounting value then becomes borrow power, redemption value, or liquidation value against deeper-liquidity markets.
- A Compound-style market tracks an exchange rate roughly as
- Typical preconditions:
- The target market can be driven to zero or near-zero
totalSupply, or a freshly launched reserve can still have only one meaningful supplier. - Some solvency-critical accounting variable can be inflated without minting proportional new receipt tokens: raw-balance-sensitive exchange-rate math, or fee-driven index growth concentrated into an empty reserve.
- Another protocol module accepts the inflated receipt token as valid collateral or liquidation collateral.
- One redeem / seize / liquidation / burn path rounds down in a way that is harmless at normal scale but catastrophic when only a few receipt-token wei remain.
- The attacker can source enough underlying or flash-loan volume to make the inflation step large relative to the empty market.
- The target market can be driven to zero or near-zero
- Common vulnerable surfaces:
- Compound v2 forks or similar cToken / hToken markets with empty or nearly empty listings
- Aave-v2-style forks whose fresh reserves can go live before any protective seed deposit or temporary collateral quarantine
- markets whose receipt-token exchange rate reads raw underlying balance after direct transfers, or whose rebasing index can be inflated by attacker-controlled reserve revenue
redeemUnderlying, burn, or related paths that truncate receipt-token burn amounts- liquidation flows that let the attacker recycle the last residual receipt tokens across sibling markets
- newly deployed or duplicate markets that never received a non-burnable seed supply
- Exploit sequence:
- The attacker finds an unused or attacker-dominated market, or waits for a freshly launched reserve that still has no meaningful outside deposits.
- The attacker mints a tiny fresh position so they own nearly all remaining receipt supply.
- The attacker inflates the accounting value of that position without minting proportional new shares: direct underlying donation in Compound-style forks, or concentrated fee accrual into
liquidityIndexin Aave-style forks. - The attacker uses the now-overpriced receipt token as collateral to borrow stronger assets from sibling markets, or prepares to redeem the inflated underlying value back out.
- A truncation / precision-loss edge lets the attacker redeem most of the inflated value while burning fewer receipt-token wei than should be required.
- The attacker liquidates or resets the residual position and repeats the same pattern against other markets.
- Variants:
- Pure empty-market inflation — the attacker mainly monetizes the distorted accounting value through over-borrowing.
- Precision-loss redemption — the decisive profit comes from
redeemUnderlying, burn, or similar math rounding down the shares burned. - Compound-style donation inflation — direct underlying transfers push exchange rate up in an almost-empty market.
- Aave-style fee / liquidityIndex inflation — flash-loan fees or similar reserve revenue are concentrated into the first depositor of a fresh reserve.
- Accumulator inflation — donated reserve balance or similar accounting revenue directly pumps a global collateral scaler in an otherwise empty market.
- Cross-market drain — one manipulated empty market becomes collateral used to drain unrelated deeper-liquidity markets.
- Duplicate-market mistake — teams accidentally deploy or leave live a second unused market for the same asset, creating the perfect empty-state target.
Three empty-state promotions reviewers should not collapse
-
The market has become economically empty
- Supply may still be nonzero, but breadth has collapsed far enough that ordinary assumptions about socialized value no longer hold.
- The important question is not just
is totalSupply > 0?buthas the market effectively fallen back into launch-state economics?
-
One actor now owns the denominator that decides what the next donation, fee event, or reserve-side value unit means
- A single supplier, or a nearly single supplier, now controls how the next exchange-rate jump,
liquidityIndexincrement, or accumulator increase gets capitalized. - This is a stronger and more dangerous state than mere illiquidity: the protocol is implicitly letting one actor define the meaning of future reserve-side value.
- A single supplier, or a nearly single supplier, now controls how the next exchange-rate jump,
-
That printed value is already allowed to matter as system truth
- Redemption math, borrow power, liquidation logic, or sibling markets are already willing to honor the distorted mark as redeemable or borrowable value.
- This is the decisive promotion, because a dust market only becomes systemically expensive once the rest of the protocol agrees to spend against it.
Healthy design keeps these three states visibly separate instead of flattening them into low-liquidity market.
- Detection heuristics:
- Review every market launch path: can
totalSupplyever return to zero, or can a fresh reserve become collateral-eligible before any protective seed deposit lands? - Treat direct underlying transfers into a receipt-token contract as potentially adversarial, not benign donations.
- Treat fee accrual inside an empty rebasing reserve as potentially adversarial too; ask who captures the first flash-loan fees and how much index growth one supplier can monopolize.
- Simulate redemptions when
totalSupplyis single-digit wei and accounting value is very large; most catastrophic precision bugs only appear there. - Compare economic intent against integer math in
redeemUnderlying, burn paths, liquidation seize calculations, and exchange-rate or index conversions. - Audit market listings as a portfolio: an empty low-liquidity market can be weaponized to steal from liquid sibling markets.
- Separate
empty market printed a huge supplier-side value and under-burned the receipt tokenfromfresh wrapper collateral printed a huge mark that reciprocal borrow-side math later floored to zero: the first belongs here, while the second is usually the sharper inverse-price-floor-to-zero family.
- Review every market launch path: can
- Defenses:
- Seed markets with non-burnable minimum liquidity or dead shares so
totalSupplycan never approach zero, and do not launch fresh reserves without that seed in place. - Prevent raw balance donations from immediately changing solvency-critical exchange-rate inputs, or account for them separately.
- In rebasing-reserve designs, quarantine new markets with collateral factor
0until the reserve has real deposits and fee accrual cannot be monopolized by one supplier. - Add minimum share-burn floors or safer rounding around redemptions in tiny-supply states.
- Disable or quarantine empty markets before they can be used as collateral.
- Review duplicate or unused markets aggressively; operational clutter can become exploitable structure.
- Seed markets with non-burnable minimum liquidity or dead shares so
What sound design looks like
- A market is either in a launch / fresh / effectively-fresh state or in a mature state, and that lifecycle classification is enforced in code rather than left to ops convention. If supplier breadth collapses back to dust, the market falls back into quarantine automatically.
- Solvency-critical marks only move when value enters through matched accounting paths. Direct donations, over-repayments, rescue transfers, fee recycling, and accidental raw-balance changes do not get to redefine collateral truth unless the design explicitly wants that and can prove the new supplier claims are proportional.
- Receipt-token burn math is monotone with economic value even at pathological supply sizes: redeeming more underlying always destroys enough supplier state, and the protocol never lets floor division turn
~2 weiof required burn into1 weijust because exchange rate or index value became enormous. - Borrow-side admission lags behind local accounting initialization. A new, dormant, duplicated, or recently reactivated market can accumulate seed liquidity and stabilize its internal accounting before any sibling market is forced to trust it as collateral.
- Empty-state handling is explicit about which promotion has happened:
the market is economically empty again,one actor can monopolize the denominator, andthat denominator still has authority to set redeemable or borrowable truthshould be different security states rather than one blurred low-liquidity condition. - Reserve revenue socialization assumes adversarial emptiness. Flash-loan premiums, utilization fees, and rebasing-index growth have minimum-liquidity thresholds, caps, treasury routing, or other guards so that one dust supplier cannot monopolize the next unit of value.
- The protocol has one coherent answer to
what is the denominator of supplier value right now?Real token balance, accounting balance, exchange rate, liquidity index, and collateral mark should reconcile under the same state machine rather than drifting across different entrypoints. - Dormant or duplicate markets are treated as latent launch surfaces, not harmless clutter. If a market no longer has healthy breadth, either seed it again, quarantine it, or remove its ability to influence systemwide solvency.
- The target invariant is simple: no actor should be able to turn a tiny-supply market into system-relevant collateral truth faster than the protocol can force proportional share issuance, proportional share burn, or a fail-closed quarantine.
Failure-prevention checklist
- Never let a lending market, reserve, or wrapper-backed collateral path become borrow-relevant while
totalSupply,scaledTotalSupply, or equivalent supplier state is still attacker-ownable dust. - Treat
market is economically empty,one actor owns the next unit of supplier-side value, andthat value still counts as redeemable or borrowable truthas separate states in code, monitoring, and incident response. - Seed non-burnable minimum liquidity before collateral admission, and encode that floor so it cannot be undone later by a redeem path, migration path, or emergency cleanup.
- Treat direct donations, over-repayments, rescue transfers, fee accrual, and any off-path balance increase as solvency code. Decide explicitly whether they should change exchange rate, supplier index, treasury balance, or none of the above.
- Keep
actual balance,accounting balance,exchange rate,liquidityIndex, and collateral valuation on one coherent story. If one path reads raw token balance while another reads scaled accounting state, document and test the boundary as hostile. - Fail closed in empty or near-empty states: no collateral credit, no flash-loan fee socialization, no donation-driven mark updates, and no redemptions whose rounding becomes attacker-favorable only because supply is microscopic.
- Require market-launch sequencing to be technically enforced rather than operationally hoped for: seed first, verify state parity second, enable collateral and borrowing last.
- Quarantine dormant, duplicate, or long-unused markets the same way you quarantine fresh ones. An old market with dust supply is still a launch-state market from the attacker’s point of view.
- Fuzz mint / redeem / withdraw / liquidation / flash-loan settlement math at single-wei and low-decimal edge states, not only at normal TVL.
- Add monitoring for production-impossible states: one meaningful supplier,
totalSupplynear zero, sudden exchange-rate jumps, extreme index growth, or a reserve whose real balance materially outruns the denominator used for collateral math. - Put blast-radius limits under the market anyway: borrow-side quarantine, per-market caps, temporary collateral factor
0, and fast pause paths should stop one tiny-supply accounting lie from draining sibling pools.
Audit prompts
- What exact variable becomes borrow truth in the empty state here: Compound-style exchange rate, Aave-style
liquidityIndex, an accumulator, or some wrapper-mark derivative of one of those? - Can an attacker drive supplier state back toward zero after launch, or does the protocol only think about the initial deployment moment?
- Which paths increase the numerator without minting proportional supplier claims: direct transfer, over-repayment, flash-loan fees, fee harvest, donation, reward settlement, or migration bookkeeping?
- Which paths burn supplier state, and where does floor division silently under-burn when unit price becomes absurdly large?
- Does collateral admission depend on raw token balance, accounting balance, or a published exchange-rate/index snapshot? Can those diverge for even one transaction?
- Can the manipulated market unlock borrowing from deeper sibling markets immediately, or is there a borrow-side quarantine that contains the damage locally?
- Which exact empty-state promotion is happening at each step: economically empty again, attacker-owned denominator, or full redeem / borrow / liquidation authority for the printed mark?
- If the reserve is new, dormant, duplicated, or governance-listed, what exactly guarantees that seed liquidity and collateral-disable sequencing happen before any outside actor can interact?
- Are flash-loan fee routing and donation handling economically neutral in tiny-supply states, or do they become attacker-controlled collateral printers?
- What invariant proves the protocol cannot credit more redeemable or borrowable supplier-side value than economically entered through matched accounting paths?
- Which operational controls would actually catch this early: dust-supply alerts, collateral-factor guards, market-freeze automation, reserve-delta reconciliation, or per-block growth clamps on exchange rate / index variables?
Lessons that should already be standard
-
Empty markets are privileged accounting states, not harmless low-usage corners. Whoever controls the dust supply often controls the meaning of future yield, donations, and collateral value.
-
This market is nearly empty,this actor owns the denominator, andthe rest of the protocol will spend against that printed valueare three different security claims. -
Collateral factor > 0 before real supplier breadth existsis a launch bug, not an aggressive growth tactic. -
Donation neutrality is not optional plumbing. If unsolicited balance growth can instantly become collateral truth, the protocol is delegating solvency to whoever can move tokens into the contract cheapest.
-
Precision-loss edges are only small at normal scale. Once a protocol lets one wei of receipt supply represent real money, rounding becomes treasury risk.
-
Operational sequencing is part of the security model. A manual plan to seed later, burn later, or raise collateral later is not a defense if an attacker can reach the market first.
-
Dormant markets deserve the same paranoia as fresh ones. The exploit family does not care whether the unsafe empty state is five minutes old or five months old.
-
Cross-market lending makes local accounting lies systemic. A tiny market should never be allowed to define borrow power for the rest of the book without extra quarantine.
-
If a design depends on
nobody will ever be the only meaningful supplier when value is socialized, then the design is incomplete until code enforces that assumption. -
High-signal incidents:
- Hundred Finance hWBTC empty-market exchange-rate exploit (2023-04-15) — the clean canonical Compound-v2 case: an effectively unused duplicate WBTC market was reduced to 2 wei of hWBTC supply, the attacker donated ~500 WBTC, borrowed against the inflated rate, then redeemed the donation back out because truncation burned only 1 wei instead of ~2.
- BUSD LP empty-market rounding exploit (2023-06-17) — a close post-Hundred variant: a low-denomination LP-token market was driven down to 1001 wei of cToken supply, direct LP donations inflated exchange rate, and a required 1.998-wei burn rounded down to 1 wei.
- Sonne Finance soVELO empty-market donation exploit (2024-05-14) — the governance-activation Compound-fork variant: a freshly listed VELO market became collateral-eligible before launch hardening, letting the attacker pin supply at 2 wei, donate ~35.47M VELO, and reuse the same
1.999994 -> 1 weiredemption truncation against sibling markets. - Onyx Protocol oPEPE empty-market donation exploit (2023-11-01) — the first-interactor launch-window replay: the attacker executed the passed proposal to list PEPE, became the first meaningful
oPEPEuser one minute later, pinned supply at 2 wei, donated ~2.52T PEPE, and turned the fresh market’s printed exchange rate into cross-market bad debt. - Radiant Capital native USDC empty-market liquidityIndex exploit (2024-01-02) — the Aave-v2-style cousin: a fresh native USDC reserve let the first depositor concentrate flash-loan fees into
liquidityIndex, then use burn rounding and fake collateral value to drain about 1,900 WETH. - Starlay Finance Acala USDC empty-market liquidityIndex exploit (2024-02-08) — the Acala-specific fresh-reserve replay: an empty
lUSDCmarket plus unsafe collateral / liquidation conditions let the attacker preserve a0.000001 lUSDCdust position, recycle USDC through the same reserve, and turn distortedliquidityIndexaccounting into about$2.14Mof borrowedDOTandLDOT. - HopeLend hETHWBTC empty-market liquidityIndex exploit (2023-10-18) — the dormant-reserve Aave-style replay: an unused
hETHWBTCmarket was driven down to one1e-8hToken unit, about1.26 WBTCof LP fees per flash-loan loop got concentrated into that dust balance, and WBTC-granularity burn truncation turned the printedliquidityIndexinto about526 ETHof extracted value. - zkLend wstETH empty-market accumulator-inflation exploit (2025-02-11) — the Starknet accumulator variant: an empty wstETH market, flash-loan over-repayment treated as donation, and floor-rounded burn math let the attacker turn a
raw_balanceof2into paper collateral worth about 7,015.4 wstETH and then borrow other assets against it. - dTRINITY dLEND cbBTC fresh-market liquidityIndex inflation exploit (2026-03-17) — the fresh-market Aave-v3-style replay: a six-day-old cbBTC reserve with zero organic supply let the first meaningful supplier capture all flash-loan-fee accrual, inflate
liquidityIndex, and borrow257,328.63 dUSDagainst phantom collateral.
Internal linkages
- Best concrete case study: hundred-finance-hwbtc-empty-market-exchange-rate-exploit-2023-04-15.
- Strong follow-on case: midas-capital-hay-busd-lp-empty-market-rounding-exploit-2023-06-17 — useful when the question is how incomplete post-Hundred mitigations still failed once LP-token denomination and rounding edges were involved.
- Strong governance-sequencing case: sonne-finance-sovelo-empty-market-donation-exploit-2024-05-14 — useful when the question is how a known bug family can re-open during market listing because execution order, not just arithmetic, is part of the security model.
- Strong launch-window replay: onyx-protocol-opepe-empty-market-donation-exploit-2023-11-01 — useful when the question is how known empty-market math can re-open at the exact moment governance lists a fresh market and the first actor gets to define the initial state.
- Strong launch-sequencing pattern note: fresh-market-initialization-failure — useful when the question is why fresh listings and new reserves are dangerous even before the classic donation or index-inflation math begins.
- Specialized rebasing-reserve subpattern: supplier-index-inflation — use this when the printable variable is a supplier scaler like
liquidityIndexorlending_accumulator, rather than a Compound-style exchange rate. - Strong Aave-fork launch-window case: radiant-capital-native-usdc-empty-market-liquidityindex-exploit-2024-01-02 — useful when the question is how empty-market inflation reappears in rebasing-reserve math where
liquidityIndex, not exchange rate, is the printable variable. - Strong Acala reserve-configuration case: starlay-finance-acala-usdc-empty-market-liquidityindex-exploit-2024-02-08 — useful when the question is how the same family survives in a fresh reserve when unsafe collateral / liquidation configuration leaves a dust
lUSDCposition borrow-relevant against deeperDOTandLDOTmarkets. - Strong Aave-fork dormant-reserve case: hopelend-hethwbtc-empty-market-liquidityindex-exploit-2023-10-18 — useful when the question is how the same
liquidityIndexfamily can stay latent inside an unused reserve for months and then become exploitable once WBTC-sized dust supply and burn truncation line up. - Strong accumulator case: zklend-wsteth-empty-market-accumulator-inflation-exploit-2025-02-11 — useful when the question is how the same empty-market / under-burn family reappears in
accumulator * raw_balanceaccounting rather than cToken exchange-rate math. - Strong Aave-v3 fresh-market case: dtrinity-dlend-cbbtc-fresh-market-liquidityindex-inflation-exploit-2026-03-17 — useful when the question is how the same family persists in later Aave-style forks where a just-listed reserve with zero supply lets flash-loan fees print collateral value even without a dormant market or a classic burn-rounding cash-out.
- Positive-design companion: fresh-market-seeding-and-activation-discipline — use this when the sharper question is how to keep a new, dormant, or effectively-fresh market from ever reaching the tiny-supply state that makes this family cash-outable.
- Positive-design companion: bootstrap-state-irreversibility-and-supply-floor-design — use this when the sharper design question is how a market keeps launch-state or dust-state supply floors from ever being redeemed back into attacker-owned opening conditions.
- Positive-design companion: effective-freshness-reclassification-and-dormant-market-quarantine — use this when the sharper lifecycle question is how an already-listed market should fall back into quarantine once low breadth, dormancy, or one-supplier conditions make the empty-market family relevant again.
- Positive-design companion: supplier-denominator-integrity-and-thin-market-fee-socialization — use this when the sharper question is who was allowed to capture the next donation, flash-loan premium, or over-repayment and why that value was still being socialized over an attacker-owned denominator.
- Positive-design companion: vault-share-truth-security-object — use this when the question is what a healthy wrapper / receipt-token truth boundary should look like before empty-market math ever crosses into lending collateral.
- Positive-design companion: collateral-admission-lag-and-borrow-side-quarantine — use this when the sharper design question is how to stop a manipulable mark from becoming immediate borrow power even if local accounting still needs work.
- Positive-design companion: minimum-unit-burn-rounding-and-low-decimal-asset-discipline — use this when the sharper cash-out question is how a tiny-supply market turned
nearly 2 units should burninto1 unit did burn, especially with coarse-decimal assets or receipt-token rails. - Positive-design companion: recursive-borrow-suppression-for-fresh-collateral — useful when the wrapper or reserve mark may be real locally but should not yet recurse into same-asset or sibling-asset borrowing.
- Positive-design companion: low-supply-recovery-and-recapitalization-discipline — useful when the sharper design question is how a market should recover once supply breadth has already collapsed instead of letting ambient donations or fee events silently reseed collateral truth.
- Adjacent pattern: donation-share-price-manipulation — the same high-level idea of attacker-inflated share value, but this note stays on the sharper empty-market / rounding-loss lending subfamily.
- Boundary case: inverse-price-floor-to-zero — use this when the decisive bug is not under-burn or exchange-rate inflation inside an empty lending market, but reciprocal borrow-side math that turns an honestly inflated wrapper mark into literal zero collateral cost. ResupplyFi is the clean contrast case.
- Adjacent pattern: solvency-check-bypass — both families create borrowable solvency from broken accounting, but here the attacker inflates receipt-token value rather than deleting collateral.
Control surface
-
The leverage sits in empty-market initialization, receipt-token supply floors, value-accounting inputs, rounding direction, and cross-market collateral admission.
-
The protocol does not fail because one variable is wrong. It fails because an almost-empty market is allowed to define solvency for the rest of the system, whether through exchange rate or
liquidityIndex. -
The sharp control-surface question is not just
can this market become tiny?butwhen does tiny become attacker-owned denominator state, and when does that printed denominator still retain redeem / borrow / liquidation authority elsewhere? -
Sources:
- https://blocksec.com/blog/6-hundred-finance-incident-catalyzing-the-wave-of-precision-related-exploits-in-vulnerable-forked-protocols
- https://www.comp.xyz/t/hundred-finance-exploit-and-compound-v2/4266
- https://www.numencyber.com/hundred-finance-exploit-7-million/
- https://raw.githubusercontent.com/SunWeb3Sec/DeFiHackLabs/main/src/test/2023-04/HundredFinance_2_exp.sol
- https://medium.com/midas-capital/midas-exploit-post-mortem-1ae266222994
- https://medium.com/@SonneFinance/post-mortem-sonne-finance-exploit-12f3daa82b06
- https://www.certik.com/blog/sonne-finance-incident-analysis
- https://medium.com/@RadiantCapital/post-mortem-report-radiant-capital-aea46cb985ae
- https://x.com/starlay_fi/status/1755605617421795560
- https://x.com/starlay_fi/status/1755856271184654360
- https://acala.subsquare.io/treasury/proposals/14
- https://www.certik.com/blog/hopelend-incident-analysis
- https://lunaray.medium.com/deep-dive-into-hopelend-hack-5962e8b55d3f
- https://metatrust.io/blogs/post/how-onyxs-governance-and-vulnerability-became-hackers-golden-shovels
- https://www.certik.com/blog/post-mortem-onyx-protocol
- https://mixbytes.io/blog/aave-and-compound-forking-empty-pool-attacks
- https://blocksec.com/blog/zklend-exploit-post-mortem-unraveling-the-details-and-clarifying-misunderstandings-of-the-10m-flash-loan-attack
- https://rekt.news/zklend-rekt
- https://docs.dtrinity.org/security/incident-disclosures
- https://x.com/dTRINITY_DeFi/status/2036267791733477788
- https://olympix.security/blog/the-257k-dtrinity-loss-and-how-olympix-would-have-prevented-it
-
Last reviewed: 2026-07-27 UTC