The attacker flashed the AIC reserve out of the USDC/AIC pair, then skim-synced the NEX/AIC pair to a wrecked ratio and bought back essentially the entire AIC reserve with a small NEX sliver. DeFiHackLabs reconstructs about 32.36 BNB (~$21.5K) net in a single transaction on BNB Chain.
Logged as “2026-08-03: Pair Skim Reserve Mismatch Exploit Flash Swap Leveraged on AIC”.
The exploit is a PancakeSwap V2 pair-skim attack worked over two fee-on-transfer tokens. AIC and NEX are both fee-on-transfer, and the pair's skim() is a public function that pays any caller the difference between a token's real ERC-20 balance and the pair's recorded reserve. Flash-borrowing a position-busting quantity and skim-syncing the pair is the textbook form.
The attacker at 0xC3cB0872C42BFA5EB3B0258D7EEA2cCaF6a49475 flash-swapped around 42.98M AIC out of the USDC/AIC pair (keeping 1 wei). In the pancakeCall callback it swapped the borrowed AIC into NEX through the NEX/AIC pair, transferred roughly 33.77M of the received NEX back into that pair, then called skim() (paying the surplus NEX to the router) and sync() to lock the pair's reserves at NEX ~= 1 and AIC ~= 83.26M. A retained sliver of about 19.35k NEX was then swapped into the wrecked-ratio equivalent of the entire AIC reserve, about 83.26M AIC, the flash swap was repaid (43.09M AIC with the 0.26% Pancake fee), and the residual ~40.17M AIC was sold through USDC and WBNB back to the attacker for around 32.36 BNB.
DeFiHackLabs reconstructs the sequence against the live BNB Chain state and reports a single-tx net gain of about 32.36 BNB (~$21.5K) in the exploit transaction 0x905cc861bcc525d3a8e699583943831b97500bbac11c92dc20ed6edbddd69f87 at block 113782392. The pair and token sources are unverified on BscScan; the mechanism description above is read from the on-chain trace rather than source code.
What would have prevented it: any of the standard pair-skim guards. A skim that only allowed the deployer to call, or one that kept a small dust buffer between the recorded reserve and the floor of balanceOf(). The simpler fix is to remove skim() and sync() from public callers or to require the caller to be the pair's LP-token holder.
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.