Gigachad Kishu Honeypot
What happened
Gigachad Kishu (GISHU) is an Ethereum token (contract 0xd92a608a…20881d) whose transfers pass through an owner-controlled burnTokenCheck modifier. With the default _sellAmount of 0, holders the owner has not whitelisted can only send tokens to the hard-coded _unirouter address (or to the owner), so a sale that pays tokens to a trading pair reverts with the message "ERC20: transfer amount exceeds balance" even when the balance is sufficient. The owner can whitelist or blacklist any address and can also mint to its own balance.
De.Fi's REKT database lists the token as an Exit Scam/Honeypot and states that the contract owner could disable the transfer function, which restricted users in selling their tokens.
How it happened
- The constructor sets
_owner = owner; _safeOwner = owner;and calls_mint(owner, initialSupply*(10**18)), so the owner holds the whole initial supply. No function changes_ownerafter construction. - Every
transferandtransferFromruns_approveCheck, which is wrapped in theburnTokenCheckmodifier. First branch:if (_owner == _safeOwner && sender == _owner){_safeOwner = recipient;_;}. While_safeOwnerstill equals the owner, any transfer sent by the owner passes and_safeOwnerbecomes the recipient of that transfer. - Privileged senders pass:
if (sender == _owner || sender == _safeOwner || recipient == _owner)lets through the owner, the current_safeOwner, and anyone sending to the owner. Inside it,if (sender == _owner && sender == recipient){_sellAmount = amount;}lets the owner set_sellAmountby sending tokens to itself. - For every other sender: a whitelisted sender (
_whiteAddress[sender] == true) passes unconditionally. A blacklisted sender must satisfyrequire((sender == _safeOwner)||(recipient == _unirouter), ...), and since_safeOwneralready passed in step 3, in practice the recipient must be_unirouter. - An address that is on neither list takes the last branch. If
amount < _sellAmountthe transfer passes, and whenrecipient == _safeOwnerthe sender is also moved to the blacklist (_blackAddress[sender] = true; _whiteAddress[sender] = false;). Otherwise it needsrecipient == _unirouter._sellAmountstarts at 0, soamount < _sellAmountis false until the owner sets it, and ordinary holders can only send to 0x7a250d56…F2488D. - A sale that moves tokens into a pair with
transferFrom(holder, pair, amount)therefore reverts for a non-whitelisted holder. Whether purchases work depends on the pair being_safeOwner, whitelisted, or the recipient being_unirouter; the source alone does not show which address received the owner's first transfer. - The owner controls the lists:
increaseAllowance(receivers)whitelists,addApprove(receivers)blacklists,decreaseAllowance(safeOwner)replaces_safeOwner, andmultiTransferwhitelists the firstapprovecountrecipients and approves the router for the maximum amount on their behalf. The function names suggest ordinary allowance helpers; the bodies only edit these lists. _mintis public and owner-only: it raises_totalSupplyand credits_balances[_owner], so the owner can create more tokens, while theTransferevent names theaccountargument.- What happened is known only from the listing: De.Fi's REKT database classifies the token as an Exit Scam/Honeypot and gives no loss figure. No transaction was opened showing the owner whitelisting, blacklisting, minting or removing liquidity.
Protocol details
Evidence
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.