dTRINITY dLEND cbBTC Fresh-Market liquidityIndex Inflation Exploit (2026-03-17)

  • Name: dTRINITY dLEND cbBTC fresh-market liquidityIndex inflation exploit
  • Date: 2026-03-17
  • Protocol: dTRINITY / dLEND
  • Chain: Ethereum
  • Category: fresh-market liquidityIndex inflation / first-depositor capture / cross-market lending drain
  • Loss: about $257,329 in dUSD
  • Summary: dTRINITY’s Ethereum dLEND deployment exposed a just-listed cbBTC reserve to full collateral use before the market had any meaningful supplier base. The attacker first forced the reserve into a dust-supply state, then recycled flash loans so that supplier-side flash-loan premiums accrued almost entirely to that microscopic position. In Aave-style accounting that meant scaledBalance * liquidityIndex detached from the reserve’s real economics. Public reconstruction indicates the attacker also widened the gap between real reserve balance and scaled-liquidity accounting by transferring about 0.8 cbBTC directly to the aToken contract without minting new shares. Once the inflated liquidityIndex was treated as valid collateral, the attacker deposited more cbBTC, borrowed essentially the whole available dUSD supply (257,328.63 dUSD), and left the protocol with bad debt. The primary postmortem preserves the clearest high-level timeline: the Ethereum deployment had only been live for about five days, the attacker set the reserve into near-dust state at 11:05 UTC, borrowed the full 257,328.63 dUSD one minute later, and operators spent the rest of the day freezing, pausing, and re-stabilizing the deployment.
  • Trigger / entry point:
    • dLEND had listed the Ethereum cbBTC market less than a week earlier, on 2026-03-11, and the reserve still had effectively zero organic supply when the attacker arrived.
    • dLEND inherited Aave-v3-style rebasing supplier accounting, where user collateral is represented as scaledBalance * liquidityIndex via getReserveNormalizedIncome().
    • Flash-loan premiums were still allowed to flow into supplier-side index growth even in this empty-market state.
    • Because the market was both fresh and nearly empty, one actor could monopolize the first meaningful units of fee accrual and turn them into protocol-wide borrow power.
  • Root cause:
    • dLEND let a fresh reserve become collateral-relevant before non-burnable seed liquidity, low-supply quarantines, or equivalent launch-state hardening were in place.
    • Supplier balances trusted liquidityIndex growth even when the reserve’s effective supply had been pushed to near zero, so flash-loan premiums became a collateral-printing mechanism.
    • The reserve lacked a robust invariant binding aggregate indexed supplier balances to economically justified underlying value.
    • Public post-incident analysis also shows a sharper Aave-family accounting-boundary issue: direct transfers to the aToken contract could increase real lendable balance without minting proportional scaled supply, worsening the denominator against which fee-driven liquidityIndex growth was socialized.
  • Exploit path:
    1. In manipulation transaction 0x8d33d688def03551cb77b0463f55ae5a670f5ebf3bbb5b8aa0e284c040ae7139, the attacker sourced cbBTC liquidity through Morpho Blue and entered the fresh dLEND cbBTC market.
    2. Public reconstruction indicates they deposited enough to mint about 100 scaled shares, then withdrew 99, leaving the reserve with only a microscopic supplier footprint they effectively controlled.
    3. They transferred about 0.8 cbBTC directly to the dLEND cbBTC aToken contract 0x504d0eacbf9ea5645a8a9da1b15f3708a5483acc, increasing real reserve balance without minting new shares.
    4. They then executed repeated flash loans. Because the scaled supplier base was near dust, the LP portion of each premium accrued almost entirely to the attacker’s residual position.
    5. Secondary reconstruction reports that the reserve liquidityIndex was pushed to roughly 6.22e27, about 6.22x its normal baseline, making the attacker’s tiny scaled balance look vastly more valuable than the reserve’s real economics supported.
    6. In extraction transaction 0xbec4c8ae19c44990984fd41dc7dd1c9a22894adccf31ca6b61b5aa084fc33260, the attacker deposited about 7.72 cbBTC into the already-manipulated reserve.
    7. dLEND then treated that deposit under the inflated index as high-value collateral, allowing the attacker to borrow about 257,328.63 dUSD from the dUSD market.
    8. The attacker unwound supporting liquidity, repaid flash-borrowed cbBTC, and exited with the borrowed dUSD, leaving bad debt equal to the gap between fake indexed collateral value and real reserve backing.
  • What the attacker needed to be true:
    • The cbBTC market had to be effectively fresh-state collateral with no meaningful honest supplier base.
    • Flash-loan premiums had to keep increasing liquidityIndex in that empty-state regime instead of being quarantined, capped, or routed away from supplier accounting.
    • dLEND had to accept the resulting scaledBalance * liquidityIndex output as real collateral during health-factor and borrowing checks.
    • The attacker needed enough external cbBTC liquidity to set the reserve state, pump liquidityIndex, and then borrow dUSD before operators froze the deployment.
  • Technical anatomy worth remembering:
    • This was not an oracle incident. dLEND’s own reserve accounting manufactured the fake solvency.
    • The exploit is a clean fresh-market Aave-family replay: empty reserve first, supplier-index inflation second, cross-market borrowing last.
    • The sharper invariant failure is that the sum of supplier balances implied by balanceOf(user) = scaledBalance(user) * liquidityIndex should never materially outrun the reserve’s real underlying backing, modulo legitimate accrued borrower interest. In dLEND that safety story was assumed rather than enforced.
    • dTRINITY is also useful because the reserve was not merely thin; it was newly listed, making this a launch-sequencing case as much as an accounting one.
    • The direct-transfer detail matters analytically because it shows how Aave-style forks can fail not only from dust-supply fee concentration but also from a ledger split between real token balance and the scaled-liquidity denominator used for index growth.
  • Representative transactions and artifacts:
    • Attacker EOA: 0x08cfdff8ded5f1326628077f38d4f90df6417fd9
    • Manipulation tx: 0x8d33d688def03551cb77b0463f55ae5a670f5ebf3bbb5b8aa0e284c040ae7139
    • Borrow / extraction tx: 0xbec4c8ae19c44990984fd41dc7dd1c9a22894adccf31ca6b61b5aa084fc33260
    • dLEND cbBTC aToken: 0x504d0eacbf9ea5645a8a9da1b15f3708a5483acc
    • dLEND L2Pool: 0xfda3a0effe2f3917aa60e0741c6788619ae19e84

