eGRID Honeypot
What happened
The deployed eGRID contract lets only the owner, transfers to the owner, transfers from tradeAddress and transfers from owner-whitelisted addresses go through. Every other transfer reaches condition, which returns false when _saleNum, _minSale and _maxSale are all zero, and the source contains no function that sets them, so those transfers revert. A holder's sell therefore fails unless the owner has whitelisted that holder.
The owner controls the exceptions through transferownership (which sets tradeAddress) and approveAndCall (which whitelists an address and overwrites its balance). De.Fi's REKT database lists the token as an exit scam/honeypot dated 2021-04-10 and says the owner could disable the transfer function, which restricted users in selling their tokens; it gives no loss figure.
How it happened
- The constructor sets
owner = msg.senderand gives the deployer the whole supply:totalSupply = _supply*(10**uint256(decimals));balanceOf[msg.sender] = totalSupply;. A current-state read on 2026-09-30 shows 50,000 tokens at 18 decimals. transferjust callstransferFrom(msg.sender, _to, _value). A zero value returns true, and whenmsg.sender != _fromthe allowance is checked and reduced.transferFromthen runsrequire(ensure(_from, _to, _value));.ensurereturns true at once forif(_from == owner || _to == owner || _from == tradeAddress||canSale[_from]){, so anyone can send tokens to the owner, and the owner,tradeAddressand whitelisted addresses can send anywhere.- For every other sender
ensurerunsrequire(condition(_from, _value));, andconditionstarts withif(_saleNum == 0 && _minSale == 0 && _maxSale == 0) return false;. Those three variables are declaredprivatewith no assignment anywhere in the source, so they stay 0,conditionreturns false and the transfer reverts. The later per-address count, minimum and maximum checks inconditioncan never be reached. - A holder who sells through a router sends tokens from the holder's address to the pair. That sender is not the owner, not
tradeAddressand not whitelisted, so the sell reverts. Whether transfers out of the pair succeed depends on whether the pair address istradeAddressor whitelisted, which the code does not show. - The owner sets the exceptions.
transferownership(address addr)ismsg.sender == owneronly and doestradeAddress = addr;; despite its name it does not changeowner, and the source has no function that does.approveAndCall(address spender, uint256 addedValue)is owner-only and doesbalanceOf[spender] = addedValue*(10**uint256(decimals));andcanSale[spender]=true;, which overwrites that address's balance without changingtotalSupplyand has no matching way to remove the whitelist entry. The source header comment says the mint function is inaccessible; this balance setter is the code that sets balances. The source shows what these functions allow, not whether they were called.
Protocol details
Evidence
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.