ValentineFloki Honeypot
What happened
ValentineFloki (ValentineFloki, 9 decimals, 1 trillion fixed supply, BNB Smart Chain) lets any whitelisted wallet blacklist holders, and a blacklisted holder's sales to the PancakeSwap pair revert with !Bot. De.Fi's REKT database lists the project as blacklisting its users from selling and then draining the project, netting the deployer about $50k (listed loss $50,830); it also states that the project deleted its online presence, the token no longer trades, and it should not be confused with other active projects of the same name. According to that listing, the deployer 0x3e92eb09…4e5c70 added initial liquidity pairing the token with BNB (the listing gives the amount as 97) in transaction 0x3df36656…b795fe, blocked transfers by blacklisting users (the listing points to the deployer's transaction list, Source), and finally removed the liquidity in transaction 0xf87d78d8…93d88f.
The token code has no function that holds or withdraws LP tokens, so the liquidity removal is a pair action that the source ties to the deployer only through the listing.
How it happened
What the code allows:
- The constructor gives the whole supply to the deployer and whitelists the owner:
_balances[_msgSender()] = _tTotal;and_isWhitelisted[owner()] = true;. There is no mint function, andtradingOpenstarts as false. - Transfers where neither side is whitelisted are gated:
if (!_isWhitelisted[sender] && !_isWhitelisted[recipient]) {thenrequire(tradingOpen);.function openTrading(bool trueFalse) public onlyOwnersets that flag, so the owner can close trading for every non-whitelisted wallet.swapEnabledis set to true in the constructor and has no setter, sorequire(sender == uniswapV2Pair || recipient == uniswapV2Pair);always applies and non-whitelisted wallets can only trade with the pair. - On a sale (
recipient == uniswapV2Pair) the code runsrequire(!_isBlacklisted[sender], "!Bot");andrequire(!_isBlacklisted[_msgSender()], "!Bot");. Through a router,senderis the holder and_msgSender()is the router, so a blacklisted holder cannot sell and a blacklisted router would block every seller. Buys come from the pair (sender == uniswapV2Pair) and skip these checks, so a blacklisted wallet can still buy. The list is edited byfunction modifyBlacklist(address[] calldata wallet, bool trueFalse) external onlyWhitelist, so the owner or any wallet the owner has whitelisted can set it. - Balances move by exactly
amountwith no fee (_balances[sender] = _balances[sender].sub(amount);), so a blacklisted holder keeps a balance that cannot be sold while the pool still pays out to others.
, as listed by De.Fi's REKT database: 5. The deployer added initial liquidity with BNB, blacklisted users so they could not sell, and then removed the liquidity. The listing does not name how many wallets were blacklisted, and the blacklist calls were not opened in this review.
Protocol details
Evidence
- transaction bscscan.com transaction 0x3df3…95fe bscscan.com
- transaction bscscan.com transaction 0xf87d…d88f bscscan.com
- address BscScan verified source for ValentineFloki (0xad251be465c332509da45071ca7b9bb09d0fb0c3) bscscan.com
- address bscscan.com address 0x3e92…5c70 bscscan.com
- analysis Web Archive web.archive.org
- analysis Sourcify repository entry for the same contract repo.sourcify.dev
- analysis De.Fi REKT database listing for ValentineFloki de.fi
- analysis bscscan.com page txs bscscan.com
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.