Starlay Finance Acala USDC Empty-Market liquidityIndex Exploit (2024-02-08)
- Name: Starlay Finance Acala USDC empty-market liquidityIndex exploit
- Date: 2024-02-08
- Protocol: Starlay Finance
- Chain: Acala EVM
- Category: fresh-market initialization failure / empty-market liquidityIndex inflation / cross-market lending drain
- Loss: about 2.2M, primarily
304,652.0407 DOTand1,440,080.616 LDOT - Summary: Starlay’s Acala deployment left its USDC reserve in an empty or near-empty state where attacker-controlled positions dominated
lUSDCsupply. Public incident statements never published a full technical postmortem, but the onchain traces line up with the same Aave-style exploit family later seen in Radiant and dTRINITY: the attacker preserved a microscopiclUSDCposition, recycled USDC through the same reserve so fees and index growth accrued to that dust supply, then borrowed realDOTandLDOTagainst collateral value that only existed because the empty reserve’sliquidityIndexhad been distorted. The sharper lifecycle lesson is that once supplier breadth collapsed to attacker-ownable dust, the reserve had become effectively fresh again whether or not it was literally new. Acala’s later treasury-compensation proposal described the root problem as Starlay’s “wrong configurations … related to an empty USDC pool” and attributed the stolen funds to DOT / LDOT outflows. - Trigger / entry point:
- Starlay’s Acala
lUSDCreserve at0x28A5AFACF605955e4c3aaF23b704C42Acd44EBb4was effectively empty enough that the attacker could control nearly all meaningful supplier state. - Starlay identified attacker EOA
0xe6F6D3cd38e9BF1e118C8Fd1528D303d261BA4F7in its first public incident notice. - Acala governance later described the exploit as stemming from Starlay-side misconfiguration “on the condition to get liquidated related to an empty USDC pool,” which strongly suggests the manipulated
lUSDCposition remained borrow-relevant when it should not have been. - A representative early exploit transaction,
0x73ea5ad193f381e5868b1f5edfcaf5195f9f3988ad4b925247fcd53081411ed6in block5500951, shows helper contract0x009965f7127d78E26b9e4306e8231f55E6070b6fcycling USDC through thelUSDCreserve, preserving a microscopic0.000001 lUSDCposition, and emerging with135.0000012 DOTdebt / proceeds.
- Starlay’s Acala
- Root cause:
- Starlay allowed an empty Acala USDC reserve to remain economically meaningful instead of treating dust-supply state as effectively fresh and forcing the market back into quarantine until supplier breadth recovered.
- Public evidence indicates Aave-style reserve accounting was the printable variable: the attacker’s dust
lUSDCposition captured reserve growth that should have been spread across a healthy supplier base. - Starlay’s own and Acala’s public statements point to a configuration failure around liquidation / collateral conditions, meaning the manipulated
lUSDCstate was accepted as valid borrowing power against deeper DOT and LDOT liquidity. - Because no full postmortem appears to have been published, the exact parameter combination is partly inferred from explorer traces rather than a complete protocol-side disclosure.
- Exploit path:
- The attacker funded Acala addresses linked to
0xe6F6D3cd38e9BF1e118C8Fd1528D303d261BA4F7and began interacting with Starlay’s Acala USDC market on 2024-02-08. - They used many short-lived helper contracts so each exploit loop could isolate a tiny
lUSDCposition while the main attacker account accumulated borrowed assets. - In the early loop visible in tx
0x73ea5ad193f381e5868b1f5edfcaf5195f9f3988ad4b925247fcd53081411ed6, the helper contract was left with only0.000001 lUSDCwhile repeatedly sending USDC into the same reserve and repaying slightly more than it borrowed, the exact pattern expected when an attacker is trying to force reserve-fee accrual intoliquidityIndexwhile owning essentially all scaled supply. - The same transaction shows the manipulated position immediately turning into borrow power: Blockscout’s decoded transfer view records
135.0000012 DOTleaving Starlay’s DOT market (0x2A43c0c220D7A2F6ca0c0B7A1130d02b0EC9Fb5E) to the helper, and then to the attacker. - Later traces show the exploit scaled up into LDOT. In tx
0xe01da5c22b93abaac83aacb8f8f36ac394c0d896817576b990f6506f1cecc3b9in block5502196, multiple helper contracts each deposit17,500 USDC, mint17,500 lUSDC, and borrow12,285.089 LDOT, while the same transaction also burns283,251.418 lUSDCand re-mints195,751.418 lUSDCinside attacker-controlled flow. - The attacker consolidated the real assets at
0xe6F6D3cd38e9BF1e118C8Fd1528D303d261BA4F7, then began pushing DOT out through Acala EVM, Acala, and Polkadot accounts catalogued in Acala’s compensation sheet. - Representative DOT cash-out transfers from the attacker EOA include
0x2fc5f95664e2ef421a1155b9da4101963fe240c77d9ac323d443a7ed036f6022(52,000 DOT),0x644c45c78c0c85898d0fe27d843547e9665a816bbd2a1f68e7ab25a71b811226(50,000 DOT), and0xcbaa10959a923ac5346eb583b653b91cc82214aa6d9ede5b8d0d9b8fdfb9c02f(20,318.894 DOT). - Acala’s incident-accounting sheet attributes the final stolen total to roughly
304,652.0407 DOTand1,440,080.616 LDOT, valued there at about$2,143,748.42, with later routing into ChangeNOW, Binance, HitBTC, WhiteBIT, Huobi, MEXC, and other identified destinations.
- The attacker funded Acala addresses linked to
- What the attacker needed to be true:
- The Acala USDC reserve had to be empty enough that one attacker-controlled dust position could dominate
lUSDCsupply and reserve-index participation. - Reserve-fee or equivalent index-accrual logic had to credit value back into the same
lUSDCmarket quickly enough to matter inside attacker-controlled loops. - Starlay had to accept the inflated
lUSDCstate as valid collateral or liquidation-resistant borrowing power against DOT and LDOT markets. - DOT and LDOT liquidity elsewhere in the protocol had to be deep enough to cash out the synthetic solvency into real assets.
- The attacker needed workable exit rails from Acala EVM into Acala / Polkadot accounts and then onward to exchanges.
- The Acala USDC reserve had to be empty enough that one attacker-controlled dust position could dominate
- Technical anatomy worth remembering:
- Starlay looks like an Acala-specific Aave-style cousin of Radiant and dTRINITY, not a Compound-style donation exploit. The printable variable was the reserve’s rebasing / index-based supplier accounting, not a cToken exchange rate.
- The noteworthy setup is the microscopic
lUSDCbalance. The exploit did not need a huge honest deposit base to steal from; it needed the opposite. - The Acala / Polkadot execution path matters. The attacker drained value from an EVM reserve, then moved the proceeds through Acala and Polkadot-native accounts, which is why the public compensation data preserved both EVM and Substrate-side addresses.
- This incident is also a reminder that “configuration” bugs can still be exploit-family bugs. If collateral admission and liquidation conditions are unsafe in an empty reserve, that is not just an ops mistake; it is the onchain exploit boundary.
Three reserve-authority promotions this incident collapsed
-
A listed Acala USDC reserve existed and could be interacted with at all
lUSDCalready existed on Acala EVM, and public-facing protocol state treated it as an admitted reserve rather than as a launch-like or quarantine object.- That only proved
users can reach this reserve, notthe reserve still has enough supplier breadth to author trustworthy accounting.
-
That admitted reserve was over-promoted into trustworthy supplier-accounting publication
- Once the reserve drifted into attacker-ownable dust, same-reserve USDC cycling no longer behaved like ordinary fee accrual across a healthy supplier base. It behaved like authorship over what the next
liquidityIndexincrement meant. - The dangerous promotion was accepting
reserve exists and can still publish an indexas if it already impliedthe reserve's denominator is mature enough that index growth still deserves accounting trust. - This is the sharper lesson than generic
wrong configuration: the printable supplier-side mark stayed recognized after the reserve had become economically first-actor-capturable again.
- Once the reserve drifted into attacker-ownable dust, same-reserve USDC cycling no longer behaved like ordinary fee accrual across a healthy supplier base. It behaved like authorship over what the next
-
That published supplier-side mark still inherited immediate cross-market solvency authority
- The manipulated
lUSDCstate did not stay local. It immediately translated into real borrow power against deeperDOTandLDOTliquidity elsewhere in Starlay. - In other words,
reserve can still print a number,the protocol treats that number as collateral-relevant accounting, andsibling markets must already spend against itwere effectively one joined state transition. - Healthy reserve design keeps
listed,accounting publication still deserves trust, andcross-market borrow authority is liveas separate promotions, especially once a reserve has drifted back toward dust supply.
- The manipulated
- Representative transactions and artifacts:
- Attacker EOA:
0xe6F6D3cd38e9BF1e118C8Fd1528D303d261BA4F7 - Acala attacker account in compensation sheet:
24mvvVXd3JXNWtJoktGwYD4T6HbufURL29T5tCFMSAj3vHNh - Starlay
lUSDC:0x28A5AFACF605955e4c3aaF23b704C42Acd44EBb4 - Starlay
lDOT:0x2A43c0c220D7A2F6ca0c0B7A1130d02b0EC9Fb5E - Starlay
lLDOT:0xB58CB2e345E9FF3484aEAcE7595ff2334328C6b1 - Starlay
vdLDOT:0xB72BDC7f9837c53a8FaE4A36Fc264ee62164bC42 - USDC token on Acala EVM:
0x07DF96D1341A7d16Ba1AD431E2c847d978BC2bCe - DOT token precompile:
0x0000000000000000000100000000000000000002 - LDOT token precompile:
0x0000000000000000000100000000000000000003 - Early exploit tx:
0x73ea5ad193f381e5868b1f5edfcaf5195f9f3988ad4b925247fcd53081411ed6 - Scaled LDOT exploit tx:
0xe01da5c22b93abaac83aacb8f8f36ac394c0d896817576b990f6506f1cecc3b9 - Representative cash-out txs:
0x2fc5f95664e2ef421a1155b9da4101963fe240c77d9ac323d443a7ed036f6022,0x644c45c78c0c85898d0fe27d843547e9665a816bbd2a1f68e7ab25a71b811226,0xcbaa10959a923ac5346eb583b653b91cc82214aa6d9ede5b8d0d9b8fdfb9c02f
- Attacker EOA:
- Response / mitigation:
- Starlay publicly acknowledged the breach on 2024-02-08, paused all Acala pools, and precautionarily suspended Astar pools even while saying Astar assets were safe.
- The team later described the incident as a USDC-liquidity-pool issue involving
liquidityIndexmiscalculation and invited the attacker to negotiate a whitehat-style return. - Acala governance later proposed partial treasury compensation for affected users, explicitly framing the issue as Starlay-side misconfiguration around an empty USDC pool.
Pattern tags
- supplier-index-inflation
- fresh-market-initialization-failure
- The preserved shape is sharper than generic
misconfiguration around an empty pool: Starlay let one actor own essentially all meaningfullUSDCsupplier state, let same-reserve accounting growth compound into that dust position, and then let the printed supplier-side mark become immediateDOT/LDOTborrow power. - This was also a clean
admitted reserve != mature solvency objectfailure. The dangerous condition was not merelyUSDC pool exists on Acala; it wasUSDC pool can still be economically authored by its next meaningful supplier.
Why the exploit worked
- Starlay let an Acala
lUSDCreserve remain borrow-relevant after supplier breadth had already collapsed into attacker-ownable dust. Whatever the exact configuration knobs were, the important structural fact is that one microscopiclUSDCposition still had line-of-sight to protocol-wide solvency. - In that state, same-reserve accrual stopped behaving like neutral protocol income and became supplier-index authorship. The attack traces show helper contracts preserving tiny
lUSDCbalances while cycling USDC through the same reserve, which only matters economically if the reserve’s accounting still credits meaningful value back into whoever owns that dust supply. - Downstream collateral and liquidation rules imposed no second distrust boundary. Acala’s own compensation proposal describes the issue as Starlay-side misconfiguration tied to an empty USDC pool, which is the important healthy-side lesson:
listed reserve,liquidation condition, andcross-market borrow authoritywere still one joined security object. - The preserved design lesson is therefore broader than
one Acala parameter was wrong: empty-reserve lifecycle, supplier-index accounting, and downstream borrow admission all belonged to one security boundary, and Starlay split them apart.
Detection and audit pivots
- Ask the lifecycle question directly: what onchain fact proves this reserve has enough supplier breadth to stop one address from re-authoring
liquidityIndexmeaning, and what demotes it back into quarantine if that breadth later collapses? If the answer is onlythe market is already listed, the control does not exist. - Reconstruct the whole supplier-value publication path: reserve inflow / fee logic,
liquidityIndex,lUSDCsupply distribution, collateral-factor logic, liquidation thresholds, and sibling-market borrow checks should all tell one coherent story before an empty reserve can matter system-wide. - Treat sparse public postmortems as a reason to inspect traces harder, not as a reason to flatten the issue into
config bug. When helper contracts intentionally preserve microscopic receipt-token balances, reviewers should assume dust-supply capture until proven otherwise. - Check for a downstream distrust boundary. Can a thin reserve stay visible while collateral factor remains
0, debt caps stay negligible, flash-loan-like accrual paths stay disabled, or only isolated borrows are permitted? If not, the protocol is still trustinglistedmore thaneconomically mature. - Follow the exit rails too. Acala / Polkadot hybrid deployments add another practical review question: once fake solvency turns into real
DOT/LDOT, how quickly can those assets leave the EVM side, and what pause or routing controls still exist before they disappear into cross-environment cash-out paths?
Failure-prevention checklist
- Do not let an admitted reserve keep cross-market borrow authority once supplier breadth has collapsed back into attacker-ownable dust. A dormant reserve should fall back into the same quarantine a fresh reserve starts in.
- Keep collateral factor at
0, debt caps negligible, or both while a reserve is still thin enough that one helper contract or one operator cluster can dominate meaningfullUSDCsupply. - Treat same-reserve accrual into
liquidityIndexas solvency code, not harmless accounting. If fee growth, repayment surplus, or any similar reserve-side inflow can still concentrate into a dust supplier set, that path should fail closed or stop affecting borrowable collateral truth. - Re-open or re-harden thin reserves only with a durable denominator floor or another explicit low-supply recovery path.
The market is already listedis not a substitute for a reserve state that cannot be re-authored by the next meaningful supplier. - Add production alerts and automated quarantine for reserve states that should almost never coexist: microscopic receipt-token supply, abnormal
liquidityIndexgrowth, and immediate borrow power against deeper sibling markets. - Test helper-contract and many-wallet exploit choreography, not only single-wallet happy paths. The Starlay traces matter because the attacker preserved dust positions in disposable helpers while the main account accumulated
DOT/LDOTelsewhere. - Put blast-radius controls underneath the market anyway: fast pauses, isolated-mode borrowing, route-specific debt caps, and downstream collateral quarantine should keep one Acala-side reserve from immediately turning fake USDC solvency into protocol-wide
DOT/LDOTlosses. - In hybrid EVM / Substrate environments, treat cash-out routing as part of mitigation design. Once the protocol knows one reserve can print borrow power, controls should assume assets may leave the EVM side quickly and should be containable before cross-environment exits complete.
Audit prompts
- What exact onchain fact proves this
lUSDCreserve is no longer economically fresh, and what restores quarantine if suppliers later redeem back toward dust? - Can one helper contract keep a microscopic
lUSDCbalance while same-reserve inflows still raiseliquidityIndexenough to matter for collateral or liquidation math? - Which configuration surfaces make the manipulated reserve dangerous: collateral factor, liquidation threshold, eMode-like correlations, debt caps, or some Acala-specific liquidation condition that still trusted empty-reserve accounting?
- If public disclosure stays sparse, do the traces still show the exploit family clearly enough — dust supplier state, same-reserve USDC cycling, and sibling-market
DOT/LDOToutflows — that reviewers should model it as supplier-index inflation anyway? - What runtime signal would have caught this before the compensation sheet existed: one meaningful supplier, impossible
liquidityIndexgrowth, repeated helper-contract dust preservation, or abnormalDOT/LDOTborrowing against tinylUSDCbalances? - Can the reserve remain observable while downstream trust stays off? If not, why was
listed reservestill being treated as equivalent tomature collateral object? - Once borrowed assets leave the lending pool, what pause, bridge, or routing controls still exist before
DOT/LDOTdisappear from Acala EVM into Acala / Polkadot-native exit rails?
Lessons that should already be standard
Listed reserveis not a maturity proof. If one actor can still dominate meaningful supplier state, the reserve has not earned cross-market solvency authority.Configuration bug in an empty poolis often just another name forthe protocol let attacker-authored accounting become borrow truth. Those are not separate classes in practice.- Sparse public postmortems do not make a lending exploit less legible. When traces preserve dust receipt-token balances, same-reserve cycling, and sibling-market drains, reviewers should still classify the family and harden the design layer.
- Dust-supply reserve capture is not only an Ethereum-mainnet fork problem. The same Aave-style accounting failure can monetize into Acala-side
DOT/LDOTjust as cleanly as into WETH or stablecoins elsewhere. - Lifecycle hardening has to survive runtime reality. A reserve can become effectively fresh again long after launch, and healthy design demotes it back into quarantine instead of honoring historical listing age.
- Hybrid stacks need exit-aware incident design. If fake solvency can be converted into assets that quickly cross from EVM execution into other settlement domains, containment has to start before off-platform cash-out, not after.
Why this incident matters
- Starlay is an important breadth case for the empty-market corpus because it shows the Aave-style
liquidityIndexfamily escaping mainline Ethereum-style environments and surfacing in Acala’s EVM / Substrate hybrid stack. - It preserves a concrete example where public evidence was sparse but still technically rich enough to reconstruct the exploit family from reserve flows, helper-contract traces, and downstream cash-out routing.
- It is also a useful warning against treating
fresh marketas only a deployment timestamp. Once an admitted reserve collapses back to attacker-ownable dust supply, the healthier security interpretation is that it has become effectively fresh again and should lose cross-market solvency authority until re-hardened. - More broadly, it warns against treating “launch / configuration” and “accounting” as separate categories. In empty lending markets they are often the same bug, just seen from different layers.
Internal linkages
- Closest recurring pattern: supplier-index-inflation.
- Broader empty-market family: empty-market-exchange-rate-inflation.
- Launch-window and empty-state framing: fresh-market-initialization-failure.
- Lifecycle companion: effective-freshness-reclassification-and-dormant-market-quarantine — the sharper lifecycle follow-up is why an admitted reserve that had collapsed back to attacker-ownable dust supply was still allowed to define cross-market solvency instead of being demoted back into a launch-style quarantine state.
- Positive-design companions: fresh-market-seeding-and-activation-discipline and collateral-admission-lag-and-borrow-side-quarantine — the sharper follow-up is why an empty
lUSDCreserve was allowed to become liquidation- and borrow-relevant before seed breadth and a safe activation state existed. - Positive-design companion: bootstrap-state-irreversibility-and-supply-floor-design — the sharper denominator-side follow-up is why an admitted reserve was still able to compress back into attacker-ownable dust instead of preserving a durable floor before cross-market borrow power turned on.
- Adjacent pattern: solvency-check-bypass.
- Useful comparison: radiant-capital-native-usdc-empty-market-liquidityindex-exploit-2024-01-02.
- Useful comparison: dtrinity-dlend-cbbtc-fresh-market-liquidityindex-inflation-exploit-2026-03-17.
Control surface
-
The decisive leverage sat in empty-reserve state, first-supplier concentration, effective-freshness classification, collateral / liquidation configuration, and the protocol’s willingness to price attacker-inflated
lUSDCas real solvency. -
Starlay did not merely suffer a bad market parameter. It exposed an empty reserve whose accounting state was allowed to become borrow-relevant before it was safe, and whose dust-supply state was not treated as reason enough to revoke that authority.
-
Sources:
- https://x.com/starlay_fi/status/1755605617421795560
- https://x.com/starlay_fi/status/1755856271184654360
- https://acala.subsquare.io/treasury/proposals/14
- https://blockscout.acala.network/tx/0x73ea5ad193f381e5868b1f5edfcaf5195f9f3988ad4b925247fcd53081411ed6
- https://blockscout.acala.network/tx/0xe01da5c22b93abaac83aacb8f8f36ac394c0d896817576b990f6506f1cecc3b9
- https://blockscout.acala.network/tx/0x2fc5f95664e2ef421a1155b9da4101963fe240c77d9ac323d443a7ed036f6022
- https://blockscout.acala.network/tx/0x644c45c78c0c85898d0fe27d843547e9665a816bbd2a1f68e7ab25a71b811226
- https://blockscout.acala.network/tx/0xcbaa10959a923ac5346eb583b653b91cc82214aa6d9ede5b8d0d9b8fdfb9c02f
-
Last reviewed: 2026-08-02 UTC