Reproduced Exploit

Mellow Flexible Vaults — native token withdrawals permanently bricked

1. Protocol lists native token (0xEeee…eEEeE) as a supported asset. 2. Liquid-asset queries always call ERC20 balanceOf on the asset address. 3. Native sentinel has no code → call reverts → redeem processing is impossible.

Jul 2025Otherdos2 min read

Chain

Other

Category

dos

Date

Jul 2025

Source

AuditVault

EVM Playground

Source-level debugger — step opcodes and Solidity in sync

evm-hack-analyzer

The attack is replayed in an in-browser EVM preloaded with the exact dumped fork state. The execution tree shows every call; step by Solidity line or by opcode across all depths — source, Stack, Memory, Storage, Balances (native / ERC-20 / NFT), Transient storage and Return value stay in sync. Click a tree node, opcode, or source line to jump. No backend, no live RPC.

Loading fork state…

Source & credit. Reproduction of a public audit finding curated by AuditVault — the original finding: 62108-h-3-unable-to-withdraw-native-tokens-because-vault-and-redee. Standalone Foundry PoC and full write-up: 62108-h-3-unable-to-withdraw-native-tokens-because-vault-and-redee_exp in the evm-hack-registry mirror.


Vulnerability classes: vuln/dos/frozen-funds · locked-funds · known-pattern

Reproduction: self-contained Foundry PoC with only forge-std. Full trace: output.txt. PoC: test/62108-h-3-unable-to-withdraw-native-tokens-because-vault-and-redee_exp.sol.

AuditVault taxonomy: severity/high · sector/staking · sector/token · platform/sherlock · locked-funds · reentrancy-guard


Key info#

ImpactHIGH — native-asset withdraw path always reverts; deposits stuck
ProtocolMellow Flexible Vaults ShareModule / BasicRedeemHook
Vulnerable codegetLiquidAssets uses IERC20(asset).balanceOf for all assets
Bug classMissing native-token branch
FindingSherlock 2025-07-mellow-flexible-vaults · #62108 · H-3
Reportsherlock-audit/2025-07-mellow-flexible-vaults-judging
SourceAuditVault
StatusFixed by protocol (PR #10). Reproduced as standalone local PoC.
Compiler^0.8.24 (PoC)

TL;DR#

  1. Protocol lists native token (0xEeee…eEEeE) as a supported asset.
  2. Liquid-asset queries always call ERC20 balanceOf on the asset address.
  3. Native sentinel has no code → call reverts → redeem processing is impossible.

The vulnerable code#

SOLIDITY
function getLiquidAssets() public view returns (uint256) {
    return hook == address(0)
        ? IERC20(asset).balanceOf(address(this)) // @> VULN
        : IRedeemHook(hook).getLiquidAssets(asset);
    // FIX: if (asset == NATIVE) return address(this).balance;
}

Root cause#

Native ETH is not an ERC20. Using balanceOf on the sentinel address reverts, so both the no-hook path and BasicRedeemHook break for native vaults.

Attack walkthrough / harm demo#

  1. Configure vault asset = native sentinel; deposit ETH.
  2. Redeem queue calls vault.getLiquidAssets() → revert.
  3. processWithdraw cannot complete; funds cannot leave via the redeem path.

Diagrams#

flowchart TD A["RedeemQueue needs liquid assets"] --> B["Vault.getLiquidAssets"] B --> C{"asset == NATIVE?"} C -->|"no branch exists"| D["IERC20.balanceOf on 0xEeee"] D --> E["REVERT — withdraw bricked"] C -->|"FIX"| F["return address this balance"]

Impact#

Any vault using native ETH as the asset cannot process redemptions. Deposited native value is stuck from the protocol's withdraw path (admin rescue aside).

Sources#


Sources & further analysis#

Reproductions & code

Alerts & third-party analyses

  • Web3Sec X hacked database: search.
  • Rekt leaderboard: search.
  • Solodit incident search: search.

These dashboards index community alerts tweets, post-mortems, and independent write-ups. Reach them through the protocol name above to cross-check this reproduction against other analyses.