Friendchips.tech Rug Pull
What happened
FRIENDCHIPS is an ERC20 token on Ethereum whose contract creates no supply at deployment and instead lets any minter-role address mint without a cap, while the deployer also holds the owner and operator roles. Etherscan shows that on 2023-09-15 the deployer called a separate contract (0x1dB0B601…281E40) in transaction 0x1cbc2774…5614ab; the page lists a mint of 100 million FRIENDCHIPS to that contract, its transfer into the Uniswap V2 pool, and 47.94 WETH paid out by the pool. De.Fi's REKT database lists the incident as a rug pull of 39,276 USD (23.94 WETH), puts the worth of the dumped tokens at 77,383 USD, and says the deployer had earlier added 24 WETH of liquidity and later moved the proceeds through Tornado Cash.
ChainAegis by SharkTeam flagged the token as a suspected rug pull the next day, saying the deployer removed a significant part of the liquidity and the price fell about 100 percent. The deployer address is 0x99856ab3…A10b33.
How it happened
- The constructor mints nothing:
constructor(address _teamWallet) public ERC20("Friendchips.tech", "FRIENDCHIPS")only sets up the Uniswap pair and exemptions, so the supply that exists was created by later mint calls. The deployer receives every privileged role:MinterRoleruns_addMinter(msg.sender),Ownablesets the deployer as owner, andoperator = _msgSender();. - Minting has no cap and no timelock.
function mint(address _to, uint256 _amount) public onlyMinter { _mint(_to, _amount); }lets any minter create any amount for any address,function mint(uint256 amount) public onlyOwner returns (bool) { _mint(_msgSender(), amount); ... }lets the owner mint to itself, andfunction addMinter(address account) public onlyMinterlets a minter hand the role to any other address, including a contract. Nothing in the source callsrenounceMinterorrenounceOwnership. - Newly minted tokens can be sold into the pool, which pays out WETH from the liquidity that buyers and the deployer supplied. The transaction page for 0x1cbc2774…5614ab shows exactly that sequence: 100 million FRIENDCHIPS minted (from the zero address) to 0x1dB0B601…281E40, sent to the pair, and 47.94 WETH released by the pool. The page labels the call
deposit(uint256 vowID)on an unverified contract created by the deployer. - Separately, the fee and trading switches would let the privileged wallets block or tax other holders.
updateSellFee(owner only) allows up to 100 percent (require( _teamFee.add(_liquidityFee) <= 100, ...)); at 100 a non-exempt seller hitsfeeAmount = amount.mul(sellFee).div(100); sendAmount = amount.sub(feeAmount);, sosuper._transfer(sender, address(this), feeAmount)debits the seller's whole amount andsuper._transfer(sender, recipient, sendAmount)sends 0 to the pair.openTrading(bool bOpen)(operator only) can settradingOpenback to false, after whichrequire(tradingOpen == true, "Trading is not yet open.")reverts every transfer that does not involve the owner or anisExcludedFromFeewallet. The exemption in_transferisif (sender == owner() || recipient == owner() || isExcludedFromFee[sender] || isExcludedFromFee[recipient]), so it covers only the owner and wallets the operator has marked throughsetExcludeFromFee; holding the operator role does not exempt a wallet by itself. The sources opened do not show these two switches being used. - What happened, per the listings: De.Fi's REKT database lists the deployer as having added 24 WETH of liquidity, minting through a malicious contract and dumping, for 39,276 USD (23.94 WETH), and then withdrawing the funds via Tornado Cash. ChainAegis described the event as the deployer removing a significant portion of the liquidity. Those accounts differ in mechanism; the opened Etherscan transaction supports the mint-and-sell reading, and the Tornado Cash step was not checked here.
Protocol details
Evidence
- report @ChainAegis incident report x.com
- report ChainAegis alert on FRIENDCHIPS rugpull (X post, 2023-09-16) x.com
- transaction Etherscan transaction 0x1cbc277477b8f3c247713d835ea5f0e456355a752bb5039307bf8079f95614ab etherscan.io
- address Friendchips.tech (FRIENDCHIPS) verified source code on Etherscan etherscan.io
- address Etherscan address page for 0x1dB0B6012D64452ED6aa98e87F7c308DB0281E40 etherscan.io
- address etherscan.io address 0x9985…0b33 etherscan.io
- analysis Sourcify match for Friendchips on Ethereum repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.