Hacks
Reproduced Exploits
Root cause, vulnerable code, attack walkthrough, and a standalone Foundry PoC for each incident — an indexed library of reproduced on-chain exploits across EVM chains.
Indexed
2341 / 2341
AlpsCon AI Trade Hub — a public Hardhat address is whitelisted, and a zero entry index pays the historical USDC index
Loss · On-chain net 152,295.3625 USDC to the attacker EOA (header of test/AlpsCon_exp.sol). The…
AlpsCon's AI Trade Hub sells ALPS "service credits" and later pays USDC "service results" from a per-share index. Reward entrypoints are gated by onlyVerified, which is…
Argent relay modules — a public owner signature is replayed, and the recovery deadline can be wrapped into the past
Two Argent-style wallets are drained, in the test's account of the incident, by relaying signatures that have been public since 2020 and 2021. The execution module's exe…
BiFi USDT — one idle gap of 264,060 blocks is reapplied at a live utilization the attacker sets
Loss · 165,575.149730 USDT surplus after a 40,499,999.999997 USDT Morpho flash loan is repaid in…
The BiFi USDT market had not been touched since block 25,946,196. Rolled to the profit block, that is 264,060 blocks, about 36.7 days output.txt:29–output.txt:32. BiFi a…
BitBay StableVault — withdraw on an empty position pays the caller the whole vault, uncapped by shares
Loss · 14,838.466608989135865711 DAI — the vault's entire idle balance, sent to the attacker by…
UsdcDaiV4Vault keeps its funds as a single Uniswap v4 DAI/USDC position. withdraw(shareAmount, deadline, addDust) is supposed to burn shareAmount and return the caller t…
EtherVista — swap's constant-product (K) check multiplies two uint112 reserves, so the invariant overflows and the pool drains
EtherVista is a Uniswap-V2-style AMM (token0 = WETH, token1 = VISTA). Its swap ends with the stock-looking constant-product check require(balance0 balance1 >= reserve0 r…
ETHMACOAPY — a base-set donation makes zero-fee actualizeFee ceil unitShares from 12253 to 12264
Loss · 4.047988247781965824 WETH on this tx output.txt:416. The test header records a second tx…
ETHMACOAPY is a legacy Set Protocol rebalancing set. Its verified RebalancingSetTokenV3 source matches the contract drained earlier the same day at 0x54e8…a6bE: same act…
Fence tranche pool — the UTC rollover credits a scheduled principal payment that was never paid, and draw pays it again
UntaggedLoss · 1,013,353.611686 USDC (1013353611686), the pool's entire balance, on the second draw outp…
A Valinor Digital / Fence Finance tranche pool on Avalanche lets anyone open a facility, name themselves borrower, fund principal, and draw it back. Cycle 1 is a wash: A…
FlashLoopAdapter — caller self-attests as the Safe, then swapRouter.call runs the victim
Loss · 114.096151469674448809 WETH left on the attacker after repaying a 1,400 WETH Morpho flash…
FlashLoopAdapter is a Zodiac-style module for looping an Aave position through a flash loan and an aggregator. open / close both enter _start, which authenticates with:
GoldPesa GPXHooks — TAKE_PAIR settles the shared unlock, so another position's debt cancels the burn credit
GPXHooks owns the GPX/USDC Uniswap V4 liquidity. Any swap whose beforeSwap sees block.timestamp - lastRebalance >= 1 hours calls reBalanceRoutine() → checkRebalance → re…
KolanHook — expired buy windows settle on the pool's own spot, then the escrowed ETH is bought back with no price limit
Loss · Attacker ETH after the flash loan is repaid: 1.280491451506671761 output.txt:7, output.tx…
KolanHook escrows ETH for timed "buy windows" on a single ETH/KLN Uniswap v4 pool (fee 0, tick spacing 10, currency0 native ETH, currency1 KLN 0x2CADc4F2660Bb77a118b0e74…
MakerDAO flip-keeper — ungated 0x8804d1de hopes a caller-supplied worker, then exits 200 WETH
Loss · 200 ETH exactly (200 WETH unwrapped). output.txt:196. Alert figure ~$538K. Not a Maker co…
This is not a MakerDAO Vat, Flipper, or GemJoin bug. Those contracts did what they are supposed to do. The loss is a dormant third-party liquidation keeper.
MALT sLP — below-peg recovery deposits treasury DAI into the pair, and swap counts it as the caller's input
The MALT stablecoin's own market is a Uniswap V2-style pair (token0 = MALT, token1 = DAI) whose swap is not the stock two-step pair. Before it pays amount0Out / amount1O…
Safe approval squat — unlimited ERC-20 allowances point at an empty CREATE address anyone can occupy
UntaggedLoss · The Safe's entire balance of four tokens output.txt:357. 3,078,123.681646 USDC (307812368…
On 2026-03-07 the Safe approved type(uint256).max of USDC, WAVAX, WETH.e, and BTC.b to 0x3725bD4D…. At block 98,603,854 that address still has no code, and the four allo…
Set Protocol — zero-fee actualizeFee ceils unitShares from 4927 to 4928 and over-redeems the base set
Loss · 5.083148662083682304 WETH pulled out of the rebalancing set after repaying the flash loan…
Set Protocol v1 prices a rebalancing set in units of its currentSet. unitShares is how many base-set wei back one naturalUnit (here 1e6) of rebalancing-set supply. Issua…
Slice FundsModule — Unbacked Release From a Caller-Chosen Source
Loss · 8.716935563284127413 ETH and 19,820.734001 USDC to the exploit contract (output.txt:6–out…
Slice’s FundsModule is the settlement contract for Slice stores. One permissionless entry point takes a list of source contracts, a recipient, a token (address(0) means…
TIPMine — permissionless mine() burns TIP out of the Pancake pair and sync() leaves the SOL reserve in place
Loss · Reconstructed profit 706.253909658913182860 SOL output.txt:12, output.txt:395. On-chain t…
TIPMine is the public "mine" function for the TIP token. Once a day it releases 2% of the unmined supply. On the first call, lastMineTime is 0, so the timer is already o…
UNCX Smart Token Vesting — Shared-Pool Share Double-Debit
Loss · This transaction keeps, after every flash loan is repaid: 55,601,598.708417972560603048 E…
UNCX Smart Token Vesting V2 keeps every vesting of a given ERC-20 in one contract balance and tracks ownership with internal shares. release() pays a fraction of that wh…
X100 Senate — two flash-bought seats pass a same-block vote that dumps treasury X into the attacker's pool
UntaggedX100's treasury is governed by a three-seat Senate. A seat is "freeze X and call applyForSenate". There is no timelock between propose, vote, and execute, and the propos…
X7 Finance (X7Pioneer) — empty-array claimRewards([]) re-accrues the same donated ETH without advancing the watermark, inflating the per-token reward until one NFT drains the whole pool
X7Pioneer is an airdropped ERC-721 whose holders share any ETH sent to the contract. claimRewards(uint256[]) first accrues address(this).balance - lastETHBalance into to…
Yapeswap — Zero-Quorum Governance Capture, Then a Fake Yearn Vault
Loss · Reported about $21.9K (SlowMist, 25 Oct 2026), including Yearn positions this PoC does no…
Yapeswap is a Uniswap V2 fork whose pairs farm a share of reserves into a Yearn vault chosen by YapeFactory.registry. Who may change that registry is feeToSetter, and at…
zkLink Nova — Transient finalizeMessageHash Reused to Forge a Batch Root
Loss · Reported about $783K across two exploit transactions. This PoC is the first transaction o…
zkLink Nova finalizes L2-to-L1 withdrawals by Merkle-proving them against l2LogsRootHashes for a batch. Only a gateway-authenticated message may call syncBatchRoot. The…
BeatXswap LiquidityVestingConvert — UniV3 slot0 spot oracle
Loss · ~2.98M–3.07M BTX (~$63.7k–$77.5k). Live attacker net 63,704.84 USDT. Teaching PoC drains…
BeatSwap's LV Convert lets users deposit USDT. 75% goes to a treasury; 25% is paired with protocol-owned BTX and minted as a Pancake V3 LP. The BTX amount is sized by _c…
BonfireSwap transfer spends any holder's standing allowance — missing caller check on the router's force-sell
Loss · Full incident ~66.08 WBNB (~$47–50K) across ~41 holders. This PoC, the five largest victi…
BonfireSwap is a custom BSC router for the reflective BONFIRE token (0x5e90253f…5590, 10% tax / 5% reflection, pair 0xD3F478F0…38f2 with WBNB). Holders who had used the…
Cozy Finance v2 — UMA Optimistic Oracle fake YES drains the protection Set
Loss · ~$160K USDC.e. PoC: Set drained 158,148.088467 USDC.e; attacker net 165,718.768963 USDC.e…
Cozy v2 protection markets pay out if a UMA Optimistic Oracle request settles YES. Anyone may proposePrice. The trigger's priceProposed callback only requires proposedPr…
DAOstack Genesis Alpha — permissionless newOrganization mints reputation and drains the avatar
Loss · 4.025 ETH, the avatar's entire treasury. Attacker balance log goes from 0 to 4.0255770215…
Genesis Alpha is a DAOstack DAO. Its avatar (0x7b11…6DB0) holds the ETH treasury. Its Reputation token (0x6256…5BF9) is the voting weight. Both are owned by one shared U…
DEX router drain — unverified V3 callback trusts a fake pool and transferFroms any approver
Loss · Incident ~62.28 WBNB from 29 victims. This PoC drains a representative 3 (OCEAN, Kandura,…
The router exposes a permissionless swap entry (selector 0x33411b5e). Routes carry an attacker-chosen pool. The router calls pool.swap(0x128acb08) without checking that…
DHC Award vault — claimed reward can be reset and paid again from the shared pool
Loss · On-chain 71,851.02 USDT. PoC reconstruction 71,100.63 USDT (single-pair dump vs original…
DHC (DeHealth / RedSonic-style "Award" staking) records a fixed reward in createAward with no per-award locked collateral. participateAward does not require the award to…
DoinGud acceptOffer pays the escrow twice — amount == 0 skips offer deletion
Loss · 35,380.154566 USDC net output.txt:591. Two payouts of 35,486.935717 minus the 35,593.7168…
DoinGud's Polygon marketplace is an EIP-2535 diamond. The escrow USDC sits on the diamond 0xE3A161…eD6A. The bidding logic lives in an unverified facet 0x123aAFC8…, whic…
Enso Finance strategy vault — short Uni V3 TWAP overvalues FARM deposits
Loss · Headline ~5.6 ETH spot of UNI/AAVE/MKR pulled, net of 0.683 WETH spent on FARM. PoC reali…
The Enso strategy vault mints deposit shares as:
ether.fi Liquid / Veda AtomicQueue — Unauthenticated solver Drain
Loss · 14.445541086626480232 liquidETH + 7.047848 USDC in the PoC (14445541086626480232 wei + 70…
1. ether.fi Liquid withdrawals on Ethereum share a Veda AtomicQueue (AtomicQueue.sol). Users who want to sell liquidETH (or other vault shares) for a want asset approve…
Flamincome — spot-priced, permissionlessly-inflatable strategy NAV drains the proportional-share YUSDT vault
Loss · 344,751.209366 USDT net attacker profit, from 597,352.101480 USDT gross loss of the Strat…
1. VaultYUSDT is a plain proportional-share vault: deposit(a) mints shares = a totalSupply() / balance(), and withdraw(s) returns balance() s / totalSupply(), where bala…
GaslessReservoirEnabler — whitelisted WETH plus arbitrary module.call spends every standing approval
Loss · This tx: 8.7199 WETH from 466 victims (~$23.8K at the fork-block price; the ~$23K alert).…
GaslessReservoirEnabler is a Polygon meta-transaction helper. The intended path is EIP-712: a user signs, a relayer calls executeMetaTransaction, and _msgSender() is the…
GDCToken — sell-tax credits 30% to the pair then burns 100% from it and sync()s
Loss · Pair drained 38.075473326480291171 WBNB (~$27k). PoC attacker profit 35.15333822653155477…
GDC is a BSC “deposit / deflation / node-reward” token paired against WBNB. Ordinary buys from the pair revert BuyingProhibited. Sells into the pair run swapSellAward: 7…
Internet Token swapV3 mints arbitrary INT to a fake pool — validateSupply is burned around
Loss · Mint 925,411,678.379023085745037207 INT, dump 161,265,976.195260022578593802 INT for 5.84…
Internet Token (INT, RewardToken 0x968D6A…eC19) on Base mints only from addresses that hold TOKEN_MINTER. LiquidityUnifier holds that role. Its swapV3(address token, add…
Likwid leverage == 0 borrow — frozen pair reserves re-quote the same BNB on every collateral add
Loss · 74.310377807370642618 BNB taken from LikwidVault in this transaction (reported ~74.31 BNB…
Likwid margin positions can be opened in two modes. leverage > 0 is a real leveraged swap: it writes delta.pairDelta, and the vault's marginBalance moves the pool. lever…
LPBonus (MSN LP-reward pool) — reserve-inconsistency between reward accrual and withdrawal lets a flash-manipulated reserve inflate an LP's FIST claim
Loss · Final attacker USDT balance 92,633.859396071632955691 (≈ $92.6k). The exploit's net new U…
1. LPBonus is an LP-reward pool for the MSN token. Its reward callbacks are all gated require(msg.sender == MSN) — they are hooks the MSN token fires from inside its own…
Mutual Uniting System (MUS) — a first-deposit bonus is paid twice and never capped, so a fresh deposit-withdraw returns more ETH than it put in
Loss · 0.400167773791578324 ETH net over-extraction for one fresh deposit-withdraw cycle — repro…
1. MUS is a "pack"/round Ponzi-matrix contract. deposit{value: D}() and withdraw(uint256,uint256,bool) are permissionless — no owner/caller check anywhere. 2. For a fres…
Nimiq HTLC handlers — OpenGSN execute() ignores the signature and opens an HTLC as the liquidity wallet
Loss · 50,463.792096 USD of 6-decimal stables: 26,130.641710 USDC + 24,332.489269 USDT0 + 0.6611…
Nimiq's Polygon swap handlers custody HTLCs for USDC, USDT0, and bridged USDC.e. The liquidity wallet had approved both handlers for unlimited token. A direct open() wou…
Notional V1 escrow — unbacked fCash mint overflows uint128 ladders and settles as cash
Loss · $1.727M — 69,257.372677950923155658 DAI + 1,658,524.864122 USDC (exact) output.txt
Notional V1 books an ERC-1155 fCash transfer as a minted pair: a CASH_PAYER (debt / short, assetType 2) on from and a CASH_RECEIVER (claim / long, assetType 3) on to — e…
OMNI404 (O404) — ERC-404 transfer(id≤50) + whitelist rounding drain
Loss · ~2.4–3.02 WETH. Main tx +2.427 WETH; three drain() follow-ups in the same block. Teaching…
O404 is an ERC-404: one contract, ERC-20 balances in 1e18 units and up to 50 ERC-721 ids. transfer(to, valueOrId) guesses intent from the magnitude of the second argumen…
ORB addPoolAndSell — BNB refund before the sell, then burnLP grinds the pair and a last swap takes the WBNB
Loss · 45.302221034270454423 BNB net to the attacker after repaying every flash-loan and Venus l…
Sending BNB to ORBToken is an implicit sell. receive() max-approves the sender to ORBCore and calls addPoolAndSell{value: msg.value}(msg.sender). On the sell branch (0.0…
Order factory — permissionless createOrderForBuyer sets attacker as seller and aborts the buyer's ETH
Loss · Incident ~24.7 ETH. This tx: 20.247 ETH from 5 buyers (10.05 + 5.05 + 3.05 + 1.547 + 0.55…
The factory's order-creation entry (selector 0xbde886fc, name unknown — factory unverified) lets any caller create an order "for" a buyer. It checks getState(buyer) == 1…
Pancake V3 Swap Helper — Signed Swap Delta Misread as the WBNB Payout
Loss · 1.648868884526157960 BNB after the live tx fee (1,132,330 gas × 0.05 gwei = 0.0000566165…
0x222C8580eaA32f6f5a728bda0129CFA485eCc52D is an unverified helper that pulls an ERC-20, swaps it for WBNB on Pancake V3, unwraps WBNB, and forwards BNB to a caller-chos…
PrimeFi verifyReport — permissionless stale Chainlink Data Streams report inflates PRFI and empties the WHYPE reserve
Loss · 425.521620381705945356 WHYPE borrowed out of the lending reserve (aWHYPE balance after th…
PrimeFi's HyperEVM market prices PRFI through DataStreamConsumer, a Chainlink Data Streams middleware. Anyone may call verifyReport. The function does not skip the signa…
Reddio RedSonic Vault — permissionless registerErc20(stETH) double-counts one balance
Loss · 9.253090281137114614 ETH (~$23K; reported ~9.25 ETH) output.txt
RedSonic Vault (EIP-2535 diamond) prices rsvETH from getTotalAssetBalance, which for the Lido leg is IERC20(stETH).balanceOf(vault) — no per-share-class accounting. regi…
rsETH Safe drain — Router multicall treats a self-call as authorized and the enabled module delegatecalls a recipe
Loss · 2,899.999999999997756821 aEthrsETH pulled from the victim Safe (~2,900 rsETH, reported ~$…
A whale Safe held 53,402.655157601774360853 aEthrsETH and had enabled a custom module, 0xeA18B13d.... That module will act on the Safe when the Router calls it. The Rout…
Secured.Fi — same-block self-trade pins getMarketUnitPrice at par and drains WBTC
Loss · Incident ~$104K across bots. This PoC: 0.89899004 WBTC (~$72K) from TokenVault output.txt
Secured.Fi values lending-order-book collateral from getMarketUnitPrice(). Within a block that is:
SKYDAO sell path — controlburn + sync() before the net credit desyncs the pair reserve
Loss · 183,482.883991401873856911 USDT leaves the SKYDAO/USDT pair output.txt:256. One wei of US…
SKYDAO is a fee-on-transfer token (35% tax) paired with USDT on PancakeSwap V2. A sell (to == pair) does not just take a tax. It calls the unverified pool controller's s…