← Protocols
Rocket Pool
Lending / Yield·EVM

Rocket Pool

01Description

Decentralized Ethereum staking pool. Stakers receive rETH — a non-rebasing reward-bearing ERC-20. Node operators run validators by bonding 8 ETH (LEB8) or 16 ETH (legacy) plus RPL collateral, making Rocket Pool the most permissionless Ethereum LST.

02Best for
  • 01rETH liquid staking
  • 02running a Rocket Pool node operator
  • 03RPL collateral / inflation rewards
  • 04DeFi composability on rETH
03Install
  • pnpm add viem
04Environment variables
VariableScopeDescription
NEXT_PUBLIC_RETH_ADDRESSClientrETH on Ethereum mainnet: 0xae78736Cd615f374D3085123A210448E74Fc6393. Same symbol on L2s but different addresses (Arbitrum: 0xEC70Dcb4A1EFa46b8F2D97C310C9c4790ba5ffA8, Base: 0xB6fe221Fe9EeF5aBa221c348bA20A1Bf5e73624c, Optimism: 0x9Bcef72be871e61ED4fBbc7630889beE758eb81D).
NEXT_PUBLIC_RP_DEPOSIT_POOLClientRocketDepositPool v1.2 on Ethereum mainnet: 0xDD3f50F8A6CafbE9b31a427582963f465E745AF8. Public ETH→rETH deposit entry point.
NEXT_PUBLIC_RP_STORAGEClientRocketStorage on Ethereum mainnet: 0x1d8f8f00cfa6758d7bE78336684788Fb0ee0Fa46. Use to look up any Rocket Pool contract by name (`getAddress(keccak256('contract.address', 'rocketDepositPool'))`).
05Prompt snippet
Integrate Rocket Pool. Stake ETH→rETH: `RocketDepositPool.deposit{value: ethAmount}()` mints rETH at the current `RocketTokenRETH.getExchangeRate()` (wei ETH per rETH, monotonically increasing). rETH is NON-rebasing; always quote ETH value via `rETH.getEthValue(uint256 rethAmount)` or `getRethValue(uint256 ethAmount)`. Unstake without using the burn path: there is NO native burn-for-ETH unless the deposit pool has free buffer (`RocketTokenRETH.getTotalCollateral()` >= rETH being burned) — otherwise users must swap on Curve / Balancer / Uniswap. When buffer is available: `rETH.burn(uint256 rethAmount)`. Look up any subcontract dynamically via RocketStorage: `RocketStorage.getAddress(keccak256(abi.encodePacked('contract.address', 'rocketDepositPool')))` — the address registry pattern means upgrades change addresses, so prefer name-based lookup.
06Gotchas
  • rETH is NON-rebasing and `1 rETH != 1 ETH` — convert with `getEthValue()` for display. Many UIs incorrectly show 1:1.
  • Burn-for-ETH only works when the deposit pool has uncommitted ETH buffer; during high demand this path is closed and users must DEX-swap, which can incur 0.5-2% slippage / depeg.
  • rETH/ETH peg has historically traded at a PREMIUM (because of node operator demand) — display secondary-market premium/discount alongside the protocol exchange rate.
  • Node operators bond 8 ETH (LEB8) + RPL collateral — operator slashing reduces their bond first; only excess slashing flows to rETH holders. RPL collateral failure (price crash) can also trigger LEB8 minipool dissolution.
  • Contracts are upgradeable via RocketStorage's address registry — never hardcode subcontract addresses; ALWAYS look up by name via `RocketStorage.getAddress(keccak256(...))`.
  • RPL token had a 1.5x supply upgrade (legacy RPL → new RPL) — verify you reference the new RPL at 0xD33526068D116cE69F19A9ee46F0bd304F21A51f and not the legacy contract.
  • L2 rETH (Arbitrum, Base, Optimism, etc.) is bridged via the canonical bridge — exchange-rate updates are propagated by RocketOvmPriceMessenger and lag L1 by hours; don't use L2 rate for L1 redemptions.
07Alternatives