Source confidence / evidence split

  • Primary dTRINITY disclosure directly confirms the date (2026-03-17), loss scale (about $257K, fully covered), affected market (cbBTC on Ethereum), exploit class (liquidity-index inflation through an empty-state reserve in a fork of Aave V3), and the mitigation bundle (Ethereum deployment frozen for about 2.5 months, non-dUSD flash loans and flash mints disabled, initialization procedures strengthened, broader admin / monitoring hardening).
  • The sharper exploit anatomy in this note — the 100 -> 1 scaled-share setup, the direct 0.8 cbBTC transfer to the aToken, the roughly 6.22e27 liquidityIndex, and the later ~7.72 cbBTC collateral deposit used to borrow 257,328.63 dUSD — comes from secondary reconstruction rather than the primary team disclosure.
  • That split matters analytically. The primary source is enough to place the incident in the fresh-market liquidityIndex inflation family and to preserve the protocol’s own mitigation posture. The secondary reconstruction is what makes the sharper actual balance vs scaled-liquidity denominator and first meaningful supplier captured fee socialization mechanics legible.
  • Treat the first layer as protocol-confirmed fact and the second layer as well-supported but still reconstruction-level detail. The mechanism is coherent across sources, but not every quantitative step is stated by dTRINITY itself.

Three reserve-state promotions this incident collapsed

  1. The reserve was reachable

    • The less-than-week-old cbBTC market had already crossed from listed to users can interact with it.
    • That was only a reachability fact, not proof that the reserve had a healthy supplier denominator or safe launch-state economics.
  2. Reserve-side value was allowed to become supplier-side indexed truth

    • Flash-loan premiums in the almost-empty reserve still flowed into liquidityIndex, and public reconstruction indicates direct cbBTC transfer behavior widened the gap between real reserve balance and the scaled-liquidity denominator used for socialization.
    • This was the decisive local-accounting promotion: the reserve kept treating tiny-denominator state as if it were mature enough to socialize new value safely.
  3. That printed indexed balance was allowed to become cross-market borrow authority

    • The dUSD market then honored the inflated cbBTC indexed balance as ordinary collateral.
    • This final promotion is where the local reserve-accounting lie became protocol-wide bad debt.
  • Response / mitigation:
    • dTRINITY publicly acknowledged the incident the same day, and the team postmortem gives a useful containment sequence: 11:53 UTC emergency pause, 12:26 UTC temporary pause on dUSD redemptions, 15:17 UTC recovery configs that disabled borrowing / disabled flash loans / froze markets, 19:39 UTC non-cbBTC markets moved to unpaused-plus-frozen state, and 19:42 UTC dUSD redemptions restored.
    • By the following day the team said all bad debt had been repaid using core-contributor funds and protocol treasury resources.
    • The Ethereum deployment then remained frozen for about 2.5 months while the team hardened reserve initialization, disabled flash loans and flash mints for non-dUSD markets, and reviewed broader infrastructure and governance controls.
    • The postmortem also commits to a sharper accounting fix: flash-loan fees no longer flow directly into immediate supplier-side liquidityIndex increases, but instead route to protocol accrual.
    • dTRINITY’s incident-disclosure page also says the team strengthened multisig safeguards, added timelocked admin controls, and expanded internal monitoring and alerting, even though no admin keys were compromised in this exploit.
    • The protocol further committed to a stricter market-listing sequence: initialize new markets in a non-live state, seed them first, and only then enable borrowing and collateral use.

