SHIBACOIN Honeypot

Reported loss Not disclosed
Ethereum
Honeypot

What happened

De.Fi's REKT database lists SHIBACOIN (Ethereum, contract 0x083a077d…1e9830) as an Exit Scam/Honeypot and says the contract owner could disable the transfer function, which restricted users in selling their tokens. The verified source has no single switch with that name. Instead, every transfer and transferFrom runs through a burnTokenCheck modifier in which an ordinary holder can send tokens only to the hard-coded _unirouter address or to _owner, unless the owner has whitelisted that holder.

A sale to any other recipient, such as a liquidity pair, reverts with "ERC20: transfer amount exceeds balance" even when the holder's balance is sufficient. The owner controls the whitelist and blacklist and can also mint additional supply to itself.

How it happened

  1. The constructor sets _owner = owner; and _safeOwner = owner; and mints initialSupply*(10**18) to the owner.
  2. In burnTokenCheck, the first branch is if (_owner == _safeOwner && sender == _owner){_safeOwner = recipient;_;}. The owner's first transfer while _safeOwner still equals the owner therefore moves _safeOwner to that recipient. The code does not show who that recipient was.
  3. For any other sender, a non-whitelisted, non-blacklisted holder reaches require((sender == _safeOwner)||(recipient == _unirouter), "ERC20: transfer amount exceeds balance"), because amount < _sellAmount is false while _sellAmount is its initial value of 0. The holder's transfer therefore passes only when the recipient is _unirouter (a transfer to _owner is allowed by an earlier branch). A transfer to any other address reverts, which includes a sale into a pair.
  4. The owner decides who is exempt. increaseAllowance(address[] memory receivers) is owner-only and sets _whiteAddress[receivers[i]] = true, and a whitelisted sender passes every check. multiTransfer whitelists its first approvecount receivers and approves _unirouter for them. addApprove sets _blackAddress[receivers[i]] = true, after which the sender can send only to _unirouter.
  5. The owner can also set a threshold by sending tokens to itself once _safeOwner has moved (if (sender == _owner && sender == recipient){_sellAmount = amount;}). Below that amount other holders' transfers pass, and if the recipient is _safeOwner the sender is added to _blackAddress.
  6. decreaseAllowance(address safeOwner) lets the owner re-point _safeOwner, and _mint is public but restricted by require(msg.sender == _owner, ...), so the owner can add to its own balance after deployment.

Protocol details

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

Build your security review skills

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