Celestia Rug Pull

Reported loss $209K
Rugpull

What happened

This record covers a counterfeit TIA token named "Celestia" at 0xCd68ACC0…e7Aa44 on Ethereum, deployed on 30 October 2023 by 0xe3cD80B7…cf02A2 and unrelated to the Celestia network. Behind obfuscated code and comments copied from OpenZeppelin, the owner-only function Address credits the token contract with however many TIA a Uniswap V2 swap needs to take 99.999% of the pair's WETH, without raising totalSupply, then swaps them to any recipient. The owner-only multicall and multicall2 functions freeze any holder's transfers or divide their balance, and there is no way to give up ownership.

On 1 November 2023 the owner called Address(0x4649F62750775220f33E0376a3CceB82f69f9527), which sold about 319.45 trillion TIA, more than a thousand times the 300 billion supply, for 115.32 WETH, about $210K according to PeckShield. The existing record says 114 ETH (208,853 USD) was then passed to another EOA and spread to 60 addresses through Disperse.app in transaction 0x84400074…056963.

How it happened

  1. The constructor sets owner = msg.sender, gives the deployer all 300 billion TIA and creates the TIA/WETH pair on the Uniswap V2 router. No code writes owner again, so ownership can never change or be renounced.
  2. Address(address _r) is onlyOwner. It computes (Sub(_RR.WETH()) * 99999) / 100000, 99.999% of the pair's WETH reserve, and asks the router with getAmountsIn how many TIA that swap needs.
  3. In Allowance, an always-true condition resolves address(uint160(uint256(_T())>>96)) to the token contract itself, and b[...] += value[0] credits it with exactly that many TIA. _totalSupply is not changed.
  4. getContract approves the router for the contract's whole balance and FactoryReview calls swapTokensForExactTokens, sending the pair's WETH to _r.
  5. multicall(bytes32[] data, uint256 _p) sets c[addr] to a positive value for each address packed into data; _transfer then runs require(add(c[from], b[from]) == 0), which can never pass, so those holders cannot sell. multicall2 instead rewrites b[addr] to the balance divided by _p and emits a fake Transfer to the pair.
  6. What happened: in transaction 0x3d9a1f15…640445 (1 November 2023, 00:09:47 UTC), Address was called with _r = 0x4649F627…9f9527. The token contract sent about 319.45 trillion TIA to the pair and the pair sent 115.3214 WETH to that address, dropping the price 99.5%.

Protocol details

Classification Token
Protocol Type Canonical Bridge
Affected asset / contract TIA
Protocol links Website @CelestiaOrg

Build your security review skills

Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.