BeginBlock, all fees received in the previous block are transferred to
ModuleAccount account. When a delegator or validator
withdraws their rewards, they are taken out of the
ModuleAccount. During begin
block, the different claims on the fees collected are updated as follows:
- The block proposer of the previous height and its delegators receive between 1% and 5% of fee rewards.
- The reserve community tax is charged.
- The remainder is distributed proportionally by voting power to all bonded validators
To incentivize validators to wait and include additional pre-commits in the block, the block proposer reward is calculated from Tendermint pre-commit messages.
The Distribution Scheme
See params for description of parameters.
fees be the total fees collected in the previous block, including
inflationary rewards to the stake. All fees are collected in a specific module
account during the block. During
BeginBlock, they are sent to the
ModuleAccount. No other sending of tokens occurs. Instead, the
rewards each account is entitled to are stored, and withdrawals can be triggered
through the messages
Reward to the Community Pool
The community pool gets
community_tax * fees, plus any remaining dust after
validators get their rewards that are always rounded down to the nearest
Reward To the Validators
The proposer receives a base reward of
fees * baseproposerreward and a bonus
fees * bonusproposerreward * P, where
P = (total power of validators with
included precommits / total bonded validator power). The more precommits the
proposer includes, the larger
P can never be larger than
only bonded validators can supply valid precommits) and is always larger than
Any remaining fees are distributed among all the bonded validators, including the proposer, in proportion to their consensus power.
powFrac = validator power / total bonded validator power
proposerMul = baseproposerreward + bonusproposerreward * P
voteMul = 1 - communitytax - proposerMul
In total, the proposer receives
fees * (voteMul * powFrac + proposerMul).
All other validators receive
fees * voteMul * powFrac.
Rewards to Delegators
Each validator's rewards are distributed to its delegators. The validator also has a self-delegation that is treated like a regular delegation in distribution calculations.
The validator sets a commission rate. The commission rate is flexible, but each validator sets a maximum rate and a maximum daily increase. These maximums cannot be exceeded and protect delegators from sudden increases of validator commission rates to prevent validators from taking all of the rewards.
The outstanding rewards that the operator is entitled to are stored in
ValidatorAccumulatedCommission, while the rewards the delegators are entitled
to are stored in
ValidatorCurrentRewards. The F1 fee distribution
scheme is used to calculate the rewards per delegator as they
withdraw or update their delegation, and is thus not handled in
For this example distribution, the underlying consensus engine selects block proposers in proportion to their power relative to the entire bonded power.
All validators are equally performant at including pre-commits in their proposed
blocks. Then hold
(precommits included) / (total bonded validator power)
constant so that the amortized block reward for the validator is
( validator power / total bonded power) * (1 - community tax rate) of
the total rewards. Consequently, the reward for a single delegator is:
(delegator proportion of the validator power / validator power) * (validator power / total bonded power)
* (1 - community tax rate) * (1 - validator commision rate)
= (delegator proportion of the validator power / total bonded power) * (1 -
community tax rate) * (1 - validator commision rate)