Strong Finance Rug Pull
What happened
Strong Finance (STRONG) is an ERC20 token on Ethereum with a Uniswap V2 pool against WETH, deployed on 5 Dec 2023. On 6 Dec 2023 PeckShield reported that the address 0x9E83c241…b42962 swapped 1,000,000,000,000,000 STRONG for 26.75 WETH (about 61.1K USD), against a total supply of 100,000,000 STRONG. Etherscan shows the swap in transaction 0x8f06eb0b…5af2cb, sent by 0x82a4f9c0…CAFfeF to 0x9E83c241…b42962 through a swap(uint256 _tokenId) call, with about 26.75 WETH leaving the pool. De.Fi's REKT database lists the loss as 61,081 USD (26.74 WETH), the deployer as 0xb112034a…eE4178, and the scammer address as 0x82a4f9c0…CAFfeF. It also says the proceeds moved to another EOA and then through a chain of addresses to Binance, in transactions 0x8f387cda…cb1e2e and 0x95fec935…fa7156.
0x9E83c241…b42962 is the _taxWallet the contract was deployed with, and the code explains how it could sell far more tokens than exist: for fee-exempt senders the transfer logic debits nothing from the sender while crediting the recipient in full.
How it happened
- The constructor takes
address stWallet, sets_taxWallet = stWallet;and marks it exempt withisFeeExempt[_taxWallet] = true;. Etherscan shows the constructor argument 0x9E83c241…b42962. The owner and the contract are also exempt. - Once
enableStrongTrade()has setfeeEnabled = true,_transferTokencomputes the amount debited from the sender asuint256 amountOut = takeFee ? tAmount : feeEnabled ? takeFeeAmounts(actions, takeFee, tAmount) : tAmount;. For an exempt sendertakeFeeis false (takefee = isTakeFees(sender)is!isFeeExempt[sender]). - In
takeFeeAmountswithtakefee == false,percentsresolves to1, thenfeeAmounts = takefee ? feeAmounts : amounts * percents;makes the fee equal to the whole amount, andreturn amounts.sub(feeAmounts);returns 0. SoamountOutis 0 and the line_balances[sender] = _balances[sender].sub(amountOut, ...)subtracts nothing from the exempt sender. - For the same transfer
amountIn = feeEnabled && takeFee ? ... : tAmount;is the fulltAmount, and_balances[recipient] = _balances[recipient].add(amountIn);credits the recipient in full.takeFeeAmountsalso adds 1% of the amount to_balances[address(this)]. An exempt wallet can therefore send any amount to the pair, up to the allowance it gave the router, without holding the tokens, and the pair's token balance rises by that amount. - A swap through
swapExactTokensForETHSupportingFeeOnTransferTokensthen pays out WETH from the pool against tokens that were never taken from anyone. Ordinary holders are not exempt: for themamountOutis the fulltAmountand they are debited normally. - What happened: PeckShield reported 0x9E83c241…b42962 swapping 1,000,000,000,000,000 STRONG for 26.75 WETH, and Etherscan shows the pool paying about 26.75 WETH in the transaction above at 2023-12-06 03:30:59 UTC.
Protocol details
Evidence
- report @PeckShieldAlert incident report twitter.com
- report StrongFinance source on Sourcify repo.sourcify.dev
- report PeckShieldAlert post on Strong Finance STRONG (via fxtwitter) twitter.com
- transaction Etherscan transaction 0x8f06eb0b...f2cb etherscan.io
- transaction etherscan.io transaction 0x8f38…1e2e etherscan.io
- transaction etherscan.io transaction 0x95fe…7156 etherscan.io
- address StrongFinance contract source on Etherscan (verified) etherscan.io
- address etherscan.io address 0x82a4…FfeF etherscan.io
- address etherscan.io address 0xb112…4178 etherscan.io
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.