0g-chain/x/community/keeper/disable_inflation.go
Draco 43be3815cc
feat: disable inflation upgrade logic (#1706)
* feat: disable inflation upgrade logic

* improve disable inflation comments

* add upgrade tests

* update changelog

* split disable inflation upgrade and the upgrade check

* remove pay rewards logic

* clean up incentives test

* add abci test

* refactor upgradeTime and blockTime check

* fix abci test

* fix wrong pr in changelog

* refactor disable inflation tests, behavior, and implementation
  - Unit tests are now shared between keeper and abci begin blocker
    since behavior is 100% the same
  - ABCI is unaware of keeper initial keeper logic branch (keeper
    methods required to be called in certain order by begin blocker)
  - Behavior of zero time is changed -- this now doesn't run for the
    zero time.  This is more ideal for new chains (genesis should set
    all correct state instead of relying on inflation disable logic),
    and allows for a simpler implementation.
  - Begin blocker now panics if parameters are not in state

* remove previous tests and implementation

* remove previous block time keeper state -- not needed for inflation
disalbing

* move inflation disabling to private method and add more comments

* remove unused key

* use correct spelling for idempotence

---------

Co-authored-by: Nick DeLuca <nickdeluca08@gmail.com>
2023-10-02 13:10:22 -07:00

54 lines
1.8 KiB
Go

package keeper
import (
"time"
sdk "github.com/cosmos/cosmos-sdk/types"
)
// CheckAndDisableMintAndKavaDistInflation compares the disable inflation time and block time,
// and disables inflation if time is set and before block time. Inflation time is reset,
// so this method is safe to call more than once.
func (k Keeper) CheckAndDisableMintAndKavaDistInflation(ctx sdk.Context) {
params, found := k.GetParams(ctx)
if !found {
// panic since this can only be reached if chain state is corrupted or method is ran at an invalid height
panic("invalid state: module parameters not found")
}
// if upgrade time is in the future or zero there is nothing to do, so return
if params.UpgradeTimeDisableInflation.IsZero() || params.UpgradeTimeDisableInflation.After(ctx.BlockTime()) {
return
}
// run disable inflation logic
k.disableInflation(ctx)
// reset disable inflation time to ensure next call is a no-op
params.UpgradeTimeDisableInflation = time.Time{}
k.SetParams(ctx, params)
}
// TODO: double check this is correct method for disabling inflation in kavadist without
// affecting rewards. In addition, inflation periods in kavadist should be removed.
func (k Keeper) disableInflation(ctx sdk.Context) {
logger := k.Logger(ctx)
logger.Info("disable inflation upgrade started")
// set x/min inflation to 0
mintParams := k.mintKeeper.GetParams(ctx)
mintParams.InflationMin = sdk.ZeroDec()
mintParams.InflationMax = sdk.ZeroDec()
k.mintKeeper.SetParams(ctx, mintParams)
logger.Info("x/mint inflation set to 0")
// disable kavadist inflation
kavadistParams := k.kavadistKeeper.GetParams(ctx)
kavadistParams.Active = false
k.kavadistKeeper.SetParams(ctx, kavadistParams)
logger.Info("x/kavadist inflation disabled")
logger.Info("disable inflation upgrade finished successfully!")
}