TeslaModelS Plaid Honeypot

Reported loss Not disclosed
BNB Chain
Honeypot

What happened

TeslaModelS Plaid (TMP) is a BEP-20 token on BNB Smart Chain, deployed from 0x76B62dAB…8F1942 in transaction 0x9af600af…09e696 on 2021-05-20. De.Fi's REKT database lists it as an Exit Scam/Honeypot, saying the contract owner could disable the transfer function and so restrict users from selling. The verified source contains a transfer block built on a variable named newun: the first transferFrom records its recipient in newun, after which any transfer or transferFrom to that address reverts with "please wait".

The contract also has a payable getTokens airdrop function. It needs no BNB and gives each address one grant, and any BNB sent with the call stays in the contract until the owner withdraws it. 99% of the supply is minted to the owner at deployment.

The source alone does not show which address ended up in newun or whether any sale actually failed.

How it happened

  1. The constructor mints 99% of the supply to the deployer: totalDistributed = 990000000000000000000000; and balances[owner] = totalDistributed;, out of a _totalSupply of 1000000000000000000000000 raw units.
  2. transferFrom begins with if(from != address(0) && newun == address(0)) newun = to; else require(to != newun, "please wait");. While newun is still the zero address, the first transferFrom stores its recipient in newun. Liquidity added through a router is a transferFrom into the pair, so on a typical pool setup that recipient would be the pair; the code itself does not name the pair.
  3. After that, every later transferFrom whose recipient equals newun fails the else require(to != newun, "please wait") check, and transfer has the same guard: require(to != newun, "please wait");.
  4. A holder's sale through a router pulls tokens into the pair with transferFrom. If newun holds the pair address, that call reverts before balances[from] is reduced, so the holder keeps the tokens but cannot swap them back.
  5. The owner controls the block: transfernewun(address _newun) public onlyOwner sets newun to any address. Pointing it at an unused address lifts the block; setting it back to the zero address re-arms capture by the next transferFrom. Nothing in the source shows which address newun holds or that the owner called this function.
  6. The payable fallback function () external payable { calls getTokens();. getTokens is payable canDistr onlyWhitelist and has no msg.value requirement, so it can be called with or without BNB. It gives the caller value tokens, sets blacklist[investor] = true after a non-zero grant so that address cannot claim again, and then shrinks the grant by value = value.div(100000).mul(99999);. Any BNB sent with the call is not forwarded and stays in the contract.
  7. clearCNDAO() is onlyOwner and runs _owner.transfer(address(this).balance);, so the owner can withdraw BNB held by the contract.

Protocol details

Classification Token
Protocol Type Exit Scam/Honeypot
Affected asset / contract TMP

Build your security review skills

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