New Average Reward Rate Calculations for Staking

Staking Dashboard is introducing new staking reward estimates based on an average calculation of validator payouts. These calculations can trivially be derived from an RPC or light client connection, and give more accurate estimates of Polkadot staking rewards.

The Problem

For a while now the ecosystem (staking dashboard included) has been using an outdated calculation to get estimated staking reward rates and inflation figures. These calculations were derived from a Polkadot JS apps hook that can be found here.

This calculation is inaccurate, incorrectly adjusting the rate based on auctions (crowdloans) To make things more complicated, the calculations are hard to read and are difficult to replicate. Instead of trying to replicate the reward curve in JS world, a basic approach of calculating averages has been opted for in average reward rates.

The (start) of the Solution

Since era points are very evenly distributed to validators now, we can assume that each active validator will likely receive a similar reward per era, making the following calculation more reliable. We are assuming, though, that the Phragmen algorithm is doing a good job at evenly distributing bonded funds throughout nominees.

Average reward rates can be derived from the average validator reward of a time period. A 30 day average reward rate would be the average validator payout for the last 30 eras on Polkadot, for example:

XDayAverageDailyReward = sum(XDayValidatorPayouts) / days

After calculating this average daily payout, we can calculate both a base rate or compounded reward rate. The base rate is simply averageDailyReward * 365, and the compounded rate uses the daily compound interest formula:

A = P[(1+r)^t]`, where:

A = the future value of the investment
P = the principal investment amount
r = the daily interest rate (decimal)
t = the number of days the money is invested for
^ = ... to the power of ...

This calculation results in the inflation rate that goes to stakers, which can then be normalised with the staking rate to get the average reward rate.

rewardRate = A / stakingRate

We can also derive an average reward after validator commission. The initial implementation on staking dashboard takes the average of all non-100% validator commissions, and deducts this percentage from either the base rate or compounded rate calculated above.

So what we are left with is:

  • An average reward rate, that can be an average for any time period (up to 84 days of Polkadot if we are limiting ourselves to node and light client support).
  • Ability to provide a base rate (effectively an average inflation rate) or a compounded rate.
  • Ability to deduct an average validator commission to get an average net rate.

Terminology of new figures:

Taking a 30 day average, before validator commission deducted:

  • 30 Day Average Reward Rate / 30 ARR
  • Compounded 30 Day Average Reward Rate / Compound 30 ARR

After validator commission:

  • Net Compounded 30 Day Average Reward Rate / Net Compound 30 ARR.

why this is hidden?

I don’t know either. I assume Ross hid it?

Otherwise, you would need to use your powers to see who did

I flagged the post as the reward calculation posted was missing a normalisation step that has since been amended in production. I left a note - would be good to be able to edit or replace as the original calculation is misleading.

I’ve now edited the original post with the added step (It looks like the post becomes editable again after it has been flagged).


thank you. we are getting lots of queries at discord so we use this as reference of change.

1 Like

So @ross the above is updated? Thanks!

Hi @johnnykawa, yes it is all up to date and being used on staking dashboard now.

1 Like