Tranquility Defi Rug Pull

Reported loss $13K
Ethereum
Rugpull

What happened

Tranquility Defi's TRNQ was a reflection token on Ethereum (0x0bb033ed…3aedf6) that gave its whole 800,000 TRNQ supply to the deployer, 0xcF4C4D29…8406fA. On 30 December 2020 the deployer added 640,000 TRNQ and 10 ETH to Uniswap V2 and received the LP tokens in its own wallet, so it could withdraw that liquidity at any time. Etherscan shows the deployer making several Remove Liquidity calls through the Uniswap V2 router on 9 February 2021, and De.Fi's REKT database lists the case as an exit scam with $12,702 lost.

The contract also gave the owner other powers over holders. Until the owner called enableTranquility, every transfer not involving the owner reverted. The owner could set the tax and liquidity fees with no cap, and above a combined 100% every fee-paying transfer reverts.

LP tokens created by the automatic liquidity feature were minted to the owner.

How it happened

  1. The constructor credits the full supply to the deployer: _rOwned[_msgSender()] = _rTotal; with _tTotal = 8 * 10**5 * 10**18.
  2. On 30 December 2020 the deployer called addLiquidityETH with 640,000 TRNQ and 10 ETH. The 2,529.82 UNI-V2 LP tokens went to the deployer's own wallet, not to a lock.
  3. The token's automatic liquidity feature also sends its LP tokens to the owner: uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this), tokenAmount, 0, 0, owner(), block.timestamp).
  4. Holding the LP tokens, the deployer can redeem them for the pool's ETH and TRNQ at any time. Etherscan shows several Remove Liquidity calls from the deployer through the Uniswap V2 router on 9 February 2021, and the deployer's wallet now holds only 0.00042308 UNI-V2.
  5. The code also allowed other traps, with no transaction seen using them. require(tranquilityEnabled, "You must meditate on your actions") blocks all non-owner transfers until the owner enables trading. setTaxFeePercent and setLiquidityFeePercent have no upper bound, so a combined fee above 100% makes tAmount.sub(tFee).sub(tLiquidity) revert on every fee-paying transfer.

Protocol details

Classification Yield Aggregator
Protocol Type Exit Scam/Rugpull
Affected asset / contract TRNQ

Build your security review skills

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