BITCOIN CONSUMPTION Honeypot
What happened
BITCOIN CONSUMPTION overrides transferFrom with a gate that reverts unless a flag called trans is on, or the deployer is the sender or recipient, or the sender is the token's own liquidity pair. trans starts false and only an address holding the minter role can change it. A DEX router sells by calling transferFrom(holder, pair, amount), which fails the gate for an ordinary holder.
The contract also has a renounceOwnership and a lockLiquidity function that only emit events. De.Fi's REKT database lists the token as an exit scam/honeypot in which the owner could disable the transfer function and restrict holders from selling; the contract is on BNB Smart Chain at 0x4c7c4de3…091baa.
How it happened
- The constructor sets the deployer as
moi, starts withtrans = false;, grants the deployer the admin, pauser and minter roles, and mints the whole supply of 1,000,000,000,000 tokens to the deployer. It also creates the token's pair with the hard-coded router at 0x05fF2B0D…608C7F and stores it asuniswapV2Pair. transferFromis overridden with a gate:require (trans || moi == sender || moi == recipient || sender == UNI);, whereUNIisuniswapV2Pair.- A sale through the router calls
transferFrom(holder, pair, amount)with the holder assenderand the pair asrecipient. Whiletransis false, none of the four conditions holds for an ordinary holder, so the call reverts. - Buys are not blocked by this gate: the pair is the
senderwhen it pays out through the router's swap, and plaintransferis not overridden. - Only
setTranschanges the flag:function setTrans(bool value) public { require(hasRole(MINTER_ROLE, msg.sender)); trans=value; }. The deployer holds that role from the constructor, so it can open or close selling. The same role can also callpiocher, which mints new tokens to any address, and the pauser role can freeze all transfers withpause(). - The functions that read like safety features do nothing:
renounceOwnership()only runsemit OwnershipRenounced(address(0), address(this));andlockLiquidity()only runsemit liquidityLocked(uniswapV2Pair, address(0));. Neither changes any roles or any liquidity.
The code allows this; no transaction was opened showing setTrans, piocher or pause being called, and no source reports how much holders lost.
Protocol details
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.