SpaceX Copycat Rug Pull
What happened
SpaceX is an unrelated ERC-20 token that reuses a well-known company name and symbol. The contract gives the whole 50,000,000 supply to the deployer at creation, and the deployer stayed the contract owner. The owner also has two powers that regular ERC-20s lack: redeemCoupon credits any address with a huge balance without raising totalSupply, and setExactTransferAmount can limit an address to a single allowed transfer size. De.Fi's REKT database lists the token as an exit scam: the deployer sold its SpaceX holdings into the Uniswap liquidity pool for 13.16 ETH across two transactions and bridged the proceeds to BSC through the Multichain bridge, and De.Fi lists the loss as 21,516 USD. That USD figure is De.Fi's listed value and was not reproduced from an opened source: the first sale transaction alone, 0x39c83e47…2c2680, shows the deployer address swapping 20 million SpaceX for about 10.47 ETH through the 1inch router on 2023-06-13 at 06:07 UTC, and the USD value of that sale at the time may be higher than the listed figure.
Deployer address: 0xeC2D2aE3…2D0aA5
Liquidity draining transactions (as listed by De.Fi): 0x39c83e47…2c2680 and 0xdea2ea6a…753fe5
Bridging transaction (as listed by De.Fi): 0x1d46c086…881014
How it happened
- The constructor sets
_balances[_msgSender()] = _totalSupply;, so the deployer receives the entire 50,000,000 token supply and is also theOwnableowner. - According to De.Fi's posted thread, the token launched on 2023-06-11. The opened sources do not show who added the SpaceX/WETH liquidity or who paid ETH into the pool.
- The contract keeps owner-only controls over holders' ability to transfer.
setExactTransferAmount(address account, uint256 amount) external onlyOwnerstores a per-address amount, and bothtransferandtransferFromthen runrequire(amount == exactAmount, "TT: transfer amount does not equal the exact transfer amount");whenever it is non-zero. A holder set to an amount other than what they try to sell cannot sell; transfers from the pair are limited the same way if the pair address is set. redeemCoupon(string memory couponCode, address recipient) external onlyOwnerruns_balances[recipient] += couponValue;for coupons preloaded in the constructor (for example_couponLedger["COUPON2023"] = _totalSupply*10000000;). It never changes_totalSupply, so the owner can credit any address with a balance far larger than the stated supply. The opened transaction does not show whether this was used.- On 2023-06-13 the deployer address sold 20 million SpaceX into the Uniswap pool for about 10.47 ETH in transaction 0x39c83e47…2c2680. De.Fi's REKT database lists a second sale, 0xdea2ea6a…753fe5, bringing the total to 13.16 ETH, and a loss of 21,516 USD; the opened first sale alone is about 10.47 ETH, so these listed figures were not reconciled.
- De.Fi reports the ETH was bridged to BSC through Multichain in 0x1d46c086…881014, and says the sell-off left the pool inadequate for trading.
Protocol details
Evidence
- report @DeDotFiSecurity incident report twitter.com
- report De.Fi Security thread on SpaceX token (tweet 2/) twitter.com
- transaction Etherscan transaction 0x39c83e47...2680 etherscan.io
- transaction etherscan.io transaction 0x1d46…1014 etherscan.io
- transaction etherscan.io transaction 0xdea2…3fe5 etherscan.io
- address SpaceXCOIN.sol verified source on Etherscan etherscan.io
- address etherscan.io address 0xeC2D…0aA5 etherscan.io
- analysis Sourcify full match for 0x3bb1c03e4ed495acd60476211859729dc579502f repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.