SAD2Token Hack
What happened
SAD2Token (SAD2, contract 0x1627B87E…732e31) is created with bool public DevMode = true;. While it is on, _transfer reverts for any call whose msg.sender is not the owner, with the message Dev Mode is on, nobody could trade. That blocks buys (the pair is the caller), sells through the router (the router is the caller) and ordinary wallet-to-wallet transfers.
Transfers where from is the owner skip every check, and only the owner can switch the mode with enableDevMode() and disableDevMode(). De.Fi's REKT database lists the token as an abandoned exit scam with low network activity and no significant loss to users. Etherscan's token page shows 29 holders and a maximum supply of 10,000 SAD2.
The code shows what the owner can do; no transaction is cited that shows trading being blocked or funds lost.
How it happened
- The state variable is declared as
bool public DevMode = true;, so trading is locked from deployment until the owner callsdisableDevMode(). - In
_transfer, a sender that is not the owner first meetsrequire(amount <= maxTokensPerTx, "ERC20: transfer amount exceeds 200 limit"). The constructor sets_maxTokensPerTxto 200 * 10**18, and the owner can change it withupdateMaxTokensPerTx(no upper bound). - When
from == owner(), the function runssuper._transfer(from, to, amount); return;before theDevModecheck, so the owner's own transfers pass without the size limit or the lock. - For everyone else,
if (DevMode) { require(msg.sender==owner(), "Dev Mode is on, nobody could trade"); ... }reverts. A buy fails because the pair ismsg.sender, a router sell fails because the router ismsg.sender, and a direct transfer by a holder fails because the holder ismsg.sender. enableDevMode()hasrequire (msg.sender == owner());and setsDevMode = true, so the owner can lock trading again afterdisableDevMode().renounceOwnershipis inherited fromOwnable; after it runs, the mode could no longer be changed. The code contains no timelock, but the on-chain owner could be a contract, and the deployer address read as owner on 2026-09-30.- Once
DevModeis false, each non-owner transfer takesfeePercentage(5 at deploy, changeable with the uncappedupdateFee) from the amount and sends it to the token contract:super._transfer(from, address(this), tokensToLock); super._transfer(from, to, tokensToTransfer);.
Protocol details
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.