Comment on page


StakeWise RewardEthToken smart contract details.
The RewardEthToken is an ERC-20 contract. It reflects the rewards accumulated by the stakers in the form of prETH tokens. The tokens are mapped 1 to 1 to ETH.
The total supply of prETH is the amount that is above the effective balance of all the validators registered for the StakeWise Permissioned Pool.
Interactions with the RewardEthToken contract are limited only to the addresses included in the WhiteListManager contract.


Checkpoints are used to keep track of the staker's previously accumulated rewards and calculate the current reward. The checkpoint is updated in the following scenarios:
  • psETH amount has changed. The staker starts earning a bigger or smaller portion of the rewards because he now holds more/less psETH.
  • The staker has transferred the prETH tokens to a different address. The staker will continue earning rewards as usual but his prETH balance will decrease by the amount of transferred prETH.
Every checkpoint stores:
  • rewardPerToken - the number of earned prETH tokens per every psETH token
  • reward - the staker's total prETH balance calculated based on the rewardPerToken


The Permissioned Pool's rewards are updated periodically by the Oracles contract using the updateTotalRewards function in the RewardEthToken contract. When the total rewards are updated, the new value of rewardPerToken is calculated.
If the rewardPerToken is smaller than the previous value, it means that the Permissioned Pool's validators have received a penalty. Every staker's current reward gets reduced proportionally to their share of the total supply of psETH.
If the rewardPerToken is greater than the previous value, it means that the Permissioned Pool's rewards have increased. The amount of prETH tokens of every psETH holder is then increased based on their share of the total supply of psETH.
The total amount of prETH tokens for each individual staker is calculated based on the following formula when calling the balanceOf function:
rt=rp+rcrc=bc(ratecratep)r_{t} = r_{p} + r_{c}\\ r_{c} = b_{c} * (rate_{c} - rate_{p})\\
rtstakers  total  amount  of  prETHrpstakers  prETH  at  the  last  checkpointrcaccumulated  prETH  since  the  last  checkpointbcstakers  current  psETH  balancerateccurrent  reward  rate  per  psETH  tokenratepstakers  checkpoint  reward  rate  per  psETH  tokenr_{t} - staker's\;total\;amount\;of\;prETH\\ r_{p} - staker's\;prETH\;at\;the\;last\;checkpoint\\ r_{c} - accumulated\;prETH\;since\;the\;last\;checkpoint\\ b_{c} - staker's\;current\;psETH\;balance\\ rate_{c} - current\;reward\;rate\;per\;psETH\;token\\ rate_{p} - staker's\;checkpoint\;reward\;rate\;per\;psETH\;token

Set Rewards Disabled

In situations where psETH lands in a contract that does not support the redistribution of prETH that it begins to accumulate, StakeWise governance (or Admin) can disable the accrual of prETH to that contract by calling the setRewardsDisabled function in the RewardEthToken contract. The function will divert all the prETH that would be accruing (and unclaimable) from the contract with psETH into the MerkleDistributor contract.