mukan-ignite/docs/versioned_docs/version-v28/06-migration/v0.27.1.md
Mukan Erkin Törük 26b204bd04
Some checks are pending
Docs Deploy / build_and_deploy (push) Waiting to run
Generate Docs / cli (push) Waiting to run
Generate Config Doc / cli (push) Waiting to run
Go formatting / go-formatting (push) Waiting to run
Check links / markdown-link-check (push) Waiting to run
Integration / pre-test (push) Waiting to run
Integration / test on (push) Blocked by required conditions
Integration / status (push) Blocked by required conditions
Lint / Lint Go code (push) Waiting to run
Test / test (ubuntu-latest) (push) Waiting to run
feat: fork Ignite CLI v29 as Mukan Ignite — remove cosmos-sdk restrictions
2026-05-11 03:31:37 +03:00

34 KiB

sidebar_position title description
991 v0.27.1 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:

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 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:

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
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)
	}
}
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:

// 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:

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:

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:

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. Specially the parameter migration 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:

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:

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.

Doctor command

As the final steps it's recommended to run ignite doctor and go mod tidy.