October 20, 2026
|
Exploit Postmortem
Cover image for "Summer.fi's $6M Loss and How Olympix Would Have Prevented It"

Summer.fi's $6M Loss and How Olympix Would Have Prevented It

Date: July 6, 2026

Chain: Ethereum

Loss: about $6.04M, roughly $5.64M from the Lower Risk USDC vault and $0.40M from the Higher Risk USDC vault

Class: share price built on balances anyone could inflate by donating tokens

In late March and early April 2026, five fresh wallets spent about $40K buying Silo "Varlamore USDC Growth" vault shares, a position whose underlying market had been impaired since the Stream Finance collapse in November 2025. On paper, inside one of Summer.fi's Lazy Summer vaults, those same shares were still valued near par.

At 05:17:59 UTC on July 6, in block 25,471,348, one transaction turned that gap into about $6.04M. The attacker borrowed $65.4M in USDC from Morpho, deposited into two Lazy Summer USDC vaults, donated the cheap Silo shares to a strategy the vault was still counting, and redeemed at the inflated price. It worked because the vault's share price was the sum of balances held by its strategies, and anyone could add to those balances by sending tokens straight to a strategy contract.

Fleets, Arks and the Number That Prices Every Share

Lazy Summer Protocol is Summer.fi's automated yield product. Users deposit USDC into a vault contract called a FleetCommander, an ERC-4626 vault, which is the standard interface for tokenized yield vaults, and keepers spread that money across strategy adapters called Arks. Each Ark wraps a position in an outside protocol such as Morpho, Spark, Sky or Silo and reports what that position is worth back to the FleetCommander. A buffer Ark holds idle USDC so that small withdrawals don't have to touch the strategies. Forklog, citing DefiLlama, reported that Lazy Summer's TVL reached $200M in its first nine months and had fallen to about $22M by the time of the attack.

The FleetCommander turns those reports into a share price. Its totalAssets() returns _totalAssets(config.bufferArk), which, unless a cached value is set for the current transaction, sums the reported value of every Ark in the active set plus the buffer. From the verified FleetCommanderCache source published with the Lower Risk vault on Blockscout:

    function _sumTotalAssets(
        IArk[] memory _arks
    ) private view returns (uint256 total) {
        for (uint256 i = 0; i < _arks.length; i++) {
            total += _arks[i].totalAssets();
        }
    }

The function takes the list of Arks, starts a running total at zero, and adds whatever each Ark says it holds. It doesn't check where that value came from or whether the Ark can actually return it. The source's own comments list the assumption under security considerations: the function "relies on accurate reporting of total assets by individual arks." That total, divided by the number of vault shares, decides how many shares a deposit buys and how much USDC a redemption pays, so if one Ark's reported value goes up, every share in the vault becomes worth more, whether or not any real USDC came in.

Each Ark decides for itself what it reports. From the verified SiloManagedVaultArk source at the Varlamore Ark's address, 0x61d7...76c2:

    function totalAssets() public view override returns (uint256 assets) {
        uint256 shares = vault.balanceOf(address(this));
        if (shares > 0) {
            assets = vault.convertToAssets(shares);
        }
    }

The first line asks the Silo vault how many of its shares the Ark's address holds, and balanceOf counts every share at that address, including ones somebody simply transferred in. The second and third lines convert those shares to USDC using the Silo vault's own convertToAssets, which values them at whatever price the Silo vault's books carry. Put the two excerpts together and the path is direct: a transfer to the Ark raises balanceOf, convertToAssets prices it at the Silo vault's stored rate, and _sumTotalAssets adds the result straight into the share price.

A Strategy Halfway Out the Door

Rekt traces the Varlamore Ark to a governance proposal published on September 4, 2025, SIP2.24, which added two new Arks to the Lower Risk USDC fleet. On October 30, 2025, about eleven weeks after onboarding, its deposit cap was set to zero in response to the Stream Finance collapse and the xUSD depeg. Setting the cap to zero stops the vault from sending the Ark new money, and it doesn't take the Ark out of the active set, so the Ark's reported value kept feeding totalAssets().

Taking it out required governance to call removeArk, and the verified FleetCommanderConfigProvider source shows why that stalled. Its _validateArkRemoval check reverts with FleetCommanderArkDepositCapGreaterThanZero if the cap isn't zero, and with FleetCommanderArkAssetsNotZero if the Ark's totalAssets() isn't exactly zero. The Varlamore Ark still held Silo shares the protocol couldn't fully withdraw, so it couldn't be removed, and its valuation was never marked down for the bad debt behind it. The same DAO had handled a similar case quickly a few weeks later: Block Analitica zeroed the caps on an Arbitrum sUSDx Silo Ark on November 4, 2025, and SIP2.39 removed it on November 21, seventeen days start to finish. Rekt found no equivalent sweep for the Varlamore Ark in the public record.

