Oiler Network Honeypot
What happened
De.Fi's REKT database lists the OIL token (Oiler Network) on Ethereum as an Exit Scam/Honeypot, stating that the contract owner could disable the transfer function and so restrict users from selling. The verified code at 0x31de9947…49f15b routes every transfer and transferFrom through a burnTokenCheck modifier. For a sender who is not the owner, the _safeOwner address or a whitelisted address, the modifier only lets the transfer through if the recipient is the owner or the hard-coded Uniswap V2 router address _unirouter; any other recipient reverts with the misleading message "ERC20: transfer amount exceeds balance".
The owner alone controls the whitelist, the blacklist and _safeOwner.
How it happened
- The constructor sets
_owner = owner; _safeOwner = owner;and mints the whole supply to the owner. - While
_owner == _safeOwner, the first transfer sent by the owner passes and makes its recipient the privileged address:if (_owner == _safeOwner && sender == _owner){_safeOwner = recipient;_;}. The code does not say who that recipient is. - After that, transfers pass unchecked when
sender == _owner || sender == _safeOwner || recipient == _owner. - Every other sender is checked. A whitelisted sender passes. A blacklisted sender, and an unlisted sender sending
amount >= _sellAmount, must satisfyrequire((sender == _safeOwner)||(recipient == _unirouter), "ERC20: transfer amount exceeds balance"). Those senders are never_safeOwnerat this point, so the recipient has to be the router address._sellAmountstarts at 0, so by default every non-privileged transfer to any other address, including a liquidity pair, reverts and the holder's balance is not debited. - The owner can change who is exempt:
multiTransferwhitelists the firstapprovecountreceivers and approves the router for them,increaseAllowance(address[])whitelists,addApprove(address[])blacklists, anddecreaseAllowance(address safeOwner)reassigns_safeOwner. These names mimic standard ERC20 functions but do not touch allowances. - A transfer from the owner to itself sets
_sellAmount = amount. Unlisted senders sending less than that amount then pass, and if the recipient is_safeOwnerthe sender is added to_blackAddress. _mintispublicand gated byrequire(msg.sender == _owner, ...); it credits_balances[_owner], so the owner can also increase supply.
This describes what the code allows. No transaction in the evidence shows which addresses the owner whitelisted, blacklisted or used as _safeOwner.
Protocol details
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.