Staking as a Service Provider Standard for ETH-only Clients
Simple Summary
A standard interface for staking as a service (SaaS) providers.
Abstract
The following provides a standard API for Rocket Pool SaaS provider contracts. RPRC-3 allows clients to stake ETH and requires providers to supply RPL collateral. Variations on this standard allow for assessing additional fees, such as fees to cover validator creation costs, or additional functionality such as returning unused ETH to the client.
Motivation
An on-chain accounting standard for SaaS providers has benefits for both providers and users. Providers benefit from streamlined operations and increased interoperability, and users have increased visibility into their provider’s operations, allowing them to verify fees and other expenses are accounted for correctly.
A RPRC-3 standard contract brings together two actors which are not served by the base Rocket Pool protocol:
- A client who wishes to earn staking rewards on their ETH without any RPL exposure and is willing to trust a SaaS provider to run a validator on their behalf. This actor benefits from an RPRC-3 relationship by earning extra rewards on their ETH above what rETH can provide.
- A SaaS provider with unstaked RPL who wishes to increase capital efficiency of this holding by engaging in a trusted relationship with clients via staking RPL on behalf of the client. This actor benefits from an RPRC-3 relationship by earning RPL rewards from previously-unstaked RPL.
Specification
A multi-signature scheme for controlling the withdrawal and node wallets is RECOMMENDED.
Node Withdrawal Wallet Contract Specification
Fields
ethRewardFee
Fee percentage assessed on ETH rewards.
exit
Array of addresses. When the admin wallet calls processValidatorExit(n)
, addresses in the exit
array will be credited with their balance.
admin
Address with administrative privileges.
Functions
processValidatorExit
When the node operator exits validators, they may call this method from the admin address to distribute assets.
function processValidatorExit(uint256 numValidators) public view
balanceOf
Gets the balance of ETH for an address.
function balanceOf(address owner) public view returns (uint256)
depositFor
Deposits ETH and credits it to an address. Fails if the transaction does not include at least 16 ETH.
function ethDepositFor(address owner) public view
exit
Adds the address to the exit queue.
function exit(address owner) public view
Node Wallet Specification
[can this be the same as a normal RP node wallet?]
Citation
Mike Leach (@VVander), "RPIP-3: SaaS Provider Standard," Rocket Pool Improvement Proposals, no. 3, March 2022. [Online serial]. Available: https://rpips.rocketpool.net/RPIPs/RPIP-3.