That left a strategy in the vault's books whose value could be raised by anyone, at a price the vault wouldn't question. The idea to take away is about who controls the inputs to a price. A vault share price is only as trustworthy as the least controlled balance inside it, and a balance that anyone can increase with a plain transfer is a balance an attacker controls. It's like a fund that marks its NAV by counting whatever is in its mailbox, valued at last year's prices.

Three Months of Setup

The Lazy Summer technical post-mortem describes the preparation. The five setup wallets spent about $40K of Stream xUSD, swapping it for Silo Varlamore shares in a Balancer pool, and the shares were cheap because their on-chain value had never been marked down after November 2025. Three blocks before the attack, a permit-aggregation transaction consolidated the five wallets' balances into the executor contract. Forklog reported the team's view that preparations began no later than April 6. Cyvers noted, per Rekt, the attacker's wallet had been funded through FixedFloat on Base, and the gist adds that gas was bridged over through LayerZero.

One Transaction, Two Vaults

Verichains and the gist reconstruct the transaction from its trace, since the attacker's executor contract is unverified. The executor took flash loans of 65,419,171.88 USDC and 1,000,000 USDT from Morpho Blue, which charges no fee and requires repayment in the same transaction.

It started with the Higher Risk vault, to set up a second, smaller drain. It deposited 398,172.237752 USDC and immediately withdrew 398,172.236752 USDC, one micro-unit less. The withdrawal was paid from the vault's liquid Sky and Morpho Arks, while the deposit stayed in the buffer, so the buffer grew from 1,000 USDC to 399,172.24 USDC at a cost to the attacker of a single unit. Next, it deposited 490,636.89 USDC into Term's "Summer USDC" Yearn v3 strategy and received 439,778.13 Term shares. Term invested that USDC into the Lower Risk vault, the kind of circular vault-in-vault exposure the gist's remediation list warns against.

In the Lower Risk USDC vault, the executor deposited 64,828,534.99 USDC at about 1.0665 USDC per share and received about 60,787,156.81 shares. It then transferred the Silo Varlamore shares, 19,551,517,226,711,127 raw units, directly to the capped Ark at 0x61d7...76c2. No vault shares were minted for them, the vault's reported value rose about 9.5%, and the share price went to about 1.1677. The executor redeemed 60,766,209.13 shares for 70,959,584.46 USDC. Redemptions pull from Arks in ascending order of size and stop once the request is covered, so the payout came from the buffer and the liquid Sky, Morpho and Spark positions belonging to other depositors, and the Silo Ark itself was never touched. The executor kept 20,947.68 shares because the liquid Arks couldn't cover the full entitlement, and the Lower Risk vault was left holding about $4.04M of illiquid assets.

The Higher Risk vault got the same treatment on a smaller scale. The executor deposited 29,517,258.14 USDC for 27,891,852.79 shares at about 1.0583, then donated the 439,778.13 Term shares to that vault's Term Ark, which credited them at 490,636.89 USDC because the Yearn strategy's stored totalAssets hadn't been refreshed. The share price rose to about 1.0756, and the executor redeemed 27,814,155.74 shares for 29,916,430.38 USDC, nearly the whole prepared buffer. After repaying both flash loans, it swapped the profit through Curve and sent 6,016,754.998 DAI to the attacker's address, plus leftover shares in both vaults. PeckShield noted the vault's displayed APY briefly showing around 2.08 million percent.

Pauses, Sweeps and a Wind-Down

Blockaid flagged the exploit on July 6 while it was running, and CertiK followed with the $65.4M flash loan figure. Summer.fi's first statement came about three hours after the first alert. Its Guardian Module, a 6-of-8 multisig across Ethereum, Base, Arbitrum and Sonic, paused Ethereum first and then the other networks and set deposit caps to zero, according to Rekt, which also notes the pause reverted on HyperEVM because the module didn't hold the guardian role there. The foundation multisig later swept the donated Silo shares out of the Lower Risk vault, socializing the loss. Part of the proceeds moved through an intermediary wallet into Tornado Cash in 10 ETH and 100 ETH deposits, and Summer.fi contacted FixedFloat with the funding addresses and transactions.

Summer.fi published its post-mortem on July 7, and its July 10 community call recap described the cause as stale-valued tokens enabling a donation attack, not a key compromise and not a contract bug. On July 15 it announced it would wind down the company and sunset the Summer.fi interface, which Forklog reported would stay up until August 31 while the Lazy Summer DAO worked to restore withdrawals across all vaults. About $4M in illiquid assets remained in the drained vaults, leaving governance to decide on reimbursement. As of October 20, 2026, the July 15 wind-down post was still the latest on Summer.fi's X account.

Two Reviews and an Informational Finding

