GoalTimeN Finance Honeypot

Reported loss Not disclosed
Ethereum
Honeypot

What happened

De.Fi's REKT database lists GoalTimeN Finance (GTX) on Ethereum as an exit scam/honeypot and states 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 ensure, which lets a transfer through only when the sender is the owner, the recipient is the owner, the sender is tradeAddress, or the sender is flagged in canSale. Every other sender falls through to condition, which returns false while _saleNum, _minSale and _maxSale are all zero, and the file contains no function that sets them.

As written, an ordinary holder can send tokens only to the owner address, so a sale into a liquidity pool reverts. Only the owner can exempt an address, through approveAndCall or transferownership. The code does not show whether or when the owner used those functions.

How it happened

  1. The constructor gives the deployer the whole supply and records it as the owner: owner = msg.sender; and balanceOf[msg.sender] = totalSupply;.
  2. transfer forwards to transferFrom, and transferFrom calls require(ensure(_from, _to, _value)); before moving any balance.
  3. ensure returns early only for if(_from == owner || _to == owner || _from == tradeAddress||canSale[_from]){ return true; }. Any other sender must pass require(condition(_from, _value));.
  4. condition starts with if(_saleNum == 0 && _minSale == 0 && _maxSale == 0) return false;. These three variables are private and are never assigned anywhere in the file, so the check always fails for non-exempt senders. A holder who sells to a pool, directly or through a router, is the _from address and reverts; the one destination that still works is the owner address.
  5. Exemptions are owner-only: approveAndCall sets canSale[spender]=true, and transferownership (which does not change owner, despite its name) sets tradeAddress = addr;. A transfer whose sender is a liquidity pool also hits ensure, so it passes only if the owner has exempted that address.
  6. approveAndCall also writes balanceOf[spender] = addedValue*(10**uint256(decimals));, which sets a balance directly without a transfer or a change to totalSupply.
  7. The file has no function that changes or renounces owner.

Protocol details

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

Build your security review skills

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