The Crypto Prophecies Honeypot
What happened
This record covers an Ethereum token at 0xd19ffe68…9654a7, created on 25 April 2021, that uses the name The Crypto Prophecies and the symbol TCP. It is a separate contract from the project's official TCP token, which Etherscan labels at 0x06576eb3…f66db4 with a different deployer. Every transfer and transferFrom on the record's contract passes through a burnTokenCheck modifier that lets through the owner, a second privileged address called _safeOwner, and owner-whitelisted wallets, but requires every other sender to be _safeOwner or to send to the Uniswap V2 router address.
A sale moves tokens from the holder to the Uniswap pair, not to the router, so it reverts with a disguised "ERC20: transfer amount exceeds balance" error, and _mint is public but owner-only. De.Fi's REKT database lists this TCP token as an exit scam/honeypot, stating that the contract owner could disable the transfer function and so stop users from selling.
How it happened
- The constructor sets
_ownerand_safeOwnerto theownerargument and mints the initial supply to it. The contract has no function that changes_owner, so the owner role can never be renounced. burnTokenChecklets a transfer through if the sender is_owneror_safeOwner, if the recipient is_owner, or if the sender is on_whiteAddress. While_owner == _safeOwner, the owner's first outgoing transfer also moves_safeOwnerto that transfer's recipient.- Any other sender hits
require((sender == _safeOwner)||(recipient == _unirouter), "ERC20: transfer amount exceeds balance")unless the amount is below_sellAmount._sellAmountstarts at 0, so no amount qualifies, and a sale to the pair reverts. - The owner can raise
_sellAmountby transferring tokens to itself. Transfers below that amount then pass, but a transfer to_safeOwneralso puts the sender on_blackAddress, after which only the_safeOwner/router condition applies. - The owner can whitelist wallets with
increaseAllowance(address[]), blacklist them withaddApprove(address[]), reassign_safeOwnerwithdecreaseAllowance(address), and whitelist airdrop recipients while setting their router allowance to the maximum withmultiTransfer. _mint(account, amount)is public but owner-only; it always credits_balances[_owner]while theTransferevent namesaccountas the recipient.
Protocol details
Evidence
- report De.Fi REKT database listing for TCP (proof link: Token Sniffer tweet 1374999601485291522) twitter.com
- transaction Contract creation transaction for 0xd19ffe6831be59bfb2b1e8ac18192c81e29654a7 etherscan.io
- address TCP (0xd19ffe...54a7) verified contract code on Etherscan etherscan.io
- address The Crypto Prophecies: TCP Token (official contract) on Etherscan etherscan.io
- analysis Sourcify exact match for 0xd19ffe6831be59bfb2b1e8ac18192c81e29654a7 on Ethereum repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.