Thunder Finance Rug Pull
What happened
Thunder Finance (TNDR) is a BNB Smart Chain token whose verified contract, ThunderFinance, gives the full 110,000 TNDR supply to the deployer and then lets only a hand-picked set of addresses transfer tokens. The comment block at the top of the source promises a 3% transfer tax, a locked team allocation and a liquidity-mining contract, but the contract code contains none of these. De.Fi's REKT database lists the project as an exit scam: the deployer added initial liquidity in bscscan.com transaction 0x01c0187f…5fd19a and removed it in 0x368154f8…99c21c, with a listed loss of 18,558 USD.
Neither transaction page could be opened for this review.
How it happened
- The constructor sets
owner = msg.sender;andbalanceOf[msg.sender] = totalSupply;, so the deployer holds the whole supply.ownerisprivateand there is no function that changes it. - Every transfer, including router-driven
transferFromcalls, passes throughensure, which returns early only forif(_from == owner || _to == owner || _from == tradeAddress||canSale[_from]){ return true; }. Any other sender must satisfyrequire(condition(_from, _value));. conditionbegins withif(_saleNum == 0 && _minSale == 0 && _maxSale == 0) return false;. The variables_saleNum,_minSaleand_maxSaleare declared but never assigned anywhere in the contract, so they stay 0 andconditionreturns false for every non-exempt sender. Such a holder's transfer reverts unless the recipient is the owner address, which means a sell through a router (transferFrom(holder, pool, amount)) fails for them.- The owner controls who is exempt.
approveAndCall(address spender, uint256 addedValue)is owner-only and setscanSale[spender]=true;, andtransferownership(address addr)is owner-only and only setstradeAddress = addr;(it does not transfer ownership). Because tokens leaving the pool also passensure, buys work only if the pool address has been given one of these exemptions; the source does not show whether it was. approveAndCallalso runsbalanceOf[spender] = addedValue*(10**uint256(decimals));, an overwrite of any address's balance that does not changetotalSupply. This is a power the code allows; no transaction opened here shows it being used.- What happened, per De.Fi's listing: the deployer added liquidity and later removed it, leaving 18,558 USD of losses. Who held the liquidity tokens in between is not shown by any source opened.
Protocol details
Evidence
- report Report thunder-finance.com
- transaction bscscan.com transaction 0x01c0…d19a bscscan.com
- transaction bscscan.com transaction 0x3681…c21c bscscan.com
- address ThunderFinance.sol verified source on BscScan bscscan.com
- analysis Web Archive web.archive.org
- analysis Sourcify full match for 0xd7526b3e1cb8c32900b51c4bd8cda85872407b20 repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.