HIP-782: Smoothing Staking Rewards
|Needs Council Approval||Yes ⓘ|
|Review period ends ⓘ||Wed, 09 Aug 2023 07:00:00 +0000|
|Type||Standards Track ⓘ|
Table of Contents
Note: This hip does not replace all of hip-406 Staking. It replaces only replaces a small part. Otherwise, hip-406 still stands.
This HIP describes a change to the staking reward system for proof of stake described in HIP-406. HIP-406 gives rewards at a constant reward rate until the unreserved balance of account
0.0.800 is empty, then suddenly drops to a near zero reward rate. This HIP defines a change so that as
0.0.800 approaches being empty, the reward rate decreases smoothly rather than with an abrupt drop.
In the original HIP, there is a setting
stakingRewardRate, and rewards are given at that rate until the unreserved balance of account
0.0.800 is empty, at which point it abruptly drops to simply distributing each day whatever came in to that account the previous day, such as through transaction fees.
The change is to remove this settings, and have
stakingRewardRate automatically change each day, based on the balance of
0.0.800 and three settings:
maxRewardRate (in tinybars earned per hbar staked per day) is the rate to pay normally (i.e., when
0.0.800 has a large balance, and not too many hbars are staked for reward). When the balance of
0.0.800 drops below
rewardBalanceThreshold (in tinybars), then the
stakingRewardRate drops smoothly as the balance drops. If the hbars staked for reward exceed
maxStakeRewarded (in tinybars), then there is a further decrease.
unreservedBalance (in tinybars) be the balance of account
0.0.800 minus the amount of rewards that have been earned but not yet distributed. Let
stakedForReward (in tinybars) be the total balance of all accounts on Hedera that have been staked for reward (so it ignores accounts that stake but decline a reward). Then each day, just before the HIP-406 reward calculations are performed using
stakingRewardRate as follows (implemented with equivalent results, but using integer calculations, rather than the real-number calculations shown):
//A real number proportional to the unreserved balance, from 0 for empty, up to 1 at the threshold. balanceRatio = min(unreservedBalance, rewardBalanceThreshold) / rewardBalanceThreshold; stakingRewardRate = maxRewardRate * balanceRatio * (2 – balanceRatio) * min(1, maxStakeRewarded / stakedForReward)
This has no effect on HAPI or on transactions. It just affects the amount of daily staking rewards received by accounts that stake for reward, when
0.0.800 has a low balance.
This document is licensed under the Apache License, Version 2.0 – see LICENSE or (https://www.apache.org/licenses/LICENSE-2.0)
Please cite this document as: