On 2026-09-09, an attacker drained ~2.98M BTX (~$77.5K) from two BeatSwap vesting contracts by crashing the spot price on the PancakeSwap V3 USDT/BTX pool the contracts used as their price oracle, realizing ~$63.7K USDT profit.
Logged as “2026-09-09: Slot0 Spot Price Oracle With No Twap Guard Drains Vesting Btx Reserves on BeatXswap”.
The two BeatSwap vesting contracts on BNB Chain, LiquidityVestingConvert and LiquidityVestingConvertOnce, used a slot0 spot-price oracle drawn from a single PancakeSwap V3 USDT/BTX pool to mint their own BTX holdings into LP positions for users. There was no TWAP, no minimum-deviation check, and no fallback price feed. A crash in the pool's spot price would compress the BTX leg of every LP mint the contracts performed, against the contract's own BTX reserves, while the user's USDT leg was already in. The "slippage" check inside deposit() only compared the required BTX against itself, scaled by 3 percent, so the same manipulated price passed its own band.
The attacker (EOA 0x67B2f08683A735cfE6f6E57fA86909b62218C2a1) ran the whole exploit inside one contract-creation transaction on block 120873720 of BNB Chain, reproduced on-chain as the deployed exploit contract at 0xaff5A574941981cF7F994f2820F7fA26FE031DEd. The attacker first flash-borrowed 15,950 USDT from Moolah for working capital and 6,000,000 BTX from a Pancake Infinity Vault flash inside its lockAcquired callback. With that float the attacker dumped BTX into the V3 USDT/BTX pool (zeroForOne set false, on the BTX leg) to push slot0.sqrtPriceX96 sharply down, so BTX quoted far too cheap relative to USDT.
With the pool price crashed, the attacker called deposit(10000 USDT) against victim LiquidityVestingConvert at 0x1e647FAADb05f2124BFCcFC003EDc06D1A90bf5D. The contract's _calculateQuote read the new slot0, sized the BTX leg from the spot price, and minted a V3 LP position straddling plus-or-minus 6000 ticks around the manipulated tick. The contract paid for that BTX leg from its own ~1.24M BTX reserve. The attacker dumped more BTX, called deposit(2000 USDT) against LiquidityVestingConvertOnce at 0x9a7A92240FBAc4030b65A6E61239928d6Bcc716F, and pulled its ~1.83M BTX reserve into a second bad-tick LP. Then the attacker reversed the swap to restore the pool, swept up the BTX the victims had just deposited as liquidity, repaid the Vault flash, sold the net ~2,984,557 BTX on the unmanipulated Pancake Infinity CL USDT/BTX pool for ~77,512 USDT, repaid Moolah, and kept the ~63,704 USDT surplus.
The two loss numbers in the README reconcile to the same drain: the 77,512 USDT taken from the Vault is the gross resale of the 2,984,557 BTX looted from the vesting contracts, and the 63,704 USDT is the attacker's realized profit after the swap round-trip and the 75 percent-to-treasury cost of the two deposits.
Fixing this requires the LP-mint logic to read a TWAP or an external reference price, not slot0, and to size the BTX leg against that independent price rather than against the same oracle it just trusted. The 3 percent "slippage" guard is ineffective whenever the oracle is the only thing being guarded against.
Query every incident yourself — free, no signup
Updated 14 Oct 2026. Figures are as reported by the sources listed above and are not independently verified.