---
title: IBC-Go v4 to v5
sidebar_label: IBC-Go v4 to v5
sidebar_position: 6
slug: /migrations/v4-to-v5
---

# Migrating from v4 to v5

This document is intended to highlight significant changes which may require more information than presented in the CHANGELOG.
Any changes that must be done by a user of ibc-go should be documented here.

There are four sections based on the four potential user groups of this document:

- [Chains](#chains)
- [IBC Apps](#ibc-apps)
- [Relayers](#relayers)
- [IBC Light Clients](#ibc-light-clients)

**Note:** ibc-go supports golang semantic versioning and therefore all imports must be updated to bump the version number on major releases.

```go
github.com/cosmos/ibc-go/v4 -> github.com/cosmos/ibc-go/v5
```

## Chains

### Ante decorator

The `AnteDecorator` type in `core/ante` has been renamed to `RedundantRelayDecorator` (and the corresponding constructor function to `NewRedundantRelayDecorator`). Therefore in the function that creates the instance of the `sdk.AnteHandler` type (e.g. `NewAnteHandler`) the change would be like this:

```diff
func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) {
  // parameter validation

  anteDecorators := []sdk.AnteDecorator{
    // other ante decorators
-   ibcante.NewAnteDecorator(opts.IBCkeeper),
+   ibcante.NewRedundantRelayDecorator(options.IBCKeeper),
  }

  return sdk.ChainAnteDecorators(anteDecorators...), nil
}
```

The `AnteDecorator` was actually renamed twice, but in [this PR](https://github.com/cosmos/ibc-go/pull/1820) you can see the changes made for the final rename.

## IBC Apps

### Core

The `key` parameter of the `NewKeeper` function in `modules/core/keeper` is now of type `storetypes.StoreKey` (where `storetypes` is an import alias for `"github.com/cosmos/cosmos-sdk/store/types"`):

```diff
func NewKeeper(
   cdc codec.BinaryCodec,
-  key sdk.StoreKey,
+  key storetypes.StoreKey,
   paramSpace paramtypes.Subspace,
   stakingKeeper clienttypes.StakingKeeper,
   upgradeKeeper clienttypes.UpgradeKeeper,
   scopedKeeper capabilitykeeper.ScopedKeeper,
) *Keeper
```

The `RegisterRESTRoutes` function in `modules/core` has been removed.

### ICS03 - Connection

The `key` parameter of the `NewKeeper` function in `modules/core/03-connection/keeper` is now of type `storetypes.StoreKey` (where `storetypes` is an import alias for `"github.com/cosmos/cosmos-sdk/store/types"`):

```diff
func NewKeeper(
   cdc codec.BinaryCodec,
-  key sdk.StoreKey,
+  key storetypes.StoreKey,
   paramSpace paramtypes.Subspace,
   ck types.ClientKeeper
) Keeper
```

### ICS04 - Channel

The function `NewPacketId` in `modules/core/04-channel/types` has been renamed to `NewPacketID`:

```diff
-  func NewPacketId(
+  func NewPacketID(
  portID,
  channelID string,
  seq uint64
) PacketId
```

The `key` parameter of the `NewKeeper` function in `modules/core/04-channel/keeper` is now of type `storetypes.StoreKey` (where `storetypes` is an import alias for `"github.com/cosmos/cosmos-sdk/store/types"`):

```diff
func NewKeeper(
   cdc codec.BinaryCodec,
-  key sdk.StoreKey,
+  key storetypes.StoreKey,
   clientKeeper types.ClientKeeper,
   connectionKeeper types.ConnectionKeeper,
   portKeeper types.PortKeeper,
   scopedKeeper capabilitykeeper.ScopedKeeper,
) Keeper
```

### ICS20 - Transfer

The `key` parameter of the `NewKeeper` function in `modules/apps/transfer/keeper` is now of type `storetypes.StoreKey` (where `storetypes` is an import alias for `"github.com/cosmos/cosmos-sdk/store/types"`):

```diff
func NewKeeper(
   cdc codec.BinaryCodec,
-  key sdk.StoreKey,
+  key storetypes.StoreKey,
   paramSpace paramtypes.Subspace,
   ics4Wrapper types.ICS4Wrapper,
   channelKeeper types.ChannelKeeper,
   portKeeper types.PortKeeper,
   authKeeper types.AccountKeeper,
   bankKeeper types.BankKeeper,
   scopedKeeper capabilitykeeper.ScopedKeeper,
) Keeper
```

The `amount` parameter of function `GetTransferCoin` in `modules/apps/transfer/types` is now of type `math.Int` (`"cosmossdk.io/math"`):

```diff
func GetTransferCoin(
   portID, channelID, baseDenom string,
-  amount sdk.Int
+  amount math.Int
) sdk.Coin
```

The `RegisterRESTRoutes` function in `modules/apps/transfer` has been removed.

### ICS27 - Interchain Accounts

The `key` and `msgRouter` parameters of the `NewKeeper` functions in

- `modules/apps/27-interchain-accounts/controller/keeper`
- and `modules/apps/27-interchain-accounts/host/keeper`

have changed type. The `key` parameter is now of type `storetypes.StoreKey` (where `storetypes` is an import alias for `"github.com/cosmos/cosmos-sdk/store/types"`), and the `msgRouter` parameter is now of type `*icatypes.MessageRouter` (where `icatypes` is an import alias for `"github.com/cosmos/ibc-go/v5/modules/apps/27-interchain-accounts/types"`):

```diff
// NewKeeper creates a new interchain accounts controller Keeper instance
func NewKeeper(
   cdc codec.BinaryCodec,
-  key sdk.StoreKey,
+  key storetypes.StoreKey,
   paramSpace paramtypes.Subspace,
   ics4Wrapper icatypes.ICS4Wrapper,
   channelKeeper icatypes.ChannelKeeper,
   portKeeper icatypes.PortKeeper,
   scopedKeeper capabilitykeeper.ScopedKeeper,
-  msgRouter *baseapp.MsgServiceRouter,
+  msgRouter *icatypes.MessageRouter,
) Keeper
```

```diff
// NewKeeper creates a new interchain accounts host Keeper instance
func NewKeeper(
   cdc codec.BinaryCodec,
-  key sdk.StoreKey,
+  key storetypes.StoreKey,
   paramSpace paramtypes.Subspace,
   channelKeeper icatypes.ChannelKeeper,
   portKeeper icatypes.PortKeeper,
   accountKeeper icatypes.AccountKeeper,
   scopedKeeper capabilitykeeper.ScopedKeeper,
-  msgRouter *baseapp.MsgServiceRouter,
+  msgRouter *icatypes.MessageRouter,
) Keeper
```

The new `MessageRouter` interface is defined as:

```go
type MessageRouter interface {
  Handler(msg sdk.Msg) baseapp.MsgServiceHandler
}
```

The `RegisterRESTRoutes` function in `modules/apps/27-interchain-accounts` has been removed.

An additional parameter, `ics4Wrapper` has been added to the `host` submodule `NewKeeper` function in `modules/apps/27-interchain-accounts/host/keeper`.
This allows the `host` submodule to correctly unwrap the channel version for channel reopening handshakes in the `OnChanOpenTry` callback.

```diff
func NewKeeper(
   cdc codec.BinaryCodec,
   key storetypes.StoreKey,
   paramSpace paramtypes.Subspace,
+  ics4Wrapper icatypes.ICS4Wrapper,
   channelKeeper icatypes.ChannelKeeper,
   portKeeper icatypes.PortKeeper,
   accountKeeper icatypes.AccountKeeper,
   scopedKeeper icatypes.ScopedKeeper,
   msgRouter icatypes.MessageRouter,
) Keeper
```

#### Cosmos SDK message handler responses in packet acknowledgement

The construction of the transaction response of a message execution on the host chain has changed. The `Data` field in the `sdk.TxMsgData` has been deprecated and since Cosmos SDK 0.46 the `MsgResponses` field contains the message handler responses packed into `Any`s.

For chains on Cosmos SDK 0.45 and below, the message response was constructed like this:

```go
txMsgData := &sdk.TxMsgData{
  Data: make([]*sdk.MsgData, len(msgs)),
}

for i, msg := range msgs {
  // message validation

  msgResponse, err := k.executeMsg(cacheCtx, msg)
  // return if err != nil

  txMsgData.Data[i] = &sdk.MsgData{
    MsgType: sdk.MsgTypeURL(msg),
    Data:    msgResponse,
  }
}

// emit events

txResponse, err := proto.Marshal(txMsgData)
// return if err != nil

return txResponse, nil
```

And for chains on Cosmos SDK 0.46 and above, it is now done like this:

```go
txMsgData := &sdk.TxMsgData{
  MsgResponses: make([]*codectypes.Any, len(msgs)),
}

for i, msg := range msgs {
  // message validation

  protoAny, err := k.executeMsg(cacheCtx, msg)
  // return if err != nil

  txMsgData.MsgResponses[i] = protoAny
}

// emit events

txResponse, err := proto.Marshal(txMsgData)
// return if err != nil

return txResponse, nil
```

When handling the acknowledgement in the `OnAcknowledgementPacket` callback of a custom ICA controller module, then depending on whether `txMsgData.Data` is empty or not, the logic to handle the message handler response will be different. **Only controller chains on Cosmos SDK 0.46 or above will be able to write the logic needed to handle the response from a host chain on Cosmos SDK 0.46 or above.**

```go
var ack channeltypes.Acknowledgement
if err := channeltypes.SubModuleCdc.UnmarshalJSON(acknowledgement, &ack); err != nil {
  return err
}

var txMsgData sdk.TxMsgData
if err := proto.Unmarshal(ack.GetResult(), txMsgData); err != nil {
  return err
}

switch len(txMsgData.Data) {
case 0: // for SDK 0.46 and above
  for _, msgResponse := range txMsgData.MsgResponses {
    // unmarshall msgResponse and execute logic based on the response
  }
  return nil
default: // for SDK 0.45 and below
  for _, msgData := range txMsgData.Data {
    // unmarshall msgData and execute logic based on the response
  }
}
```

See [ADR-03](/architecture/adr-003-ics27-acknowledgement#next-major-version-format) for more information or the [corresponding documentation about authentication modules](../02-apps/02-interchain-accounts/03-auth-modules.md#onacknowledgementpacket).

### ICS29 - Fee Middleware

The `key` parameter of the `NewKeeper` function in `modules/apps/29-fee` is now of type `storetypes.StoreKey` (where `storetypes` is an import alias for `"github.com/cosmos/cosmos-sdk/store/types"`):

```diff
func NewKeeper(
   cdc codec.BinaryCodec,
-  key sdk.StoreKey,
+  key storetypes.StoreKey,
   paramSpace paramtypes.Subspace,
   ics4Wrapper types.ICS4Wrapper,
   channelKeeper types.ChannelKeeper,
   portKeeper types.PortKeeper,
   authKeeper types.AccountKeeper,
   bankKeeper types.BankKeeper,
) Keeper
```

The `RegisterRESTRoutes` function in `modules/apps/29-fee` has been removed.

### IBC testing package

The `MockIBCApp` type has been renamed to `IBCApp` (and the corresponding constructor function to `NewIBCApp`). This has resulted therefore in:

- The `IBCApp` field of the `*IBCModule` in `testing/mock` to change its type as well to `*IBCApp`:

```diff
type IBCModule struct {
   appModule *AppModule
-  IBCApp    *MockIBCApp // base application of an IBC middleware stack
+  IBCApp    *IBCApp // base application of an IBC middleware stack
}
```

- The `app` parameter to `*NewIBCModule` in `testing/mock` to change its type as well to `*IBCApp`:

```diff
func NewIBCModule(
   appModule *AppModule,
-  app *MockIBCApp
+  app *IBCApp
) IBCModule
```

The `MockEmptyAcknowledgement` type has been renamed to `EmptyAcknowledgement` (and the corresponding constructor function to `NewEmptyAcknowledgement`).

The `TestingApp` interface in `testing` has gone through some modifications:

- The return type of the function `GetStakingKeeper` is not the concrete type `stakingkeeper.Keeper` anymore (where `stakingkeeper` is an import alias for `"github.com/cosmos/cosmos-sdk/x/staking/keeper"`), but it has been changed to the interface `ibctestingtypes.StakingKeeper` (where `ibctestingtypes` is an import alias for `""github.com/cosmos/ibc-go/v5/testing/types"`). See this [PR](https://github.com/cosmos/ibc-go/pull/2028) for more details. The `StakingKeeper` interface is defined as:

```go
type StakingKeeper interface {
  GetHistoricalInfo(ctx sdk.Context, height int64) (stakingtypes.HistoricalInfo, bool)
}
```

- The return type of the function `LastCommitID` has changed to `storetypes.CommitID` (where `storetypes` is an import alias for `"github.com/cosmos/cosmos-sdk/store/types"`).

See the following `git diff` for more details:

```diff
type TestingApp interface {
   abci.Application

   // ibc-go additions
   GetBaseApp() *baseapp.BaseApp
-  GetStakingKeeper() stakingkeeper.Keeper
+  GetStakingKeeper() ibctestingtypes.StakingKeeper
   GetIBCKeeper() *keeper.Keeper
   GetScopedIBCKeeper() capabilitykeeper.ScopedKeeper
   GetTxConfig() client.TxConfig

   // Implemented by SimApp
   AppCodec() codec.Codec

   // Implemented by BaseApp
-  LastCommitID() sdk.CommitID
+  LastCommitID() storetypes.CommitID
   LastBlockHeight() int64
}
```

The `powerReduction` parameter of the function `SetupWithGenesisValSet` in `testing` is now of type `math.Int` (`"cosmossdk.io/math"`):

```diff
func SetupWithGenesisValSet(
   t *testing.T,
   valSet *tmtypes.ValidatorSet,
   genAccs []authtypes.GenesisAccount,
   chainID string,
-  powerReduction sdk.Int,
+  powerReduction math.Int,
   balances ...banktypes.Balance
) TestingApp
```

The `accAmt` parameter of the functions

- `AddTestAddrsFromPubKeys` ,
- `AddTestAddrs`
- and `AddTestAddrsIncremental`

in `testing/simapp` are now of type `math.Int` (`"cosmossdk.io/math"`):

```diff
func AddTestAddrsFromPubKeys(
   app *SimApp,
   ctx sdk.Context,
   pubKeys []cryptotypes.PubKey,
-  accAmt sdk.Int,
+  accAmt math.Int
)
func addTestAddrs(
   app *SimApp,
   ctx sdk.Context,
   accNum int,
-  accAmt sdk.Int,
+  accAmt math.Int,
   strategy GenerateAccountStrategy
) []sdk.AccAddress
func AddTestAddrsIncremental(
   app *SimApp,
   ctx sdk.Context,
   accNum int,
-  accAmt sdk.Int,
+  accAmt math.Int
) []sdk.AccAddress
```

The `RegisterRESTRoutes` function in `testing/mock` has been removed.

## Relayers

- No relevant changes were made in this release.

## IBC Light Clients

### ICS02 - Client

The `key` parameter of the `NewKeeper` function in `modules/core/02-client/keeper` is now of type `storetypes.StoreKey` (where `storetypes` is an import alias for `"github.com/cosmos/cosmos-sdk/store/types"`):

```diff
func NewKeeper(
  cdc codec.BinaryCodec,
- key sdk.StoreKey,
+ key storetypes.StoreKey,
  paramSpace paramtypes.Subspace,
  sk types.StakingKeeper,
  uk types.UpgradeKeeper
) Keeper
```
