diff --git a/app/upgrades/v6/upgrade.go b/app/upgrades/v6/upgrade.go index df42c29c2..17757d0c0 100644 --- a/app/upgrades/v6/upgrade.go +++ b/app/upgrades/v6/upgrade.go @@ -6,6 +6,7 @@ import ( upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/functionx/fx-core/v6/app/keepers" + govtypes "github.com/functionx/fx-core/v6/x/gov/types" ) func CreateUpgradeHandler( @@ -16,6 +17,10 @@ func CreateUpgradeHandler( return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { cacheCtx, commit := ctx.CacheContext() + if err := UpdateParams(cacheCtx, app); err != nil { + return nil, err + } + ctx.Logger().Info("start to run v6 migrations...", "module", "upgrade") toVM, err := mm.RunMigrations(cacheCtx, configurator, fromVM) if err != nil { @@ -27,3 +32,49 @@ func CreateUpgradeHandler( return toVM, nil } } + +func UpdateParams(cacheCtx sdk.Context, app *keepers.AppKeepers) error { + mintParams := app.MintKeeper.GetParams(cacheCtx) + mintParams.InflationMax = sdk.ZeroDec() + mintParams.InflationMin = sdk.ZeroDec() + if err := mintParams.Validate(); err != nil { + return err + } + app.MintKeeper.SetParams(cacheCtx, mintParams) + + distrParams := app.DistrKeeper.GetParams(cacheCtx) + distrParams.CommunityTax = sdk.ZeroDec() + distrParams.BaseProposerReward = sdk.ZeroDec() + distrParams.BonusProposerReward = sdk.ZeroDec() + if err := distrParams.ValidateBasic(); err != nil { + return err + } + app.DistrKeeper.SetParams(cacheCtx, distrParams) + + stakingParams := app.StakingKeeper.GetParams(cacheCtx) + stakingParams.UnbondingTime = 1 + if err := stakingParams.Validate(); err != nil { + return err + } + app.StakingKeeper.SetParams(cacheCtx, stakingParams) + + govTallyParams := app.GovKeeper.GetTallyParams(cacheCtx) + govTallyParams.Quorum = sdk.OneDec().String() // 100% + govTallyParams.Threshold = sdk.OneDec().String() // 100% + govTallyParams.VetoThreshold = sdk.OneDec().String() // 100% + app.GovKeeper.SetTallyParams(cacheCtx, govTallyParams) + + app.GovKeeper.IterateParams(cacheCtx, func(param *govtypes.Params) (stop bool) { + param.Quorum = sdk.OneDec().String() // 100% + param.Threshold = sdk.OneDec().String() // 100% + param.VetoThreshold = sdk.OneDec().String() // 100% + if err := param.ValidateBasic(); err != nil { + panic(err) + } + if err := app.GovKeeper.SetParams(cacheCtx, param); err != nil { + panic(err) + } + return false + }) + return nil +} diff --git a/app/upgrades/v6/upgrade_test.go b/app/upgrades/v6/upgrade_test.go new file mode 100644 index 000000000..d32d29472 --- /dev/null +++ b/app/upgrades/v6/upgrade_test.go @@ -0,0 +1,62 @@ +package v6_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/suite" + abci "github.com/tendermint/tendermint/abci/types" + tmrand "github.com/tendermint/tendermint/libs/rand" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + + "github.com/functionx/fx-core/v6/app" + v6 "github.com/functionx/fx-core/v6/app/upgrades/v6" + "github.com/functionx/fx-core/v6/testutil/helpers" + fxtypes "github.com/functionx/fx-core/v6/types" +) + +type UpgradeTestSuite struct { + suite.Suite + + app *app.App + ctx sdk.Context +} + +func TestUpgradeTestSuite(t *testing.T) { + suite.Run(t, new(UpgradeTestSuite)) +} + +func (s *UpgradeTestSuite) SetupTest() { + valNumber := tmrand.Intn(5) + 5 + valSet, valAccounts, valBalances := helpers.GenerateGenesisValidator(valNumber, sdk.Coins{}) + s.app = helpers.SetupWithGenesisValSet(s.T(), valSet, valAccounts, valBalances...) + s.ctx = s.app.NewContext(false, tmproto.Header{ + ChainID: fxtypes.MainnetChainId, + Height: s.app.LastBlockHeight() + 1, + ProposerAddress: valSet.Proposer.Address.Bytes(), + }) +} + +func (s *UpgradeTestSuite) CommitBlock(block int64) { + _ = s.app.Commit() + block-- + + ctx := s.ctx + nextBlockHeight := ctx.BlockHeight() + 1 + + _ = s.app.BeginBlock(abci.RequestBeginBlock{ + Header: tmproto.Header{ + Height: nextBlockHeight, + }, + }) + s.ctx = s.app.NewContext(false, ctx.BlockHeader()) + s.ctx = s.ctx.WithBlockHeight(nextBlockHeight) + if block > 0 { + s.CommitBlock(block) + } +} + +func (s *UpgradeTestSuite) TestUpdateParams() { + s.NoError(v6.UpdateParams(s.ctx, s.app.AppKeepers)) + s.CommitBlock(10) +} diff --git a/x/gov/keeper/params.go b/x/gov/keeper/params.go index 4460bf963..00d8c8ff4 100644 --- a/x/gov/keeper/params.go +++ b/x/gov/keeper/params.go @@ -9,6 +9,19 @@ import ( "github.com/functionx/fx-core/v6/x/gov/types" ) +func (keeper Keeper) IterateParams(ctx sdk.Context, cb func(param *types.Params) (stop bool)) { + store := ctx.KVStore(keeper.storeKey) + iter := sdk.KVStorePrefixIterator(store, types.FxBaseParamsKeyPrefix) + defer iter.Close() + for ; iter.Valid(); iter.Next() { + var param types.Params + keeper.cdc.MustUnmarshal(iter.Value(), ¶m) + if cb(¶m) { + break + } + } +} + // GetParams gets the gov module's parameters. func (keeper Keeper) GetParams(ctx sdk.Context, msgType string) (params types.Params) { store := ctx.KVStore(keeper.storeKey) diff --git a/x/gov/keeper/proposal.go b/x/gov/keeper/proposal.go index 9c6ad112a..080ed5203 100644 --- a/x/gov/keeper/proposal.go +++ b/x/gov/keeper/proposal.go @@ -24,9 +24,7 @@ func (keeper Keeper) SubmitProposal(ctx sdk.Context, messages []sdk.Msg, fxMetad return v1.Proposal{}, errortypes.ErrInvalidRequest.Wrapf("invalid fx metadata content: %s", err) } if err := keeper.AssertFXMetadata(fxMD); err != nil { - if err != nil { - return v1.Proposal{}, err - } + return v1.Proposal{}, err } // Will hold a comma-separated string of all Msg type URLs.