Reproduced Exploit

GTE — Launchpad pairFor CREATE2 salt mismatches factory

1. Factory salt = keccak(token0, token1, launchpadLp, feeDistributor). 2. pairFor salt = keccak(token0, token1) only. 3. If createPair already exists, try/catch leaves the wrong predicted address. 4. HARM: graduation reverts forever against an empty address.

Aug 2025Otheruntagged2 min read

Chain

Other

Category

untagged

Date

Aug 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: 64856-h-08-create2-address-of-the-uniswap-pair-used-by-launchpad-d. Standalone Foundry PoC and full write-up: 64856-h-08-create2-address-of-the-uniswap-pair-used-by-launchpad-d_exp in the evm-hack-registry mirror.


Vulnerability classes: wrong-condition · permanent · fot-slippage

Reproduction: self-contained Foundry PoC with only forge-std. Full trace: output.txt. PoC: test/64856-h-08-create2-address-of-the-uniswap-pair-used-by-launchpad-d_exp.sol.

AuditVault taxonomy: lang/solidity · platform/code4rena · has/github · has/poc · severity/high · sector/dex · sector/launchpad · genome: wrong-condition · permanent


Key info#

ImpactHIGH — graduation / endRewards stuck when pair pre-exists
ProtocolGTE
Vulnerable codeLaunchpad.pairFor salt
Bug classCREATE2 salt mismatch
FindingCode4rena 2025-08 GTE · #64856 · H-08 · codegpt
ReportCode4rena report
SourceAuditVault
Compiler^0.8.24 (PoC)

TL;DR#

  1. Factory salt = keccak(token0, token1, launchpadLp, feeDistributor).
  2. pairFor salt = keccak(token0, token1) only.
  3. If createPair already exists, try/catch leaves the wrong predicted address.
  4. HARM: graduation reverts forever against an empty address.

The vulnerable code#

SOLIDITY
// @> VULN: salt omits launchpadLp + launchpadFeeDistributor
keccak256(abi.encodePacked(token0, token1))

Fix: match factory salt exactly.


Root cause#

Two different CREATE2 address formulas for the same pair.


Preconditions#

  • Pair already created via factory before graduation path runs.

Attack walkthrough#

  1. Pre-create the real factory pair.
  2. Trigger graduation; createPair reverts PAIR_EXISTS.
  3. Code keeps wrong pairFor address with no code → revert.

Diagrams#

flowchart TD F["Factory CREATE2 with full salt"] --> R["Real pair contract"] P["pairFor with short salt"] --> W["Wrong empty address"] G["graduate try/catch"] --> W W --> S["Stuck bonding state"]

Impact#

Permanent inability to graduate (and endRewards failures) for that token pair.


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.