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:
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:
// 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
:
// 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:
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
.
// 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
:
// 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
// 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 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)
:
// 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
// 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. 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.
// 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
:
// 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:
// 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:
// 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:
// 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 instead of two.
// 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{}
:
// x/{moduleName}/module.go
package module_name
// ...
func (am AppModule) Route() sdk.Route { return sdk.Route{} }