BullsDrop Honeypot
What happened
BullsDrop (BDROP) is a BEP20 token on BNB Smart Chain at 0x04c8f29b…566c9c. Its transfer and transferFrom functions reject any transfer whose recipient equals a stored address named newun. In transferFrom, the first call made while newun is empty stores that call's recipient as newun, and the owner can later change it with transfernewun.
A researcher's write-up of this same code pattern on other tokens describes newun being set to the liquidity pool address when liquidity is added, which blocks sells with a "please wait" error. De.Fi's REKT database lists BullsDrop as an Exit Scam/Honeypot and says the contract owner could disable the transfer function, which restricted users in selling their tokens. No transaction was opened that shows what newun held for this token, so the code is the evidence for how the block works.
How it happened
- The constructor sets
symbol = "BDROP",name = "BullsDrop",decimals = 0and_totalSupply = 1000000000, and credits the whole supply to the deployer withbalances[owner] = _totalSupply;. transferstarts withrequire(to != newun, "please wait");, so no direct transfer can end at thenewunaddress.transferFrombegins withif(from != address(0) && newun == address(0)) newun = to; else require(to != newun, "please wait");. Whilenewunis empty, the firsttransferFromcall skips the check, goes through, and stores its own recipient innewun. When tokens are added to a DEX pool through a router, the router moves them withtransferFrom, so the pool address is a natural recipient of that first call; the researcher's write-up describes exactly this for the pattern, and the code here does not show which address was stored.- After
newunis set, every latertransferFromandtransferto that address reverts with "please wait". A holder selling through a router would be sending to the pool withtransferFrom, so the sale reverts if the pool isnewun. The owner is not exempt from this check, and transfers to any other address still pass. - The owner can change the target at any time with
function transfernewun(address _newun) public onlyOwner { newun = _newun; }. Pointing it at an unused address lifts the block; setting it to the zero address makes the nexttransferFromrecipient becomenewunagain.Ownedhas no renounce function. clearCNDAOis owner-only and sends the contract's own native-coin balance to the owner:_owner.transfer(address(this).balance);.- What happened: De.Fi's REKT database lists this token as an Exit Scam/Honeypot dated 2021-04-25. No sale, liquidity or
transfernewuntransaction was opened, so none of those events is claimed.
Protocol details
Evidence
- report @Token_Sniffer incident report twitter.com
- report Sourcify copy of the verified source repo.sourcify.dev
- report De.Fi REKT database listing (proof link, tweet not retrievable) twitter.com
- address BscScan verified source, BullsDrop (BDROP) bscscan.com
- analysis BSC-SCAM: Stealthy Liquidity Pool Block (cryptot3ddybear) cryptot3ddybear.gitlab.io
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.