Alaskan Honeypot
What happened
De.Fi's REKT database lists Alaskan (ALASKA) on BNB Smart Chain as an Exit Scam/Honeypot, stating that the contract owner could disable the transfer function and so restrict users from selling. The verified source (a contract named KingAkita) shows a mechanism that can do this: every transfer passes through a burnTokenCheck modifier. A holder on neither the owner's whitelist nor its blacklist can send tokens to the hard-coded _unirouter address or to the owner, and, once the owner has set _sellAmount above 0, to any recipient for amounts below it.
A blacklisted holder gets no amount-based pass and can send only to _unirouter or the owner. Other transfers revert with "ERC20: transfer amount exceeds balance" even though the holder's balance is not the cause. The source does not state what _unirouter is.
No loss figure is listed.
How it happened
- The owner address
_owneris set once in the constructor and the source has no function that changes it.transferandtransferFromboth call_approveCheck, which carries theburnTokenCheckmodifier. - The first transfer sent by the owner while
_owner == _safeOwnerpasses and runs_safeOwner = recipient. After that, transfers pass when the sender is_owneror_safeOwner, or when the recipient is_owner. - For other senders, a whitelisted sender (
_whiteAddress[sender] == true) passes. A blacklisted sender must satisfyrequire((sender == _safeOwner)||(recipient == _unirouter), "ERC20: transfer amount exceeds balance"). A sender on neither list passes whenamount < _sellAmount; otherwise the samerequireapplies._unirouteris the hard-coded address 0x05fF2B0D…608C7F. A transfer into a liquidity pool address is covered by neither exemption, so it reverts with a message that blames the balance, unless the sender is on neither list andamount < _sellAmount, or is whitelisted. _sellAmountstarts at 0, so theamount < _sellAmountbranch is never true until the owner sets it. The owner can set it with a transfer to itself (if (sender == _owner && sender == recipient){_sellAmount = amount;}), but only once_safeOwneris no longer the owner; while_owner == _safeOwner, a self-transfer takes the first branch and does not reach that line. Once_sellAmountis set, a holder on neither list can send amounts below it to any recipient, and if the recipient is_safeOwnerthe sender is flagged:_blackAddress[sender] = true; _whiteAddress[sender] = false;. A blacklisted holder can then send to_unirouter, to_owner, or as_safeOwner.- The owner alone controls the lists and the exemption target:
increaseAllowancewhitelists,addApproveblacklists,decreaseAllowance(address safeOwner)replaces_safeOwner, andmultiTransfercan whitelist receivers and set their allowance to_unirouterto the maximum. - The owner can also mint:
_mintispublic, requiresmsg.sender == _owner, and adds the amount to_balances[_owner]. The code shows this power; no transaction was opened showing it used.
Protocol details
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.