SAD2Token Hack

Reported loss Not disclosed
Ethereum
Abandoned

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

  1. The state variable is declared as bool public DevMode = true;, so trading is locked from deployment until the owner calls disableDevMode().
  2. In _transfer, a sender that is not the owner first meets require(amount <= maxTokensPerTx, "ERC20: transfer amount exceeds 200 limit"). The constructor sets _maxTokensPerTx to 200 * 10**18, and the owner can change it with updateMaxTokensPerTx (no upper bound).
  3. When from == owner(), the function runs super._transfer(from, to, amount); return; before the DevMode check, so the owner's own transfers pass without the size limit or the lock.
  4. For everyone else, if (DevMode) { require(msg.sender==owner(), "Dev Mode is on, nobody could trade"); ... } reverts. A buy fails because the pair is msg.sender, a router sell fails because the router is msg.sender, and a direct transfer by a holder fails because the holder is msg.sender.
  5. enableDevMode() has require (msg.sender == owner()); and sets DevMode = true, so the owner can lock trading again after disableDevMode(). renounceOwnership is inherited from Ownable; 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.
  6. Once DevMode is false, each non-owner transfer takes feePercentage (5 at deploy, changeable with the uncapped updateFee) from the amount and sends it to the token contract: super._transfer(from, address(this), tokensToLock); super._transfer(from, to, tokensToTransfer);.

Protocol details

Classification Other
Protocol Type Exit Scam/Abandoned
Affected asset / contract SAD2

Build your security review skills

Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.