--- sidebar_position: 999 title: v0.18.0 description: For chains that were scaffolded with IGNITE® CLI versions lower than v0.18, changes are required to use IGNITE® CLI v0.18. --- # Upgrading a Blockchain to use IGNITE® CLI v0.18 IGNITE® CLI v0.18 comes with Cosmos SDK v0.44. This version of Cosmos SDK introduced changes that are not compatible with chains that were scaffolded with IGNITE® CLI versions lower than v0.18. **Important:** After upgrading from IGNITE® CLI v0.17.3 to IGNITE® CLI v0.18, you must update the default blockchain template to use blockchains that were scaffolded with earlier versions. These instructions are written for a blockchain that was scaffolded with the following command: ``` ignite scaffold chain github.com/username/mars ``` If you used a different module path, replace `username` and `mars` with the correct values for your blockchain. ## Blockchain For each file listed, make the required changes to the source code of the blockchain template. ### go.mod ``` module github.com/username/mars go 1.16 require ( github.com/cosmos/cosmos-sdk v0.44.0 github.com/cosmos/ibc-go v1.2.0 github.com/gogo/protobuf v1.3.3 github.com/google/go-cmp v0.5.6 // indirect github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/spf13/cast v1.3.1 github.com/spf13/cobra v1.1.3 github.com/stretchr/testify v1.7.0 github.com/tendermint/spm v0.1.6 github.com/tendermint/tendermint v0.34.13 github.com/tendermint/tm-db v0.6.4 google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83 google.golang.org/grpc v1.40.0 ) replace ( github.com/99designs/keyring => github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 google.golang.org/grpc => google.golang.org/grpc v1.33.2 ) ``` ### app/app.go ```go package app import ( //... // Add the following packages: "github.com/cosmos/cosmos-sdk/x/feegrant" feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" feegrantmodule "github.com/cosmos/cosmos-sdk/x/feegrant/module" "github.com/cosmos/ibc-go/modules/apps/transfer" ibctransferkeeper "github.com/cosmos/ibc-go/modules/apps/transfer/keeper" ibctransfertypes "github.com/cosmos/ibc-go/modules/apps/transfer/types" ibc "github.com/cosmos/ibc-go/modules/core" ibcclient "github.com/cosmos/ibc-go/modules/core/02-client" ibcporttypes "github.com/cosmos/ibc-go/modules/core/05-port/types" ibchost "github.com/cosmos/ibc-go/modules/core/24-host" ibckeeper "github.com/cosmos/ibc-go/modules/core/keeper" // Remove the following packages: // transfer "github.com/cosmos/cosmos-sdk/x/ibc/applications/transfer" // ibctransferkeeper "github.com/cosmos/cosmos-sdk/x/ibc/applications/transfer/keeper" // ibctransfertypes "github.com/cosmos/cosmos-sdk/x/ibc/applications/transfer/types" // ibc "github.com/cosmos/cosmos-sdk/x/ibc/core" // ibcclient "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client" // porttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/05-port/types" // ibchost "github.com/cosmos/cosmos-sdk/x/ibc/core/24-host" // ibckeeper "github.com/cosmos/cosmos-sdk/x/ibc/core/keeper" ) var ( //... ModuleBasics = module.NewBasicManager( //... slashing.AppModuleBasic{}, // Add feegrantmodule.AppModuleBasic{}, feegrantmodule.AppModuleBasic{}, // <-- ibc.AppModuleBasic{}, //... ) //... ) type App struct { //... // Replace codec.Marshaler with codec.Codec appCodec codec.Codec // <-- // Add FeeGrantKeeper FeeGrantKeeper feegrantkeeper.Keeper // <-- } func New( /*...*/ ) { //bApp.SetAppVersion(version.Version) bApp.SetVersion(version.Version) // <-- keys := sdk.NewKVStoreKeys( //... upgradetypes.StoreKey, // Add feegrant.StoreKey feegrant.StoreKey, // <-- evidencetypes.StoreKey, //... ) app.FeeGrantKeeper = feegrantkeeper.NewKeeper(appCodec, keys[feegrant.StoreKey], app.AccountKeeper) // <-- // Add app.BaseApp as the last argument to upgradekeeper.NewKeeper app.UpgradeKeeper = upgradekeeper.NewKeeper(skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, homePath, app.BaseApp) app.IBCKeeper = ibckeeper.NewKeeper( // Add app.UpgradeKeeper appCodec, keys[ibchost.StoreKey], app.GetSubspace(ibchost.ModuleName), app.StakingKeeper, app.UpgradeKeeper, scopedIBCKeeper, ) govRouter.AddRoute(govtypes.RouterKey, govtypes.ProposalHandler). //... // Replace NewClientUpdateProposalHandler with NewClientProposalHandler AddRoute(ibchost.RouterKey, ibcclient.NewClientProposalHandler(app.IBCKeeper.ClientKeeper)) // Replace porttypes with ibcporttypes ibcRouter := ibcporttypes.NewRouter() app.mm.SetOrderBeginBlockers( upgradetypes.ModuleName, // Add capabilitytypes.ModuleName, capabilitytypes.ModuleName, minttypes.ModuleName, //... // Add feegrant.ModuleName, feegrant.ModuleName, ) // Add app.appCodec as an argument to module.NewConfigurator: app.mm.RegisterServices(module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter())) // Replace: // app.SetAnteHandler( // ante.NewAnteHandler( // app.AccountKeeper, app.BankKeeper, ante.DefaultSigVerificationGasConsumer, // encodingConfig.TxConfig.SignModeHandler(), // ), // ) // With the following: anteHandler, err := ante.NewAnteHandler( ante.HandlerOptions{ AccountKeeper: app.AccountKeeper, BankKeeper: app.BankKeeper, SignModeHandler: encodingConfig.TxConfig.SignModeHandler(), FeegrantKeeper: app.FeeGrantKeeper, SigGasConsumer: ante.DefaultSigVerificationGasConsumer, }, ) if err != nil { panic(err) } app.SetAnteHandler(anteHandler) // Remove the following: // ctx := app.BaseApp.NewUncachedContext(true, tmproto.Header{}) // app.CapabilityKeeper.InitializeAndSeal(ctx) } func (app *App) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { var genesisState GenesisState if err := tmjson.Unmarshal(req.AppStateBytes, &genesisState); err != nil { panic(err) } // Add the following: app.UpgradeKeeper.SetModuleVersionMap(ctx, app.mm.GetVersionMap()) return app.mm.InitGenesis(ctx, app.appCodec, genesisState) } // Replace Marshaler with Codec func (app *App) AppCodec() codec.Codec { return app.appCodec } // Replace BinaryMarshaler with BinaryCodec func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey sdk.StoreKey) paramskeeper.Keeper { //... } ``` ### app/genesis.go ```go // Replace codec.JSONMarshaler with codec.JSONCodec func NewDefaultGenesisState(cdc codec.JSONCodec) GenesisState { // ... } ``` ### testutil/keeper/mars.go Add the following code: ```go package keeper import ( "testing" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/store" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmdb "github.com/tendermint/tm-db" "github.com/username/mars/x/mars/keeper" "github.com/username/mars/x/mars/types" ) func MarsKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { storeKey := sdk.NewKVStoreKey(types.StoreKey) memStoreKey := storetypes.NewMemoryStoreKey(types.MemStoreKey) db := tmdb.NewMemDB() stateStore := store.NewCommitMultiStore(db) stateStore.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db) stateStore.MountStoreWithDB(memStoreKey, sdk.StoreTypeMemory, nil) require.NoError(t, stateStore.LoadLatestVersion()) registry := codectypes.NewInterfaceRegistry() k := keeper.NewKeeper( codec.NewProtoCodec(registry), storeKey, memStoreKey, ) ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger()) return k, ctx } ``` If `mars` is an IBC-enabled module, add the following code, instead: ```go package keeper import ( "testing" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/store" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" typesparams "github.com/cosmos/cosmos-sdk/x/params/types" ibckeeper "github.com/cosmos/ibc-go/modules/core/keeper" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmdb "github.com/tendermint/tm-db" "github.com/username/test/x/mars/keeper" "github.com/username/test/x/mars/types" ) func MarsKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { logger := log.NewNopLogger() storeKey := sdk.NewKVStoreKey(types.StoreKey) memStoreKey := storetypes.NewMemoryStoreKey(types.MemStoreKey) db := tmdb.NewMemDB() stateStore := store.NewCommitMultiStore(db) stateStore.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db) stateStore.MountStoreWithDB(memStoreKey, sdk.StoreTypeMemory, nil) require.NoError(t, stateStore.LoadLatestVersion()) registry := codectypes.NewInterfaceRegistry() appCodec := codec.NewProtoCodec(registry) capabilityKeeper := capabilitykeeper.NewKeeper(appCodec, storeKey, memStoreKey) amino := codec.NewLegacyAmino() ss := typesparams.NewSubspace(appCodec, amino, storeKey, memStoreKey, "MarsSubSpace", ) IBCKeeper := ibckeeper.NewKeeper( appCodec, storeKey, ss, nil, nil, capabilityKeeper.ScopeToModule("MarsIBCKeeper"), ) k := keeper.NewKeeper( codec.NewProtoCodec(registry), storeKey, memStoreKey, IBCKeeper.ChannelKeeper, &IBCKeeper.PortKeeper, capabilityKeeper.ScopeToModule("MarsScopedKeeper"), ) ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, logger) return k, ctx } ``` ### testutil/network/network.go ```go func DefaultConfig() network.Config { // ... return network.Config{ // ... // Add sdk.DefaultPowerReduction AccountTokens: sdk.TokensFromConsensusPower(1000, sdk.DefaultPowerReduction), StakingTokens: sdk.TokensFromConsensusPower(500, sdk.DefaultPowerReduction), BondedTokens: sdk.TokensFromConsensusPower(100, sdk.DefaultPowerReduction), // ... } } ``` ### testutil/sample/sample.go Add the following code: ```go package sample import ( "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" ) // AccAddress returns a sample account address func AccAddress() string { pk := ed25519.GenPrivKey().PubKey() addr := pk.Address() return sdk.AccAddress(addr).String() } ``` ### BandChain Support If your module includes integration with BandChain, added manually or scaffolded with `ignite scaffold band`, upgrade the `github.com/bandprotocol/bandchain-packet` package to `v0.0.2` in `go.mod`. ## Module ### x/mars/keeper/keeper.go ```go package keeper // ... type ( Keeper struct { // Replace Marshaler with BinaryCodec cdc codec.BinaryCodec //... } ) func NewKeeper( // Replace Marshaler with BinaryCodec cdc codec.BinaryCodec, // ... ) *Keeper { // ... } ``` ### x/mars/keeper/msg_server_test.go ```go package keeper_test import ( //... // Add the following: keepertest "github.com/username/mars/testutil/keeper" "github.com/username/mars/x/mars/keeper" ) func setupMsgServer(t testing.TB) (types.MsgServer, context.Context) { // Replace // keeper, ctx := setupKeeper(t) // return NewMsgServerImpl(*keeper), sdk.WrapSDKContext(ctx) // With the following: k, ctx := keepertest.MarsKeeper(t) return keeper.NewMsgServerImpl(*k), sdk.WrapSDKContext(ctx) } ``` ### x/mars/module.go ```go package mars type AppModuleBasic struct { // Replace Marshaler with BinaryCodec cdc codec.BinaryCodec } // Replace Marshaler with BinaryCodec func NewAppModuleBasic(cdc codec.BinaryCodec) AppModuleBasic { return AppModuleBasic{cdc: cdc} } // Replace JSONMarshaler with JSONCodec func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { return cdc.MustMarshalJSON(types.DefaultGenesis()) } // Replace JSONMarshaler with JSONCodec func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage) error { //... } // Replace codec.Marshaller with codec.Codec func NewAppModule(cdc codec.Codec, keeper keeper.Keeper) AppModule { //... } // Replace JSONMarshaler with JSONCodec func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.RawMessage) []abci.ValidatorUpdate { //... } // Replace JSONMarshaler with JSONCodec func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { //... } // Add the following func (AppModule) ConsensusVersion() uint64 { return 2 } ```