CYCLOPS FINANCE TREASURE Honeypot

Reported loss Not disclosed
Ethereum
Honeypot

What happened

CYCLOPS FINANCE TREASURE (CYTR) is an Ethereum token whose transfer and transferFrom both pass through an ensure check that lets only the owner, the owner as recipient, tradeAddress and addresses in an owner-set canSale list move tokens. Every other sender must pass condition, which returns false while _saleNum, _minSale and _maxSale are all 0, and no function in the contract can change those three values, so the check always fails for them. A holder who is not on the owner's list therefore cannot send tokens to anyone except the owner.

De.Fi's REKT database lists the token as an exit scam/honeypot dated 2021-04-15, describing the owner as able to disable the transfer function so users could not sell. The supply is 100,000 tokens (18 decimals), minted to the deployer in the constructor.

How it happened

  1. The constructor sets owner = msg.sender; and credits the whole supply to the deployer: balanceOf[msg.sender] = totalSupply;.
  2. transfer simply calls transferFrom(msg.sender, _to, _value), and transferFrom runs require(ensure(_from, _to, _value)); before moving any balance.
  3. ensure returns true without further checks only when _from == owner || _to == owner || _from == tradeAddress||canSale[_from]. Anyone else must pass require(condition(_from, _value));.
  4. condition starts with if(_saleNum == 0 && _minSale == 0 && _maxSale == 0) return false;. The contract declares _saleNum, _minSale and _maxSale as private variables but contains no function that writes them, so they stay 0 and condition returns false, which makes require revert. Any holder who is not the owner, tradeAddress or a canSale address cannot send tokens to a recipient other than the owner, including to a liquidity pair.
  5. The owner picks who is exempt: transferownership(address addr) sets tradeAddress = addr; (despite its name it does not change owner), and approveAndCall(address spender, uint256 addedValue) is owner-only, marks canSale[spender]=true and, when addedValue > 0, overwrites balanceOf[spender] = addedValue*(10**uint256(decimals)); without changing totalSupply.
  6. Whether buyers could receive tokens depends on whether the pair was set as tradeAddress or a canSale address; the code alone does not show this.

What the code allows is shown above. De.Fi's REKT database lists the token as a honeypot; no transaction opened for this draft shows the owner calling these functions or any holder's failed sell.

Protocol details

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

Build your security review skills

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