Proposal to turn off 32 (full) node operator deposits

I personally like the idea of giving rETH in return, then they can hold, or sell on the secondary market. At the very least, I think refunds should get inserted in the queue just like MP matches do. I think that is how most expect it to work. I understand this requires some protocol changes so would be a long term solution.

Short term id say remove it from the installer process, update the docs to say its an option and be very explicit about how it works and the risks. Perhaps find a whale that can clear the queue + the deposit refund backlog? :slight_smile:

Agree - let’s do the “prevent further damage” step (remove the option from smart nodes and ask allnodes to remove it from their setup) immediately, an only then figure out a next step.

Ok, we’ve talked about this some more and based on the feedback here, I’ve decided to remove the 32 ETH deposit option from the CLI. You can still do it if you’re particularly determined by using the Go lib or the contracts directly, but for the average user, this will prevent them from making a mistake they didn’t intend to make.

I’ll release this either in version 1.4.4 or 1.5.0, whichever ends up hitting mainnet first.

6 Likes

With that out of the way, I think we should discuss longer term visions for the 32 eth deposit option.

What is the reasoning behind the priority queue?

In my view, the 32e deposit is kind of useless:

  • If there’s liquidity in the deposit pool, you don’t need it, and would get instantly refunded
  • If there’s no liquidity in the deposit pool, either the minipool queue is short OR
    • You want the 32e deposit to start staking immediately
    • but you don’t want the 32e deposit, because there’s no liquidity, and who knows if you’ll ever get refunded

It doesn’t make sense to me to process 32e minipools separately from 16e minipools- a 32e minipool doesn’t provide the NO with enough benefit to punish them by locking up their eth. In fact, because the NO doesn’t receive rewards on more than 16e + commission, they are effectively donating to rEth holders until they get their refund. You could even make the argument that 32e depositors should be rewarded somehow, eg, by being processed before 16e depositors- but I won’t make this argument, because it punishes 1-minipool operators, which is contrary to the raison d’ĂȘtre of the platform.

I know it is a contract change and subject to audits, but I support @BLinc117.eth 's proposal to process minipools in order, regardless of deposit size.

Hmmm
 I had an alternate idea, which I posted about quite a while ago in “Improvements to skipping the minipool queue”, which @ken mentioned in the initial post. The idea is to mint rETH as reimbursement.

I think this has value for a couple of reasons:

  • Institutions do best with predictability. Being able to say “I pay 33.6 ETH and get 1 working minipool + 16 ETH of minted rETH” is easier to model than either “I put in 33.6 ETH and get 1 working minipool and then 16 ETH someday I can’t predict” or “I put in 17.6 ETH and get 1 not-yet-working minipool, which will start producing at some point I can’t predict.”
  • It allows folks to decide if/when they value skipping the queue based on all factors (number of pending minipools, rETH price on the market, etc). They can also opt into this flow whenever, not only if they decide to do so ahead. Eg, if they put in a 16 ETH deposit when the queue was 200 and 100 minipools were getting dequeued a week, and then something changed suddenly and only 10 minipools were getting dequeued a week, they’d be able to decide to skip the queue at that time.
Early code

This is a first stab at step 3 in my link. I haven’t done step 2 yet.

    // Refund node by minting rETH instead of waiting for user deposited ETH
    function reth_refund() override external onlyMinipoolOwnerOrWithdrawalAddress(msg.sender) onlyInitialised {
        // Check refund balance
        require(nodeRefundBalance == 0, "reth_refund should only be used when no user ETH has been assigned for the refund; please call refund()");
        require(nodeDepositBalance == rocketDAOProtocolSettingsMinipool.getFullDepositNodeAmount(),
            "reth_refund should only be used when a Full deposit was made and no refund has occurred");
        require(msg.value == getFullDepositUserAmount(), "reth_refund should be for the full refund amount");

        // Get node withdrawal address
        address nodeWithdrawalAddress = rocketStorage.getNodeWithdrawalAddress(nodeAddress);

        // Mint rETH to withdrawal address
        RocketTokenRETHInterface rocketTokenRETH = RocketTokenRETHInterface(getContractAddress("rocketTokenRETH"));
        rocketTokenRETH.mint(msg.value, nodeWithdrawalAddress);

        // Update deposit balance to reflect refund
        nodeDepositBalance = nodeDepositBalance(msg.value);

        // This is equivalent to (1) receiving a deposit to mint rETH and (2) immediately withdrawing
        // the same amount of ETH from the vault to assign to a minipool; we'll emit those events
        emit DepositReceived(msg.sender, msg.value, block.timestamp);
        emit EtherWithdrawn(nodeWithdrawalAddress, msg.value, block.timestamp);
    }
