mukan-ibc/docs/versioned_docs/version-v10.1.x/05-migrations/06-v4-to-v5.md
Mukan Erkin Törük 6852832fe8
Some checks failed
CodeQL / Analyze (push) Waiting to run
Docker Build & Push Simapp (main) / docker-build (push) Waiting to run
golangci-lint / lint (push) Waiting to run
Tests / Code Coverage / build (amd64) (push) Waiting to run
Tests / Code Coverage / build (arm64) (push) Waiting to run
Tests / Code Coverage / unit-tests (map[additional-args:-tags="test_e2e" name:e2e path:./e2e]) (push) Waiting to run
Tests / Code Coverage / unit-tests (map[name:08-wasm path:./modules/light-clients/08-wasm]) (push) Waiting to run
Tests / Code Coverage / unit-tests (map[name:ibc-go path:.]) (push) Waiting to run
Deploy to GitHub Pages / Deploy to GitHub Pages (push) Has been cancelled
Buf-Push / push (push) Has been cancelled
initial: sovereign Mukan Network fork
2026-05-11 03:18:28 +03:00

441 lines
13 KiB
Markdown

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