Rage.Fan Honeypot
What happened
De.Fi's REKT database lists Rage.Fan (RAGE, Ethereum contract 0x034f9e67…4b0c42) as an exit scam/honeypot dated 2021-03-28, saying the owner could disable the transfer function and so stop users selling. The verified source shows the control behind that: every transfer passes a burnTokenCheck modifier, and an ordinary holder's transfer only goes through if the recipient is the hard-coded router address _unirouter or the owner, unless the owner has whitelisted that holder or a _sellAmount threshold has been set. The owner alone can whitelist or blacklist addresses, move the _safeOwner exemption, and mint more supply.
These are what the code allows; no transaction showing the owner using them was opened.
How it happened
- Every
transferandtransferFromruns_approveCheck, which is wrapped in theburnTokenCheck(sender,recipient,amount)modifier.senderis the token holder even ontransferFrom. - The owner is exempt. The first branch is
if (_owner == _safeOwner && sender == _owner){_safeOwner = recipient;_;}, so the first transfer out of the owner records its recipient as_safeOwner. After that,if (sender == _owner || sender == _safeOwner || recipient == _owner)lets the owner, the_safeOwneraddress and anything sent to the owner through. - Addresses in
_whiteAddresspass freely. Addresses in_blackAddressfail unless the recipient is the router:require((sender == _safeOwner)||(recipient == _unirouter), "ERC20: transfer amount exceeds balance"). - An ordinary holder is checked with
if (amount < _sellAmount)._sellAmountstarts at 0, so this is false and theelsebranch runs the samerequire: the recipient must be_unirouter(0x7a250d56…F2488D) or the sender must be_safeOwner. The owner is also an allowed recipient through the earlier branch. A transfer to any other address, such as a pool receiving a sale, reverts with the misleading messagetransfer amount exceeds balance, and the holder's balance is left unchanged. - If the owner later sets
_sellAmount(a transfer from the owner to itself while_owner != _safeOwnerruns_sellAmount = amount), ordinary transfers below that amount pass, and a transfer below it whose recipient is_safeOwneralso sets_blackAddress[sender] = true. - Only the owner can change who is exempt:
increaseAllowancewhitelists,addApproveblacklists,decreaseAllowancereplaces_safeOwner, andmultiTransferwhitelists its firstapprovecountreceivers and gives them a maximum allowance to the router._owneris assigned only in the constructor, so no function transfers or renounces it. _mintispublicbut requiresmsg.sender == _ownerand credits_balances[_owner], so the owner can also add supply at any time.
Protocol details
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.