2 Likes

I do like the idea of issuing rEth optionally- the refund can go to the deposit pool and the minter can burn rEth when there’s liquidity.

There is, however, no reason we can’t do both. You could either:

  1. deposit 16e
  2. deposit 32e and get no rEth, landing in the same queue as 1) for your refund
  3. deposit 32e and get rEth, no queuing needed

Yeah, that makes sense to me. And note we can allow people to move along the steps - doesn’t need to be decided ahead of time (though you can only move down the list).

What is the latest thoughts on how to clear the queue for the existing 32 ETH minipools that are not advancing in the queue? Do we have to close the queue to clear them?

1 Like

I agree we need to clear the queue and make sure the refunds are given quickly

Why are the 32 behind the 16 what is the point then of offering 32? Do you actually stake 32 or only 16?

It offers the node operator the ability to start effectively staking their RPL and earning RPL rewards. They also start to stake on ETH on the beacon chain early (without having to wait in the queue). But both come at the cost of the risk of not advancing in the minipool queue for a refund.

@knoshua pointed out a pretty big issue with the rEth-minting deposit on discord and I wanted to summarize it here so it doesn’t get lost.

Post-withdrawals, rEth will be redeemable for eth from the vault. Providing an NO the ability to mint rEth on deposit means they can immediately begin staking, then immediately redeem their rEth for Eth, and repeat the process, effectively creating a path to convert vaulted eth to staked eth, and eliminating liquidity for redemptions. I see this as a pretty major flaw in the approach.

3 Likes

That point is fair, though it only applies in the narrow circumstance where:

  • rETH supply > rETH demand
  • rETH supply - available rewards < rETH demand

If the former isn’t true, then folks aren’t looking to exit. If the latter isn’t true, then we’ll trade at a discount in any case. If we are in the middle ground, then yes - folks could effectively burn rETH to skip the queue for free and effectively use liquidity meant for rETH burning for minipool matching instead.


That said, @knoshua brought up a different point, which I find more challenging. If this path is available, will nearly everyone with enough capital take it? If so, that could make the half pool depositors wait indefinitely. This assumes that the people that get refunds choose to sell their rETH before full repeg is achieved, which thus delays full repeg, dis-incentivizes directly minting rETH, and thus delays when there’s ETH available for matching with the half deposits.

If this narrative is accurate, we’re pretty much swapping from the current state (16 ETH pools are the norm, 32 ETH pools wait a long time for peg) to a similar state (rETH refunds are the norm, 16 ETH pools wait a long time for peg).

I haven’t yet decided whether (A) I buy that narrative entirely, or (B) which of those 2 choices sounds better.

Reasons this narrative might not be true:
  • People may actually like being partly liquid; the narrative is less true insofar as people don’t sell before repeg.
  • Taxes - potentially major; in some jurisdictions the swap to rETH is considered taxable but staking ETH isn’t.
  • Taxes - minor; in some jurisdictions the rETH sale is treated preferentially if you wait a year - ie, if we have a 2% discount you may be better off waiting a year (and full repeg) rather than selling when it gets near full repeg but it’s been less than a year.

I think all of the above apply even more so to institutions than to people.

With v1.5.0 now released, 32 ETH minipools are officially no more. Thanks for your feedback guys!

4 Likes

Now that it’s disabled are there plans to update the queue to push the Full deposits to the front of the queue? I’m not sure how hard that would be but it would resolve the last open issue. Otherwise the 30 or so full deposits in the queue may wait months and months more to get their refund.

I guess though if you go with this approach you’ll need to also disable the ability to do the full deposit even manually through the CLI otherwise people will use it to skip the queue on new minipools.

Edit: just saw Kane’s comment that there’s no way without a contract upgrade to disable full deposits. In that case moving full node deposits to the front of the queue could be abused. Unless that would also require a contract upgrade anyway in which case could do them both at the same time.

I think you more or less hit the nail on the head - it would require a contract upgrade, so no “quick” solution available.

I suspect the queue will clear out naturally (discount goes away for a bit; or a big whale deposit) before a contract change would get in.