NONAME Rug Pull
What happened
NONAME (NONAME, Ethereum, contract 0x09ff2267…6c76bb) is an OpenZeppelin-style token whose deployer holds the minter role, an uncapped mint, and a whitelist-admin role that can set the transfer tax with no upper limit. The code also lets that role repoint the pair that receives the LP reward. De.Fi's REKT database lists the project as an exit scam/rug pull with $30,120 lost, and says the project also ran a crowdsale through a NonameCrowdsale contract. Etherscan shows the deployer 0x961E3149…3DCbfd adding 400 NONAME and 5.9 ETH of liquidity on 2020-12-02, then removing all of it and selling about 3,100 NONAME on 2021-02-15. A Safe smart account that De.Fi calls the proxy contract forwarded 26 ETH to each of two external wallets on 2020-12-03.
Transactions and addresses listed by De.Fi:
- Mint through the proxy contract: 0xda6f43af…0096d4
- Initial liquidity: 0x03b4dcfa…5c4c20
- Liquidity removal: 0xfce75c90…168715
- Token sale: 0x04d42088…b9fe17
- Crowdsale contract: 0x1a9f9c40…a02f40
- Distribution of the raised ETH to two external wallets: 0x57cf8745…a31bdd and 0xd494ea26…f25bc1
How it happened
- At deployment the contract inherits
MinterRoleandWhitelistAdminRole, whose constructors run_addMinter(_msgSender());and_addWhitelistAdmin(_msgSender());, so the deployer holds both roles. - What the code allows:
function mint(address account, uint256 amount) public onlyMinter returns (bool) { _mint(account, amount);has no cap, and_mintraises_totalSupply. A minter can also add more minters withaddMinter.renounceMinterexists, so the power can be given up; no opened transaction shows it being renounced. - What the code allows:
setTransactionTax(uint256 _taxDivisor)has no bound. In_transfer,taxAmount = amount.div(taxDivisor)is split into_rewardLiquidityProviders(from, taxAmount.div(2))andsuper._burn(from, taxAmount.div(2)), and the recipient getsamount.sub(taxAmount). The sender is debited the fullamountin total, so a divisor of 1 makes the recipient's share zero.setUniswapV2Pairlets the same role point the reward transfer at a different address. - What happened, per Etherscan: a Safe smart account sent 400 NONAME to the deployer on 2020-12-02 at 16:54 UTC, and 13 minutes later the deployer added 400 NONAME and 5.9 ETH of liquidity, receiving 48.5798 LP tokens. De.Fi describes the 400 tokens as minted through the proxy contract; the page shows a transfer from the Safe.
- On 2020-12-03 the same Safe sent 26 ETH to each of two external wallets (De.Fi links the crowdsale as the source of that ETH; the crowdsale transactions were not opened).
- On 2021-02-15 at 19:27 UTC the deployer called
removeLiquidityETHWithPermitSupportingFeeOnTransferTokens, burning 48.58 LP tokens, and at 19:31 UTC swapped about 3,100 NONAME for 0.17 ETH through the router.
Protocol details
Evidence
- report NonameToken source on Sourcify repo.sourcify.dev
- transaction Etherscan tx 0xda6f43af... (Safe execTransaction) etherscan.io
- transaction Etherscan tx 0x03b4dcfa... (addLiquidityETH) etherscan.io
- transaction Etherscan tx 0xfce75c90... (removeLiquidity) etherscan.io
- transaction Etherscan tx 0x04d42088... (swapExactTokensForETH) etherscan.io
- transaction Etherscan tx 0x57cf8745... (Safe ETH transfer) etherscan.io
- transaction Etherscan tx 0xd494ea26... (Safe ETH transfer) etherscan.io
- address NonameToken verified source on Etherscan etherscan.io
- analysis Web Archive archive.ph
- analysis bloxy.info page 0x1a9f…2f40 bloxy.info
- analysis bloxy.info page 0x1a9f…2f40 bloxy.info
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.