SHIDAO Rug Pull
What happened
On May 25th, 2022, SHIDAO was rug pulled for about $180K, according to De.Fi's REKT database. De.Fi's listing also says the project falsified a CertiK audit to gain customers' trust. The same listing says a funding address, 0x1815b580…4C5d7f, distributed BNB for transaction fees and sent 0.02 BNB to roughly 25 other addresses for token sales, and that the ShiD tokens were then distributed to all of those addresses by the contract 0xC86D17c7…0Ea9A1, after which the wallets sold their tokens.
The verified token contract (Shi DAO, ShiD, 0xc59D46Ce…923FD6) mints the whole supply to the deployer, charges an 8% fee on every transfer that does not involve a whitelisted address, and lets the admin add or remove addresses from that whitelist. That setup means the deployer's wallets can sell without the fee and without any cap, while the code has no sell block or blacklist.
How it happened
What the code allows (from the verified source):
- The constructor mints the full supply to the deployer:
_mint(msg.sender, 2100_000_000_000_000 * (10**decimals())); //预挖(comment: "pre-mine"). It also grants the deployer bothDEFAULT_ADMIN_ROLEandCONFIG_ADMIN, and creates the ShiD/BUSD pair withIUniswapV2Factory(uniswapV2Router02.factory()).createPair(address(this), BUSD). - The deployer, the router and the token contract are whitelisted in the constructor:
addNoBurnAddress(msg.sender);,addNoBurnAddress(swapV2Router);,addNoBurnAddress(address(this));. In_transfer, the branchif (_noBurnAddress[sender] || _noBurnAddress[recipient]) { super._transfer(sender, recipient, amount); }moves tokens with no fee. - Every other transfer takes 8% from the sender: 1% burned (
super._burn(sender, burnAmount)), 1% tomarketWallet, 4% to the contract for the SHIB dividend (holderAwardAmount = (amount * 4) / 100) and 2% to the LP reward reserve (LPReward = (amount * 2) / 100). The sender's balance is debited for the full amount and the recipient receivesrealAmount, which is 92% of it. The percentages are hard-coded; there is no fee setter. CONFIG_ADMINcan change who pays the fee at any time withaddNoBurnAddress(address addr)andremoveNoBurnAddress(address addr), so the admin can exempt any wallet or put the fee back on any whitelisted one, including the router. The admin can also changemarketWalletthroughsetMarketWallet.marketWalletis never set in the constructor, so while it is the zero address any fee-bearing transfer reverts atsuper._transfer(sender, marketWallet, marketAmount)with "ERC20: transfer to the zero address".- Nothing in the contract limits how much a whitelisted address can sell, and the contract has no
renounceOwnership;AccessControl.renounceRoleexists, so the admin could give the role up, but the source shows no call to it.
(according to De.Fi's listing, not verified by a transaction here):
6. De.Fi's REKT database lists the incident as an exit scam/rug pull of about $180K on 2022-05-25. It says a funding address sent BNB to about 25 other addresses, the contract 0xC86D17c7…0Ea9A1 distributed ShiD tokens to those addresses, and the wallets then sold their tokens.
Protocol details
Evidence
- report @SHIIIIDAO incident report twitter.com
- address ShiDToken verified source on BscScan bscscan.com
- address bscscan.com address 0x1815…5d7f bscscan.com
- address bscscan.com address 0xC86D…a9A1 bscscan.com
- analysis Sourcify match for ShiDToken (BSC, chain 56) repo.sourcify.dev
- analysis De.Fi REKT database listing for ShiD (no proof link in the import) de.fi
- analysis @SHIIIIDAO X profile (via fxtwitter) api.fxtwitter.com
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.