From 8849e52f6e69343b2c64c2c0943e3704de84999c Mon Sep 17 00:00:00 2001 From: Solovyov1796 Date: Sun, 4 Aug 2024 01:51:44 +0800 Subject: [PATCH] custom inflation calculation function --- app/app.go | 2 +- chaincfg/mint.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 chaincfg/mint.go diff --git a/app/app.go b/app/app.go index 0b16600c..8a875c27 100644 --- a/app/app.go +++ b/app/app.go @@ -839,7 +839,7 @@ func NewApp( // earn.NewAppModule(app.earnKeeper, app.accountKeeper, app.bankKeeper), // router.NewAppModule(app.routerKeeper), // nil InflationCalculationFn, use SDK's default inflation function - mint.NewAppModule(appCodec, app.mintKeeper, app.accountKeeper, nil, mintSubspace), + mint.NewAppModule(appCodec, app.mintKeeper, app.accountKeeper, chaincfg.CustomInflationCalculateFn, mintSubspace), // community.NewAppModule(app.communityKeeper, app.accountKeeper), metrics.NewAppModule(options.TelemetryOptions), diff --git a/chaincfg/mint.go b/chaincfg/mint.go new file mode 100644 index 00000000..ec0752a6 --- /dev/null +++ b/chaincfg/mint.go @@ -0,0 +1,48 @@ +package chaincfg + +import ( + "github.com/cometbft/cometbft/libs/log" + + sdk "github.com/cosmos/cosmos-sdk/types" + minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" +) + +func CustomInflationCalculateFn(ctx sdk.Context, minter minttypes.Minter, params minttypes.Params, bondedRatio sdk.Dec, _ sdk.Dec) sdk.Dec { + logger := ctx.Logger() + if logger == nil { + panic("logger is nil") + } + return customInflationCalculateFn(logger, minter, params, bondedRatio) +} + +func customInflationCalculateFn(logger log.Logger, minter minttypes.Minter, params minttypes.Params, bondedRatio sdk.Dec) sdk.Dec { + // The target annual inflation rate is recalculated for each previsions cycle. The + // inflation is also subject to a rate change (positive or negative) depending on + // the distance from the desired ratio (67%). The maximum rate change possible is + // defined to be 13% per year, however the annual inflation is capped as between + // 7% and 20%. + + // (1 - bondedRatio/GoalBonded) * InflationRateChange + inflationRateChangePerYear := sdk.OneDec(). + Sub(bondedRatio.Quo(params.GoalBonded)). + Mul(params.InflationRateChange) + inflationRateChange := inflationRateChangePerYear.Quo(sdk.NewDec(int64(params.BlocksPerYear))) + + // adjust the new annual inflation for this next cycle + inflation := minter.Inflation.Add(inflationRateChange) // note inflationRateChange may be negative + if inflation.GT(params.InflationMax) { + inflation = params.InflationMax + } + if inflation.LT(params.InflationMin) { + inflation = params.InflationMin + } + + logger.Info( + "calculated new annual inflation", + "bondedRatio", bondedRatio, + "inflation", inflation, + "params", params, + "minter", minter, + ) + return inflation +}