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.
Chain
Other
Category
dos
Date
Jul 2025
Source
AuditVault
EVM Playground
Source-level debugger — step opcodes and Solidity in sync
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.
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-registrymirror.
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#
| Impact | HIGH — native-asset withdraw path always reverts; deposits stuck |
| Protocol | Mellow Flexible Vaults ShareModule / BasicRedeemHook |
| Vulnerable code | getLiquidAssets uses IERC20(asset).balanceOf for all assets |
| Bug class | Missing native-token branch |
| Finding | Sherlock 2025-07-mellow-flexible-vaults · #62108 · H-3 |
| Report | sherlock-audit/2025-07-mellow-flexible-vaults-judging |
| Source | AuditVault |
| Status | Fixed by protocol (PR #10). Reproduced as standalone local PoC. |
| Compiler | ^0.8.24 (PoC) |
TL;DR#
- Protocol lists native token (
0xEeee…eEEeE) as a supported asset. - Liquid-asset queries always call ERC20
balanceOfon the asset address. - Native sentinel has no code → call reverts → redeem processing is impossible.
The vulnerable code#
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#
- Configure vault asset = native sentinel; deposit ETH.
- Redeem queue calls
vault.getLiquidAssets()→ revert. processWithdrawcannot complete; funds cannot leave via the redeem path.
Diagrams#
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#
- AuditVault finding #62108
- Sherlock issue #147
- Reduced source:
ShareModule.sol/BasicRedeemHook.sol@eca8836
Sources & further analysis#
Reproductions & code
- Standalone PoC + full trace: 62108-h-3-unable-to-withdraw-native-tokens-because-vault-and-redee_exp (evm-hack-registry mirror).
- AuditVault finding: 62108-h-3-unable-to-withdraw-native-tokens-because-vault-and-redee.
Alerts & third-party analyses
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.