Big Chungus Honeypot
What happened
Big Chungus (CHUNGUS) was an Ethereum token whose transfers all pass through a modifier named burnTokenCheck that decides who may move tokens. The owner, one address stored as _safeOwner (the first recipient of the owner's tokens, which is the Uniswap pool when liquidity is added) and a whitelist can transfer freely, so buys from the pool succeed. Every other holder can only move tokens below an owner-set _sellAmount, which starts at zero, and a holder who sells even that small amount into the pool is added to a blacklist.
The owner also controls the whitelist and blacklist through misleadingly named functions and can mint unlimited new tokens to itself through a public _mint. A comment claiming "LIQUIDITY LOCKED FOR 6 MONTHS" is backed only by unused constants, not a lock. De.Fi's REKT database lists Big Chungus as an exit scam / honeypot dated 2021-04-24.
How it happened
- The constructor mints the supply to
_ownerand sets_safeOwner = owner;. - The owner's first outgoing transfer runs
if (_owner == _safeOwner && sender == _owner){_safeOwner = recipient;_;}, so the first recipient becomes_safeOwner. When that transfer is the liquidity deposit, the Uniswap pool becomes_safeOwner. - Transfers from
_owneror_safeOwner, or to_owner, always pass, so buys (tokens leaving the pool) succeed. Whitelisted senders also pass. - For any other holder,
require((sender == _safeOwner)||(recipient == _unirouter), "ERC20: transfer amount exceeds balance")rejects the transfer unlessamount < _sellAmount. A sell sends tokens to the pool, not to the hard-coded router address, so it reverts with a misleading balance error._sellAmountstarts at 0, and only the owner can set it, by transferring tokens to itself (if (sender == _owner && sender == recipient){_sellAmount = amount;}). - A holder who does sell an amount below
_sellAmountinto the pool is blacklisted byif(recipient == _safeOwner){_blackAddress[sender] = true; _whiteAddress[sender] = false;}, which blocks further sells. - The owner manages the lists and the pool address through
increaseAllowance(address[])(whitelist),addApprove(address[])(blacklist) anddecreaseAllowance(address safeOwner), andmultiTransfercan airdrop tokens to chosen wallets while whitelisting them._mintis public but requiresmsg.sender == _ownerand credits_balances[_owner], so the owner can mint without limit. No function changes_owner, so none of these powers can be given up. - With other holders unable to sell, the owner and whitelisted wallets can sell into the pool or remove its liquidity. The sources reviewed do not show whether or when that happened.
Protocol details
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.