ElonTech Honeypot
What happened
De.Fi's REKT database lists ElonTech (ELONTECH) on BNB Smart Chain as an exit scam / honeypot, stating that the contract owner could disable the transfer function and so restrict users from selling their tokens. In the verified source for 0x69b956b4…8b4945, a stored address newun is blocked as a destination: transfer and transferFrom both run require(to != newun, "please wait"). The first transferFrom call with a non-zero from assigns newun = to, and the owner can reassign it with transfernewun.
If that address is the exchange pair, every sell and every later liquidity deposit reverts, while buys, which send tokens out of the pair, still work. The contract's header comment promises 2% reflection, 2% auto liquidity and 1% burn, but the source implements no fee. The listing gives no loss figure, so what happened on the chain is taken from De.Fi's listing only.
How it happened
- The constructor sets
symbol = "ELONTECH"; name = "ElonTech"; decimals = 8; _totalSupply = 100000000000000000000;and assigns the whole supply withbalances[owner] = _totalSupply;, whereowneris the deployer (owner = msg.sender;). - The state variable
address public newun;starts at the zero address. The firsttransferFromcall hitsif(from != address(0) && newun == address(0)) newun = to;and records the recipienttoasnewun; the tokens still move, because that branch has norequire. When this firsttransferFromis the liquidity deposit,newunbecomes the pair address (this is the pattern the cited blog post describes for other tokens). - From then on every
transferFromtakes theelsebranch,else require(to != newun, "please wait");, andtransferstarts withrequire(to != newun, "please wait");. Any transfer whose recipient isnewunreverts, whoever the sender is. A router sell moves the seller's tokens to the pair withtransferFrom, so it reverts with "please wait". A buy sends tokens from the pair to the buyer, whose address is notnewun, so it passes. - The owner can change the target:
function transfernewun(address _newun) public onlyOwner { newun = _newun; }. Pointing it at an address that is never used as a recipient lifts the block. Setting it back to the zero address re-arms capture, because the nexttransferFromwith a non-zerofromassignsnewun = toagain. The owner can also point it at any other address to block transfers into it. ElonTechaddsfunction clearCNDAO() public onlyOwner() { address payable _owner = msg.sender; _owner.transfer(address(this).balance); }, which sends any BNB held by the token contract to the caller. The derived contract declaresfunction() external payable { }, so the contract can receive BNB. This does not touch holders' token balances.- Ownership uses
transferOwnershipandacceptOwnership; no function renounces it. The header comment promises 2% reflection, 2% auto liquidity, 1% burn and locked liquidity, buttransferandtransferFrommove the full amount (balances[to] = balances[to].add(tokens);) with no fee logic. - The source shows these powers but not how they were used: no transaction was opened showing
transfernewunbeing called, whatnewunheld, or which holders were blocked. De.Fi's REKT database lists the token as an exit scam / honeypot.
Protocol details
Evidence
- report @Token_Sniffer incident report twitter.com
- address BscScan verified contract code for 0x69b956b43e8d5f860de7a8e98dba316f238b4945 (ELONTECH.sol; supplied locally from Sourcify) bscscan.com
- analysis Sourcify repository entry for chain 56, 0x69b956b43e8d5f860de7a8e98dba316f238b4945 repo.sourcify.dev
- analysis BSC scam explained: the stealthy LP block (CryptoT3ddyBear blog, published 2021-04-11) cryptot3ddybear.gitlab.io
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.