
Date: July 16, 2026
Chain: BNB Chain
Loss: 209,061.63 USDT, the pool's whole USDT reserve, of which the attacker kept 201,359.47 USDT
Class: a sell hook that burns tokens out of the trading pair and resyncs its reserves
Before the attack, CrowdRingCircle's PancakeSwap V2 pool, which paired its CRC token with USDT, held 209,061.63 USDT against about 35.9 million CRC. At 09:44:27 UTC on July 16, 2026, a single BNB Chain transaction left that pool holding zero USDT and 40,629.6 CRC, and the attacker's wallet was 201,359.47 USDT richer.
The token itself made it possible. CRC's transfer logic included a "sell destroy" feature that, whenever someone sold into the pool, burned CRC out of the pool's own balance and then told the pool to update its reserves. With the right sell size, that feature wiped the pool's CRC reserve to zero, and a pool that believes it holds no CRC will hand over all of its USDT for a few tokens.
CRC, which Chinese-language coverage calls 众环CRC, is a BNB Chain token at 0x8581433150F2c48fF2eFE5A22B17C7d405054509, and its liquidity sat in the PancakeSwap V2 pair at 0xd8799A644850c065388c22DF4eE0C28472922526. A PancakeSwap V2 pair prices trades from two stored numbers, its reserves of each token, and keeps them in line with its real balances through a function called sync(), which anyone can call and which simply copies the pair's current token balances into its reserves.
Like many tokens designed to push their own price up, CRC charged a fee on sells and destroyed part of the supply over time. According to the DeFiHackLabs analysis, which works from CRC's verified source, the token's internal _update function has a branch that runs on any transfer to a registered DEX pair from a sender that isn't exempt, while a sellDestroyEnabled flag is on. That branch burns an amount equal to the sell, capped at whatever CRC the pair holds, directly from the pair's balance, and then calls sync() on the pair so its reserves reflect the burn.
A sell is supposed to add tokens to the pool. CRC's sell branch did the opposite first, taking tokens out of the pool before the seller's tokens arrived and fixing that reduced balance into the reserves with an early sync(). AML Crypto's write-up describes the same mechanism, and stresses that PancakeSwap itself wasn't compromised.
The rule CRC broke is one every constant-product pool depends on: a token transfer into a pair may raise that pair's balance of the token, and nothing a seller does should be able to lower it. Once the pool's CRC reserve can be driven to zero by a sell, the pool's pricing formula has nothing left to protect the USDT side. It's like a shop where every customer returning an item also removes one from the shelf before the stock count, until a well-timed return leaves the count at zero and the till pays out at any price.
The attacker's wallet, 0x34579eA92a07a88F5505dFaA4D99Ab94b2784087, sent a contract creation transaction, and the attack ran from the deployed code in block 110301524. DeFiHackLabs reports that the working capital came from a flash loan plus borrows from lending markets, and the transaction's logs show roughly 185 million USDT gathered from several sources before the first trade.
First, the attack contract bought almost all of the pool's CRC. It sent 184,995,877.11 USDT into the pair and took out 35,862,714.91 CRC, which left exactly 40,629.6 CRC in the pool. The pair's Sync event after that trade recorded reserves of 185,204,938.74 USDT and 40,629.6 CRC, which also shows that the pool started with 209,061.63 USDT of its own.
Next came the sell that triggered the burn. The attacker's wallet supplied 45,144 CRC it already held, and the contract sold it into the pair. CRC's 10% sell fee sent 4,514.4 CRC to a fee address, leaving a net sell of exactly 40,629.6 CRC, and the sell-destroy branch burned that same amount from the pair, every CRC the pool had. The token then called sync(), and the pair's reserves read 185,204,938.74 USDT against zero CRC.
Then the 40,629.6 CRC from the sell landed in the pair, and the contract called swap() for the pool's entire USDT balance. Measured against a recorded CRC reserve of zero, those 40,629.6 tokens counted as an enormous deposit, and the pair released all 185,204,938.74 USDT. Its final Sync event shows zero USDT and 40,629.6 CRC.
The contract repaid its loans and sent 201,359.47 USDT to the attacker's wallet. The difference between that and the 209,061.63 USDT the pool lost, about 7,702 USDT, went to the cost of the borrowed capital, according to DeFiHackLabs. Everyone who'd provided liquidity to the pair, and every holder whose CRC was priced by it, was left with a pool that had no USDT in it.
TenArmor's monitoring flagged the attack, and Phemex News, citing PANews, reported a loss of about $201,400 the next day. AML Crypto traced what came next: between 09:50:54 and 09:53:33 UTC the funds moved to Ethereum through Relay, ETH went into Tornado Cash on Ethereum, part of the money returned to the exploit address on BNB Chain at 09:57:35 UTC, and BNB went into Tornado Cash on BNB Chain from 09:58:26 to 10:11:30 UTC, 22 Tornado Cash transactions in all. AML Crypto also flagged an address, 0x24078f47b683b55afbfcc90392d72edf484eddac, funded from a FixedFloat hot wallet, as a suspected attacker-controlled lead and recommended formal requests to FixedFloat and Relay. As of October 20, 2026, none of the published reports on the exploit cited a statement from the CRC team.
Olympix reads a contract the way an attacker does, as states, transitions and entry points, and takes in the context around the code, including the AMM it trades on, to infer the rules the system depends on but never writes down. In CRC, the states that matter are the pair's token balance and its stored reserves, and every transfer is an entry point that can change them. The engine maps every path through the token's transfer logic and uses signals to decide which ones are worth attacking. Olympix's static analysis surfaces the signal here: a token transfer hook that burns from an address other than the sender, specifically a registered liquidity pair, and then calls sync() on that pair in the middle of the transfer.
The invariant is one sentence: a sell into the pair must never reduce the pair's CRC reserve. From every path through _update, the engine narrows to the feasible ones, where the sender isn't exempt and the destroy flag is on, and then to the ones that move the pair's reserve, which is exactly the sell-destroy branch.
BugPoCer takes that invariant and runs Counterexample-Guided Invariant Refutation, working outward from the token and its pair and executing those paths until one breaks the rule. The counterexample is the attack in its smallest form: buy the pool's CRC down to a small balance, sell exactly enough that the net sell equals that balance, watch the burn and the early sync() set the CRC reserve to zero, and swap the arriving tokens for every USDT in the pool. BugPoCer returns that sequence with the minimal conditions that trigger it and a generated Forge test that replays it, which is the July 16 transaction produced in development instead of on BNB Chain.
Olympix runs that check automatically in development, at every merge and before release, so the finding would have appeared when the sell-destroy branch was first written into _update, before the token launched with its pool.
CRC's designers wanted sells to shrink supply, and they implemented it by reaching into the pool's balance and rewriting its reserves mid-transfer, which handed control of the pool's pricing to whoever sold the right amount. Tokenomics that burn, tax or rebase have to leave the pair's accounting alone, and that's a rule an engine can state and break in a test long before launch. If your token logic touches the pools it trades in, book a technical walkthrough.
Protocol: CrowdRingCircle (CRC)
Chain: BNB Chain
Date: July 16, 2026, 09:44:27 UTC
Loss: 209,061.63 USDT from the CRC/USDT pair (201,359.47 USDT to the attacker after financing costs)
Attacker EOA: 0x3457...4087
Contract deployed by the exploit tx: 0xc594...d133
Attack contract (executed the swaps): 0x2ead...5da1
Vulnerable contract (CRC token): 0x8581...4509
Victim pool (PancakeSwap V2 CRC/USDT): 0xd879...2526
Exploit tx: 0xeaef...c834
Block: 110301524
Suspected related address (per AML Crypto): 0x2407...ddac
AML Crypto: CrowdRingCircle Hack, $201K Drained from CRC/USDT Pool
DeFiHackLabs: CrowdRingCircle Proof of Concept
Phemex News: BSC Project CrowdRingCircle Loses $201,400 in Suspicious Attack