Monster Chain 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
- 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;. transferis gated byonlyPermitted, 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'stransfer, whose caller is the pair, not the creator, so the buyer is not added.- Allowances are creator-only:
function approve(address spender, uint256 amount) public virtual onlyCreator override, as areincreaseAllowanceanddecreaseAllowance. A router sell callstransferFrom(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 directtransferto the pair reverts ononlyPermitted. - The creator is exempt from both checks. When the creator calls the router,
transferFromsetsgivePermissions(recipient)for the pair, which lets the pair pay out tokens to buyers. - 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.
- Etherscan then shows 29.782233193619876615 ETH sent from the creator address to the Binance-labelled address 0xfc5D4755…cfE06b at 16:48 UTC.
Protocol details
Evidence
- transaction Etherscan transaction 0x7ecc57f57b7fa56179a7461a415b8b3945a75db18c4f8a21fcf0eb0db364d508 etherscan.io
- transaction Etherscan transaction 0xb130a570450d55b49e21fe12b72c3faf7a5b944a204fd298cd824c1f67b1019d etherscan.io
- transaction Etherscan transaction 0x960f8b8d4118407c309e2bcb1ee43ed6350aa2505f5f25c065a1ee493cd9833c etherscan.io
- transaction Etherscan transaction 0x402e4c0cccd533d193ae455bb53e3faa4e118e5a3f08ba00975cb4f461307abd etherscan.io
- transaction Etherscan transaction 0xbca7f22adeb65eca028e1c20c37b1a66436f5827258808a6daeb4209413e7dd2 etherscan.io
- address MONSTER CHAIN (MONSC) verified source on Etherscan etherscan.io
- analysis Sourcify match for 0x8AAd244F0B3837D8bF9cC66a7682d26292F26ed6 repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.