Efinity Token Honeypot
What happened
De.Fi's REKT database lists this Ethereum token (contract 0xf183bcac…8ecb35, on-chain name Efinity Token, symbol EFI) as an exit scam/honeypot dated 2021-06-24, stating that the contract owner could disable the transfer function and so restrict users from selling. The verified source has no single on/off switch. Instead, transfer and transferFrom both pass through a burnTokenCheck modifier in which an ordinary holder's transfer only succeeds when the recipient is the address stored in _unirouter, unless the owner has whitelisted that holder.
Selling into a liquidity pool is a transfer to the pool, so it reverts for a non-whitelisted holder. The contract was deployed on 2021-06-24 at 06:52 UTC. No loss figure is listed, and the source shows what the code permits, not which holders were affected.
How it happened
- The constructor stores the same address in
_ownerand_safeOwnerand mints the whole initial supply to_owner; no function in the contract changes_ownerafterwards. - Every holder transfer goes through
_approveCheck(...), which carries theburnTokenCheckmodifier. In its first branch,if (_owner == _safeOwner && sender == _owner){_safeOwner = recipient;_;}, the recipient of the owner's first outgoing transfer becomes_safeOwner. - Afterwards, transfers where the sender is
_owneror_safeOwner, or where the recipient is_owner, always pass (if (sender == _owner || sender == _safeOwner || recipient == _owner)). - Any other sender is checked in order: a whitelisted sender passes; a blacklisted sender, and a sender in neither list whose
amountis not below_sellAmount, hitrequire((sender == _safeOwner)||(recipient == _unirouter), "ERC20: transfer amount exceeds balance")._sellAmountstarts atuint256 private _sellAmount = 0;, so theamount < _sellAmountbranch cannot run until the owner raises it. A transfer from such a holder to anything other than_unirouter, including a liquidity pool or another wallet, therefore reverts. - The owner controls who is exempt.
increaseAllowance(address[] receivers)is owner-only and sets_whiteAddress[receivers[i]] = true;and clears the blacklist;addApprovedoes the reverse;multiTransferwhitelists the firstapprovecountrecipients and gives them a maximum allowance for_unirouter;decreaseAllowance(address safeOwner)re-points_safeOwner. An owner transfer to itself sets the threshold:if (sender == _owner && sender == recipient){_sellAmount = amount;}. - When
_sellAmountis non-zero, a non-listed holder's transfer below it is allowed, but if the recipient is_safeOwnerthe code writes_blackAddress[sender] = true; _whiteAddress[sender] = false;while still completing that transfer, after which that sender is limited to transfers to_unirouter. _mintis declaredpublicwithrequire(msg.sender == _owner, ...)and credits_balances[_owner], so the owner can mint further supply to itself at any time. The source does not show whether it was ever called.- What happened, per the listing: De.Fi's REKT database lists the token as an exit scam/honeypot with the owner able to disable transfers so users could not sell. No transaction was opened for this record, so which wallets were blocked or whitelisted is not established here.
Protocol details
Evidence
- report @Token_Sniffer incident report twitter.com
- address Etherscan verified source, Efinity Token (EFI) etherscan.io
- analysis Sourcify exact-match copy of 0xf183bcac25cacccf01f4a8727cf773358c8ecb35 repo.sourcify.dev
- analysis De.Fi REKT database listing for EFI (Exit Scam/Honeypot, 2021-06-24, Ethereum) de.fi
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.