JAGUAR Honeypot
What happened
De.Fi's REKT database lists JAGUAR (BNB Chain, contract 0x7f916bc9…39bb90) as an Exit Scam/Honeypot and says the contract owner could disable the transfer function, which restricted users in selling their tokens. The verified source overrides transferFrom so that, while the trans flag is false (its value set in the constructor), the call succeeds only if the sender or recipient is moi (the deployer) or the sender is the liquidity pair. A holder selling through the router, which moves the holder's tokens with transferFrom, therefore reverts until an account holding MINTER_ROLE calls setTrans(true).
The same role-holders can also pause every transfer and mint more tokens through piocher, and the functions named renounceOwnership and lockLiquidity only emit events and change no state.
How it happened
- The constructor sets
moi = _msgSender();andtrans = false;, grantsDEFAULT_ADMIN_ROLE,PAUSER_ROLEandMINTER_ROLEto the deployer, mints1000000000000 * 10 ** decimals()to it, and creates the token's pair through the factory of the router at 0x05fF2B0D…608C7F. transferFromis overridden withrequire (trans || moi == sender || moi == recipient || sender == UNI);, whereUNIisuniswapV2Pair. Whiletransisfalse, a call is allowed only when the deployer is on either side or the pair is the sender.- A holder selling into the pair through the router makes the router call
transferFrom(holder, pair, amount). Heretransisfalse, the holder is notmoi, the recipient is the pair rather thanmoi, and the sender is not the pair, so therequirefails and the call reverts with no message.transferis not overridden. setTrans(bool value)requireshasRole(MINTER_ROLE, msg.sender)and setstrans=value, so the role-holder alone decides when the restriction is lifted or re-applied.pause()requiresPAUSER_ROLEand_beforeTokenTransferis declaredwhenNotPaused, so a pause blocks every transfer, mint and burn.piocher(address to, uint256 amount)requiresMINTER_ROLEand calls_mint(to, amount), so supply can be increased after deployment.renounceOwnership()contains onlyemit OwnershipRenounced(address(0), address(this));andlockLiquidity()contains onlyemit liquidityLocked(uniswapV2Pair, address(0));. Neither changes roles or locks anything, although the events suggest otherwise.
Protocol details
Evidence
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.