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
441 lines
13 KiB
Markdown
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
|
|
|
|
any, err := k.executeMsg(cacheCtx, msg)
|
|
// return if err != nil
|
|
|
|
txMsgData.MsgResponses[i] = any
|
|
}
|
|
|
|
// 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
|
|
```
|