Crowny.io Honeypot

Reported loss Not disclosed
Ethereum
Honeypot

What happened

Crowny.io (CRWNY) is an Ethereum token deployed on 8 April 2021 at 0xc3756f83…62e0a2 by 0x66C618ed…8c7DAf. It is a different contract from the Crowny Token (CRWNY) that Etherscan lists at 0xDBdDf072…a143b1. Every transfer and transferFrom runs the burnTokenCheck modifier, which lets the fixed _owner, a stored _safeOwner address and whitelisted wallets move tokens but makes every other holder's transfer revert unless it is sent to the Uniswap V2 router address.

A Uniswap sale moves 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 hide behind ERC-20 names (increaseAllowance, addApprove, decreaseAllowance), and a public owner-only _mint can create unlimited supply. De.Fi's REKT database lists Crowny.io as an exit scam/honeypot.

How it happened

  1. The constructor sets _owner and _safeOwner to its owner argument and then calls the public _mint, which requires msg.sender == _owner, so deployment only succeeds when owner is the deploying account. No other code writes _owner, and there is no renounce function.
  2. In burnTokenCheck, while _owner == _safeOwner, the owner's first outgoing transfer runs _safeOwner = recipient. If that first 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 where the sender is _owner or _safeOwner, or the recipient is _owner, always pass, so buys out of a pair set as _safeOwner go through. Senders marked by increaseAllowance(address[]), or by the first approvecount recipients of the owner's multiTransfer, are whitelisted and also pass.
  4. Every other sender hits require((sender == _safeOwner)||(recipient == _unirouter), "ERC20: transfer amount exceeds balance"). _unirouter is 0x7a250d56…F2488D, the Uniswap V2 router, but a sale transfers the holder's tokens to the pair, so it reverts. Senders marked by addApprove(address[]) (the blacklist) are always held to this check.
  5. An unlisted sender passes only if amount < _sellAmount. _sellAmount starts at 0 and the owner can raise it by transferring tokens to itself; a transfer under the limit into _safeOwner then puts the seller on the blacklist, so at most one small sale works.
  6. _mint(address,uint256) is public, callable only by _owner, and always credits _balances[_owner], whatever account its Transfer event names.

Protocol details

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

Build your security review skills

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