Reproduced Exploit
Pro Token: transfer-hook reward-swap self-dealing drains the pair
Loss
~605K USDT (~$8.2M cumulative)
Chain
BNB Chain
Category
untagged
Date
Jul 2026
Source
DeFiHackLabs
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. Exploit reproduction, trace data, and analysis adapted from DeFiHackLabs by SunWeb3Sec — an open registry of reproduced on-chain exploits. The historical source/toolchain is unavailable; this entry is documentation only and claims no executable Forge PoC. Upstream DeFiHackLabs PoC:
src/test/…/ProToken_exp.sol.
Vulnerability classes: vuln/logic · vuln/access-control
Reproduction: a self-contained, faithful reconstruction of the incident's core bug — local deploy, no fork — both gates green (registry
forge testPASS + browser PlaygroundVERDICT: PASS). Basis: DeFiHackLabs PR #1209 (ProToken_exp.sol, the upstream fork replay).
Key info#
| Loss | |
| Chain | BNB Chain |
| Vulnerable contract | 0xce01759b… (Finding #2026: ProToken) |
| Bug class | Finding #2026: ProToken |
Root cause#
The Pro token's transfer logic auto-processes a reward on transfers involving a registered player: it swaps Pro into USDT through the USDT/Pro pair and forwards that USDT straight to an attacker-controlled winner address. By looping a dust Pro transfer out of an attacker player clone, the helper repeatedly triggers the reward swap, each pass shipping USDT out of the pair to the attacker until the pair's USDT reserve is drained (~605K USDT per tx; ~$8.2M cumulative over ~13 txs). Any address can register as a player and drive the loop - nothing is privileged.
// @> VULN: a player transfer auto-triggers a reward swap that ships USDT from
Why it's exploitable here#
The Pro token's transfer logic auto-processes a reward on transfers involving a registered player: it swaps Pro into USDT through the USDT/Pro pair and forwards that USDT straight to an attacker-controlled winner address. By looping a dust Pro transfer out of an attacker player clone, the helper repeatedly triggers the reward swap, each pass shipping USDT out of the pair to the attacker until the pair's USDT reserve is drained (~605K USDT per tx; ~$8.2M cumulative over ~13 txs). Any address can register as a player and drive the loop - nothing is privileged.
Attack path#
Marked-line walkthrough (Playground)#
The EVM Playground pins each step to the exact executed source line:
- L74 — Permissionless player registration: Root cause: any address can register as a player; a player transfer then auto-triggers a reward that swaps Pro into USDT and forwards it to an attacker-controlled winner.
- L94 — Exploit driver: The reproduction registers the attacker as both player and winner and loops dust transfers.
- L95 — Drain the pair: Each looped player transfer ships USDT out of the pair to the attacker until it is drained.
- L97 — Setup: the exploit: Setup: the exploit deploys USDT, the pair and the Pro token.
- L98 — Setup: the pair USDT reserve: Setup: the USDT/Pro pair holds ~700K USDT, the reserve the reward swaps drain.
- L100 — Setup: reward size per pass: Setup: each reward pass sells a fixed slice of Pro into the pair for USDT.
- L101 — Setup: the loop count: Setup: ~13 on-chain txs are modelled as one looped tx of reward passes.
PoC#
Registry (Foundry, local deploy — faithful reconstruction + harm-asserting test):
cd 2026-07-ProToken_exp
forge test -vvv
The browser Playground replays the same synthetic opcode-for-opcode and measures the
harm. Both gates are green (registry forge test PASS + Playground _verify-poc
VERDICT: PASS).
Sources#
- Basis / upstream PoC: DeFiHackLabs PR #1209 — ProToken_exp.sol (fork replay of the on-chain tx).
- DeFiHackLabs incident collection: SunWeb3Sec/DeFiHackLabs.
Sources & further analysis#
Reproductions & code
- No executable Forge reproduction is claimed; the historical source/toolchain was unavailable for this finding.
- Upstream DeFiHackLabs PoC:
ProToken_exp.sol.
Alerts & third-party analyses
- DeFiHackLabs incident explorer: search "Pro Token: transfer-hook reward-swap self-dealing drains the pair".
- 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.