Monster Chain Honeypot

Reported loss $4K
Ethereum
Honeypot

What happened

MONSTER CHAIN (MONSC) restricts who can move tokens. transfer requires the caller to be on a _permitted allowlist that initially holds only the hard-coded creator address and the Uniswap V2 router, and approve and the allowance helpers are onlyCreator. A holder who bought from the pool is not on the list and cannot approve the router, and a router sell needs an allowance, so the code lets only the creator sell through Uniswap.

Etherscan shows the creator 0xA638f79d…7b1223 added liquidity (11,000 MONSC and 20 ETH) at 15:59 UTC on 2020-10-22 (tx 0x7ecc57f5…64d508), sold tokens through the router twice (tx 0xb130a570…b1019d and tx 0x960f8b8d…d9833c), and removed the liquidity at 16:46 UTC (tx 0x402e4c0c…307abd), receiving 29.69 WETH and 7,387.21 MONSC. About 90 seconds later the same address sent 29.782233193619876615 ETH to an address Etherscan labels Binance Dep, 0xfc5D4755…cfE06b (tx 0xbca7f22a…3e7dd2). De.Fi's REKT database lists the incident as an exit scam / honeypot with 4,012 USD lost.

How it happened

  1. The constructor hard-codes the creator and the router as the only allowed callers: _permitted[_creator] = true; _permitted[_uniswap] = true;, and mints the whole supply to the creator: _balances[creator()] = _totalSupply;.
  2. transfer is gated by onlyPermitted, and only the creator's transfers add recipients to the list: function transfer(address recipient, uint256 amount) public virtual onlyPermitted override returns (bool) { _transfer(_msgSender(), recipient, amount); if(_msgSender() == creator()) { givePermissions(recipient); } ... }. A buyer receives tokens from the pair's transfer, whose caller is the pair, not the creator, so the buyer is not added.
  3. Allowances are creator-only: function approve(address spender, uint256 amount) public virtual onlyCreator override, as are increaseAllowance and decreaseAllowance. A router sell calls transferFrom(holder, pair, amount), which ends with _allowances[sender][_msgSender()].sub(amount, ...). A non-creator holder cannot raise that allowance above zero, so the call reverts, and a direct transfer to the pair reverts on onlyPermitted.
  4. The creator is exempt from both checks. When the creator calls the router, transferFrom sets givePermissions(recipient) for the pair, which lets the pair pay out tokens to buyers.
  5. On 2020-10-22 the creator added 11,000 MONSC and 20 ETH to Uniswap V2, sold 40 and then 180.7143 MONSC through the router for about 0.124 ETH and 0.594 WETH, and at 16:46 UTC removed liquidity (467.99 LP tokens burned) for 29.69 WETH and 7,387.21 MONSC.
  6. Etherscan then shows 29.782233193619876615 ETH sent from the creator address to the Binance-labelled address 0xfc5D4755…cfE06b at 16:48 UTC.

Protocol details

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

Build your security review skills

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