Misa Inu Honeypot

Reported loss Not disclosed
Ethereum
Honeypot

What happened

Misa Inu (MISA) is an Ethereum token deployed on 6 June 2021 at 0x6723164e…39a56c by 0x9fA03C9b…F656C8. Every transfer and transferFrom runs a burnTokenCheck modifier that lets the owner, a stored _safeOwner address and whitelisted wallets move tokens freely, but makes any other holder's transfer revert unless it is sent to the Uniswap V2 router address. A Uniswap sale moves the seller's tokens into the pair, not the router, so ordinary holders can buy but not sell, and the revert shows the misleading message "ERC20: transfer amount exceeds balance".

The whitelist and blacklist setters are disguised as increaseAllowance, addApprove and decreaseAllowance, and a public owner-only _mint lets the owner add unlimited supply to its own balance at any time. De.Fi's REKT database lists MISA as an exit scam/honeypot.

How it happened

  1. The constructor sets _owner and _safeOwner to its owner argument and mints initialSupply*(10**18) to it. No other code writes _owner.
  2. In burnTokenCheck, while _owner == _safeOwner, the owner's first outgoing transfer runs _safeOwner = recipient. If that transfer is the liquidity deposit into the Uniswap pair, the pair becomes _safeOwner; the owner can also set it directly with decreaseAllowance(address safeOwner).
  3. Transfers from _owner or _safeOwner, or to _owner, always pass, so buys out of a pair set as _safeOwner work. Wallets whitelisted through increaseAllowance(address[]) or the first approvecount recipients of the owner's multiTransfer also pass.
  4. Every other sender hits require((sender == _safeOwner)||(recipient == _unirouter), "ERC20: transfer amount exceeds balance"), where _unirouter is 0x7a250d56…F2488D, the Uniswap V2 router. A sale sends tokens to the pair, so it reverts. Wallets marked by addApprove(address[]) are always held to this check.
  5. An unlisted sender passes only if amount < _sellAmount. _sellAmount starts at 0 and the owner sets it by transferring tokens to itself; a transfer under that limit into _safeOwner then blacklists the seller.
  6. _mint(address,uint256) is public, restricted to _owner, and always credits _balances[_owner], whatever account is passed. The owner can call it at any time to create new tokens and sell them into the pool, since the owner's own transfers are never blocked.

Protocol details

Classification Token
Protocol Type Exit Scam/Honeypot
Affected asset / contract MISA

Build your security review skills

Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.