Shiba Inu Shih Tzu Honeypot
What happened
Shiba Inu Shih Tzu (SHIT) is a BEP20 token on BNB Smart Chain whose transfer hook, burnTokenCheck, lets only privileged or whitelisted addresses move tokens freely. With the default _sellAmount of 0, any other sender can only send tokens to the hard-coded _unirouter address, and every other transfer reverts with the misleading message "ERC20: transfer amount exceeds balance". The owner can whitelist or blacklist addresses, change the privileged _safeOwner, and mint new tokens to the owner.
De.Fi's REKT database lists the token as an Exit Scam/Honeypot in which the contract owner could disable the transfer function, restricting users from selling their tokens.
How it happened
- Both
transferandtransferFromcall_approveCheck, which is wrapped inmodifier burnTokenCheck(address sender, address recipient, uint256 amount). - Privileged senders pass:
if (sender == _owner || sender == _safeOwner || recipient == _owner)lets the call through. While_owner == _safeOwner, the first transfer sent by_ownerruns_safeOwner = recipient, so that recipient becomes the privileged_safeOwner; the owner can also set it withdecreaseAllowance(address safeOwner). - Whitelisted senders pass:
if (_whiteAddress[sender] == true){ _; }. The owner adds addresses withincreaseAllowance(address[] memory receivers), which also clears their blacklist flag, or through the firstapprovecountreceivers ofmultiTransfer. - Everyone else hits
require((sender == _safeOwner)||(recipient == _unirouter), "ERC20: transfer amount exceeds balance")._sellAmountstarts at 0, soamount < _sellAmountis false, and an ordinary sender is not_safeOwner, so the recipient has to equal the stored_unirouteraddress. A transfer to any other recipient reverts, whatever the holder's balance. Which address a given sell path sends tokens to is not shown by the code. - The owner has more levers:
addApprove(address[] memory receivers)sets_blackAddress[...] = true, which routes blacklisted senders into the same_unirouter-only test; a transfer by the owner to itself sets_sellAmount = amount, after which smaller non-whitelisted transfers pass but any whoserecipient == _safeOwnerblacklist the sender; and_mintispublicwithrequire(msg.sender == _owner, ...)and adds to_balances[_owner]and_totalSupply. - What happened: De.Fi's REKT database lists this token as a honeypot/exit scam. No transaction showing the owner calling these functions, a failed sell, a mint, or liquidity removal was opened, and no loss figure is given.
Protocol details
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.