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,329indUSD - Summary: dTRINITY’s Ethereum dLEND deployment exposed a just-listed
cbBTCreserve 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 meantscaledBalance * liquidityIndexdetached 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 about0.8 cbBTCdirectly to theaTokencontract without minting new shares. Once the inflatedliquidityIndexwas treated as valid collateral, the attacker deposited morecbBTC, borrowed essentially the whole availabledUSDsupply (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 at11:05 UTC, borrowed the full257,328.63 dUSDone 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
cbBTCmarket less than a week earlier, on2026-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 * liquidityIndexviagetReserveNormalizedIncome(). - 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.
- dLEND had listed the Ethereum
- 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
liquidityIndexgrowth 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
aTokencontract could increase real lendable balance without minting proportional scaled supply, worsening the denominator against which fee-drivenliquidityIndexgrowth was socialized.
- Exploit path:
- In manipulation transaction
0x8d33d688def03551cb77b0463f55ae5a670f5ebf3bbb5b8aa0e284c040ae7139, the attacker sourcedcbBTCliquidity through Morpho Blue and entered the fresh dLENDcbBTCmarket. - Public reconstruction indicates they deposited enough to mint about
100scaled shares, then withdrew99, leaving the reserve with only a microscopic supplier footprint they effectively controlled. - They transferred about
0.8 cbBTCdirectly to the dLENDcbBTCaTokencontract0x504d0eacbf9ea5645a8a9da1b15f3708a5483acc, increasing real reserve balance without minting new shares. - 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.
- Secondary reconstruction reports that the reserve
liquidityIndexwas pushed to roughly6.22e27, about6.22xits normal baseline, making the attacker’s tiny scaled balance look vastly more valuable than the reserve’s real economics supported. - In extraction transaction
0xbec4c8ae19c44990984fd41dc7dd1c9a22894adccf31ca6b61b5aa084fc33260, the attacker deposited about7.72 cbBTCinto the already-manipulated reserve. - dLEND then treated that deposit under the inflated index as high-value collateral, allowing the attacker to borrow about
257,328.63 dUSDfrom thedUSDmarket. - The attacker unwound supporting liquidity, repaid flash-borrowed
cbBTC, and exited with the borroweddUSD, leaving bad debt equal to the gap between fake indexed collateral value and real reserve backing.
- In manipulation transaction
- What the attacker needed to be true:
- The
cbBTCmarket had to be effectively fresh-state collateral with no meaningful honest supplier base. - Flash-loan premiums had to keep increasing
liquidityIndexin that empty-state regime instead of being quarantined, capped, or routed away from supplier accounting. - dLEND had to accept the resulting
scaledBalance * liquidityIndexoutput as real collateral during health-factor and borrowing checks. - The attacker needed enough external
cbBTCliquidity to set the reserve state, pumpliquidityIndex, and then borrowdUSDbefore operators froze the deployment.
- The
- 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) * liquidityIndexshould 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
cbBTCaToken:0x504d0eacbf9ea5645a8a9da1b15f3708a5483acc - dLEND
L2Pool:0xfda3a0effe2f3917aa60e0741c6788619ae19e84
- Attacker EOA:
Source confidence / evidence split
- Primary dTRINITY disclosure directly confirms the date (
2026-03-17), loss scale (about$257K, fully covered), affected market (cbBTCon Ethereum), exploit class (liquidity-index inflationthrough an empty-state reserve in a fork of Aave V3), and the mitigation bundle (Ethereum deployment frozen for about2.5months, non-dUSDflash loans and flash mints disabled, initialization procedures strengthened, broader admin / monitoring hardening). - The sharper exploit anatomy in this note — the
100 -> 1scaled-share setup, the direct0.8 cbBTCtransfer to theaToken, the roughly6.22e27liquidityIndex, and the later~7.72 cbBTCcollateral deposit used to borrow257,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 inflationfamily and to preserve the protocol’s own mitigation posture. The secondary reconstruction is what makes the sharperactual balance vs scaled-liquidity denominatorandfirst meaningful supplier captured fee socializationmechanics 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
-
The reserve was reachable
- The less-than-week-old
cbBTCmarket had already crossed fromlistedtousers 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.
- The less-than-week-old
-
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 directcbBTCtransfer 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.
- Flash-loan premiums in the almost-empty reserve still flowed into
-
That printed indexed balance was allowed to become cross-market borrow authority
- The
dUSDmarket then honored the inflatedcbBTCindexed balance as ordinary collateral. - This final promotion is where the local reserve-accounting lie became protocol-wide bad debt.
- The
- Response / mitigation:
- dTRINITY publicly acknowledged the incident the same day, and the team postmortem gives a useful containment sequence:
11:53 UTCemergency pause,12:26 UTCtemporary pause ondUSDredemptions,15:17 UTCrecovery configs that disabled borrowing / disabled flash loans / froze markets,19:39 UTCnon-cbBTCmarkets moved to unpaused-plus-frozen state, and19:42 UTCdUSDredemptions 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.5months while the team hardened reserve initialization, disabled flash loans and flash mints for non-dUSDmarkets, 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
liquidityIndexincreases, 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.
- dTRINITY publicly acknowledged the incident the same day, and the team postmortem gives a useful containment sequence:
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
aTokenthen 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 reservefailure. 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
cbBTCreserve cross the line fromreachabletoborrow-relevantbefore 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,liquidityIndexgrowth stopped being shared yield and became attacker-controlled collateral printing. - The flash-loan loop alone already fit the familiar
supplier-index-inflationfamily: 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 cbBTCtransfer 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 betweenwhat balance-sheet state looked liveandwhat denominator supplier-index updates were actually distributing over. - Downstream borrowing then treated the printed
scaledBalance * liquidityIndexresult 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 marketandmature collateral objectare 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
scaledTotalSupplyback 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
aTokencontracts 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
liquidityIndexby multiples before monitoring or governance can react. - Alert on production-improbable reserve states: one meaningful supplier, dust
scaledTotalSupply, abruptliquidityIndexjumps, 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 listingtotrusted collateral, and what onchain fact pushes it back into quarantine if supply later collapses toward dust? - If
liquidityIndexor normalized income jumped by2x,5x, or10xinside 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 backingquickly 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 usersandallowed to define borrow power across the protocolshould 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
liquidityIndexinflation, and cross-market bad debt minted from a launch-state accounting lie. - It strengthens the
fresh-market initialization failurecorpus 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-inflationfamily to the sharperactual-balance / scaled-liquidity divergencevariant. 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
- Closest recurring pattern: supplier-index-inflation.
- Broader empty-market family: empty-market-exchange-rate-inflation.
- Launch-window subpattern: fresh-market-initialization-failure.
- Positive-design companions: fresh-market-seeding-and-activation-discipline and collateral-admission-lag-and-borrow-side-quarantine — the sharper follow-up is why a less-than-week-old reserve was allowed to publish borrowable collateral truth before irreversible seeding and launch-state quarantine had finished.
- Positive-design companion: supplier-denominator-integrity-and-thin-market-fee-socialization — useful when the sharper follow-up is exactly how flash-loan premiums, direct transfers, and dust-supply denominators should have been constrained before
liquidityIndexgrowth was allowed to become supplier-side collateral value. - Positive-design companion: actual-balance-and-scaled-liquidity-ledger-coherence-discipline — useful when the sharper follow-up is how raw
aTokencustody balance, recognized reserve liquidity, supplier-denominator state, flash-loanable inventory, and collateral-visible backing should have been kept on one coherent ledger story instead of drifting apart during a fresh-market reserve. - Useful contrast: hopelend-hethwbtc-empty-market-liquidityindex-exploit-2023-10-18 — same Aave-style
liquidityIndexfamily, but with a dormant reserve rather than a just-listed one. - Useful contrast: radiant-capital-native-usdc-empty-market-liquidityindex-exploit-2024-01-02 — another fresh-reserve Aave-style replay, but with a more explicit official postmortem on launch-state hardening and fee-routing fixes.
- Useful contrast: zerolend-pt-lbtc-actual-balance-scaled-liquidity-liquidityindex-exploit-2025-02-23 — the sharper case where divergence between real token balance and scaled-liquidity accounting is itself the decisive mechanism rather than an adjacent amplifier.
Control surface
-
The decisive leverage sat in reserve-launch sequencing, first-depositor concentration, flash-loan-fee routing into
liquidityIndex, and the accounting boundary between realaTokenbalance and scaled supplier liquidity. -
dLEND did not fail because
cbBTCwas mispriced by an oracle. It failed because a fresh empty reserve was allowed to turn fee accrual and balance-accounting drift into protocol-wide borrow power. -
Sources:
- 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
- https://etherscan.io/tx/0x8d33d688def03551cb77b0463f55ae5a670f5ebf3bbb5b8aa0e284c040ae7139
- https://etherscan.io/tx/0xbec4c8ae19c44990984fd41dc7dd1c9a22894adccf31ca6b61b5aa084fc33260
-
Last reviewed: 2026-07-29 UTC