Reproduced Exploit
Entangle Trillion — Curve/Convex withdrawal selector typo freezes LP exits
The CurveCompoundConvexSynthChef integration calls convex.witdraw rather than Convex withdraw. The selector does not exist on the target contract, so a legitimate LP withdrawal reverts and the LP stays in the chef.
Chain
Other
Category
dependency
Date
Feb 2024
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: 51369-withdrawals-are-blocked-due-to-wrong-function-name-on-the-cu. Standalone Foundry PoC and full write-up: 51369-withdrawals-are-blocked-due-to-wrong-function-name-on-the-cu_exp in the
evm-hack-registrymirror.
Vulnerability classes: vuln/dependency/unsafe-external-call · vuln/logic/missing-validation · vuln/dos/frozen-funds
Reproduction: Fully local, cheatcode-free synthetic. Run
forge test -vvvin this folder.
Key info#
| Field | Value |
|---|---|
| Protocol | Entangle Trillion |
| Finding | AuditVault 51369 |
| Impact | High |
| Reproduction | Local synthetic; no mainnet fork |
| Vulnerable contract | See test/51369-withdrawals-are-blocked-due-to-wrong-function-name-on-the-cu.sol |
| Compiler | Solidity 0.8.24 |
TL;DR#
The CurveCompoundConvexSynthChef integration calls convex.witdraw rather than Convex withdraw. The selector does not exist on the target contract, so a legitimate LP withdrawal reverts and the LP stays in the chef.
Vulnerable code#
The minimized contract preserves the report’s blamed operation with an @> VULN marker in the synthetic.
Root cause#
withdrawLP loads the configured pool then invokes the misspelled interface method. The result cannot be true because the external selector is absent; the chef consequently reverts before it transfers LP to MasterChef.
Preconditions#
The relevant protocol integration is configured and holds the affected asset or retained message. No privileged bypass beyond the intended caller is required for the demonstrated broken path.
Attack walkthrough#
The synthetic gives the chef 100 LP. The master attempts withdrawLP, catches the expected revert, and asserts that all 100 LP remain trapped while the master received none.
Diagrams#
Impact#
The synthetic ends with an on-chain require proving the report’s concrete harm, rather than merely proving a function can be called.
Remediation#
Rename the interface member and call to withdraw(uint256,uint256), then regression-test an end-to-end withdrawal against the configured Convex target.
How to reproduce#
cd /workspaces/RustroverProjects/audits/evm-hack-registry/51369-withdrawals-are-blocked-due-to-wrong-function-name-on-the-cu_exp
forge test -vvv
Sources#
- AuditVault finding
- Halborn assessment
- Reduced local source: test/51369-withdrawals-are-blocked-due-to-wrong-function-name-on-the-cu.sol
Sources & further analysis#
Reproductions & code
- Standalone PoC + full trace: 51369-withdrawals-are-blocked-due-to-wrong-function-name-on-the-cu_exp (evm-hack-registry mirror).
- AuditVault finding: 51369-withdrawals-are-blocked-due-to-wrong-function-name-on-the-cu.
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.