Pattern tags

  • supplier-index-inflation
  • fresh-market-initialization-failure
  • entrypoint-only-policy-off-path-state-mutation
  • Fresh reserve, microscopic scaled supply, and cross-market collateral admission were already enough to replay the Aave-family empty-market exploit; the direct transfer to the aToken then made the same reserve look richer to flash-loan and balance-reading paths than to the denominator used for supplier-index socialization.
  • This was a clean listed reserve != mature reserve failure. dLEND had already granted borrow-side authority to a market whose first meaningful actor still got to decide what fee accrual and reserve balance meant.

Why the exploit worked

  • dLEND let a less-than-week-old cbBTC reserve cross the line from reachable to borrow-relevant before the protocol had established either a durable supply floor or a quarantine that would have made first-supplier accounting economically harmless. Once the attacker reduced scaled supply back toward dust, liquidityIndex growth stopped being shared yield and became attacker-controlled collateral printing.
  • The flash-loan loop alone already fit the familiar supplier-index-inflation family: premiums were socialized over a denominator so small that one user effectively owned all future fee accrual. That meant dLEND’s own accounting path manufactured the fake collateral value without any external oracle failure.
  • The direct 0.8 cbBTC transfer sharpened the failure into an accounting-boundary problem too. Real reserve balance, flash-loanable balance, and the state visible to some downstream reads grew, but scaled supply did not. That widened the gap between what balance-sheet state looked live and what denominator supplier-index updates were actually distributing over.
  • Downstream borrowing then treated the printed scaledBalance * liquidityIndex result as ordinary collateral truth. There was no second distrust boundary where a fresh reserve, a dust-supply reserve, or a reserve with unexplained actual-balance / scaled-liquidity divergence had to stay locally observable but still economically quarantined.
  • The preserved lesson is therefore broader than Aave forks need more seeding: launch-state hardening, off-path balance mutation handling, and borrow-side admission all belonged to one security object, and dLEND split them apart.

Detection and audit pivots

  • Reconstruct the full reserve state object, not only liquidityIndex: actual underlying balance, scaled total supply, reserve cache / total liquidity, flash-loan premium routing, and collateral checks should all tell one coherent story before the market can matter system-wide.
  • Force direct transfers, over-repayments, and flash-loan fee accrual into fresh or dust-supply reserves during testing. If any of those paths can increase live lendable balance or supplier-side value without proportionally increasing scaled supply, the reserve still has an off-path balance-sheet gap.
  • Ask the lifecycle question explicitly: what onchain fact proves this reserve is past its dangerous opening state, and what automated response shrinks its authority again if scaled supply or supplier breadth later collapses back toward dust?
  • Audit first-supplier economics rather than only steady-state math. If one address can still capture the next meaningful unit of fee accrual, then listed market and mature collateral object are still being conflated.
  • Check for a downstream distrust boundary. Can a fresh or thin reserve be observable while collateral factor stays 0, correlated borrows stay disabled, flash loans stay off, or debt caps stay too small for one fabricated mark to drain sibling markets?