Rekt's review of the audit record shows how scope shaped what was examined. ChainSecurity's report, delivered January 14, 2025, covered FleetCommander and the Ark contracts, including the removal flow, and its finding 8.3, "Removal of Arks Can Be DOSed," noted that removeArk requires an Ark's totalAssets to be zero and can fail with residual dust or tokens sent before removal. It was rated Informational and acknowledged, with Summer.fi responding that future Arks should be fully emptiable. The November 2025 Sherlock contest and Prototech Labs reviews were scoped to the governance package, staking, vesting and the governor, not FleetCommander or the Arks. ChainSecurity's review predates the Varlamore Ark's onboarding by about seven months, and the exposure that mattered on July 6 came from a combination that only existed later: an Ark stuck in the active set, an external vault whose valuation never moved, and an aggregation function that trusted both.

How Olympix Follows a Balance Into the Share Price

Olympix reads a vault the way an attacker would, as states, transitions and entry points, and it takes in the context around the code, including how strategies are added, capped and removed, to infer the rules the system relies on. Here the critical state is the vault's totalAssets(), and the transitions that move it include every way an Ark's reported value can change. The engine maps those paths, keeps the feasible ones, and narrows to the ones that can move the share price, which leaves a short list: deposits and redemptions that mint and burn shares alongside assets, keeper rebalances that move value between Arks, and plain token transfers to an Ark's address, which move value without minting anything.

The signal Olympix's static analysis surfaces in this case sits in the two excerpts above: a share-price calculation that sums balanceOf-based valuations from contracts any address can send tokens to, with no shares minted in return and no check on the price the external vault reports. Olympix has flagged this class before in other codebases.

BugPoCer takes it from there with Counterexample-Guided Invariant Refutation, starting from the vault as a whole. Lazy Summer's depositors rely on a rule nobody wrote into the FleetCommander: the share price should move only when the value the vault really holds moves, and never because an outside address dropped tokens on one of its Arks. BugPoCer infers that rule and drives deposits, Ark valuation and redemptions through every reachable state until the share price moves without real value behind it, and that includes states a fresh deployment never shows, like an Ark whose deposit cap is zero while it still sits in the active set and still reports value.

The counterexample for this exploit would contain the July 6 sequence in its smallest form: a deposit at the current price, a direct transfer of the Ark's underlying vault shares to an active Ark, totalAssets() rising with totalSupply() unchanged, and a redemption that pays out more USDC than went in, drawn from the other Arks. Its minimal conditions are an active Ark whose underlying shares can be bought below the price the external vault reports, and enough liquid USDC in the buffer and smaller Arks to pay the redemption. BugPoCer returns it with a generated Forge test that replays it, which a team can run against a mainnet fork of any fleet configuration.

Because Olympix runs at every merge and before release, the donation signal would have surfaced at the merge that introduced SiloManagedVaultArk, with a counterexample stating the price condition that turns it into a drain, and the same invariant would be re-tested whenever the fleet's configuration changed. The governance action that capped the Varlamore Ark without removing it is exactly the kind of state transition the engine checks against the invariant, in development instead of on mainnet.

When a Paused Strategy Still Counts

A strategy capped for removal kept pricing every share in the vault for eight months, and the cost of turning that into $6M was about $40K of impaired tokens and a flash loan. For builders running multi-strategy vaults, every balance that feeds the share price is an input you have to defend, including strategies you're in the middle of retiring. To see how Olympix tests your vault's share price against donations and half-finished state changes, book a technical walkthrough.

On-Chain References

Protocol: Summer.fi Lazy Summer Protocol (FleetCommander vaults)

Chain: Ethereum

Date: July 6, 2026, 05:17:59 UTC

Block: 25471348

Loss: about $6.04M (6,016,754.998 DAI net to the attacker)

Attacker EOA: 0x7BF7...BDCa

Exploit contract (unverified): 0x0514...FC61

Intermediary wallet: 0x46E0...eBa7

LazyVault_LowerRisk_USDC (FleetCommander): 0x98C4...cF17

Silo Varlamore Ark (SiloManagedVaultArk, donation target): 0x61d7...76c2

Lower Risk buffer Ark: 0x106C...dD2B

LazyVault_HigherRisk_USDC (FleetCommander): 0xE9cD...cB06

Higher Risk Term Ark (donation target): 0xfD89...8519

Term "Summer USDC" Yearn v3 strategy: 0xA9ca...A9c4

Flash-loan source (Morpho Blue): 0xBBBB...FFCb

Exploit tx: 0x0db5...da12

Sources

Summer.fi: Lazy Summer USDC Vault Exploit Post-Mortem, What Happened and What Comes Next

Lazy Summer exploit technical post-mortem (GitHub Gist)

Verichains: Lazy Summer Hack Analysis, Stale-Asset Donation and ERC-4626 Share-Price Manipulation

Rekt: Summer Finance

Forklog: Summer.fi ceases operations after Lazy Summer exploit

PeckShield: Summer.fi exploit alert

More from Olympix:

No items found.

Ready to Shift Security Assurance In-House? Talk to Our Security Experts Today.