MaxGoatToken Honeypot

Reported loss Not disclosed
BNB Chain
Honeypot

What happened

MaxGoatToken (MGOAT) is a BNB Smart Chain token whose code keeps a single address, newun, and rejects every transfer sent to it with the message "please wait". newun is filled in by the first transferFrom call made while it is empty, or set directly by the owner through transfernewun. If newun ends up being the liquidity pair, which is what an independent write-up of this code pattern describes happening at the first add-liquidity transaction, selling into the pool reverts while buying keeps working.

De.Fi's REKT database lists the token as an exit scam/honeypot and says the contract owner could disable the transfer function, which restricted users in selling their tokens. No transaction or holder data was opened for this token, so the code shows what the owner could do, not what was done.

How it happened

  1. The constructor mints the whole supply to the deployer, who is also the owner: balances[owner] = _totalSupply; with _totalSupply = 1000000000000000 * 10**9; and 9 decimals.
  2. The contract stores a blocked address, address public newun;. The owner can change it at any time with function transfernewun(address _newun) public onlyOwner { newun = _newun; }.
  3. transfer refuses any recipient equal to it: require(to != newun, "please wait");.
  4. transferFrom, the call a router makes when it pulls a seller's tokens into a pool, sets newun if it is still empty and otherwise applies the same block: if(from != address(0) && newun == address(0)) newun = to; then else require(to != newun, "please wait");. The first transferFrom therefore picks the blocked address, and the code does not check who from or to is.
  5. If newun is the pair, a holder's sell reverts at that require before any balance is changed, while a buy, where the pair sends tokens to the buyer with transfer, only fails if the buyer is newun. The page this record cites as a write-up of the pattern describes newun being set to the pair during the first add-liquidity transaction.
  6. The block can be lifted or re-armed by the owner: pointing newun at an unused address stops blocking the pair, while transfernewun(address(0)) lets the next transferFrom overwrite it with that call's recipient.

Protocol details

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

Build your security review skills

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