--- sidebar_position: 991 title: v0.27.1 description: For chains that were scaffolded with IGNITE® CLI versions lower than v0.27.0. changes are required to use IGNITE® CLI v0.27.1. --- ## Cosmos SDK v0.47.3 upgrade notes ### Imports To use the new cosmos SDK make sure you update `go.mod` dependencies: ```text title="go.mod" go 1.20 require ( // remove-start github.com/cosmos/cosmos-sdk v0.46.7 github.com/tendermint/tendermint v0.34.24 github.com/tendermint/tm-db v0.6.7 github.com/cosmos/ibc-go/v7 v7.1.0 github.com/gogo/protobuf v1.3.3 github.com/regen-network/cosmos-proto v0.3.1 // remove-end // highlight-start cosmossdk.io/api v0.3.1 github.com/cosmos/cosmos-sdk v0.47.3 github.com/cometbft/cometbft v0.37.1 github.com/cometbft/cometbft-db v0.7.0 github.com/cosmos/ibc-go/v6 v6.1.0 github.com/cosmos/gogoproto v1.4.7 // highlight-end // ... ) replace ( // remove-start github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go v0.8.0 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 // remove-end // highlight-next-line github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) ``` The Cosmos SDK has migrated to CometBFT as its default consensus engine which requires changes in your app imports: 1. Replace `github.com/tendermint/tendermint` by `github.com/cometbft/cometbft` 2. Replace `github.com/tendermint/tm-db` by `github.com/cometbft/cometbft-db` 3. Verify `github.com/tendermint/tendermint` is not an indirect or direct dependency The SDK has also migrated from `gogo/protobuf` to `cosmos/gogoproto`. This means you must replace all `github.com/gogo/protobuf` imports with `github.com/cosmos/gogoproto`. This change might introduce breaking changes to your proto layout. Follow the official [Cosmos migration guide](https://docs.cosmos.network/main/migrations/upgrading#gogoproto-import-paths) to make sure you are using the correct layout. You might need to replace the following imports: 1. Replace `github.com/cosmos/cosmos-sdk/simapp` by `cosmossdk.io/simapp` ### App changes Applications scaffolded with older version of IGNITE® CLI would require the following changes to some of the app files: ```text title="app/app.go" import ( //... // remove-next-line tmjson "github.com/tendermint/tendermint/libs/json" // highlight-next-line "encoding/json" // highlight-start autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1" "github.com/cosmos/cosmos-sdk/runtime" runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" "github.com/cosmos/cosmos-sdk/x/consensus" consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types" // highlight-end ) func getGovProposalHandlers() []govclient.ProposalHandler { // ... govProposalHandlers = append(govProposalHandlers, paramsclient.ProposalHandler, // remove-next-line distrclient.ProposalHandler, upgradeclient.LegacyProposalHandler, // ... ) return govProposalHandlers } var ( // ... ModuleBasics = module.NewBasicManager( auth.AppModuleBasic{}, authzmodule.AppModuleBasic{}, // remove-next-line genutil.AppModuleBasic{}, // highlight-next-line genutil.NewAppModuleBasic(genutiltypes.DefaultMessageValidator), bank.AppModuleBasic{}, // ... vesting.AppModuleBasic{}, // highlight-next-line consensus.AppModuleBasic{}, //... ) ) var ( // highlight-next-line _ runtime.AppI = (*App)(nil) _ servertypes.Application = (*App)(nil) // remove-next-line _ simapp.App = (*App)(nil) ) type App struct { *baseapp.BaseApp cdc *codec.LegacyAmino appCodec codec.Codec interfaceRegistry types.InterfaceRegistry // highlight-next-line txConfig client.TxConfig invCheckPeriod uint // ... // remove-start StakingKeeper stakingkeeper.Keeper CrisisKeeper crisiskeeper.Keeper UpgradeKeeper upgradekeeper.Keeper // remove-end // highlight-start StakingKeeper *stakingkeeper.Keeper CrisisKeeper *crisiskeeper.Keeper UpgradeKeeper *upgradekeeper.Keeper // highlight-end // ... FeeGrantKeeper feegrantkeeper.Keeper GroupKeeper groupkeeper.Keeper // highlight-next-line ConsensusParamsKeeper consensusparamkeeper.Keeper // ... } func New( logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, skipUpgradeHeights map[int64]bool, homePath string, invCheckPeriod uint, encodingConfig appparams.EncodingConfig, appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp), ) *App { appCodec := encodingConfig.Marshaler cdc := encodingConfig.Amino interfaceRegistry := encodingConfig.InterfaceRegistry // highlight-next-line txConfig := encodingConfig.TxConfig // ... bApp.SetCommitMultiStoreTracer(traceStore) bApp.SetVersion(version.Version) bApp.SetInterfaceRegistry(interfaceRegistry) // highlight-next-line bApp.SetTxEncoder(txConfig.TxEncoder()) keys := sdk.NewKVStoreKeys( // ... banktypes.StoreKey, stakingtypes.StoreKey, // highlight-next-line crisistypes.StoreKey, // ... group.StoreKey, icacontrollertypes.StoreKey, // highlight-next-line consensusparamtypes.StoreKey, // ... ) // ... app := &App{ // ... interfaceRegistry: interfaceRegistry, // highlight-next-line txConfig: txConfig, invCheckPeriod: invCheckPeriod, // ... } // ... // set the BaseApp's parameter store // remove-next-line bApp.SetParamStore(app.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramstypes.ConsensusParamsKeyTable())) // highlight-start app.ConsensusParamsKeeper = consensusparamkeeper.NewKeeper(appCodec, keys[upgradetypes.StoreKey], authtypes.NewModuleAddress(govtypes.ModuleName).String()) bApp.SetParamStore(&app.ConsensusParamsKeeper) // highlight-end // ... app.AccountKeeper = authkeeper.NewAccountKeeper( appCodec, keys[authtypes.StoreKey], // remove-next-line app.GetSubspace(authtypes.ModuleName), authtypes.ProtoBaseAccount, maccPerms, sdk.Bech32PrefixAccAddr, // highlight-next-line authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.BankKeeper = bankkeeper.NewBaseKeeper( appCodec, keys[banktypes.StoreKey], app.AccountKeeper, // remove-next-line app.GetSubspace(banktypes.ModuleName), app.BlockedModuleAccountAddrs(), // highlight-next-line authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.StakingKeeper = stakingkeeper.NewKeeper( appCodec, keys[stakingtypes.StoreKey], app.AccountKeeper, app.BankKeeper, // remove-next-line app.GetSubspace(stakingtypes.ModuleName), // highlight-next-line authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.MintKeeper = mintkeeper.NewKeeper( appCodec, keys[minttypes.StoreKey], // remove-next-line app.GetSubspace(minttypes.ModuleName), // remove-next-line &app.StakingKeeper, // highlight-next-line app.StakingKeeper, app.AccountKeeper, app.BankKeeper, authtypes.FeeCollectorName, // highlight-next-line authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.DistrKeeper = distrkeeper.NewKeeper( appCodec, keys[distrtypes.StoreKey], // remove-next-line app.GetSubspace(distrtypes.ModuleName), app.AccountKeeper, app.BankKeeper, // remove-next-line &app.StakingKeeper, // highlight-next-line app.StakingKeeper, authtypes.FeeCollectorName, // highlight-next-line authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.SlashingKeeper = slashingkeeper.NewKeeper( appCodec, // highlight-next-line cdc, keys[slashingtypes.StoreKey], // remove-next-line &app.StakingKeeper, // highlight-next-line app.StakingKeeper, // remove-next-line app.GetSubspace(slashingtypes.ModuleName), // highlight-next-line authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) app.CrisisKeeper = crisiskeeper.NewKeeper( // remove-next-line app.GetSubspace(crisistypes.ModuleName), // highlight-start appCodec, keys[crisistypes.StoreKey], // highlight-end invCheckPeriod, app.BankKeeper, authtypes.FeeCollectorName, // highlight-next-line authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) // ... // Create evidence Keeper for to register the IBC light client misbehaviour evidence route evidenceKeeper := evidencekeeper.NewKeeper( appCodec, keys[evidencetypes.StoreKey], // remove-next-line &app.StakingKeeper, // highlight-next-line app.StakingKeeper, app.SlashingKeeper, ) // If evidence needs to be handled for the app, set routes in router here and seal app.EvidenceKeeper = *evidenceKeeper // highlight-start govConfig := govtypes.DefaultConfig() govKeeper := govkeeper.NewKeeper( appCodec, keys[govtypes.StoreKey], app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.MsgServiceRouter(), govConfig, authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) // highlight-end govRouter := govv1beta1.NewRouter() govRouter. AddRoute(govtypes.RouterKey, govv1beta1.ProposalHandler). AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.ParamsKeeper)). // remove-next-line AddRoute(distrtypes.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.DistrKeeper)). AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.UpgradeKeeper)). AddRoute(ibcclienttypes.RouterKey, ibcclient.NewClientProposalHandler(app.IBCKeeper.ClientKeeper)) // highlight-next-line govKeeper.SetLegacyRouter(govRouter) // remove-start govConfig := govtypes.DefaultConfig() app.GovKeeper = govkeeper.NewKeeper( appCodec, keys[govtypes.StoreKey], app.GetSubspace(govtypes.ModuleName), app.AccountKeeper, app.BankKeeper, &app.StakingKeeper, govRouter, app.MsgServiceRouter(), govConfig, ) // remove-end // highlight-start app.GovKeeper = *govKeeper.SetHooks( govtypes.NewMultiGovHooks( // register the governance hooks ), ) // highlight-end // ... // remove-start app.GovKeeper.SetHooks( govtypes.NewMultiGovHooks( // insert governance hooks receivers here ), ) // remove-end // ... app.mm = module.NewManager( genutil.NewAppModule( app.AccountKeeper, app.StakingKeeper, app.BaseApp.DeliverTx, encodingConfig.TxConfig, ), // remove-next-line auth.NewAppModule(appCodec, app.AccountKeeper, nil), // highlight-next-line auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)), authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), vesting.NewAppModule(app.AccountKeeper, app.BankKeeper), // remove-start bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), capability.NewAppModule(appCodec, *app.CapabilityKeeper), // remove-end // highlight-start bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(banktypes.ModuleName)), capability.NewAppModule(appCodec, *app.CapabilityKeeper, false), // highlight-end feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), groupmodule.NewAppModule(appCodec, app.GroupKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), // remove-start crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants), gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, minttypes.DefaultInflationCalculationFn), slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), // remove-end // highlight-start crisis.NewAppModule(app.CrisisKeeper, skipGenesisInvariants, app.GetSubspace(crisistypes.ModuleName)), gov.NewAppModule(appCodec, &app.GovKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(govtypes.ModuleName)), mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, nil, app.GetSubspace(minttypes.ModuleName)), slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.GetSubspace(slashingtypes.ModuleName)), distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.GetSubspace(distrtypes.ModuleName)), staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(stakingtypes.ModuleName)), // highlight-end upgrade.NewAppModule(app.UpgradeKeeper), evidence.NewAppModule(app.EvidenceKeeper), // highlight-next-line consensus.NewAppModule(appCodec, app.ConsensusParamsKeeper), ibc.NewAppModule(app.IBCKeeper), params.NewAppModule(app.ParamsKeeper), transferModule, icaModule, // this line is used by starport scaffolding # stargate/app/appModule ) app.mm.SetOrderBeginBlockers( // ... paramstypes.ModuleName, vestingtypes.ModuleName, // highlight-next-line consensusparamtypes.ModuleName, // ... ) app.mm.SetOrderEndBlockers( // ... paramstypes.ModuleName, upgradetypes.ModuleName, vestingtypes.ModuleName, // highlight-next-line consensusparamtypes.ModuleName, // ... ) // remove-next-line app.mm.SetOrderInitGenesis( // highlight-next-line genesisModuleOrder := []string{ // ... paramstypes.ModuleName, upgradetypes.ModuleName, vestingtypes.ModuleName, // highlight-next-line consensusparamtypes.ModuleName, // ... // remove-next-line ) // highlight-start } app.mm.SetOrderInitGenesis(genesisModuleOrder...) app.mm.SetOrderExportGenesis(genesisModuleOrder...) // highlight-end // remove-start app.mm.RegisterInvariants(&app.CrisisKeeper) app.mm.RegisterRoutes(app.Router(), app.QueryRouter(), encodingConfig.Amino) // remove-end // highlight-next-line app.mm.RegisterInvariants(app.CrisisKeeper) app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) app.mm.RegisterServices(app.configurator) // highlight-start autocliv1.RegisterQueryServer(app.GRPCQueryRouter(), runtimeservices.NewAutoCLIQueryService(app.mm.Modules)) reflectionSvc, err := runtimeservices.NewReflectionService() if err != nil { panic(err) } reflectionv1.RegisterReflectionServiceServer(app.GRPCQueryRouter(), reflectionSvc) // highlight-end // create the simulation manager and define the order of the modules for deterministic simulations // remove-start app.sm = module.NewSimulationManager( // ... ) // remove-end // highlight-start overrideModules := map[string]module.AppModuleSimulation{ authtypes.ModuleName: auth.NewAppModule(app.appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)), } app.sm = module.NewSimulationManagerFromAppModules(app.mm.Modules, overrideModules) // highlight-end app.sm.RegisterStoreDecoders() // ... // remove-start app.SetInitChainer(app.InitChainer) app.SetBeginBlocker(app.BeginBlocker) // remove-end // ... } func (app *App) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { var genesisState GenesisState // remove-next-line if err := tmjson.Unmarshal(req.AppStateBytes, &genesisState); err != nil { // highlight-next-line if err := json.Unmarshal(req.AppStateBytes, &genesisState); err != nil { panic(err) } // ... } // remove-start // GetMaccPerms returns a copy of the module account permissions func GetMaccPerms() map[string][]string { dupMaccPerms := make(map[string][]string) for k, v := range maccPerms { dupMaccPerms[k] = v } return dupMaccPerms } // remove-end // highlight-start // TxConfig returns App's TxConfig. func (app *App) TxConfig() client.TxConfig { return app.txConfig } // Configurator get app configurator func (app *App) Configurator() module.Configurator { return app.configurator } // ModuleManager returns the app ModuleManager func (app *App) ModuleManager() *module.Manager { return app.mm } // highlight-end ``` ```text title="app/simulation_test.go" import ( // ... // remove-start "cosmossdk.io/simapp" tmtypes "github.com/tendermint/tendermint/types" // remove-end // highlight-start "encoding/json" "fmt" "math/rand" "runtime/debug" "strings" dbm "github.com/cometbft/cometbft-db" "github.com/cometbft/cometbft/libs/log" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/server" storetypes "github.com/cosmos/cosmos-sdk/store/types" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" simcli "github.com/cosmos/cosmos-sdk/x/simulation/client/cli" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" // highlight-end ) // highlight-start type storeKeysPrefixes struct { A storetypes.StoreKey B storetypes.StoreKey Prefixes [][]byte } // highlight-end // Get flags every time the simulator is run func init() { // remove-next-line simapp.GetSimulatorFlags() // highlight-next-line simcli.GetSimulatorFlags() } // remove-start var defaultConsensusParams = &abci.ConsensusParams{ Block: &abci.BlockParams{ MaxBytes: 200000, MaxGas: 2000000, }, Evidence: &tmproto.EvidenceParams{ MaxAgeNumBlocks: 302400, MaxAgeDuration: 504 * time.Hour, // 3 weeks is the max duration MaxBytes: 10000, }, Validator: &tmproto.ValidatorParams{ PubKeyTypes: []string{ tmtypes.ABCIPubKeyTypeEd25519, }, }, } // remove-end // highlight-start func fauxMerkleModeOpt(bapp *baseapp.BaseApp) { bapp.SetFauxMerkleMode() } // highlight-end func BenchmarkSimulation(b *testing.B) { // remove-start simapp.FlagEnabledValue = true simapp.FlagCommitValue = true config, db, dir, logger, _, err := simapp.SetupSimulation("goleveldb-app-sim", "Simulation") // remove-end // highlight-start simcli.FlagSeedValue = time.Now().Unix() simcli.FlagVerboseValue = true simcli.FlagCommitValue = true simcli.FlagEnabledValue = true config := simcli.NewConfigFromFlags() config.ChainID = "mars-simapp" db, dir, logger, _, err := simtestutil.SetupSimulation( config, "leveldb-bApp-sim", "Simulation", simcli.FlagVerboseValue, simcli.FlagEnabledValue, ) // highlight-end require.NoError(b, err, "simulation setup failed") b.Cleanup(func() { // remove-start db.Close() err = os.RemoveAll(dir) require.NoError(b, err) // remove-end // highlight-start require.NoError(b, db.Close()) require.NoError(b, os.RemoveAll(dir)) // highlight-end }) // remove-next-line encoding := app.MakeEncodingConfig() // highlight-start appOptions := make(simtestutil.AppOptionsMap, 0) appOptions[flags.FlagHome] = app.DefaultNodeHome appOptions[server.FlagInvCheckPeriod] = simcli.FlagPeriodValue // highlight-end // remove-next-line app := app.New( // highlight-next-line bApp := app.New( logger, db, nil, true, map[int64]bool{}, app.DefaultNodeHome, 0, // remove-start encoding, simapp.EmptyAppOptions{}, // remove-end // highlight-start app.MakeEncodingConfig(), appOptions, baseapp.SetChainID(config.ChainID), // highlight-end ) // highlight-next-line require.Equal(b, app.Name, bApp.Name()) _, simParams, simErr := simulation.SimulateFromSeed( b, os.Stdout, // remove-start app.BaseApp, simapp.AppStateFn(app.AppCodec(), app.SimulationManager()), simulationtypes.RandomAccounts, simapp.SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), config, app.AppCodec(), // remove-end // highlight-start bApp.BaseApp, simtestutil.AppStateFn( bApp.AppCodec(), bApp.SimulationManager(), app.NewDefaultGenesisState(bApp.AppCodec()), ), simulationtypes.RandomAccounts, simtestutil.SimulationOperations(bApp, bApp.AppCodec(), config), bApp.ModuleAccountAddrs(), config, bApp.AppCodec(), // highlight-end ) // remove-next-line err = simapp.CheckExportSimulation(app, config, simParams) // highlight-next-line err = simtestutil.CheckExportSimulation(bApp, config, simParams) require.NoError(b, err) require.NoError(b, simErr) if config.Commit { // remove-next-line simapp.PrintStats(db) // highlight-next-line simtestutil.PrintStats(db) } } ``` ```text title="x/{{moduleName}}/module_simulation.go" import ( // ... // remove-next-line simappparams "cosmossdk.io/simapp/params" ) var ( // ... // remove-next-line _ = simappparams.StakePerAccount // highlight-next-line _ = rand.Rand{} ) // remove-start func (am AppModule) RandomizedParams(_ *rand.Rand) []simtypes.ParamChange { // ... } // remove-end // highlight-start // ProposalMsgs returns msgs used for governance proposals for simulations. func (am AppModule) ProposalMsgs(simState module.SimulationState) []simtypes.WeightedProposalMsg { return []simtypes.WeightedProposalMsg{ // this line is used by starport scaffolding # simapp/module/OpMsg } } // highlight-end ``` ### Deprecations The app module might contains some legacy methods that are deprecated and can be removed: ```text title="x/{{moduleName}}/module.go" // remove-start // Deprecated: use RegisterServices func (am AppModule) Route() sdk.Route { return sdk.Route{} } // Deprecated: use RegisterServices func (AppModule) QuerierRoute() string { return types.RouterKey } // Deprecated: use RegisterServices func (am AppModule) LegacyQuerierHandler(_ *codec.LegacyAmino) sdk.Querier { return nil } // remove-end ``` ### Other required changes Changes required to the network test util: ```text title="testutil/network/network.go" import ( // ... // remove-start "github.com/cosmos/cosmos-sdk/simapp" pruningtypes "github.com/cosmos/cosmos-sdk/pruning/types" // remove-end // highlight-start pruningtypes "github.com/cosmos/cosmos-sdk/store/pruning/types" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" // highlight-end ) func New(t *testing.T, configs ...Config) *Network { // ... net, err := network.New(t, t.TempDir(), cfg) require.NoError(t, err) // highlight-start _, err = net.WaitForHeight(1) require.NoError(t, err) // highlight-end // ... } func DefaultConfig() network.Config { // remove-next-line encoding := app.MakeEncodingConfig() // highlight-start var ( encoding = app.MakeEncodingConfig() chainID = "chain-" + tmrand.NewRand().Str(6) ) // highlight-end return network.Config{ // ... // remove-next-line AppConstructor: func(val network.Validator) servertypes.Application { // highlight-next-line AppConstructor: func(val network.ValidatorI) servertypes.Application { return app.New( // remove-next-line val.Ctx.Logger, // highlight-next-line val.GetCtx().Logger, tmdb.NewMemDB(), nil, true, map[int64]bool{}, // remove-next-line val.Ctx.Config.RootDir, // highlight-next-line val.GetCtx().Config.RootDir, 0, encoding, // remove-start simapp.EmptyAppOptions{}, baseapp.SetPruning(pruningtypes.NewPruningOptionsFromString(val.AppConfig.Pruning)), baseapp.SetMinGasPrices(val.AppConfig.MinGasPrices), // remove-end // highlight-start simtestutil.EmptyAppOptions{}, baseapp.SetPruning(pruningtypes.NewPruningOptionsFromString(val.GetAppConfig().Pruning)), baseapp.SetMinGasPrices(val.GetAppConfig().MinGasPrices), baseapp.SetChainID(chainID), // highlight-end ) }, // ... // remove-next-line ChainID: "chain-" + tmrand.NewRand().Str(6), // highlight-next-line ChainID: chainID, // ... } } ``` Update the collect genesis transactions command and add the new message validator argument: ```text title="cmd/{{binaryNamePrefix}}d/cmd/root.go" import ( // ... // highlight-start tmtypes "github.com/cometbft/cometbft/types" "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" // highlight-end ) func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { // ... // highlight-next-line gentxModule := app.ModuleBasics[genutiltypes.ModuleName].(genutil.AppModuleBasic) rootCmd.AddCommand( // ... // remove-next-line genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, app.DefaultHome), // highlight-next-line genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, app.DefaultNodeHome, gentxModule.GenTxValidator), // ... ) // ... } func (a appCreator) newApp( logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts servertypes.AppOptions, ) servertypes.Application { // ... pruningOpts, err := server.GetPruningOptionsFromFlags(appOpts) if err != nil { panic(err) } // highlight-start homeDir := cast.ToString(appOpts.Get(flags.FlagHome)) chainID := cast.ToString(appOpts.Get(flags.FlagChainID)) if chainID == "" { // fallback to genesis chain-id appGenesis, err := tmtypes.GenesisDocFromFile(filepath.Join(homeDir, "config", "genesis.json")) if err != nil { panic(err) } chainID = appGenesis.ChainID } // highlight-end // ... return app.New( // ... baseapp.SetPruning(pruningOpts), baseapp.SetMinGasPrices(cast.ToString(appOpts.Get(server.FlagMinGasPrices))), // remove-next-line baseapp.SetMinRetainBlocks(cast.ToUint64(appOpts.Get(server.FlagMinRetainBlocks))), baseapp.SetHaltHeight(cast.ToUint64(appOpts.Get(server.FlagHaltHeight))), baseapp.SetHaltTime(cast.ToUint64(appOpts.Get(server.FlagHaltTime))), // highlight-next-line baseapp.SetMinRetainBlocks(cast.ToUint64(appOpts.Get(server.FlagMinRetainBlocks))), // ... baseapp.SetIAVLDisableFastNode(cast.ToBool(appOpts.Get(server.FlagDisableIAVLFastNode))), // highlight-next-line baseapp.SetChainID(chainID), ) ) func (a appCreator) appExport( logger log.Logger, db dbm.DB, traceStore io.Writer, height int64, forZeroHeight bool, jailAllowedAddrs []string, appOpts servertypes.AppOptions, // highlight-next-line modulesToExport []string, ) (servertypes.ExportedApp, error) { // ... // remove-next-line return app.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs) // highlight-next-line return app.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs, modulesToExport) } ``` Add the new extra argument to `ExportAppStateAndValidators`: ```text title="app/export.go" func (app *App) ExportAppStateAndValidators( forZeroHeight bool, jailAllowedAddrs []string, // highlight-next-line modulesToExport []string, ) (servertypes.ExportedApp, error) { // ... // remove-next-line genState := app.mm.ExportGenesis(ctx, app.appCodec) // highlight-next-line genState := app.mm.ExportGenesisForModules(ctx, app.appCodec, modulesToExport) appState, err := json.MarshalIndent(genState, "", " ") if err != nil { return servertypes.ExportedApp{}, err } // ... } ``` ### Migration You can also follow other Cosmos SDK migration steps in their [upgrade guide](https://docs.cosmos.network/main/migrations/upgrading#v047x). Specially the [parameter migration](https://docs.cosmos.network/main/migrations/upgrading#xconsensus) which is required if you want to run the updated version keeping you current app state. ## Query commands Query commands context initialization should be changed to: ```text title="x/{moduleName}/client/cli/query_{typeName}.go" RunE: func(cmd *cobra.Command, args []string) (err error) { // remove-next-line clientCtx := client.GetClientContextFromCmd(cmd) // highlight-start clientCtx, err := client.GetClientQueryContext(cmd) if err != nil { return err } // highlight-end // ... } ``` ## ibc-go v7 Chains that are newly scaffolded with IGNITE® CLI `v0.27.1` now use `ibc-go/v7` for IBC functionality. It is required to upgrade to the newest version of `ibc-go`. Applications scaffolded with older version of IGNITE® CLI require the following changes to the app file: ```text title="app/app.go" import ( // ... // remove-start ica "github.com/cosmos/ibc-go/v6/modules/apps/27-interchain-accounts" icacontrollerkeeper "github.com/cosmos/ibc-go/v6/modules/apps/27-interchain-accounts/controller/keeper" icacontrollertypes "github.com/cosmos/ibc-go/v6/modules/apps/27-interchain-accounts/controller/types" icahost "github.com/cosmos/ibc-go/v6/modules/apps/27-interchain-accounts/host" icahostkeeper "github.com/cosmos/ibc-go/v6/modules/apps/27-interchain-accounts/host/keeper" icahosttypes "github.com/cosmos/ibc-go/v6/modules/apps/27-interchain-accounts/host/types" icatypes "github.com/cosmos/ibc-go/v6/modules/apps/27-interchain-accounts/types" "github.com/cosmos/ibc-go/v6/modules/apps/transfer" ibctransferkeeper "github.com/cosmos/ibc-go/v6/modules/apps/transfer/keeper" ibctransfertypes "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types" ibc "github.com/cosmos/ibc-go/v6/modules/core" ibcclient "github.com/cosmos/ibc-go/v6/modules/core/02-client" ibcclientclient "github.com/cosmos/ibc-go/v6/modules/core/02-client/client" ibcclienttypes "github.com/cosmos/ibc-go/v6/modules/core/02-client/types" ibcporttypes "github.com/cosmos/ibc-go/v6/modules/core/05-port/types" ibchost "github.com/cosmos/ibc-go/v6/modules/core/24-host" ibckeeper "github.com/cosmos/ibc-go/v6/modules/core/keeper" // remove-end // highlight-start ica "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts" icacontrollerkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/keeper" icacontrollertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types" icahost "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host" icahostkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/keeper" icahosttypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types" icatypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types" "github.com/cosmos/ibc-go/v7/modules/apps/transfer" ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" ibc "github.com/cosmos/ibc-go/v7/modules/core" ibcclient "github.com/cosmos/ibc-go/v7/modules/core/02-client" ibcclientclient "github.com/cosmos/ibc-go/v7/modules/core/02-client/client" ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" ibcporttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" solomachine "github.com/cosmos/ibc-go/v7/modules/light-clients/06-solomachine" ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" // highlight-end ) var ( // ... ModuleBasics = module.NewBasicManager( // ... groupmodule.AppModuleBasic{}, ibc.AppModuleBasic{}, // highlight-start ibctm.AppModuleBasic{}, solomachine.AppModuleBasic{}, // highlight-end upgrade.AppModuleBasic{}, // ... ) ) func New( logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, skipUpgradeHeights map[int64]bool, homePath string, invCheckPeriod uint, encodingConfig appparams.EncodingConfig, appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp), ) *App { // ... keys := sdk.NewKVStoreKeys( // ... govtypes.StoreKey, paramstypes.StoreKey, // remove-next-line ibchost.StoreKey, // highlight-next-line ibcexported.StoreKey, // ... ) // ... // grant capabilities for the ibc and ibc-transfer modules // remove-next-line scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibchost.ModuleName) // highlight-next-line scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibcexported.ModuleName) scopedICAControllerKeeper := app.CapabilityKeeper.ScopeToModule(icacontrollertypes.SubModuleName) // ... app.IBCKeeper = ibckeeper.NewKeeper( appCodec, // remove-start keys[ibchost.StoreKey], app.GetSubspace(ibchost.ModuleName), // remove-end // highlight-start keys[ibcexported.StoreKey], app.GetSubspace(ibcexported.ModuleName), // highlight-end app.StakingKeeper, app.UpgradeKeeper, scopedIBCKeeper, ) // ... app.mm.SetOrderBeginBlockers( // ... crisistypes.ModuleName, ibctransfertypes.ModuleName, // remove-next-line ibchost.ModuleName, // highlight-next-line ibcexported.ModuleName, // ... ) app.mm.SetOrderEndBlockers( // ... stakingtypes.ModuleName, ibctransfertypes.ModuleName, // remove-next-line ibchost.ModuleName, // highlight-next-line ibcexported.ModuleName, // ... ) genesisModuleOrder := []string{ // ... genutiltypes.ModuleName, ibctransfertypes.ModuleName, // remove-next-line ibchost.ModuleName, // highlight-next-line ibcexported.ModuleName, // ... } // ... ) func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey storetypes.StoreKey) paramskeeper.Keeper { // ... paramsKeeper.Subspace(crisistypes.ModuleName) paramsKeeper.Subspace(ibctransfertypes.ModuleName) // remove-next-line paramsKeeper.Subspace(ibchost.ModuleName) // highlight-next-line paramsKeeper.Subspace(ibcexported.ModuleName) // ... } ``` You can follow other IBC migration steps in their [migration guide v6 to v7](https://github.com/cosmos/ibc-go/blob/v7.0.1/docs/migrations/v6-to-v7.md). ## Doctor command As the final steps it's recommended to run `ignite doctor` and `go mod tidy`.