rock solid Vaults Honeypot
What happened
De.Fi's REKT database lists rock solid Vaults (RSV, BNB Smart Chain, contract 0xe9a063e3…e3c983) as an exit scam/honeypot, stating that the contract owner could disable the transfer function, which restricted users in selling their tokens. In the verified source, every transfer and transferFrom runs through a burnTokenCheck modifier. For an ordinary holder who the owner has not whitelisted, a transfer to any address other than the hard-coded _unirouter (0x9B087bC3…6F4403) or the owner reverts with a message that reads like a balance error.
The owner can also whitelist or blacklist holders, change the exempt _safeOwner address, and mint new supply to itself. The code shows what the owner can do; this draft cites no transaction showing which of these powers were used.
How it happened
- The constructor stores the
ownerargument as both_ownerand_safeOwnerand calls_mint(_owner, initialSupply*(10**18))._mintrequiresmsg.sender == _owner, so the deployment can only succeed ifowneris the deployer, 0x444ff12F…cf9400. No function in the contract reassigns_owner. transferandtransferFromboth call_approveCheck(sender, recipient, amount), which is declared with theburnTokenCheck(sender,recipient,amount)modifier. The balance is only debited inside the modifier body, so a revert leaves the holder's balance untouched.- Privileged paths pass. While
_owner == _safeOwner, any transfer sent by the owner passes and resets_safeOwnerto the recipient (if (_owner == _safeOwner && sender == _owner){_safeOwner = recipient;_;}). After that,if (sender == _owner || sender == _safeOwner || recipient == _owner)lets the owner, the_safeOwneraddress, and anyone sending to the owner through. An owner-to-owner transfer in that branch sets_sellAmount = amount. - Whitelisted senders pass unconditionally (
if (_whiteAddress[sender] == true){ _; }). - Every other holder hits one of two paths. A blacklisted sender, or an unlisted sender whose
amountis not below_sellAmount, must satisfyrequire((sender == _safeOwner)||(recipient == _unirouter), "ERC20: transfer amount exceeds balance"). Because_sellAmountstarts at 0,amount < _sellAmountis false for every amount until the owner sets it, so such a holder can only send to_unirouter(or to the owner, handled in step 3). A transfer to any other address, including a trading pair, reverts. Whenamount < _sellAmountdoes hold, the transfer passes, and ifrecipient == _safeOwnerthe sender is added to_blackAddress. - The owner-only functions control who falls into which group.
increaseAllowance(address[])whitelists and un-blacklists,addApprove(address[])blacklists and un-whitelists,decreaseAllowance(address safeOwner)replaces_safeOwner, andmultiTransferwhitelists the firstapprovecountreceivers and approves_unirouterfor the maximum amount. The names suggest allowance helpers; the bodies do not do that. _mintispublicand owner-only. It addsamountto_totalSupplyand credits_balances[_owner], so the owner can create supply at any time.- What happened: De.Fi's REKT database lists the token as an exit scam/honeypot where holders were restricted from selling. The proof link could not be opened, and no transaction is cited here for a blacklist entry, a mint, or a liquidity removal.
Protocol details
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.