Reproduced Exploit
Panoptic — cross-contract reentrancy converts phantom shares to real shares
1. Liquidation delegates type(uint248).max phantom shares on ct0 and ct1. 2. ct0.settleLiquidation refunds ETH to liquidator before ct1 is revoked. 3. Reentrant transferFrom moves ct1 phantom shares to the attacker. 4. revoke mints missing phantom into _internalSupply; attacker redeems real assets.
Chain
Other
Category
untagged
Date
Dec 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: 65026-h-02-cross-contract-reentrancy-in-liquidation-enables-conver. Standalone Foundry PoC and full write-up: 65026-h-02-cross-contract-reentrancy-in-liquidation-enables-conver_exp in the
evm-hack-registrymirror.
Vulnerability classes: cross-contract · single-function · direct-drain · reentrancy-guard
Reproduction: a self-contained Foundry PoC that compiles & runs in an isolated project with only
forge-std— no fork, no RPC, noanvil_state. Full trace: output.txt. PoC: test/65026-h-02-cross-contract-reentrancy-in-liquidation-enables-conver_exp.sol.
Key info#
| Impact | HIGH — reentrant transfer of phantom shares during liquidation drains CollateralTracker |
| Protocol | Panoptic |
| Vulnerable code | CollateralTracker |
| Bug class | cross-contract |
| Finding | Code4rena — Panoptic, 2025-12 · #65026 · reporter qed |
| Report | code4rena.com/reports/2025-12-panoptic-next-core |
| Source | AuditVault |
| Status | Audit finding — caught in review, not exploited on-chain. Reproduced as a standalone local PoC. |
| Compiler | ^0.8.24 (PoC) |
This is an audit finding, not a historical on-chain incident. The PoC keeps
the vulnerable logic verbatim (marked @> VULN) and reduces dependencies
to the minimum needed to show the claimed harm.
TL;DR#
- Liquidation delegates type(uint248).max phantom shares on ct0 and ct1.
- ct0.settleLiquidation refunds ETH to liquidator before ct1 is revoked.
- Reentrant transferFrom moves ct1 phantom shares to the attacker.
- revoke mints missing phantom into _internalSupply; attacker redeems real assets.
The vulnerable code#
See test/65026-h-02-cross-contract-reentrancy-in-liquidation-enables-conver.sol — the @> VULN marker is on the blamed line (line 152 in the synthetic).
Root cause#
ETH refund reentrancy window + revoke treating transferred phantom as consumed.
Preconditions#
Protocol operating conditions that make the path reachable (see finding report). No exotic privileges beyond those the real call path requires.
Attack walkthrough#
From output.txt: the Exploit.run() path executes the attack end-to-end and requires the harm.
Diagrams#
Impact#
Complete drainage of CollateralTracker assets from LPs.
Sources#
Sources & further analysis#
Reproductions & code
- Standalone PoC + full trace: 65026-h-02-cross-contract-reentrancy-in-liquidation-enables-conver_exp (evm-hack-registry mirror).
- AuditVault finding: 65026-h-02-cross-contract-reentrancy-in-liquidation-enables-conver.
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.