NeptuneWallet Honeypot

Reported loss Not disclosed
BNB Chain
Honeypot

What happened

NeptuneWallet (NEW) is a BEP20 token with an owner-controlled tracing switch. When tracing is true, the first transferFrom call stores its recipient in nxOwner, and from then on transfer and transferFrom revert for that recipient. If that address is a trading pair, sells revert while buys from the pair are unaffected.

The owner can turn tracing off and on, and emitTransfer lets the owner add to its own balance without raising totalSupply. De.Fi's REKT database lists the token as an Exit Scam/Honeypot and says the contract owner could restrict users from selling. An opened Token Sniffer post from 2021-05-05 describes this kind of LP-address block in other tokens and predates this deployment.

How it happened

  1. The constructor sets symbol = "NEW", assigns the full 1000000000000000000000 raw supply to the owner and then calls transfer(dead, burnedAmount) for 500000000000000000000 raw units, sending half the supply to 0x00000000…00dEaD.
  2. tracing starts as false (bool tracing = false;), so at first the checks do nothing. Only setTracing(bool _tracing) onlyOwner changes it.
  3. With tracing on, transferFrom runs if(from != address(0) && nxOwner == address(0)) nxOwner = to; else require(to != nxOwner, "Order ContextHandler");. The first transferFrom after that stores its recipient in nxOwner. The source does not show which address that was.
  4. From then on transferFrom and transfer (require(to != nxOwner, "Handling Request")) revert for any call whose recipient is nxOwner, with no exemption for the owner. If nxOwner is a pair, a sell, which makes the router call transferFrom(holder, pair, amount), reverts, while a buy, where the pair is the sender, is not blocked. There is no function that changes nxOwner, but setTracing(false) switches the check off and setTracing(true) switches it back on.
  5. onlyOwner accepts msg.sender == owner || msg.sender == nxOwner, so the captured address also satisfies the owner check.
  6. emitTransfer(uint256 _input) onlyOwner runs balances[msg.sender] = balances[msg.sender] + (_input); with no overflow check and no change to _totalSupply, so the owner can add to its own balance at will. The source alone does not show whether this was done.
  7. renounceOwnership(address _newOwner) has no access check and only writes currentOwner, which no other code reads, so it does not remove or transfer the owner role.
  8. What happened on-chain (sell attempts, liquidity removal, losses) was not established by the opened sources. De.Fi's REKT database lists the token as a honeypot.

Protocol details

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

Build your security review skills

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