Zodiac Credit Rug Pull
What happened
Zodiac Credit (ZOC) is a BNB Chain token deployed on 5 April 2023 at 0x76401604…a11717 by 0xfAd248B5…f8a28E. Its transfer function lets anyone buy from the pool but blocks sales from flagged wallets with the misleading error "Block is busy, please try again". Buyers are flagged automatically when their gas price is above an owner-set threshold, and the owner can flag every recorded buyer at once with Bonous() or halt all selling with DepositTransfer().
Wallet-to-wallet transfers by holders always revert, and the deployer is exempt from every check through a second, hidden _owner variable. On 9 April 2023 CertiK reported that the deployer removed liquidity in 8 transactions, profiting about $77K; De.Fi's REKT database adds that the deployer also sold ZOC and the price fell about 90% (liquidity removals include tx 0xb7fcda93…63170d, 0xec4c14d4…7d381a and 0x6e950143…99ac0d).
How it happened
- The constructor mints the whole supply to the deployer and also records the deployer in
BCR's own_ownervariable, separate from the one inOwnable. Every check in_transferis skipped when_owneris the sender or recipient, and no function changes this_owner. onlyOwnerpasses forowner()or_root, and_rootis also fixed to the deployer, sorenounceOwnership()would not remove the deployer's powers.- The owner sets the pool address with
SwapContract(address swap_). On each buy (from==_swap), the code records the buyer inhaveToken, andif(from==_swap &&_currprice>_defaultPrice){isStatus[to]=true;}flags the buyer whentx.gasprice.mul(100)exceeds_defaultPrice. The owner can change that threshold with the misnamedsetCurrPrice; set to 0, every buyer is flagged. - A sale sends tokens to the pool, and
if(to==_swap){ if(isStatus[from]){require(false,"Block is busy, please try again");} }makes a flagged wallet's sale revert.Bonous()callsAirDropGiftfor every recorded buyer, flagging them all;AirDropGiftandAirDropflag and unflag single wallets. DepositTransfer()setstradeStatus=true, after whichif(tradeStatus && from!=_swap){require(false,"Block is busy, please try again");}blocks every transfer except buys out of the pool.- A transfer between two wallets hits
airtokenlist[from]=trueand thenif(airtokenlist[from]){require(false,...)}, so it always reverts; holders cannot move tokens to another wallet to sell from there. - On 9 April 2023 the deployer removed liquidity in 8 transactions, profiting about $77K, according to CertiK.
Protocol details
Evidence
- report @CertiKAlert incident report twitter.com
- report CertiK Alert: large liquidity removal on Zodiac Credit - ZOC (ZOC) twitter.com
- transaction ZOC contract creation transaction bscscan.com
- transaction bscscan.com transaction 0x6e95…ac0d bscscan.com
- transaction bscscan.com transaction 0xb7fc…170d bscscan.com
- transaction bscscan.com transaction 0xec4c…381a bscscan.com
- address Zodiac Credit-ZOC (ZOC) verified contract code on BscScan bscscan.com
- address bscscan.com address 0xfad2…a28e bscscan.com
- analysis Sourcify match for 0x76401604de3dc379aec0cf54005c0d0937a11717 on BNB Chain repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.