DOGEMASK Honeypot
What happened
DOGEMASK is a BNB Smart Chain token (contract 0x544c2c5a…ad9c20). The first check inside its _transfer function is require(tx.origin == to || tx.origin == owner());, so a transfer goes through only when the transaction was started by the contract owner or when the tokens are sent to the very account that started the transaction. A sale through a DEX router pulls tokens with transferFrom(holder, pair, amount), so the recipient is the pair and not the holder, and the check reverts for every holder other than the owner.
De.Fi's REKT database lists the token as an Exit Scam/Honeypot and states that the contract owner could disable the transfer function, which restricted users in selling their tokens.
How it happened
- The constructor gives the whole supply to the deployer (
_rOwned[_msgSender()] = _rTotal;, with_tTotal = 1000 * 10**6 * 10**9, which is 1,000,000,000 tokens at 9 decimals) and creates the trading pair through the hard-coded router address 0x10ED43C7…56024E. - Every transfer, including
transferFrom, runs through_transfer, which containsrequire(tx.origin == to || tx.origin == owner());with no revert message. - A buy passes the check: the pair pays out with
transfer, the recipienttois the buyer, andtx.originis the buyer's own account. - A sale by any holder other than the owner reverts: the router calls
transferFrom(holder, pair, amount), sotois the pair,tx.originis the holder, and neither side of the||is true. Sending tokens to another wallet fails the same way. - Only transactions started by
owner()can move tokens to an arbitrary recipient. No function in the contract changes or removes the condition; the exemption simply followsowner(), whichtransferOwnershipcan reassign andrenounceOwnershipsets to the zero address. - The owner has further levers.
setTaxFeePercentandsetliquidityFeePercenthave no cap, and_getTValuescomputestAmount.sub(tFee).sub(tLiquidity), so combined fees up to 100% of a transfer are accepted while the sender is still debited the fullrAmount.setMaxTxPercentsets_maxTxAmount = _tTotal.mul(maxTxPercent).div(10**2)with no lower bound, andif(from != owner() && to != owner() && !swapAndLiquifyEnabled) require(amount <= _maxTxAmount)applies it to every transfer that does not involve the owner oncesetSwapAndLiquifyEnabled(false)is called. - What happened is known only from the listing: De.Fi's REKT database classifies the token as an Exit Scam/Honeypot and does not give a loss figure. No transaction or holder report was opened to show the owner calling any of these functions.
Protocol details
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.