The issue with this is that the rocketETHToken.burn()
function only allows for excess balance to be withdrawn. I.e. ETH that has been deposited by stakers but that is not yet staked on the Ethereum beacon chain. So Rocketpool allows users to burn rETH and withdraw ETH as long as the excess balance is sufficient.
As a result users won't be able to unstake rETH
rocketETHToken.burn()
is the only way for users to unstake rETH. And unstake will revert in case there is no excess balance in rETH contract.
Take a look on burn()
:
This executes withdrawDepositCollateral(ethAmount)
:
This then calls rocketDepositPool.withdrawExcessBalance(_ethRequired.sub(ethBalance))
to get the ETH from the excess balance:
And this function reverts if the excess balance is insufficient which you can see in the require(_amount <= getExcessBalance(), "Insufficient excess balance for withdrawal");
check.
Users can't unstake rETH in certain conditions
Manual Review
You can use the RocketDepositPool.getExcessBalance()
to check if there is sufficient excess ETH to withdraw from Rocketpool.
As a fallback you can use Uniswap pool ETH/rETH to exchange
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.