Media Network Honeypot
What happened
De.Fi's REKT database lists Media Network (MEDIA) on Ethereum as an Exit Scam/Honeypot and describes the contract owner as able to disable the transfer function, which restricted users from selling. In the verified source for 0x862060f1…28f176, a burnTokenCheck modifier on every transfer lets only the owner, a stored _safeOwner, whitelisted addresses and transfers to the owner pass freely. Other senders can send only to the hard-coded router address 0x7a250d56…F2488D, or in amounts below an owner-set _sellAmount, so a normal holder's sell into a pool reverts with "ERC20: transfer amount exceeds balance".
How it happened
- The constructor stores the same address as
_ownerand_safeOwnerand mints the supply to it:_owner = owner; _safeOwner = owner; _mint(_owner, initialSupply*(10**18));._sellAmountstarts at 0. transferandtransferFromboth call_approveCheck, which is wrapped in theburnTokenCheckmodifier. When_owner == _safeOwnerand the sender is the owner, the first branch runs_safeOwner = recipient;and the transfer proceeds, so the owner's first transfer re-points_safeOwnerat its recipient. The code does not show which address that was on-chain.- Otherwise, a transfer proceeds without further checks if
sender == _owner || sender == _safeOwner || recipient == _owner, or if_whiteAddress[sender] == true. If the owner sends tokens to itself,_sellAmount = amount;is set. - For every other sender the code requires
(sender == _safeOwner)||(recipient == _unirouter), with the failure message "ERC20: transfer amount exceeds balance". That is the case for blacklisted senders and for non-listed senders whoseamountis not below_sellAmount. A holder selling through the router sends tokens to the pair rather than to_unirouter, so with_sellAmountat 0 the sell reverts, while a holder's own transfer to the router address passes. - If
_sellAmountis set above 0, a non-listed sender can move amounts below it; if the recipient is_safeOwnerthe sender is added to_blackAddress. - Owner-only functions control the lists:
increaseAllowance(receivers)whitelists and un-blacklists,addApprove(receivers)blacklists and un-whitelists,decreaseAllowance(safeOwner)replaces_safeOwner, andmultiTransfersends tokens and whitelists the firstapprovecountreceivers. These function names do not match what they do. The code does not show which were called. _mintispublicbut guarded byrequire(msg.sender == _owner, ...)and adds to_balances[_owner], so the owner can raise the supply; no transaction shown here proves it was used.
Protocol details
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.