--- sidebar_position: 995 title: v0.24.0 description: For chains that were scaffolded with Ignite CLI versions lower than v0.24, changes are required to use Ignite CLI v0.24.0. --- ## Cosmos SDK v0.46 upgrade notes ### Update dependencies Cosmos SDK v0.46 is compatible with the latest version of IBC Go v5. If you have a chain that is using an older version, update the dependencies in your project. Throughout the code you might see the following dependencies: ```go package pkg_name import ( "github.com/cosmos/ibc-go/v3/..." ) ``` Where `v3` is the version of IBC Go and `...` are different IBC Go packages. To upgrade the version to `v5`, a global find-and-replace should work. Replace `cosmos/ibc-go/v3` (or whicherver version you're using) with `cosmos/ibc-go/v5` only in `*.go` files (to exclude unwated changes to files like `go,sum`). ### Module keeper Add an import: ```go // x/{moduleName}/keeper/keeper.go package keeper // ... import ( //... storetypes "github.com/cosmos/cosmos-sdk/store/types" ) ``` In the `Keeper` struct replace `sdk.StoreKey` with `storetypes.StoreKey`: ```go // x/{moduleName}/keeper/keeper.go package keeper // ... type ( Keeper struct { cdc codec.BinaryCodec storeKey storetypes.StoreKey memKey storetypes.StoreKey paramstore paramtypes.Subspace } ) ``` In the argument list of the `NewKeeper` function definition: ```go package keeper // ... // x/{moduleName}/keeper/keeper.go func NewKeeper( //... memKey storetypes.StoreKey, ) ``` Store type aliases have been removed from the Cosmos SDK `types` package and now have to be imported from `store/types`, instead. In the `testutil/keeper/{moduleName}.go` replace `types.StoreKey` with `storetypes.StoreKey` and `types.MemStoreKey` with `storetypes.MemStoreKey`. ```go // testutil/keeper/{moduleName}.go package keeper // ... func {moduleName}Keeper(t testing.TB) (*keeper.Keeper, sdk.Context) { storeKey := sdk.NewKVStoreKey(storetypes.StoreKey) memStoreKey := storetypes.NewMemoryStoreKey(storetypes.MemStoreKey) //... } ``` ### Testutil network package Add the `require` package for testing and `pruningtypes` and remove `storetypes`: ```go // testutil/network/network.go package network // ... import ( pruningtypes "github.com/cosmos/cosmos-sdk/pruning/types" "github.com/stretchr/testify/require" // storetypes "github.com/cosmos/cosmos-sdk/store/types" <-- remove this line ) ``` In the `DefaultConfig` function replace `storetypes.NewPruningOptionsFromString` with `pruningtypes.NewPruningOptionsFromString` ```go // testutil/network/network.go package network // ... func DefaultConfig() network.Config { //... return network.Config{ AppConstructor: func(val network.Validator) servertypes.Application { return app.New( baseapp.SetPruning(pruningtypes.NewPruningOptionsFromString(val.AppConfig.Pruning)), //... ) }, //... } } ``` The `New` function in the Cosmos SDK `testutil/network` package now accepts [three arguments](https://github.com/cosmos/cosmos-sdk/blob/v0.46.0/testutil/network/network.go#L206) instead of two. In the `New` function add `t.TempDir()` as the second argument to `network.New()` and test that no error is thrown with `require.NoError(t, err)`: ```go // testutil/network/network.go package network // ... func New(t *testing.T, configs ...network.Config) *network.Network { //... net, err := network.New(t, t.TempDir(), cfg) require.NoError(t, err) //... } ``` ### Testutil keeper package In the `{moduleName}Keeper` function make the following replacements: - `storetypes.StoreKey` → `types.StoreKey` - `storetypes.MemStoreKey` → `types.MemStoreKey` - `sdk.StoreTypeIAVL` → `storetypes.StoreTypeIAVL` - `sdk.StoreTypeMemory` → `storetypes.StoreTypeMemory` ```go // testutil/keeper/{moduleName}.go package keeper // ... func {moduleName}Keeper(t testing.TB) (*keeper.Keeper, sdk.Context) { storeKey := sdk.NewKVStoreKey(types.StoreKey) memStoreKey := storetypes.NewMemoryStoreKey(types.MemStoreKey) //... stateStore.MountStoreWithDB(storeKey, storetypes.StoreTypeIAVL, db) stateStore.MountStoreWithDB(memStoreKey, storetypes.StoreTypeMemory, nil) //... } ``` ### IBC modules If you have IBC-enabled modules (for example, added with `ignite scaffold module ... --ibc` or created manually), make the following changes to the source code. Cosmos SDK expects IBC modules to [implement the `IBCModule` interface](https://ibc.cosmos.network/main/ibc/apps/ibcmodule/). Create a `IBCModule` type that embeds the module's keeper and a method that returns a new `IBCModule`. Methods in this file will be defined on this type. ```go // x/{moduleName}/module_ibc.go package module_name // ... type IBCModule struct { keeper keeper.Keeper } func NewIBCModule(k keeper.Keeper) IBCModule { return IBCModule{ keeper: k, } } ``` Replace receivers for all methods in this file from `(am AppModule)` to `(im IBCModule)`. Replace all instances of `am.` with `im.` to fix the errors. `OnChanOpenInit` now returns to values: a `string` and an `error`: ```go // x/{moduleName}/module_ibc.go package module_name // ... func (im IBCModule) OnChanOpenInit( /*...*/ ) (string, error) ``` Ensure that all return statements (five, in the default template) in `OnChanOpenInit` return two values. For example: ```go // x/{moduleName}/module_ibc.go package module_name // ... func (im IBCModule) OnChanOpenInit( /*...*/ ) (string, error) { //... return "", sdkerrors.Wrapf(porttypes.ErrInvalidPort, "invalid port: %s, expected %s", portID, boundPort) //... } ``` Error acknowledgments returned from Transfer `OnRecvPacket` now include a deterministic ABCI code and error message. Remove the `.Error()` call: ```go // x/{moduleName}/module_ibc.go package module_name // ... func (im IBCModule) OnRecvPacket( /*...*/ ) { //... if err := modulePacketData.Unmarshal(modulePacket.GetData()); err != nil { // return channeltypes.NewErrorAcknowledgement(sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal packet data: %s", err.Error()).Error()) return channeltypes.NewErrorAcknowledgement(sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal packet data: %s", err.Error())) } // ... // Dispatch packet switch packet := modulePacketData.Packet.(type) { // ... default: // errMsg := fmt.Sprintf("unrecognized %s packet type: %T", types.ModuleName, packet) // return channeltypes.NewErrorAcknowledgement(errMsg) err := fmt.Errorf("unrecognized %s packet type: %T", types.ModuleName, packet) return channeltypes.NewErrorAcknowledgement(err) } } ``` After switching to using both `AppModule` and `IBCModule`, modifying the following line: ```go // x/{moduleName}/module.go package module_name // ... var ( //... _ porttypes.IBCModule = IBCModule{} // instead of "= AppModule{}" ) ``` ### Main The `Execute` function in Cosmos SDK `server/cmd` package now accepts [three arguments](https://github.com/cosmos/cosmos-sdk/blob/v0.46.0/server/cmd/execute.go#L20) instead of two. ```go // cmd/{{projectName}}d/main.go package projectNamed // ... func main() { //... if err := svrcmd.Execute(rootCmd, "", app.DefaultNodeHome); err != nil { os.Exit(1) } } ``` ### Handler Cosmos SDK v0.46 no longer needs a `NewHandler` function that was used to handle messages and call appropriate keeper methods based on message types. Feel free to remove `x/{moduleName}/handler.go` file. Since there is no `NewHandler` now, modify the deprecated `Route` function to return `sdk.Route{}`: ```go // x/{moduleName}/module.go package module_name // ... func (am AppModule) Route() sdk.Route { return sdk.Route{} } ```