BraveHeart TOKEN Honeypot
What happened
De.Fi's REKT database lists BraveHeart TOKEN (BRVHRT, BNB Smart Chain, contract 0x03b9ab48…d14078) as an Exit Scam/Honeypot dated 2021-05-22 and says the owner could disable transfers so holders could not sell. In the verified source, _transfer reverts for every sender other than the owner and a stored pancake address while the TIME flag is true. The revert text claims a "1 Sale PER 30 MIN" limit, but the code contains no time comparison, and TIME is true by default.
Only the owner can switch it off.
How it happened
bool private TIME = true;is set at deployment, and the whole supply is minted to the deployer in the constructor with_mint(msg.sender, 1000000000000000e18);.- The
pancakevariable (address public pancake;) is never set in the constructor. Two paths write to it, and both depend on the owner. Inside_transfer,if(sender == owner()){ pancake = recipient; }overwrites it with the recipient of every transfer the owner sends. The owner can also set it directly withfunction addPancake (address input) public onlyOwner { pancake = input; }. So the code does not say which addresspancakeholds; it is whichever address the owner last sent tokens to or last passed toaddPancake, and the owner can repoint it at will. - The next check is
if(sender != owner() && recipient != owner() && sender != pancake && TIME == true){ revert("FOR VALUE PROTECTION, YOU CAN ONLY SELL 1 Sale PER 30 MIN"); }. Any transfer between two non-owner addresses where the sender is notpancakereverts, whatever the amount and whenever the sender last transferred. A holder selling to a pair (sender is the holder, recipient is the pair) hits this revert unless the holder is the owner orpancake. Transfers whose sender ispancake, such as buys ifpancakeis the pair, are not blocked by this check. - The
transDatatimestamps written bysaveTransDataare never compared against the current time, so the message does not describe a rate limit. - Only the owner can lift the block:
function setTIME (bool _bool) public onlyOwner { TIME = _bool; }. The owner also hasGTYA(address, bool), which flags an address asbotso thatrequire(amount <=0, "bots......")makes every transfer from it revert, andfire(uint256)/POOL(address, bool)/setBAR(bool)to cap the size of transfers to flagged recipients (default cap10000e18). setFeecapstxFeeat 100 out of 1000, i.e. 10%; the default is 0. A fee is taken from the recipient's side (amount.sub(fee)credited) while the sender is debited the fullamount.- Whether the owner called any of these functions is not shown without a transaction. At the 2026-09-30 read,
ownerin meta.json is still the deployer address, so ownership had not been renounced.
Protocol details
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.