Rise Protocol Rug Pull
What happened
Rise Protocol (RISE) is a rebasing reflection token on Ethereum that minted its entire 100,000-token supply to the deployer and traded on a Uniswap V2 RISE/WETH pool funded by the deployer. Etherscan shows the deployer adding liquidity on 2021-02-11 (10 ETH with 1,000 RISE, then 240 ETH with 24,000 RISE) and, on 2021-03-11, removing liquidity (262.1 ETH and 26,470.38 RISE) and selling 42,055.37 RISE for 14.65 ETH 32 seconds later. De.Fi's REKT database lists the project as an exit scam with a 59,164 USD loss and says the liquidity had been locked until February 12 before the deployer removed it.
The token contract also gives the owner switches over trading, fee splits and per-transaction limits.
How it happened
- The constructor assigns the whole supply to the deployer:
_rOwned[_msgSender()] = reflectionFromToken(_totalSupply, false);with_totalSupply = 10**5 * 10**9. The deployer is also theOwnableowner and the rebaser, andowner()still reads as the deployer address. - Etherscan shows the deployer adding liquidity to the Uniswap V2 RISE/WETH pool in two
addLiquidityETHtransactions on 2021-02-11 (0xab9d2e39…2d293a with 10 ETH and 1,000 RISE, and 0x2d49344f…82cd35 with 240 ETH and 24,000 RISE). The LP tokens went to the deployer; the token contract has no lock or LP-handling code. - The owner holds switches that decide how everyone else can trade.
_enableTrading()isonlyOwner, and until it is called_transferreverts for calls from the pair or the router withRise: trading is disabled.;if(sender != owner() && recipient != owner() && !inSwapAndLiquify)exempts the owner fromrequire(amount <= _maxTxAmount, ...), and_setMaxTxAmountaccepts any value down to 10^8 (0.1 RISE). - The fee setters are capped (
require(fee < 50, ...)forsetSellFeeandsetTxFee) but the split is not.setBurnTopandsetBurnBottomtake any value, and_getTValuescomputestBurnFee = BURN_TOP*fee/BURN_BOTTOM; tRewardFee = fee.sub(tBurnFee);. If the burn share exceeds the fee,subreverts, so a fee-bearing sell or transfer would fail, andBURN_BOTTOM = 0divides by zero._setRewardAddresscan point the reward share of every fee at any wallet. - What happened, per Etherscan: on 2021-03-11 at 17:24:05 UTC the deployer called
removeLiquidityETHon Uniswap V2 Router 2 and received 262.1 ETH and 26,470.38 RISE, then at 17:24:37 UTC swapped 42,055.37 RISE for 14.65 ETH throughswapExactTokensForETHSupportingFeeOnTransferTokens(0x3697937b…d60602 and 0x7bb3e71f…27246f). The pool's ETH side was removed by its liquidity provider; none of the owner functions in step 3 or 4 is shown to have been used.
Protocol details
Evidence
- report Report riseprotocol.io
- transaction Etherscan transaction 0x3697937bf8b399e98c219f3279b028c864197ed65529f6a28d8d77cdf5d60602 (removeLiquidityETH) etherscan.io
- transaction Etherscan transaction 0x7bb3e71f16bca5ac3de805d3d97eab0b83ec743524b5358e318a508a2827246f (token sale) etherscan.io
- transaction Etherscan transactions 0xab9d2e39... and 0x2d49344f... (addLiquidityETH) etherscan.io
- transaction Etherscan transaction 0x2d49344f24fbba0609c55f5d426a9ac1c5a5ae6d9d1f463165d287ad7b82cd35 (addLiquidityETH) etherscan.io
- address Rise Protocol (RISE) verified source on Etherscan etherscan.io
- analysis Web Archive web.archive.org
- analysis Rise on Sourcify repository (match) repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.