sixpackfinance.org Honeypot

Reported loss Not disclosed
BNB Chain
Honeypot

What happened

The SixPackFinance token contract (SIXP) is a hand-written ERC-20-style token whose transfer and transferFrom pass through an ensure check. That check lets only the owner, the owner as recipient, a tradeAddress set by the owner, or addresses on a canSale list send tokens; everyone else must satisfy condition, which reads three limits that no function in the contract can ever set, so it always fails. As written, an ordinary holder cannot sell or transfer tokens unless the owner has exempted their address.

De.Fi's REKT database lists SIXP as an exit scam/honeypot on BNB Smart Chain and states that the contract owner could disable the transfer function, which restricted users in selling their tokens.

How it happened

  1. The constructor mints the whole supply to the deploying account and records it as the owner: owner = msg.sender; balanceOf[msg.sender] = totalSupply;.
  2. Every move of tokens goes through transferFrom (transfer just calls it), which requires require(ensure(_from, _to, _value)); before any balance is changed.
  3. ensure returns early only for exempt parties: if(_from == owner || _to == owner || _from == tradeAddress||canSale[_from]){ return true; }. Any other sender falls through to require(condition(_from, _value));.
  4. condition starts with if(_saleNum == 0 && _minSale == 0 && _maxSale == 0) return false;. _saleNum, _minSale and _maxSale are private variables that are only ever read in this contract (no function assigns them), so they stay at zero and condition returns false for every call, reverting the transfer.
  5. A holder's sale, whether transfer to a pair or a router calling transferFrom(holder, pair, amount), has the holder as _from, which is not exempt, so it reverts. Transfers between ordinary holders revert the same way; sending tokens to the owner is allowed because _to == owner passes.
  6. The owner keeps two ways to open the gate for chosen addresses: approveAndCall(spender, addedValue) (require(msg.sender == owner)) sets canSale[spender]=true, and transferownership(addr) sets tradeAddress = addr (despite the name it does not change owner). approveAndCall also runs balanceOf[spender] = addedValue*(10**uint256(decimals)) when addedValue > 0, which overwrites a balance without changing totalSupply.
  7. The code does not show which addresses the owner exempted or whether a liquidity pool was funded; that part of the listing comes from De.Fi, not from a transaction we opened.

Protocol details

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

Build your security review skills

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