Front-running and MEV vulnerabilities in disclosed reports
Public mempools make transaction ordering an attacker-controlled parameter, and any protocol that assumes otherwise is exploitable for free.
- Reports indexed
- 41
- Total paid
- $45k
- Critical
- 0
- Largest payout
- $45k
Every pending transaction is a public announcement of intent. Front-running findings are the cases where acting on that announcement is profitable: sandwiching a swap with no slippage bound, claiming a first-mover reward someone else paid to discover, or racing a governance execution.
The class also covers the inverse — back-running and censorship — and the protocol designs that make ordering matter more than it should. Auctions settled in a single transaction, liquidations open to anyone with no commitment phase, and reveal steps that can be observed before they are committed all show up repeatedly.
Remediations in these reports are more varied than in other classes: commit-reveal, private submission, slippage and deadline parameters that are actually enforced, and batch settlement at a uniform clearing price.
What reviewers look for
- Swap or redemption paths with default or unenforced slippage limits
- Reward claims where discovery and settlement happen in separate transactions
- Reveal steps whose value is derivable from the earlier commit
- Auctions or liquidations settled purely on arrival order
- Deadline parameters accepted but never compared to `block.timestamp`
Curated highlights
The largest disclosed payouts in this group, with our own summary of each. Every report links back to the original disclosure.
Sandwichable liquidation bonus enables MEV extraction from borrowers
A lending protocol's liquidation routine executed collateral swaps through an AMM router with zero slippage protection (`amountOutMin` set to zero) while relying on spot prices for bonus calculations. Mempool searchers could sandwich pending liquidation transactions by driving up local pool prices beforehand, forcing the swap to settle at severely degraded exchange rates. This allowed MEV bots to siphon excess value from the liquidated borrower's remaining collateral pool.
Putty: `acceptCounterOffer()` May Result In Both Orders Being Filled
The Putty protocol suffered from a race condition in the acceptCounterOffer() function that allowed users to be unintentionally over-leveraged. An attacker could front-run the cancellation of an original order by filling it, which allowed the protocol to subsequently fill both the original and the new orders. This occurred because the cancellation function lacked a check to verify that the order was not already filled, leading to potential financial loss and excessive market exposure for users.
Putty: Order cancellation is prone to frontrunning and is dependent on a centralized database
Putty's order cancellation mechanism suffered from critical dependencies on centralized infrastructure and exposure to frontrunning. Because cancellations required on-chain transactions with specific order data, users could not cancel without either interacting with a centralized database or risking MEV-based frontrunning. This design created a significant risk where a centralized server outage could prevent users from invalidating orders, leaving their funds vulnerable to exploitation by parties holding mirrored order data.
PoolTogether: Increasing reserves breaks PrizePool accounting
An accounting flaw in PoolTogether's `PrizePool` contract allows external reserve contributions to be misattributed and extracted by prize vaults. When `increaseReserve` is invoked, prize tokens are transferred into the contract and added to `_reserve`, but the helper `_accountedBalance()` is not updated. As a result, subsequent calls to `contributePrizeTokens` evaluate the unallocated token delta as total contract balance minus accounted balance, treating the newly deposited reserve funds as excess contributions. Any vault can claim these tokens, inflating its distribution accumulators and causing contract token balances to fall below accounted protocol liabilities.
PoolTogether: `Vault.mintWithPermit()` can be DoS'd
The `Vault.mintWithPermit` function allowed users to deposit into the vault using an ERC-2612 permit signature; however, it required the exact asset amount calculated from the current exchange rate. Because the exchange rate could fluctuate between signature generation and transaction execution, the hardcoded amount often caused the permit validation to fail. Attackers could front-run these transactions to manipulate the exchange rate, effectively creating a Denial-of-Service condition that prevented users from successfully minting shares. The protocol team eventually mitigated this issue by removing the problematic function entirely.
PoolTogether: `Claimer.claimPrizes` can be front-runned in order to make losses for the claim bot
The PoolTogether V5 prize-claiming mechanism was vulnerable to front-running, where malicious actors could cause large batch-claim transactions from automated bots to revert entirely. By claiming a single prize ahead of a bot's batched transaction, attackers exploited the contract's strict requirement that every prize in a batch must be eligible for claiming. This resulted in significant gas losses for the bots, undermining the economic incentive structure of the protocol's VRGDA-based claimer system. The flaw allowed attackers to disrupt honest market participants and potentially manipulate the dynamically adjusting prize fees for personal gain.
All reports in this group
- The Wildcat Protocol: `AccessControlHooks` `onQueueWithdrawal()` does not check if market is hooked which could lead to unexpected errors such as temporary DoSFront-running / MEV$0
- Phi: Attacker can DOS user from selling shares of a `credId`Front-running / MEV$0
- Reserve: Broken assumptions can lead to the inability to seize RSRFront-running / MEV$0
- Reserve: Users can dodge losses due to StRSR era changes with instant operationsFront-running / MEV$0
- Thorchain: A malicious user can steal money out of the vault and other usersFront-running / MEV$0
- Arbitrum Foundation: Edge from dishonest challenge edge tree can inherit timer from honest tree allowing confirmation of incorrect assertionFront-running / MEV$0
- DYAD: Attacker can frontrun to prevent vaults from being removed from the dNFT owner's positionFront-running / MEV$0
- LoopFi: Availability of deposit invariant can be bypassedFront-running / MEV$0
- Renzo: Potential arbitrage opportunity in the `xRenzoDeposit` L2 contractFront-running / MEV$0
- Lavarage: Innocent borrower could incur losses caused by a malicious lenderFront-running / MEV$0
- Revert Lend: `AutoRange` execution can be front-ran to avoid protocol fee, causing loss for protocolFront-running / MEV$0
- Abracadabra Money: Adjusting "_I_" will create a sandwich opportunity because of price changesFront-running / MEV$0
- Wise Lending: Borrowers can DoS liquidations by repaying as little as 1 share.Front-running / MEV$0
- Taiko: Invocation delays are not honoured when protocol unpausesFront-running / MEV$0
- Amphora Protocol: Reorg attack on user's Vault deployment and deposit may lead to theft of fundsFront-running / MEV$0
- Salty.IO: MinShares Slippage Parameters Are Ineffective For Initial DepositFront-running / MEV$0
- reNFT: All orders can be hijacked to lock rental assets forever by tipping a malicious ERC20Front-running / MEV$0
- Ethereum Credit Guild: The gauge status wasn't checked before reducing the user's gauge weight.Front-running / MEV$0
- Ethereum Credit Guild: Anyone can steal all distributed rewardsFront-running / MEV$0
- Collective: Since buyToken function has no slippage checking, users can get less tokens than expected when they buy tokens directlyFront-running / MEV$0
- Olas: Missing slippage protection in `liquidity_lockbox::withdraw`Front-running / MEV$0
- INIT Capital: `_handleRepay` of `MoneyMarketHook` does not consider the actual debt shares of the `posId` inside the position manager and could lead to a user's tokens getting stuck inside the hookFront-running / MEV$0
- INIT Capital: Liquidations can be prevented by frontrunning and liquidating 1 debt (or more) due to wrong assumption in POS\_MANAGERFront-running / MEV$0
- Wildcat Protocol: `codehash` check in factory contracts does not account for non-empty addressesFront-running / MEV$0
- Tapioca DAO: `BaseTOFT.sol`: `retrieveFromStrategy` can be used to manipulate other user's positions due to absent approval checkFront-running / MEV$0
- Tapioca DAO: `BaseTOFT.sol`: `removeCollateral` can be used to manipulate other user's positions and steal tokens due to absent approval checkFront-running / MEV$0
- Tapioca DAO: Potential 99.5% loss in `emergencyWithdraw()` of two Yieldbox strategiesFront-running / MEV$0
- Maia DAO Ecosystem: Some functions in the Talos contracts do not allow user to supply `slippage` and `deadline`, which may cause swap revertFront-running / MEV$0
- Maia DAO Ecosystem: A lack of slippage protection can lead to a significant loss of user fundsFront-running / MEV$0
- Lybra Finance: Volatile prices and lack of checks on `rigidRedemption()` can cause users to purchase stETH at unwanted pricesFront-running / MEV$0
- Asymmetry Finance: Lack of deadline for uniswap AMMFront-running / MEV$0
- Ethos Reserve: In `ReaperVaultV2`, we should update `lockedProfit` and `lastReport` before changing `lockedProfitDegradation`Front-running / MEV$0
- Biconomy: Theft of funds under relaying the transactionFront-running / MEV$0
- Biconomy: Attacker can gain control of counterfactual walletFront-running / MEV$0
- Biconomy: Griefing attacks on `handleOps` and `multiSend` logicFront-running / MEV$0