BEER COIN Honeypot

Reported loss Not disclosed
BNB Chain
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

  1. The BEER constructor mints the whole supply to the deployer, who is the owner: _mint(msg.sender, 1000000000000000e18);. The state variable bool private TIME = true; means the restriction is on from deployment.
  2. 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 with addPancake.
  3. 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 nor pancake and the transaction reverts. Wallet-to-wallet transfers between ordinary holders hit the same check.
  4. 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.
  5. The message mentions a 30 minute window, but no timestamp is compared: saveTransData only writes transData[sender] = _timestamp; and nothing reads it. The only exit is function setTIME (bool _bool) public onlyOwner { TIME = _bool; }.
  6. The owner has further controls: GTYA(address _addr, bool _bool) marks senders in bot, and if(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 cap MAX, applied to transfers to addresses flagged through POOL; setFee accepts values up to 100 (10% of each transfer, since the divisor is 1000), taken from the amount the recipient receives and sent to feeDistributor.

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

Classification Token
Protocol Type Exit Scam/Honeypot
Affected asset / contract BEER

Build your security review skills

Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.