Toothless - How to train meme Rug Pull
What happened
TOOTH ("Toothless - How to train meme") was an Ethereum meme token deployed on 2023-07-18. On 2023-07-19 Cyvers flagged transaction 0x82a9a63d…48b681, in which the token's deployer removed about 97 ETH (about $186,000) from the Uniswap V2 liquidity pool. The verified contract looks renounced because its Ownable constructor sets the owner to the zero address, but control sits with a separate hidden address, _token.token, set at deployment.
That address can flag any holder through a capitalised Approve() function so every later transfer from that holder reverts, and anyone can call addLiquidity() to credit it with any number of tokens without a Transfer event or a change to totalSupply.
How it happened
- The constructor stores a private address in
_token.token = token_;, whileOwnable's constructor calls_setOwner(address(0)), soowner()reads as the zero address from deployment and the token appears renounced. - The hidden address can call
Approve(holder, amount)with any non-zero amount;_requireAllowthen runs_cex[spender] = spender;, marking that holder. - Every
transferandtransferFromfirst calls_isEnoughBalance(sender, ...). For a marked sender it setsamount = _totalSupply;and calls_moins(sender, amount), which subtracts the whole supply from the holder's balance; Solidity 0.8.19's checked arithmetic reverts, so a marked holder cannot sell or move tokens. The check uses the token owner (sender), so it also blocks sales routed throughtransferFrom. addLiquidity(spender, amount, isOwner)is public and only requiresisOwner == true. Whenspenderis the hidden address, it debits the caller bytotal = 0and then addsamountto_balances[spender], giving that address unlimited tokens with noTransferevent and no change tototalSupply.- On 2023-07-19 the deployer removed about 97 ETH from the Uniswap V2 pool in 0x82a9a63d…48b681, per Cyvers, which reported the funds at 0xdd614517…0f6790.
Protocol details
Evidence
- report @CyversAlerts incident report twitter.com
- report Cyvers Alerts on X: deployer of $TOOTH removed 97 ETH from liquidity pool twitter.com
- transaction etherscan.io transaction 0x82a9…b681 etherscan.io
- address Toothless (TOOTH) verified token contract, Etherscan etherscan.io
- address etherscan.io address 0x341b…d813 etherscan.io
- analysis Sourcify exact match, chain 1, 0x807a7f15e3aa1b2188c71ab744369d422b2de3af repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.