China Rabbit Rug Pull
What happened
ChinaRabbit (ChinaRabbit, BSC contract 0x5116737A…B20630) is a BEP20 token whose source gives the deployer a hidden balance-editing function. setAutomatedMarketMakerPair(pair, value) reads like a routine pair-registration setter, but it adds value to _balances[pair] without debiting anyone or raising the total supply, and it is gated by a private _Msgsender variable that stays set to the deployer even after renounceOwnership(). The token also burns 2% of every transfer.
CertiK's alert of 2023-01-15 reports a slippage event in which the token dropped more than 95% and the deployer (0x914b...) sold about $88K. De.Fi's REKT database lists the incident as an exit scam/rug pull of about $88K, says the deployer removed liquidity from the pair and sold a large quantity of tokens, and puts the price drop at roughly 90%.
from De.Fi's listing: deployer 0x914b9044…061d88; example sale transaction 0x40740941…283e4a.
How it happened
- The constructor mints the whole 1,300,000,000 supply to the deployer (
_mint(msg.sender, 1300000000*1e18);).Ownablealso stores the deployer in a second private variable (_Msgsender = msgSender;). - Every transfer burns 2%:
uint256 burnamount = amount.mul(2).div(100);. The sender is debited the fullamount(_balances[sender] = _balances[sender].sub(amount, ...)), the recipient is creditedamountminus the burn, and the burned part is added to_balances[address(0)]while_totalSupplyshrinks. The team fee line isamount.mul(0).div(100), so it is zero. - The balance-editing function is
setAutomatedMarketMakerPair(address pair, uint256 value) public onlyMsg. It calls_setAutomatedMarketMakerPair, which runs_balances[pair] = _balances[pair].add(value);. Nothing is subtracted from any account,_totalSupplyis untouched and noTransferevent is emitted. - What this allows: the deployer can credit a liquidity pair with any number of tokens. A Uniswap V2-style pair works out how many tokens were paid in by comparing
balanceOf(pair)with its stored reserves, so phantom tokens can be counted as payment for BNB taken out of the pool. - Renouncing does not remove the power.
onlyMsgchecks_Msgsender == _msgSender(), andrenounceOwnership()only clears_owner. Anowner()read of the zero address (eth_call, 2026-09-30) therefore does not mean the setter is dead. - What was reported: CertiK says the deployer sold about $88K of the token and the price fell more than 95%. Neither the alert nor the code evidence shows whether the sale used the deployer's own tokens or the setter, and no transaction showing a call to
setAutomatedMarketMakerPairwas opened.
Protocol details
Evidence
- report @CertiKAlert incident report twitter.com
- report CertiK Alert post on ChinaRabbit slippage x.com
- transaction bscscan.com transaction 0x4074…3e4a bscscan.com
- address ChinaRabbitToken verified source on BscScan bscscan.com
- address bscscan.com address 0x914b…1d88 bscscan.com
- analysis ChinaRabbitToken on Sourcify (match) repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.