PangeaOceanCleaunUp Honeypot

Reported loss Not disclosed
BNB Chain
Honeypot

What happened

PangeaOceanCleaunUp (PANGEA) is a BNB Smart Chain reflection token with a hard-coded condition in _transfer: require(tx.origin == to || tx.origin == owner());. A holder selling through a router starts the transaction from their own wallet, but the token's recipient is the pool pair, so the condition fails and the sell reverts. Buying keeps working when the buyer receives the tokens at the same address that sent the transaction.

Because it is hard-coded, the condition is not an owner switch, and renouncing ownership would not remove it. De.Fi's REKT database lists the token as an exit scam/honeypot and says the contract owner could disable the transfer function, which restricted users in selling their tokens. No transaction or holder data was opened for this token, so the code shows how sells fail, not what was done with liquidity.

How it happened

  1. The constructor gives the whole reflected supply to the deployer, creates the pair with the router at 0x10ED43C7…56024E and exempts the owner from fees: _rOwned[_msgSender()] = _rTotal;, uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());, _isExcludedFromFee[owner()] = true;. The supply is 100000 * 10**6 * 10**9, which is 100 billion tokens with 9 decimals.
  2. Every transfer and transferFrom reaches _transfer, which contains require(tx.origin == to || tx.origin == owner()); with no revert message.
  3. A sell through a router calls transferFrom(holder, pair, amount). tx.origin is the holder, to is the pair and owner() is someone else, so the condition is false and the transaction reverts. The holder's tokens stay in their wallet because the revert happens before _tokenTransfer. The same check stops a holder sending tokens to any address other than their own.
  4. A buy works when the pair pays out to the address that signed the transaction, because to equals tx.origin. Transactions signed by the owner pass for any recipient through tx.origin == owner(), so the owner can sell or move tokens.
  5. renounceOwnership() exists, but it would only set owner() to the zero address and remove the owner's bypass; the tx.origin == to condition stays. A latest-block owner read recorded in the evidence metadata (2026-09-30) returns the deployer address 0x1feab2a0…09856d.
  6. The owner also holds uncapped fee setters: function setTaxFeePercent(uint256 taxFee) external onlyOwner() { _taxFee = taxFee; } and setliquidityFeePercent, plus setMaxTxPercent, which has no lower bound and takes effect when swapAndLiquifyEnabled is false (if(from != owner() && to != owner() && !swapAndLiquifyEnabled) require( (amount <= _maxTxAmount) ...). These are additional powers the code allows; no source shows them being used.

Protocol details

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

Build your security review skills

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