Oiler Network Honeypot

Reported loss Not disclosed
Ethereum
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

  1. The constructor sets _owner = owner; _safeOwner = owner; and mints the whole supply to the owner.
  2. 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.
  3. After that, transfers pass unchecked when sender == _owner || sender == _safeOwner || recipient == _owner.
  4. Every other sender is checked. A whitelisted sender passes. A blacklisted sender, and an unlisted sender sending amount >= _sellAmount, must satisfy require((sender == _safeOwner)||(recipient == _unirouter), "ERC20: transfer amount exceeds balance"). Those senders are never _safeOwner at this point, so the recipient has to be the router address. _sellAmount starts 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.
  5. The owner can change who is exempt: multiTransfer whitelists the first approvecount receivers and approves the router for them, increaseAllowance(address[]) whitelists, addApprove(address[]) blacklists, and decreaseAllowance(address safeOwner) reassigns _safeOwner. These names mimic standard ERC20 functions but do not touch allowances.
  6. A transfer from the owner to itself sets _sellAmount = amount. Unlisted senders sending less than that amount then pass, and if the recipient is _safeOwner the sender is added to _blackAddress.
  7. _mint is public and gated by require(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

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

Build your security review skills

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