Pera Finance Honeypot
What happened
Pera Finance ($Pera) is a BEP-20 token on BNB Smart Chain, deployed from 0xded51b18…bF537e at contract address 0xcb0ff1a8…f74a38. The source file opens with a comment describing a yield-farming protocol, but the contract itself contains only a token and an owner BNB-withdrawal function, with no staking or reward logic. Its transfer and transferFrom functions use a variable, newun, that records the first address to receive tokens through transferFrom and then rejects every later transfer to that address with the message "please wait".
A trading pool receives tokens whenever someone sells, so once the pool address is captured, selling reverts while buying (tokens leaving the pool) is not checked. De.Fi's REKT database lists the token as an Exit Scam/Honeypot in which the contract owner could disable the transfer function, restricting users from selling; it gives no loss figure and no transaction hashes.
How it happened
- The constructor sets
symbol = "$Pera",name = "Pera Finance",decimals = 8and_totalSupply = 1000000000000000000, i.e. 10 billion tokens, and assigns all of it tobalances[owner]. The owner is the deployer:Ownedsetsowner = msg.sender. transferFromrunsif(from != address(0) && newun == address(0)) newun = to; else require(to != newun, "please wait");. The firsttransferFromwith a non-zero sender therefore stores its recipient innewunwithout any check. A router-based liquidity add moves the owner's tokens to the pool withtransferFrom, so the pool can becomenewunthis way (the code allows this; the on-chainnewunvalue was not read).- From then on every
transferFromwhose recipient equalsnewunreverts, because theelsebranch requiresto != newun. A sell through a router callstransferFrom(seller, pool, amount), so it fails for every holder.transferhas the same guard:require(to != newun, "please wait");. - Buys are not affected by this check: the pool pays buyers with
transfer(buyer, amount), and the guard only tests the recipient againstnewun. Holders can therefore acquire tokens that they cannot sell back through the pool. - The owner can call
transfernewun(address _newun)(onlyOwner) to overwritenewun. Setting it toaddress(0)makes the nexttransferFromrecipient be captured again, so the block re-arms; only pointing it at an address that is not the pool lifts it. The only ownership functions aretransferOwnershipandacceptOwnership; there is norenounceOwnership. clearCNDAO()(onlyOwner) sends the contract's own BNB balance to the owner, and the contract has a payable fallback. This does not touch holders' tokens or the pool.- What happened on chain is not established here: no sell transactions, liquidity removal or owner calls were opened. Only De.Fi's REKT database listing states that selling was restricted.
Protocol details
Evidence
- report De.Fi REKT database listing for $Pera (as imported in the job meta) twitter.com
- address BscScan verified source code, Pera Finance ($Pera) bscscan.com
- analysis Scam explained: BSC stealthy LP block cryptot3ddybear.gitlab.io
- analysis Sourcify repository entry, chain 56 contract 0xcb0ff1a87deffbe315b8084c3aa708f5d8f74a38 repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.