Moonpad Honeypot

Reported loss Not disclosed
BNB Chain
Honeypot

What happened

Moonpad (MPAD) is a BEP-20 token on BNB Smart Chain whose contract stops tokens from being transferred to one stored address, newun. The first time transferFrom runs while newun is empty, the contract stores that call's recipient as newun. A liquidity deposit is normally made through transferFrom, so the pool address would be the one stored.

After that, every transfer and transferFrom whose recipient is newun reverts with "please wait", which is the call a router makes when a holder sells into the pool. Buys, where the pool sends tokens out, are not blocked by this code. The owner can change newun with transfernewun.

De.Fi's REKT database lists MPAD as an Exit Scam/Honeypot and says the contract owner could disable the transfer function, which restricted users in selling their tokens. No loss amount is listed there.

How it happened

  1. The constructor mints the whole supply (_totalSupply = 10000000000000000, 8 decimals, so 100 million tokens) to the deployer, who becomes owner. newun starts as the zero address.
  2. transfer contains require(to != newun, "please wait");, so no ordinary transfer can end at the address stored in newun.
  3. transferFrom begins with if(from != address(0) && newun == address(0)) newun = to; else require(to != newun, "please wait");. The first call made while newun is empty skips the check and records its recipient as newun. The blog post cited in the listing describes this first call as the liquidity deposit, which sets newun to the liquidity pool address. For this token the code allows that sequence; no transaction was opened to show which address newun holds.
  4. Once newun holds the pool address, a sale (router calls transferFrom(holder, pool, amount)) hits the else branch and reverts. A direct transfer to the pool reverts the same way. Transfers out of the pool, such as buys, do not pass through the check, so holders can acquire tokens but cannot send them back to the pool.
  5. The owner is not exempt from the to != newun check, but transfernewun(address _newun) public onlyOwner lets the owner change it at any time. Setting it to the zero address re-arms the capture (the next transferFrom records its recipient). Pointing it at an unused address lifts the block. Ownership can also be handed over through transferOwnership and acceptOwnership; there is no renounce function.
  6. clearCNDAO() is onlyOwner and sends the contract's own BNB balance to the owner. The Moonpad contract overrides the fallback with an empty payable function, so the contract accepts BNB. This is separate from the sell block and does not touch pool liquidity.

Protocol details

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

Build your security review skills

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