ElonMVP Rug Pull
What happened
ElonMVP is a BEP20 token on BNB Smart Chain whose verified source lets the deployer control who can trade. The whole supply is minted to the deployer in the constructor, ordinary transfers only work when _isTradingOpen is true (an owner-only switch) and only between a wallet and the PancakeSwap pair, and sells are blocked for any address marked in a _claimed list that any _synced address can edit. The deployer is itself _synced, so none of these checks apply to it. De.Fi's REKT database lists the token as an exit scam/rug pull with 44,371 USD lost and says the deployer removed liquidity for a profit of about 170 BNB and then laundered the proceeds through Tornado.Cash.
Facts from De.Fi's listing: the deployer wallet was funded with 12 BNB by wallet 0xbf66c21f…44ee37 (transaction 0xad1d3a78…fbc2f6), and that wallet was itself funded through Tornado.Cash. The creator 0xdd65cb76…93bdf6 seeded an ElonMVP/BNB pool with about 300 BNB in transactions 0x403ee181…d8b928 and 0x1973aa35…4c7272, again funded from Tornado.Cash. Once the token gained traction the liquidity was removed for about 170 BNB in transaction 0x67f92de2…53b128, the funds were moved to address 0x88795b97…d3ef38 in transaction 0xe1513999…6b82bf, and then laundered through Tornado.Cash. De.Fi's listing says information on the case was scarce when it was written. The pair address in the listing's DEX Screener link is 0xb9911cc7…171c8e.
How it happened
What the code allows:
- The constructor mints the whole supply to the deployer (
_tokenBalances[_msgSender()] = _tokenTotalSupply;, 10 billion tokens at 9 decimals) and marks the deployer and the token itself as exempt:_synced[owner()] = true; _synced[address(this)] = true;. It also sets_isSwapEnabled = true; no function ever changes that flag back. _isTradingOpenis false by default and onlyopenTrading(bool value) public onlyOwnerchanges it. In_internalTransfer,if (!_synced[sender] && !_synced[recipient]) { require(_isTradingOpen);means that while the switch is off every transfer between non-exempt addresses reverts, including buys from the pair and sells to it. The owner can turn the switch back off at any time.- Because
_isSwapEnabledstays true, non-exempt transfers must also passrequire(sender == uniswapV2Pair || recipient == uniswapV2Pair);, so ordinary holders can only buy from or sell to the pair; wallet-to-wallet transfers revert. - Sells are guarded by a blacklist:
if (recipient == uniswapV2Pair) { require(!_claimed[sender], "Claimed"); require(!_claimed[_msgSender()], "Claimed"); }. In a router sell the holder issenderand the router is_msgSender(), so a holder in_claimedcannot sell, and if the router address were in_claimedevery router sell would revert. Buys are not affected because the recipient is then the buyer, not the pair. - The lists are edited by
function claim(address[] calldata wallet, bool value) external onlySyncedandfunction sync(address[] calldata wallet, bool value) external onlySynced. Any_syncedaddress, not only the owner, can add wallets to either list, and there is no limit on how many. The owner is_syncedfrom the constructor, so the owner is not subject to the trading switch or the sell blacklist. - Nothing in the contract restricts removing liquidity. A liquidity withdrawal pays tokens out of the pair (
sender == uniswapV2Pair), which passes the pair rule in step 3, and the LP tokens are standard PancakeSwap LP tokens outside this contract.
What was reported:
- De.Fi's REKT database lists the token as an exit scam/rug pull, with about 300 BNB seeded into the pool and about 170 BNB taken out when the liquidity was removed. The explorer and DEX Screener pages were not reachable (HTTP 403, and the news article host did not resolve), so this analysis does not show whether
openTrading,claimorsyncwas ever called on-chain, or who held the LP tokens.
Protocol details
Evidence
- report Report dexscreener.com
- transaction bscscan.com transaction 0x1973…7272 bscscan.com
- transaction bscscan.com transaction 0x403e…b928 bscscan.com
- transaction bscscan.com transaction 0x67f9…b128 bscscan.com
- transaction bscscan.com transaction 0xad1d…c2f6 bscscan.com
- transaction bscscan.com transaction 0xe151…82bf bscscan.com
- address ElonMVP verified contract source, ElonMVP.sol, BscScan bscscan.com
- address bscscan.com address 0x8879…ef38 bscscan.com
- address bscscan.com address 0xbf66…ee37 bscscan.com
- address bscscan.com address 0xbf66…altx bscscan.com
- address bscscan.com address 0xdd65…bdf6 bscscan.com
- address bscscan.com address 0xdd65…altx bscscan.com
- analysis De.Fi REKT database listing for ElonMVP (proof links: DEX Screener pair page and DefiDaoNews article, both inaccessible) defidaonews.com
- analysis Sourcify match for ElonMVP contract on BSC repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.