diff --git a/app/app.go b/app/app.go index 5dda48b6..5edba683 100644 --- a/app/app.go +++ b/app/app.go @@ -30,6 +30,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/slashing" "github.com/cosmos/cosmos-sdk/x/staking" "github.com/cosmos/cosmos-sdk/x/supply" + "github.com/cosmos/cosmos-sdk/x/upgrade" + upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client" "github.com/kava-labs/kava/x/auction" "github.com/kava-labs/kava/x/bep3" @@ -61,10 +63,14 @@ var ( staking.AppModuleBasic{}, mint.AppModuleBasic{}, distr.AppModuleBasic{}, - gov.NewAppModuleBasic(paramsclient.ProposalHandler, distr.ProposalHandler, committee.ProposalHandler), + gov.NewAppModuleBasic( + paramsclient.ProposalHandler, distr.ProposalHandler, committee.ProposalHandler, + upgradeclient.ProposalHandler, + ), params.AppModuleBasic{}, crisis.AppModuleBasic{}, slashing.AppModuleBasic{}, + upgrade.AppModuleBasic{}, supply.AppModuleBasic{}, evidence.AppModuleBasic{}, auction.AppModuleBasic{}, @@ -118,6 +124,7 @@ type App struct { distrKeeper distr.Keeper govKeeper gov.Keeper crisisKeeper crisis.Keeper + upgradeKeeper upgrade.Keeper paramsKeeper params.Keeper evidenceKeeper evidence.Keeper vvKeeper validatorvesting.Keeper @@ -138,7 +145,7 @@ type App struct { // NewApp returns a reference to an initialized App. func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, - invCheckPeriod uint, + skipUpgradeHeights map[int64]bool, invCheckPeriod uint, baseAppOptions ...func(*bam.BaseApp)) *App { cdc := MakeCodec() @@ -150,9 +157,9 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, keys := sdk.NewKVStoreKeys( bam.MainStoreKey, auth.StoreKey, staking.StoreKey, supply.StoreKey, mint.StoreKey, distr.StoreKey, slashing.StoreKey, - gov.StoreKey, params.StoreKey, evidence.StoreKey, validatorvesting.StoreKey, - auction.StoreKey, cdp.StoreKey, pricefeed.StoreKey, bep3.StoreKey, - kavadist.StoreKey, incentive.StoreKey, committee.StoreKey, + gov.StoreKey, params.StoreKey, upgrade.StoreKey, evidence.StoreKey, + validatorvesting.StoreKey, auction.StoreKey, cdp.StoreKey, pricefeed.StoreKey, + bep3.StoreKey, kavadist.StoreKey, incentive.StoreKey, committee.StoreKey, ) tkeys := sdk.NewTransientStoreKeys(params.TStoreKey) @@ -236,6 +243,11 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, app.supplyKeeper, auth.FeeCollectorName, ) + app.upgradeKeeper = upgrade.NewKeeper( + skipUpgradeHeights, + keys[upgrade.StoreKey], + app.cdc, + ) // create evidence keeper with router evidenceKeeper := evidence.NewKeeper( @@ -269,6 +281,7 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, AddRoute(gov.RouterKey, gov.ProposalHandler). AddRoute(params.RouterKey, params.NewParamChangeProposalHandler(app.paramsKeeper)). AddRoute(distr.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.distrKeeper)). + AddRoute(upgrade.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.upgradeKeeper)). AddRoute(committee.RouterKey, committee.NewProposalHandler(app.committeeKeeper)) app.govKeeper = gov.NewKeeper( app.cdc, @@ -347,6 +360,7 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, slashing.NewAppModule(app.slashingKeeper, app.accountKeeper, app.stakingKeeper), distr.NewAppModule(app.distrKeeper, app.accountKeeper, app.supplyKeeper, app.stakingKeeper), staking.NewAppModule(app.stakingKeeper, app.accountKeeper, app.supplyKeeper), + upgrade.NewAppModule(app.upgradeKeeper), evidence.NewAppModule(app.evidenceKeeper), validatorvesting.NewAppModule(app.vvKeeper, app.accountKeeper), auction.NewAppModule(app.auctionKeeper, app.accountKeeper, app.supplyKeeper), @@ -363,7 +377,11 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, // CanWithdrawInvariant invariant. // Auction.BeginBlocker will close out expired auctions and pay debt back to cdp. // So it should be run before cdp.BeginBlocker which cancels out debt with stable and starts more auctions. - app.mm.SetOrderBeginBlockers(mint.ModuleName, distr.ModuleName, slashing.ModuleName, validatorvesting.ModuleName, kavadist.ModuleName, auction.ModuleName, cdp.ModuleName, bep3.ModuleName, incentive.ModuleName, committee.ModuleName) + app.mm.SetOrderBeginBlockers( + upgrade.ModuleName, mint.ModuleName, distr.ModuleName, slashing.ModuleName, + validatorvesting.ModuleName, kavadist.ModuleName, auction.ModuleName, cdp.ModuleName, + bep3.ModuleName, incentive.ModuleName, committee.ModuleName, + ) app.mm.SetOrderEndBlockers(crisis.ModuleName, gov.ModuleName, staking.ModuleName, pricefeed.ModuleName) diff --git a/app/app_test.go b/app/app_test.go index 263c16b7..0ca09394 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -16,11 +16,11 @@ import ( func TestExport(t *testing.T) { db := db.NewMemDB() - app := NewApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, 0) + app := NewApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, 0) setGenesis(app) // Making a new app object with the db, so that initchain hasn't been called - newApp := NewApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, 0) + newApp := NewApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, 0) _, _, err := newApp.ExportAppStateAndValidators(false, []string{}) require.NoError(t, err, "ExportAppStateAndValidators should not have an error") } @@ -28,7 +28,7 @@ func TestExport(t *testing.T) { // ensure that black listed addresses are properly set in bank keeper func TestBlackListedAddrs(t *testing.T) { db := db.NewMemDB() - app := NewApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, 0) + app := NewApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, 0) for acc := range mAccPerms { require.True(t, app.bankKeeper.BlacklistedAddr(app.supplyKeeper.GetModuleAddress(acc))) diff --git a/app/sim_test.go b/app/sim_test.go index 6acf2f61..8a42b28a 100644 --- a/app/sim_test.go +++ b/app/sim_test.go @@ -80,7 +80,7 @@ func TestFullAppSimulation(t *testing.T) { require.NoError(t, os.RemoveAll(dir)) }() - app := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, fauxMerkleModeOpt) + app := NewApp(logger, db, nil, true, map[int64]bool{}, simapp.FlagPeriodValue, fauxMerkleModeOpt) require.Equal(t, appName, app.Name()) // run randomized simulation @@ -112,7 +112,7 @@ func TestAppImportExport(t *testing.T) { require.NoError(t, os.RemoveAll(dir)) }() - app := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, fauxMerkleModeOpt) + app := NewApp(logger, db, nil, true, map[int64]bool{}, simapp.FlagPeriodValue, fauxMerkleModeOpt) require.Equal(t, appName, app.Name()) // Run randomized simulation @@ -146,7 +146,7 @@ func TestAppImportExport(t *testing.T) { require.NoError(t, os.RemoveAll(newDir)) }() - newApp := NewApp(log.NewNopLogger(), newDB, nil, true, simapp.FlagPeriodValue, fauxMerkleModeOpt) + newApp := NewApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, simapp.FlagPeriodValue, fauxMerkleModeOpt) require.Equal(t, appName, newApp.Name()) var genesisState GenesisState @@ -207,7 +207,7 @@ func TestAppSimulationAfterImport(t *testing.T) { require.NoError(t, os.RemoveAll(dir)) }() - app := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, fauxMerkleModeOpt) + app := NewApp(logger, db, nil, true, map[int64]bool{}, simapp.FlagPeriodValue, fauxMerkleModeOpt) require.Equal(t, appName, app.Name()) // Run randomized simulation @@ -246,7 +246,7 @@ func TestAppSimulationAfterImport(t *testing.T) { require.NoError(t, os.RemoveAll(newDir)) }() - newApp := NewApp(log.NewNopLogger(), newDB, nil, true, simapp.FlagPeriodValue, fauxMerkleModeOpt) + newApp := NewApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, simapp.FlagPeriodValue, fauxMerkleModeOpt) require.Equal(t, appName, newApp.Name()) newApp.InitChain(abci.RequestInitChain{ @@ -279,7 +279,7 @@ func TestAppStateDeterminism(t *testing.T) { for j := 0; j < numTimesToRunPerSeed; j++ { logger := log.NewNopLogger() db := dbm.NewMemDB() - app := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, interBlockCacheOpt()) + app := NewApp(logger, db, nil, true, map[int64]bool{}, simapp.FlagPeriodValue, interBlockCacheOpt()) fmt.Printf( "running non-determinism simulation; seed %d: attempt: %d/%d\n", diff --git a/app/test_common.go b/app/test_common.go index 78b80486..5303d630 100644 --- a/app/test_common.go +++ b/app/test_common.go @@ -27,6 +27,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/slashing" "github.com/cosmos/cosmos-sdk/x/staking" "github.com/cosmos/cosmos-sdk/x/supply" + "github.com/cosmos/cosmos-sdk/x/upgrade" "github.com/kava-labs/kava/x/auction" "github.com/kava-labs/kava/x/bep3" @@ -58,10 +59,11 @@ func NewTestApp() TestApp { SetBip44CoinType(config) db := tmdb.NewMemDB() - app := NewApp(log.NewNopLogger(), db, nil, true, 0) + app := NewApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, 0) return TestApp{App: *app} } +// nolint func (tApp TestApp) GetAccountKeeper() auth.AccountKeeper { return tApp.accountKeeper } func (tApp TestApp) GetBankKeeper() bank.Keeper { return tApp.bankKeeper } func (tApp TestApp) GetSupplyKeeper() supply.Keeper { return tApp.supplyKeeper } @@ -71,6 +73,7 @@ func (tApp TestApp) GetMintKeeper() mint.Keeper { return tApp.mintKeep func (tApp TestApp) GetDistrKeeper() distribution.Keeper { return tApp.distrKeeper } func (tApp TestApp) GetGovKeeper() gov.Keeper { return tApp.govKeeper } func (tApp TestApp) GetCrisisKeeper() crisis.Keeper { return tApp.crisisKeeper } +func (tApp TestApp) GetUpgradeKeeper() upgrade.Keeper { return tApp.upgradeKeeper } func (tApp TestApp) GetParamsKeeper() params.Keeper { return tApp.paramsKeeper } func (tApp TestApp) GetVVKeeper() validatorvesting.Keeper { return tApp.vvKeeper } func (tApp TestApp) GetAuctionKeeper() auction.Keeper { return tApp.auctionKeeper } diff --git a/cmd/kvd/main.go b/cmd/kvd/main.go index d551ab96..6f049696 100644 --- a/cmd/kvd/main.go +++ b/cmd/kvd/main.go @@ -47,20 +47,22 @@ func main() { PersistentPreRunE: server.PersistentPreRunEFn(ctx), } - rootCmd.AddCommand(genutilcli.InitCmd(ctx, cdc, app.ModuleBasics, app.DefaultNodeHome)) - rootCmd.AddCommand(genutilcli.CollectGenTxsCmd(ctx, cdc, auth.GenesisAccountIterator{}, app.DefaultNodeHome)) - rootCmd.AddCommand(genutilcli.MigrateGenesisCmd(ctx, cdc)) - rootCmd.AddCommand(genutilcli.GenTxCmd( - ctx, - cdc, - app.ModuleBasics, - staking.AppModuleBasic{}, - auth.GenesisAccountIterator{}, - app.DefaultNodeHome, - app.DefaultCLIHome)) - rootCmd.AddCommand(genutilcli.ValidateGenesisCmd(ctx, cdc, app.ModuleBasics)) - rootCmd.AddCommand(AddGenesisAccountCmd(ctx, cdc, app.DefaultNodeHome, app.DefaultCLIHome)) - rootCmd.AddCommand(flags.NewCompletionCmd(rootCmd, true)) + rootCmd.AddCommand( + genutilcli.InitCmd(ctx, cdc, app.ModuleBasics, app.DefaultNodeHome), + genutilcli.CollectGenTxsCmd(ctx, cdc, auth.GenesisAccountIterator{}, app.DefaultNodeHome), + genutilcli.MigrateGenesisCmd(ctx, cdc), + genutilcli.GenTxCmd( + ctx, + cdc, + app.ModuleBasics, + staking.AppModuleBasic{}, + auth.GenesisAccountIterator{}, + app.DefaultNodeHome, + app.DefaultCLIHome), + genutilcli.ValidateGenesisCmd(ctx, cdc, app.ModuleBasics), + AddGenesisAccountCmd(ctx, cdc, app.DefaultNodeHome, app.DefaultCLIHome), + flags.NewCompletionCmd(rootCmd, true), + ) server.AddCommands(ctx, cdc, rootCmd, newApp, exportAppStateAndTMValidators) @@ -81,8 +83,13 @@ func newApp(logger log.Logger, db dbm.DB, traceStore io.Writer) abci.Application cache = store.NewCommitKVStoreCacheManager() } + skipUpgradeHeights := make(map[int64]bool) + for _, h := range viper.GetIntSlice(server.FlagUnsafeSkipUpgrades) { + skipUpgradeHeights[int64(h)] = true + } + return app.NewApp( - logger, db, traceStore, true, invCheckPeriod, + logger, db, traceStore, true, skipUpgradeHeights, invCheckPeriod, baseapp.SetPruning(store.NewPruningOptionsFromString(viper.GetString("pruning"))), baseapp.SetMinGasPrices(viper.GetString(server.FlagMinGasPrices)), baseapp.SetHaltHeight(viper.GetUint64(server.FlagHaltHeight)), @@ -96,13 +103,13 @@ func exportAppStateAndTMValidators( ) (json.RawMessage, []tmtypes.GenesisValidator, error) { if height != -1 { - tempApp := app.NewApp(logger, db, traceStore, false, uint(1)) + tempApp := app.NewApp(logger, db, traceStore, false, map[int64]bool{}, uint(1)) err := tempApp.LoadHeight(height) if err != nil { return nil, nil, err } return tempApp.ExportAppStateAndValidators(forZeroHeight, jailWhiteList) } - tempApp := app.NewApp(logger, db, traceStore, true, uint(1)) + tempApp := app.NewApp(logger, db, traceStore, true, map[int64]bool{}, uint(1)) return tempApp.ExportAppStateAndValidators(forZeroHeight, jailWhiteList) }