Rocket Man Honeypot
What happened
De.Fi's REKT database lists this token as an exit scam/honeypot, stating that the contract owner could disable the transfer function and so stop users from selling. The verified source has no all-transfers switch. Its control is an address variable, newun, that transfer and transferFrom use as a blocked recipient: any call whose recipient equals newun reverts with "please wait".
If newun points at the liquidity pair, a sale (a transfer into the pair) reverts while a purchase out of the pair still passes. The owner can set newun at any time with transfernewun, and the first transferFrom made while newun is unset also sets it to that call's recipient. The contract is at 0xbf3955a8…5afb68 on BNB Smart Chain.
How it happened
- The deployer becomes
owner(owner = msg.sender;) and receives the whole supply in the constructor (balances[owner] = _totalSupply;). newunstarts as the zero address. The owner can set it to any address at any time:function transfernewun(address _newun) public onlyOwner { newun = _newun; }.- Every
transfercall rejects a recipient equal tonewun:require(to != newun, "please wait");. The check is on the recipient only, so it applies to every sender, including the owner. transferFromhas two branches:if(from != address(0) && newun == address(0)) newun = to; else require(to != newun, "please wait");. Whilenewunis zero, the first call with a non-zerofromskips the check and stores its recipient innewun; oncenewunis non-zero, every latertransferFromto that address reverts.- DEX routers move a seller's tokens into the pair with
transferFrom. Ifnewunholds the pair address, sells therefore revert with "please wait", while buys (the pair sending tokens out to the buyer) are not blocked. The code does not setnewunto the pair by itself; that depends on which address the owner sets, or which call reachestransferFromfirst. Pointingnewunat an unused address lifts the block, and setting it back to the zero address lets the nexttransferFromcapture a new recipient. clearCNDAOlets the owner send the contract's native balance to itself:_owner.transfer(address(this).balance);. There is norenounceOwnership; the owner can pass the role on withtransferOwnershipandacceptOwnership.
Protocol details
Evidence
- report @Token_Sniffer incident report twitter.com
- address Rocket Man (ROCKETMAN) verified source on BscScan bscscan.com
- analysis Scam explained: BSC stealthy LP block cryptot3ddybear.gitlab.io
- analysis Sourcify copy of RocketMan.sol repo.sourcify.dev
- analysis De.Fi REKT database listing for ROCKETMAN (text as supplied in meta.json) de.fi
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.