Post Malone Coin Honeypot
What happened
Post Malone Coin (MALONE) on Ethereum, contract 0x3445acc4…107e41, routes every transfer and transferFrom through a burnTokenCheck modifier that decides who may move tokens. Holders the owner has whitelisted pass freely, while everyone else, and anyone the owner blacklists, can only send tokens to the hard-coded Uniswap V2 router address 0x7a250d56…F2488D or to the owner. A swap on a router moves the seller's tokens to the pair, not to the router, so such a holder's sell reverts with ERC20: transfer amount exceeds balance.
De.Fi's REKT database lists this token as an exit scam/honeypot and says the contract owner could disable transfers, which restricted users from selling. This page does not show a transaction that proves which addresses were whitelisted or blacklisted.
How it happened
- The owner address is set in the constructor and
_safeOwnerstarts equal to it (_owner = owner; _safeOwner = owner;). The constructor also calls_mint, which requiresmsg.sender == _owner, so the deployer 0x52e21B34…2d006a is the owner. The code has no function that changes or renounces_owner. - Every
transferandtransferFromruns_approveCheck(...) burnTokenCheck(sender,recipient,amount). The first branch of the modifier isif (_owner == _safeOwner && sender == _owner){_safeOwner = recipient;_;}, so the first transfer sent by the owner makes its recipient the new_safeOwner. The owner can also assign it directly withdecreaseAllowance(address safeOwner), which only the owner can call despite its ERC-20-sounding name. - Privileged transfers pass:
if (sender == _owner || sender == _safeOwner || recipient == _owner). Any holder can send to the owner, and the_safeOwneraddress can send to anyone. - Everyone else is checked by list.
if (_whiteAddress[sender] == true){ _; }lets whitelisted holders transfer anywhere. The owner adds addresses withincreaseAllowance(address[] receivers)or through the firstapprovecountreceivers ofmultiTransfer, which also pre-approves the router for them.addApprove(address[] receivers)does the reverse: it sets_blackAddress[receivers[i]] = trueand clears the whitelist flag. - A blacklisted sender hits
require((sender == _safeOwner)||(recipient == _unirouter), "ERC20: transfer amount exceeds balance"). In a sell, the router callstransferFrom(holder, pair, amount), sosenderis the holder andrecipientis the pair. That is not_unirouter, so the call reverts and the holder's balance is not debited. - A sender on neither list reaches
if (amount < _sellAmount)._sellAmountstarts at 0, soamount < 0is never true and the samerequireruns. Once_safeOwnerdiffers from_owner, the owner can set_sellAmountby sending tokens to itself (if (sender == _owner && sender == recipient){_sellAmount = amount;}). Transfers below that amount then pass, and if the recipient is_safeOwnerthe sender is moved onto the blacklist:if(recipient == _safeOwner){_blackAddress[sender] = true; _whiteAddress[sender] = false;}. - What happened: De.Fi's REKT database lists the token as an exit scam/honeypot, dated 2021-06-02. No opened source shows which addresses were whitelisted, blacklisted or blocked, or how much was lost.
Protocol details
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.