M
My Crypto News AI

How an MEV Bot Lost $15M to Fake Tokens: The Approval Management Flaw Haunting Ethereum

On-chain security researchers identified a sophisticated $15 million theft targeting jaredFromSubway, a well-known MEV bot operator on Ethereum, exposing a fundamental flaw in how smart contracts manage token approvals. The attack, which occurred on June 20, 2026, demonstrates how even experienced traders operating high-value bots can fall victim to improper approval management, a vulnerability that extends far beyond this single incident.

What Exactly Happened to the MEV Bot?

MEV bots like jaredFromSubway operate by monitoring the Ethereum mempool, simulating transactions, and automatically approving token interactions to capture arbitrage opportunities across decentralized exchanges. The bot's contract held substantial working capital in WETH, USDC, and USDT, making it an attractive target for attackers.

The attacker exploited a critical gap in the bot's approval workflow. When the bot interacted with wrapper-style token contracts, it would call approve() to grant an allowance, expecting the wrapper to consume that allowance through a transferFrom() call. However, the bot never verified whether the allowance was actually consumed after the operation, nor did it revoke any residual allowance. This left persistent attack surface that the attacker could later exploit.

Over approximately 600 blocks and roughly 13 transactions, the attacker accumulated unconsumed approvals on all three real assets. The final harvest transaction extracted 1,474.58 WETH, 2,870,573 USDC, and 2,035,760 USDT, totaling approximately $15 million in losses.

How Did the Attacker Build This Honeypot?

The attacker's strategy involved constructing a convincing fake trading environment with three key components. First, they deployed fake wrapper tokens using real token names but prefixed symbols with "f" (for example, fUSDC for USDC). These fake tokens mimicked legitimate wrappers with wrapTo() and unwrap() functions, plus an attacker-restricted withdraw() function that could drain unconsumed allowances.

Second, the attacker deployed approximately 44 Uniswap V2-style pools via a self-deployed factory. These pools paired fake tokens with each other to form convincing swap routes. When swap() was called, the pools emitted real Sync and Swap events that were indistinguishable from legitimate trades.

Third, the attacker used a per-block getStatus() switch in an external contract to control when allowances were consumed. When getStatus() returned 1 (indicating the same block as an activation transaction), wrapTo() would skip the transferFrom call entirely, leaving the allowance unconsumed. When getStatus() returned 0, wrapTo() called transferFrom normally, establishing trust. The attacker likely used builder bribes to place activation transactions in the same block as the bot's transactions.

Steps the Attacker Took to Accumulate Approvals

  • Infrastructure Setup: The attacker deployed a fake token factory contract, created approximately 44 fake Uniswap V2 pools via a self-deployed factory, funded the pools with initial token balances so swap() calls would succeed, and sent 0.01 ETH to the harvest contract for gas and builder bribe.
  • Initial Trust Building: In the earliest transactions, fake tokens had no getStatus() switch, so wrapTo() called transferFrom directly and consumed the allowance. The bot approved, wrapped, swapped, unwrapped, and profited normally, establishing the fake tokens as profitable trading opportunities.
  • Continued Interaction: In subsequent transactions, the getStatus() switch was deployed but returned 0 when called in different blocks. wrapTo() still called transferFrom and consumed the allowance, so the bot continued to profit and kept interacting with the fake tokens.
  • Allowance Accumulation: Starting from block 25360519, the attacker placed activation transactions in the same block as the bot's transactions via builder bribe, causing getStatus() to return 1. In this mode, wrapTo() skipped transferFrom entirely, leaving the allowance unconsumed, but unwrap() still sent a small amount of real tokens back to the bot to maintain profitability.
  • Final Harvest: The attacker called withdraw() on all fake tokens in a single harvest transaction, using the accumulated unconsumed allowances to call transferFrom and move the bot's real balances to the attacker's address.

Why This Matters Beyond One Bot's Loss

This incident represents one of three notable security incidents during the week of June 15-21, 2026, with total losses of approximately $18.3 million across multiple protocols. The jaredFromSubway attack accounted for the largest portion of these losses, but it reflects a broader pattern of approval-related vulnerabilities affecting smart contracts across Ethereum.

The attack highlights a fundamental principle in smart contract security: never assume that a contract will behave as expected. The bot's developers assumed that wrapper contracts would consume granted allowances through transferFrom, a reasonable assumption for well-behaved contracts. However, the lack of verification or revocation created a vulnerability that sophisticated attackers could exploit through social engineering and block-level manipulation.

Security researchers emphasize that this type of vulnerability extends beyond MEV bots. Any smart contract that grants approvals to external contracts without verifying consumption or revoking residual allowances faces similar risks. The attack also demonstrates how builder bribes and block-level control can be weaponized to manipulate contract behavior in ways that are difficult to detect on-chain.

How to Protect Smart Contracts from Approval Vulnerabilities

  • Verify Allowance Consumption: After calling a contract that is expected to consume an allowance, verify that the allowance was actually reduced or consumed. If the allowance remains unchanged, revert the transaction or investigate further before proceeding.
  • Revoke Residual Allowances: Always revoke or reset allowances to zero after an operation completes, especially when interacting with untrusted or newly deployed contracts. This prevents accumulated approvals from becoming persistent attack surfaces.
  • Validate Design Before Launch: Conduct thorough smart contract audits that specifically examine approval management logic, token interaction patterns, and assumptions about external contract behavior. Test interactions with both legitimate and malicious token contracts.
  • Implement Allowance Limits: Use time-based or amount-based limits on approvals granted to external contracts. Instead of approving unlimited amounts, approve only the specific amount needed for a single operation and revoke immediately after.
  • Monitor Block-Level Behavior: For high-value operations, implement monitoring systems that detect unusual block-level patterns, such as transactions being bundled with suspicious activation contracts or builder bribes being used in unexpected ways.

The jaredFromSubway incident underscores a critical lesson for blockchain security: on-chain systems must validate design, code, and business logic before launch. The attack succeeded not because of a novel technical vulnerability, but because the bot's developers made reasonable assumptions about contract behavior without implementing verification mechanisms.

As Ethereum continues to evolve and MEV-related activities become more sophisticated, smart contract developers must adopt a more defensive posture when interacting with external contracts. The cost of improper approval management, as demonstrated by this $15 million loss, far exceeds the cost of implementing robust verification and revocation mechanisms.