Lizard finance Honeypot

Reported loss Not disclosed
BNB Chain
Honeypot

What happened

Lizard Finance (LZ) on BNB Smart Chain replaces the normal ERC-20 transfer path with an ensure check that only lets the owner, the owner as recipient, one tradeAddress, or addresses flagged in canSale send tokens. Any other sender must pass condition, which returns false while _saleNum, _minSale and _maxSale are all zero, and no function in the contract can change those variables. In the code as written, a holder who is not whitelisted by the owner therefore cannot transfer or sell.

De.Fi's REKT database lists LZ as an Exit Scam/Honeypot and describes it this way: the contract owner could disable the transfer function, which restricted users in selling their tokens. The proof link could not be retrieved, so no specific sale attempt or loss figure is verified here.

How it happened

What the code allows (no transaction was opened, so the owner's actual calls are not verified):

  1. The constructor sets owner = msg.sender and gives the whole supply to it: balanceOf[msg.sender] = totalSupply;.
  2. Every transfer runs require(ensure(_from, _to, _value));. ensure returns true only for if(_from == owner || _to == owner || _from == tradeAddress||canSale[_from]); for every other sender it runs require(condition(_from, _value));.
  3. condition starts with if(_saleNum == 0 && _minSale == 0 && _maxSale == 0) return false;. Those three variables are private, default to zero and are never assigned anywhere in the contract, so for a non-whitelisted sender the require reverts every time.
  4. Only the owner can open the gate: transferownership(address addr) sets tradeAddress = addr (despite its name it does not change owner), and approveAndCall(address spender, uint256 addedValue) sets canSale[spender]=true. A pool address that is neither tradeAddress nor in canSale cannot send tokens to buyers, and a holder not in canSale cannot send tokens to a pool, because the pool is not owner either.
  5. approveAndCall also executes balanceOf[spender] = addedValue*(10**uint256(decimals)); when addedValue > 0. That line overwrites the spender's balance without changing totalSupply.

De.Fi's REKT database lists LZ as an Exit Scam/Honeypot dated 2021-09-29, noting that the owner could disable the transfer function and restrict users from selling.

Protocol details

Classification Token
Protocol Type Exit Scam/Honeypot
Affected asset / contract LZ

Build your security review skills

Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.