mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-26 16:25:21 +00:00
28 lines
1.2 KiB
Go
28 lines
1.2 KiB
Go
|
package keeper
|
||
|
|
||
|
import (
|
||
|
sdkmath "cosmossdk.io/math"
|
||
|
)
|
||
|
|
||
|
const SecondsPerYear = 365 * 24 * 3600
|
||
|
|
||
|
// CalculateStakingAnnualPercentage returns the annualized staking reward rate.
|
||
|
// It assumes that staking comes from one of two sources depending on if inflation is enabled or not.
|
||
|
func CalculateStakingAnnualPercentage(totalSupply, totalBonded sdkmath.Int, inflationRate, communityTax, rewardsPerSecond sdkmath.LegacyDec) sdkmath.LegacyDec {
|
||
|
// no rewards are given if no tokens are bonded, in addition avoid division by zero
|
||
|
if totalBonded.IsZero() {
|
||
|
return sdkmath.LegacyZeroDec()
|
||
|
}
|
||
|
|
||
|
// the percent of inflationRate * totalSupply tokens that are distributed to stakers
|
||
|
percentInflationDistributedToStakers := sdkmath.LegacyOneDec().Sub(communityTax)
|
||
|
|
||
|
// the total amount of tokens distributed to stakers in a year
|
||
|
amountGivenPerYear := inflationRate.
|
||
|
MulInt(totalSupply).Mul(percentInflationDistributedToStakers). // portion provided by inflation via mint & distribution modules
|
||
|
Add(rewardsPerSecond.Mul(sdkmath.LegacyNewDec(SecondsPerYear))) // portion provided by community module
|
||
|
|
||
|
// divide by total bonded tokens to get the percent return
|
||
|
return amountGivenPerYear.QuoInt(totalBonded)
|
||
|
}
|