BEER COIN Honeypot
What happened
In BEER COIN's _transfer, a transfer reverts when neither side is the owner, the sender is not the address stored in pancake, and the owner-controlled flag TIME is on. TIME starts as true, and the revert message says only one sale per 30 minutes is allowed, but the code has no timer: while TIME is on, an ordinary holder's sell or transfer always fails. The owner can switch the check off with setTIME, blacklist senders with GTYA, and cap sell size with fire.
De.Fi's REKT database lists the token as an exit scam/honeypot in which the owner could disable the transfer function and restrict holders from selling; the contract is on BNB Smart Chain at 0xa1f68c2b…b9bd52.
How it happened
- The
BEERconstructor mints the whole supply to the deployer, who is theowner:_mint(msg.sender, 1000000000000000e18);. The state variablebool private TIME = true;means the restriction is on from deployment. - In
_transfer, whenever the owner is the sender, the recipient is recorded as the pool address:if(sender == owner()){ pancake = recipient; }. The owner can also set it directly withaddPancake. - The sell block follows:
if(sender != owner() && recipient != owner() && sender != pancake && TIME == true){ revert("FOR VALUE PROTECTION, YOU CAN ONLY SELL 1 Sale PER 30 MIN"); }. A sale through a DEX router moves tokens from the holder to the pair, so the sender is neither the owner norpancakeand the transaction reverts. Wallet-to-wallet transfers between ordinary holders hit the same check. - Buys pass because the pair is then the sender and matches
pancake, as does any transfer to or from the owner. Holders can still send tokens to the owner address, since the check requires both sides to be non-owner. - The message mentions a 30 minute window, but no timestamp is compared:
saveTransDataonly writestransData[sender] = _timestamp;and nothing reads it. The only exit isfunction setTIME (bool _bool) public onlyOwner { TIME = _bool; }. - The owner has further controls:
GTYA(address _addr, bool _bool)marks senders inbot, andif(bot[sender] == true){ require(amount <=0, "bots......"); }then reverts any transfer above the 1000-unit minimum from that sender;fire(uint256 TKP)sets the sell capMAX, applied to transfers to addresses flagged throughPOOL;setFeeaccepts values up to 100 (10% of each transfer, since the divisor is 1000), taken from the amount the recipient receives and sent tofeeDistributor.
The code allows this; no transaction was opened showing the owner calling setTIME, GTYA or setFee, and no source reports how much holders lost.
Protocol details
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.