Proposal to turn off 32 (full) node operator deposits

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