> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cosmos.network/llms.txt
> Use this file to discover all available pages before exploring further.

# IBC-Go v10 to v11.1

> This guide provides instructions for migrating from ibc-go v10 to v11.1.

ibc-go supports golang semantic versioning and therefore all imports must be updated on major version releases.

This guide is for chains upgrading directly from ibc-go v10 to ibc-go v11.1. It includes the changes from the ibc-go v11.0 migration and the Packet Forward Middleware changes introduced in ibc-go v11.1.

The following changes from v10 to v11 are relevant to this upgrade:

* Chains will need to remove the `ParamSubspace` arg from all calls to `Keeper` constructors

```diff theme={"theme":{"light":"github-light-high-contrast","dark":"github-dark-high-contrast"}}
  app.IBCKeeper = ibckeeper.NewKeeper(
    appCodec,
    runtime.NewKVStoreService(keys[ibcexported.StoreKey]),
-   app.GetSubspace(ibcexported.ModuleName),
    app.UpgradeKeeper,
    authtypes.NewModuleAddress(govtypes.ModuleName).String(),
  )
```

The transfer module, the packet forward middleware, and the rate limiting middleware support custom address codecs. This feature is primarily added to support Cosmos EVM for IBC transfers. In a standard Cosmos SDK app, they are wired as follows:

```diff theme={"theme":{"light":"github-light-high-contrast","dark":"github-dark-high-contrast"}}
  app.TransferKeeper = ibctransferkeeper.NewKeeper(
    appCodec,
+    app.AccountKeeper.AddressCodec(),
    runtime.NewKVStoreService(keys[ibctransfertypes.StoreKey]),
    app.IBCKeeper.ChannelKeeper,
    app.MsgServiceRouter(),
    app.AccountKeeper, app.BankKeeper,
    authtypes.NewModuleAddress(govtypes.ModuleName).String(),
  )
```

```diff theme={"theme":{"light":"github-light-high-contrast","dark":"github-dark-high-contrast"}}
  app.RateLimitKeeper = ratelimitkeeper.NewKeeper(
    appCodec,
+    app.AccountKeeper.AddressCodec(),
    runtime.NewKVStoreService(keys[ratelimittypes.StoreKey]),
    app.IBCKeeper.ChannelKeeper,
    app.IBCKeeper.ClientKeeper,
    app.BankKeeper,
    authtypes.NewModuleAddress(govtypes.ModuleName).String()
  )
```

```diff theme={"theme":{"light":"github-light-high-contrast","dark":"github-dark-high-contrast"}}
  app.PFMKeeper = packetforwardkeeper.NewKeeper(
    appCodec,
+    app.AccountKeeper.AddressCodec(),
    runtime.NewKVStoreService(keys[packetforwardtypes.StoreKey]),
    app.TransferKeeper,
    app.IBCKeeper.ChannelKeeper,
    app.BankKeeper,
    authtypes.NewModuleAddress(govtypes.ModuleName).String()
  )
```

## ICS27-GMP

ICS27 General Message Passing (GMP) has been added as a supported IBC application of ibc-go. It has no parameters.

### Add `StoreUpgrades` for ICS27-GMP module

If ICS27-GMP is being added to an existing chain, you must [manually add store upgrades](https://docs.cosmos.network/sdk/v0.53/learn/advanced/upgrade#add-storeupgrades-for-new-modules) for the new GMP module and configure the store loader to apply those upgrades in `app.go`:

```go theme={"theme":{"light":"github-light-high-contrast","dark":"github-dark-high-contrast"}}
if upgradeInfo.Name == "v11_1" && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) {
  storeUpgrades := store.StoreUpgrades{
    Added: []string{gmptypes.StoreKey},
  }

  app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades))
}
```

This ensures that the new module's stores are added to the multistore before the migrations begin.
If a chain does not integrate ICS27-GMP, it does not need to add the GMP key to the `Added` field.

## Packet Forward Middleware (New in v11.1)

Packet Forward Middleware (PFM) has been moved from [cosmos/ibc-apps](https://github.com/cosmos/ibc-apps) to ibc-go in this release. PFM is now available under `modules/apps/packet-forward-middleware`.

Your migration path depends on whether your chain already uses PFM from ibc-apps.

### If your chain already uses PFM from ibc-apps

Replace all ibc-apps PFM imports with the new ibc-go imports and review the [integration instructions](/ibc/next/middleware/packet-forward-middleware/integration).

If your chain already has a PFM store from a previous upgrade, do not add `packetforwardtypes.StoreKey` as a new store in this upgrade. The ibc-go PFM module intentionally preserves the original module name and store key, including the `packetfowardmiddleware` spelling, for compatibility with the legacy implementation.

The PFM module includes in-place migrations for existing PFM state. Before upgrading, ensure there are no non-refundable in-flight packets. The v3-to-v4 PFM migration removes the deprecated `nonrefundable` field from in-flight packet state and aborts if any stored in-flight packet has `nonrefundable=true`.

### If your chain is adding PFM for the first time

First follow the [integration instructions](/ibc/next/middleware/packet-forward-middleware/integration).

If PFM is being added to an existing chain, you must [manually add store upgrades](https://docs.cosmos.network/sdk/latest/guides/upgrades/upgrade#adding-new-modules-during-an-upgrade) for the new PFM module and configure the store loader to apply those upgrades in `app.go`.

If your upgrade also introduces ICS27-GMP, include both store keys:

```go theme={"theme":{"light":"github-light-high-contrast","dark":"github-dark-high-contrast"}}
if upgradeInfo.Name == "v11_1" && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) {
  storeUpgrades := store.StoreUpgrades{
    Added: []string{gmptypes.StoreKey, packetforwardtypes.StoreKey},
  }

  app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades))
}
```

This ensures that the new module's stores are added to the multistore before the migrations begin.
If your chain already added the ICS27-GMP store key in a previous upgrade, do not add `gmptypes.StoreKey` again. If your chain does not integrate PFM, it does not need to add the PFM key to the `Added` field.
