TeslaModelS Plaid 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
- The constructor mints 99% of the supply to the deployer:
totalDistributed = 990000000000000000000000;andbalances[owner] = totalDistributed;, out of a_totalSupplyof 1000000000000000000000000 raw units. transferFrombegins withif(from != address(0) && newun == address(0)) newun = to; else require(to != newun, "please wait");. Whilenewunis still the zero address, the firsttransferFromstores its recipient innewun. Liquidity added through a router is atransferFrominto the pair, so on a typical pool setup that recipient would be the pair; the code itself does not name the pair.- After that, every later
transferFromwhose recipient equalsnewunfails theelse require(to != newun, "please wait")check, andtransferhas the same guard:require(to != newun, "please wait");. - A holder's sale through a router pulls tokens into the pair with
transferFrom. Ifnewunholds the pair address, that call reverts beforebalances[from]is reduced, so the holder keeps the tokens but cannot swap them back. - The owner controls the block:
transfernewun(address _newun) public onlyOwnersetsnewunto any address. Pointing it at an unused address lifts the block; setting it back to the zero address re-arms capture by the nexttransferFrom. Nothing in the source shows which addressnewunholds or that the owner called this function. - The payable fallback
function () external payable {callsgetTokens();.getTokensispayable canDistr onlyWhitelistand has nomsg.valuerequirement, so it can be called with or without BNB. It gives the callervaluetokens, setsblacklist[investor] = trueafter a non-zero grant so that address cannot claim again, and then shrinks the grant byvalue = value.div(100000).mul(99999);. Any BNB sent with the call is not forwarded and stays in the contract. clearCNDAO()isonlyOwnerand runs_owner.transfer(address(this).balance);, so the owner can withdraw BNB held by the contract.
Protocol details
Evidence
- report De.Fi REKT database listing (proof link: Token Sniffer post) twitter.com
- address BscScan verified source, TeslaModelS Plaid (TMP) bscscan.com
- analysis Scam explained: BSC stealthy LP block (CryptoT3ddyBear blog) cryptot3ddybear.gitlab.io
- analysis Sourcify copy, TeslaModelS Plaid repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.