Mozik.cc Honeypot
What happened
Mozik.cc (MOZ) is an Ethereum token deployed on 7 May 2021 at 0xb330eb3c…cc83b7. Every transfer and transferFrom runs through a modifier named burnTokenCheck that lets the owner, a hidden _safeOwner address and owner-whitelisted addresses move tokens freely. The owner's first outgoing transfer makes its recipient _safeOwner, so if that transfer is the liquidity deposit, the Uniswap pair becomes _safeOwner and buys from it pass.
Any other holder's transfer only passes if it is below a threshold _sellAmount, which starts at zero and which only the owner can set, and a holder who sells below the threshold into _safeOwner is then blacklisted; everything else reverts with the misleading message "transfer amount exceeds balance". De.Fi's REKT database lists Mozik.cc as an exit scam/honeypot, stating that the contract owner could disable transfers and so stop holders from selling.
How it happened
- The constructor sets both
_ownerand_safeOwnerto theownerargument and mints the initial supply to it. - While
_owner == _safeOwner, the owner's first outgoing transfer sets_safeOwner = recipient. A Uniswap liquidity add moves the owner's tokens to the pair withtransferFrom, which would make the pair_safeOwner. - Transfers sent by
_owneror_safeOwner, or sent to_owner, always pass, so buys from the pair go through. - A sale is the router calling
transferFrom(holder, pair, amount). For a holder who is not whitelisted, it passes only ifamount < _sellAmount, and because the recipient is_safeOwnerthat holder is then added to_blackAddress. With_sellAmountat its starting value of zero, every sale fails. - Blacklisted or over-threshold senders must satisfy
sender == _safeOwner || recipient == _unirouter. A router sale sends to the pair, not the router, so it reverts with "ERC20: transfer amount exceeds balance". - The owner controls the lists through misleadingly named functions:
increaseAllowance(address[])whitelists,addApprove(address[])blacklists,decreaseAllowance(address)sets_safeOwner, and a transfer from the owner to itself sets_sellAmount. The public_mintlets the owner credit any amount to itself, and the contract has no function to renounce or transfer_owner.
Protocol details
Evidence
- report De.Fi REKT database listing for MOZ (proof link: Token Sniffer tweet) twitter.com
- transaction Mozik.cc contract creation transaction etherscan.io
- address Mozik.cc (MOZ) verified contract code on Etherscan etherscan.io
- analysis Sourcify exact match for 0xb330eb3c9453097d754e99d28c2ea5ace1cc83b7 on Ethereum repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.