Mochi.market Honeypot
What happened
This "Mochi.market" (MOMA) token on Ethereum (0x9fd4f831…220e26, deployed on 25 April 2021) copied the name and symbol of the Mochi.market NFT marketplace token and is a different contract from the one Ethplorer lists for that project (0xbd1848e1…4bd55b). Its transfer code lets the pool send tokens to buyers but stops ordinary holders from selling: a modifier on every transfer and transferFrom only lets the deployer, the _safeOwner address and owner-whitelisted wallets move tokens freely, and a sale to the pool fails with the misleading error "ERC20: transfer amount exceeds balance". The deployer can whitelist or blacklist any address through functions disguised as increaseAllowance and addApprove, and the contract has no function to transfer or renounce ownership.
De.Fi's REKT database lists the token as a honeypot exit scam on 25 April 2021 in which the owner restricted users from selling; no loss figure is recorded.
How it happened
- The constructor hard-codes
_name = 'Mochi.market'and_symbol = 'MOMA', sets_ownerand_safeOwnerto the deployer and mints 100,000,000 MOMA with_mint(_owner, 100*1e6*(10**18)). - On the deployer's first outgoing transfer,
if (_owner == _safeOwner && sender == _owner){_safeOwner = recipient;_;}makes that recipient_safeOwner. If that transfer is the liquidity deposit, the pool becomes_safeOwnerand can send tokens freely, so buys go through. - Every other transfer passes only if
sender == _owner || sender == _safeOwner || recipient == _owneror_whiteAddress[sender] == true. - A holder who is not whitelisted falls through to
require((sender == _safeOwner)||(recipient == _unirouter), "ERC20: transfer amount exceeds balance"). A Uniswap sale moves tokens from the holder to the pool, not to the router, so it reverts with an error that looks like a balance problem. - The only exception is
if (amount < _sellAmount)._sellAmountstarts at 0 and is set only by an owner transfer to itself. Below that threshold a transfer succeeds, but a transfer to_safeOwnerthen blacklists the sender:if(recipient == _safeOwner){_blackAddress[sender] = true; _whiteAddress[sender] = false;}. - Owner-only functions with standard-looking names manage the lists:
increaseAllowance(address[])whitelists,addApprove(address[])blacklists,decreaseAllowance(address)sets_safeOwner, andmultiTransfersends tokens and whitelists the firstapprovecountreceivers. A public owner-only_mintcan add supply to_ownerat any time.
Protocol details
Evidence
- report @Token_Sniffer incident report twitter.com
- transaction Mochi.market (MOMA) copycat contract creation transaction etherscan.io
- address ERC20 (Mochi.market / MOMA) verified source code etherscan.io
- address Mochi Market Token (MOMA) on Ethplorer ethplorer.io
- analysis Sourcify match for 0x9fd4f83111debc86ee54f45ca80df39bbb220e26 on Ethereum repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.