/
inflation_calculation.go
60 lines (50 loc) · 2.32 KB
/
inflation_calculation.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Copyright 2024 Tabi Foundation
// This file is part of the Tabi Network packages.
//
// Tabi is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The Tabi packages are distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
package types
import (
sdk "github.com/cosmos/cosmos-sdk/types"
tabitypes "github.com/tabilabs/tabi/types"
)
// CalculateEpochProvisions returns mint provision per epoch
func CalculateEpochMintProvision(
params Params,
period uint64,
epochsPerPeriod int64,
bondedRatio sdk.Dec,
) sdk.Dec {
x := period // period
a := params.ExponentialCalculation.A // initial value
r := params.ExponentialCalculation.R // reduction factor
c := params.ExponentialCalculation.C // long term inflation
bTarget := params.ExponentialCalculation.BondingTarget // bonding target
maxVariance := params.ExponentialCalculation.MaxVariance // max percentage that inflation can be increased by
// exponentialDecay := a * (1 - r) ^ x + c
decay := sdk.OneDec().Sub(r)
exponentialDecay := a.Mul(decay.Power(x)).Add(c)
// bondingIncentive doesn't increase beyond bonding target (0 < b < bonding_target)
if bondedRatio.GTE(bTarget) {
bondedRatio = bTarget
}
// bondingIncentive = 1 + max_variance - bondingRatio * (max_variance / bonding_target)
sub := bondedRatio.Mul(maxVariance.Quo(bTarget))
bondingIncentive := sdk.OneDec().Add(maxVariance).Sub(sub)
// periodProvision = exponentialDecay * bondingIncentive
periodProvision := exponentialDecay.Mul(bondingIncentive)
// epochProvision = periodProvision / epochsPerPeriod
epochProvision := periodProvision.Quo(sdk.NewDec(epochsPerPeriod))
// Multiply epochMintProvision with power reduction (10^18 for tabi) as the
// calculation is based on `tabi` and the issued tokens need to be given in
// `atabi`
epochProvision = epochProvision.Mul(sdk.NewDecFromInt(tabitypes.PowerReduction))
return epochProvision
}