Failure-prevention checklist

  • Keep new reserves in a technically enforced distrust state until seed liquidity is irreversible, reserve accounting reconciles cleanly, and collateral / borrowing authority is enabled in a later step rather than at listing time.
  • Encode a non-burnable minimum supply or equivalent virtual-balance floor so one address cannot reduce scaledTotalSupply back to attacker-ownable dust after launch.
  • Fail closed when supplier denominator is too thin: route flash-loan premiums away from liquidityIndex, disable flash loans, or quarantine index growth entirely until reserve depth and supplier breadth cross explicit thresholds.
  • Reconcile underlying.balanceOf(aToken), reserve cache, scaledTotalSupply, and collateral valuation after every direct transfer, repayment, donation, rescue, or flash-loan settlement path. If those ledgers can diverge, decide which one is allowed to create lendable balance and which one is not.
  • Treat direct transfers to aToken contracts as solvency events, not harmless ERC-20 noise. Either sweep them into matched accounting, reject their economic effect, or ensure they cannot increase flash-loanable balance without minting proportional scaled supply.
  • Put hard caps below fresh-market collateral anyway: isolated mode, debt caps, collateral factor 0, correlated-borrow suppression, and fast reserve freezes should stop one thin reserve from draining sibling markets.
  • Add per-operation or per-block sanity bounds on supplier-index growth so one flash-loan loop cannot move liquidityIndex by multiples before monitoring or governance can react.
  • Alert on production-improbable reserve states: one meaningful supplier, dust scaledTotalSupply, abrupt liquidityIndex jumps, or real reserve balance materially exceeding the accounting denominator used for supplier fee socialization.

Audit prompts

  • What exact denominator does flash-loan fee socialization divide by in this reserve, and can one actor temporarily own almost all of it?
  • Can a reserve become collateral-relevant before a non-burnable seed position exists, or before governance / ops finish the sequencing that is supposed to make the market safe?
  • Which paths can increase real reserve balance without minting proportional scaled supply: direct transfers, over-repayments, rescue flows, fee settlement, or unusual callback branches?
  • Does flash-loan execution read underlying.balanceOf(aToken) while supplier indexing and health-factor math trust a different liquidity denominator? If so, what prevents premium compounding against fiction?
  • What onchain fact graduates a market from fresh listing to trusted collateral, and what onchain fact pushes it back into quarantine if supply later collapses toward dust?
  • If liquidityIndex or normalized income jumped by 2x, 5x, or 10x inside one block, which invariant or circuit breaker would fail before the reserve could be used to borrow from deeper sibling markets?
  • Can the same reserve both generate the attacker-controlled fee event and immediately monetize the printed balance through borrowing, or is there a downstream distrust boundary that keeps those steps separate?
  • Which monitoring path would notice sum(balanceOf(users)) materially outruns economically justified underlying backing quickly enough to matter in production?

Lessons that should already be standard

  • A newly listed reserve is not the same thing as a mature collateral object. Reachable by users and allowed to define borrow power across the protocol should already be separate lifecycle states.
  • Flash-loan premiums are solvency inputs. If a protocol lets the same user manufacture fee income and monopolize its distribution, it is letting them print collateral.
  • Real reserve balance and scaled-liquidity accounting must tell the same story. If direct transfers make one ledger richer while index math still divides by a much smaller denominator, the gap is already an exploit surface.
  • Direct ERC-20 transfers into accounting wrappers are not harmless background noise. In lending systems they can silently redefine what future flash loans, withdrawals, and fee socialization mean.
  • Forking Aave-style code does not inherit Aave-style launch discipline automatically. If the fresh-market hardening and denominator guards do not ship with the fork, the exploit family is still live.
  • Borrow-side quarantine is not optional cleanup. Even if local reserve accounting later proves healthy, new or thin collateral should not get immediate line-of-sight to deeper sibling liquidity.

Why this incident matters

  • dTRINITY preserves a late, very legible Aave-v3-style empty-market case: a less-than-week-old reserve, fee-socialized liquidityIndex inflation, and cross-market bad debt minted from a launch-state accounting lie.
  • It strengthens the fresh-market initialization failure corpus because the failure was not just arithmetic; it was that a new market was allowed to matter before launch-state assumptions had become false.
  • It also helps bridge the supplier-index-inflation family to the sharper actual-balance / scaled-liquidity divergence variant. Public reconstruction suggests the attacker did not only concentrate fees over dust supply; they also used direct transfer behavior to widen the gap between real reserve balance and the denominator used for supplier-index growth.
  • Finally, dTRINITY is useful as a fork-maintenance reminder: known Aave-family edge cases do not disappear just because the upstream design is famous. If the hardening does not ship with the fork, the exploit family is still live.

Internal linkages

Control surface