UnoRe Honeypot
What happened
UnoRe (UNO) is an Ethereum token whose transfer and transferFrom both run through a burnTokenCheck modifier that the owner can steer. In the verified source, a holder who is not whitelisted can only send tokens to the _unirouter address or to _owner; a transfer to any other recipient reverts with "ERC20: transfer amount exceeds balance", and the owner can whitelist or blacklist addresses and change _safeOwner. De.Fi's REKT database lists the token as an Exit Scam/Honeypot dated 2021-04-24, saying the owner could disable the transfer function, which restricted users in selling their tokens.
The listing gives no loss amount, and the code alone does not show whether any holder was blocked.
How it happened
- The constructor sets
_owner = owner;and_safeOwner = owner;, then mints the initial supply to the owner._mintispublicand only checksrequire(msg.sender == _owner, ...), so the owner can mint more to itself. No function in the contract changes_ownerafterwards. - Every
transferandtransferFromgoes through_approveCheck, which carries theburnTokenCheckmodifier. While_owner == _safeOwner, the owner's first outgoing transfer runsif (_owner == _safeOwner && sender == _owner){_safeOwner = recipient;_;}, so_safeOwnerbecomes that transfer's recipient. The code does not show who that recipient is. - Senders that pass freely:
_owner,_safeOwner, any sender sending to_owner(if (sender == _owner || sender == _safeOwner || recipient == _owner)), and any address with_whiteAddress[sender] == true. - Every other holder reaches
if (amount < _sellAmount)._sellAmountis initialised to 0, so this is false for every amount and execution falls torequire((sender == _safeOwner)||(recipient == _unirouter), "ERC20: transfer amount exceeds balance");. The transfer succeeds only if the recipient is the_unirouteraddress 0x7a250d56…F2488D (or_owner, handled in step 3); any other recipient reverts, and the holder's balance is not debited. A blacklisted sender hits the samerequire. Whether a liquidity pair is one of the allowed recipients is not shown by the code. - The owner controls who is exempt:
increaseAllowance(address[])sets_whiteAddress = trueand_blackAddress = false,addApprove(address[])does the reverse,multiTransferwhitelists the firstapprovecountrecipients and approves the router for them, anddecreaseAllowance(address safeOwner)reassigns_safeOwner. An owner self-transfer (if (sender == _owner && sender == recipient){_sellAmount = amount;}) can set_sellAmount; once it is above 0, holder transfers below that amount pass, and if the recipient equals_safeOwnerthe sender is added to_blackAddress.
Protocol details
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.