TeamRocket Honeypot
What happened
TeamRocket (on-chain name $TeamRocket, BNB Chain contract 0xa260ca4e…280bff) is a BEP-20 token whose _approve function keeps real allowances only for one hard-coded address, 0xBbE84f65…eed195, which is also the deploying address and the owner. For every other holder _approve writes an allowance of zero, so any transferFrom for a non-zero amount, which is what a router uses to sell, reverts on the allowance check. De.Fi's REKT database lists the token as an Exit Scam/Honeypot, stating that the contract owner could disable the transfer function, which restricted users in selling their tokens; no sell transaction, pool address or loss figure was opened to confirm what happened on-chain.
The owner can also call an uncapped mint.
How it happened
- The constructor credits the entire supply,
8723563500000000000base units at 7 decimals (872,356,350,000 tokens), to the deployer with_balances[msg.sender] = _totalSupply;. _approveis the function every approval path goes through. It branches on a literal address:if (owner == address(0xBbE84f65D89A1d083470f771869F4e67f0eed195)) { _allowances[owner][spender] = amount;stores the requested value, butelse { _allowances[owner][spender] = 0;stores zero and emitsApproval(owner, spender, 0)for everyone else.- A holder who approves a router therefore gets an allowance of zero, because
approvecalls_approve(_msgSender(), spender, amount). - A sell goes through the router's
transferFrom(holder, pair, amount). In this contracttransferFromcalls_transfer(sender, recipient, amount)first and then_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "BEP20: transfer amount exceeds allowance")). The stored allowance is 0, sosubreverts for anyamountabove zero and the whole call, including the balance move, is rolled back. The holder keeps the tokens but cannot sell them through a router. - A purchase uses
transferfrom the pool to the buyer, which calls_transferand does not read allowances, so buying is not affected.transferFromfor the hard-coded address behaves normally because its allowances are stored. - The exemption is tied to the literal address, not to
owner():renounceOwnershipexists but would not remove it. The owner can also create tokens withfunction mint(uint256 amount) public onlyOwner, which has no cap. The source does not show whethermintor a pool deposit was ever used.
Protocol details
Evidence
- report @Token_Sniffer incident report twitter.com
- address TeamRocket token verified source on BscScan bscscan.com
- analysis Sourcify repository entry for the contract repo.sourcify.dev
- analysis De.Fi REKT database listing for TEAM ROCKET (Exit Scam/Honeypot, 2021-09-09) de.fi
- analysis Scam explained: BSC no-approval scam (cryptot3ddybear blog) cryptot3ddybear.gitlab.io
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.