v30.0.0
Upgrade to v30.0.0
v30.0.0 adds gno.land smart contract support to Ignite CLI alongside the existing Cosmos SDK tooling, and upgrades scaffolded chains to Cosmos SDK v0.55.0, IBC v11.2.0, and CometBFT v0.40.0.
Cosmos SDK commands move to ignite cosmos
The top-level scaffold, chain, account, and generate commands now target gno.land. The Cosmos SDK tooling for sovereign blockchains lives under ignite cosmos:
-ignite scaffold chain mychain
+ignite cosmos scaffold chain mychain
-ignite chain serve
+ignite cosmos chain serve
The same applies to generate, account, testnet, and doctor. Top-level chain, generate, and testnet print a deprecation error pointing at the ignite cosmos equivalent.
Go module path changes to v30
The Go module path changes from github.com/ignite/cli/v29 to github.com/ignite/cli/v30. In your go.mod:
-require github.com/ignite/cli/v29 v29.10.1
+require github.com/ignite/cli/v30 v30.0.0
Update the imports in your code:
-import "github.com/ignite/cli/v29/ignite/pkg/cosmosclient"
+import "github.com/ignite/cli/v30/ignite/pkg/cosmosclient"
Then refresh the dependencies:
go mod tidy
Ignite plugins follow the same rule: update the module require and every github.com/ignite/cli/v29/... import in the plugin source to v30, then rebuild the plugin binary.
Scaffolded chains move to Cosmos SDK v0.55.0
Chains scaffolded with v29 use Cosmos SDK v0.53.x, IBC v10, and CometBFT v0.38.x. Chains scaffolded with v30 use Cosmos SDK v0.55.0, IBC v11.2.0, and CometBFT v0.40.0.
If you wish to keep using a chain scaffolded with IGNITE® v29, simply run the doctor command:
ignite cosmos doctor
Scaffolding commands in v30 generate code for v0.55 chains, so running them against a v0.53 chain produces code that does not compile. Migrate the chain first.
The sections below cover the changes an Ignite-scaffolded chain needs. For the full list of SDK changes, read the Cosmos SDK v0.55.0 upgrading guide and the IBC v10 to v11 migration guide.
Update the dependencies
Open the go.mod file in your blockchain directory and update the versions:
-go 1.24.1
+go 1.26.5
-cosmossdk.io/api v0.9.2
+cosmossdk.io/api v1.1.0
-cosmossdk.io/client/v2 v2.0.0-beta.11
+cosmossdk.io/client/v2 v2.11.0
-cosmossdk.io/collections v1.3.1
+cosmossdk.io/collections v1.4.0
-cosmossdk.io/core v0.11.3
+cosmossdk.io/core v1.1.0
-cosmossdk.io/errors v1.0.2
+cosmossdk.io/errors v1.1.0
-cosmossdk.io/log v1.6.1
+cosmossdk.io/log/v2 v2.1.0
-cosmossdk.io/store v1.1.2
-cosmossdk.io/x/circuit v0.1.1
-cosmossdk.io/x/evidence v0.1.1
-cosmossdk.io/x/feegrant v0.1.1
-cosmossdk.io/x/nft v0.1.0
-cosmossdk.io/x/upgrade v0.2.0
-github.com/cometbft/cometbft v0.38.21
+github.com/cometbft/cometbft v0.40.0
-github.com/cosmos/cosmos-db v1.1.1
+github.com/cosmos/cosmos-db v1.1.3
-github.com/cosmos/cosmos-sdk v0.53.6
+github.com/cosmos/cosmos-sdk v0.55.0
+github.com/cosmos/cosmos-sdk/store/v2 v2.0.0
-github.com/cosmos/ibc-go/v10 v10.4.0
+github.com/cosmos/ibc-go/v11 v11.2.0
-google.golang.org/grpc v1.72.2
+google.golang.org/grpc v1.82.1
-google.golang.org/protobuf v1.36.6
+google.golang.org/protobuf v1.36.11
Add these replaces to keep the libp2p dependency compatible with the buf tool used for proto generation:
replace (
// replace broken goleveldb
github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
+ // support for go 1.27 (remove when cosmossdk.io/log/v2 is updated)
+ github.com/bytedance/sonic => github.com/bytedance/sonic v1.15.4
+ // fix libp2p/webtransport incompatibility with quic-go v0.62+ (pulled by the buf tool)
+ github.com/libp2p/go-libp2p => github.com/libp2p/go-libp2p v0.50.0
+ github.com/quic-go/webtransport-go => github.com/quic-go/webtransport-go v0.13.0
)
Update import paths
The cosmossdk.io/x/... modules move into the main Cosmos SDK module. The x/params, x/group, x/circuit, and x/nft modules are removed from the chain template:
-_ "github.com/cosmos/cosmos-sdk/x/evidence" // import for side-effects
+_ "github.com/cosmos/cosmos-sdk/x/evidence" // import for side-effects
-feegrant "cosmossdk.io/x/feegrant"
+feegrant "github.com/cosmos/cosmos-sdk/x/feegrant"
-upgradekeeper "cosmossdk.io/x/upgrade/keeper"
+upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper"
The log and store packages move to v2:
-"cosmossdk.io/log"
+"cosmossdk.io/log/v2"
-storetypes "cosmossdk.io/store/types"
+storetypes "github.com/cosmos/cosmos-sdk/store/v2/types"
Remove x/params, x/group, x/circuit, and x/nft
Cosmos SDK v0.55 removes the x/params module and moves x/circuit and x/nft to the deprecated contrib directory. x/group moves to the commercial Cosmos Enterprise offering. None of them are part of the template anymore, following the SDK v0.55 reference app.
In app/app.go, delete the ParamsKeeper and CircuitBreakerKeeper fields, the GetSubspace method, the paramskeeper and paramstypes imports, and the matching lines in the depinject.Inject call. In app/app_config.go, delete the params, group, circuit, and nft module config entries, the related imports, and the nft.ModuleName and circuittypes.ModuleName entries in the module account permissions, blocked accounts, and init genesis order. If your chain still mounts the params store, delete it in your upgrade handler store upgrades.
If you want to keep the circuit breaker or the NFT module, they are still usable from the github.com/cosmos/cosmos-sdk/contrib/x/circuit and github.com/cosmos/cosmos-sdk/contrib/x/nft packages, but they are no longer maintained by the SDK team and their protos are no longer resolved by ignite generate for TypeScript clients and composables.
Update the app wiring
Cosmos SDK v0.55 requires two wiring changes in app/app_config.go:
Add the staking key rotation fee pool to the module account permissions. The staking keeper panics at construction when this account is missing, whether or not your validators use key rotation:
moduleAccPerms = []*authmodulev1.ModuleAccountPermission{
// ...
{Account: stakingtypes.BondedPoolName, Permissions: []string{authtypes.Burner, stakingtypes.ModuleName}},
{Account: stakingtypes.NotBondedPoolName, Permissions: []string{authtypes.Burner, stakingtypes.ModuleName}},
{Account: stakingtypes.KeyRotationFeePoolName, Permissions: []string{authtypes.Burner}},
// ...
}
Put the bank module first in the end blockers. The bank module now runs an end blocker, and it must be first:
EndBlockers: []string{
banktypes.ModuleName,
govtypes.ModuleName,
stakingtypes.ModuleName,
// ...
},
Module constructors drop the trailing subspace argument. In app/app.go:
-overrideModules := map[string]module.AppModuleSimulation{
- authtypes.ModuleName: auth.NewAppModule(app.appCodec, app.AuthKeeper, authsims.RandomGenesisAccounts, nil),
+overrideModules := map[string]module.AppModuleSimulation{
+ authtypes.ModuleName: auth.NewAppModule(app.appCodec, app.AuthKeeper, authsims.RandomGenesisAccounts),
}
Update the app constructor
AppCreator and AppExporter lose the traceStore parameter, and appBuilder.Build loses the traceStore argument:
func New(
logger log.Logger,
db dbm.DB,
- traceStore io.Writer,
loadLatest bool,
appOpts servertypes.AppOptions,
baseAppOptions ...func(*baseapp.BaseApp),
) *App {
-app.App = appBuilder.Build(db, traceStore, baseAppOptions...)
+app.App = appBuilder.Build(db, baseAppOptions...)
In cmd/mychaind/cmd/commands.go and cmd/mychaind/cmd/testnet.go, remove the traceStore io.Writer parameter from newApp, appExport, and newTestnetApp, and drop the io import.
Migrate IBC to v11
All IBC keeper constructors lose the subspace argument. The transfer keeper takes an address codec, the keepers are returned as pointers, and each keeper takes the channel keeper once. In app/ibc.go:
app.IBCKeeper = ibckeeper.NewKeeper(
app.appCodec,
runtime.NewKVStoreService(app.GetKey(ibcexported.StoreKey)),
- app.GetSubspace(ibcexported.ModuleName),
app.UpgradeKeeper,
govModuleAddr,
)
app.TransferKeeper = ibctransferkeeper.NewKeeper(
app.appCodec,
+ app.AuthKeeper.AddressCodec(),
runtime.NewKVStoreService(app.GetKey(ibctransfertypes.StoreKey)),
- app.GetSubspace(ibctransfertypes.ModuleName),
- app.IBCKeeper.ChannelKeeper,
app.IBCKeeper.ChannelKeeper,
app.MsgServiceRouter(),
app.AuthKeeper,
app.BankKeeper,
govModuleAddr,
)
app.ICAHostKeeper = icahostkeeper.NewKeeper(
app.appCodec,
runtime.NewKVStoreService(app.GetKey(icahosttypes.StoreKey)),
- app.GetSubspace(icahosttypes.SubModuleName),
- app.IBCKeeper.ChannelKeeper, // ICS4Wrapper
+ app.IBCKeeper.ChannelKeeper,
app.AuthKeeper,
app.MsgServiceRouter(),
app.GRPCQueryRouter(),
govModuleAddr,
)
app.ICAControllerKeeper = icacontrollerkeeper.NewKeeper(
app.appCodec,
runtime.NewKVStoreService(app.GetKey(icacontrollertypes.StoreKey)),
- app.GetSubspace(icacontrollertypes.SubModuleName),
- app.IBCKeeper.ChannelKeeper,
+ app.IBCKeeper.ChannelKeeper,
app.MsgServiceRouter(),
govModuleAddr,
)
Delete the legacy param key table block that calls app.ParamsKeeper.Subspace(...). The IBC keeper fields on the App struct become pointers:
-TransferKeeper ibctransferkeeper.Keeper
-ICAControllerKeeper icacontrollerkeeper.Keeper
-ICAHostKeeper icahostkeeper.Keeper
+TransferKeeper *ibctransferkeeper.Keeper
+ICAControllerKeeper *icacontrollerkeeper.Keeper
+ICAHostKeeper *icahostkeeper.Keeper
If you scaffolded an IBC module, its IBCModule type must implement the new SetICS4Wrapper method:
// SetICS4Wrapper implements the IBCModule interface
func (im IBCModule) SetICS4Wrapper(porttypes.ICS4Wrapper) {}
Update the client code
SIGN_MODE_TEXTUAL is removed. In cmd/mychaind/cmd/root.go, delete the TextualCoinMetadataQueryFn line and the authtxconfig import:
-// textual is enabled by default, we need to re-create the tx config grpc instead of bank keeper.
-txConfigOpts.TextualCoinMetadataQueryFn = authtxconfig.NewGRPCCoinMetadataQueryFn(clientCtx)
txConfig, err := tx.NewTxConfigWithOptions(clientCtx.Codec, txConfigOpts)
Update the testnet commands
BaseApp.NewUncachedContext is deprecated. In cmd/mychaind/cmd/testnet.go, replace it and flush the changes to the root store:
-ctx := app.App.NewUncachedContext(true, cmtproto.Header{})
+ctx := app.App.NewNextBlockContext(cmtproto.Header{})
// flush the out-of-band state changes to the root CommitMultiStore,
// they are committed with the first block of the testnet
+ app.App.SimWriteState()
return app
genutil.ExportGenesisFileWithTime now takes an AppGenesis. In cmd/mychaind/cmd/testnet_multi_node.go:
-if err := genutil.ExportGenesisFileWithTime(genFile, chainID, nil, appState, genTime); err != nil {
+exportGenesis := genutiltypes.NewAppGenesisWithVersion(chainID, appState)
+if err := genutil.ExportGenesisFileWithTime(genFile, exportGenesis, genTime); err != nil {
Generate the migration diff
To see the entire difference between scaffolded chains, use the "Generate Migration Difference" tool:
Checkout the Guide To use the Gen-Mig-Diff Tool.
Then run the command
gen-mig-diffs --output temp/migration --from v29 --to v30
The easiest path is to copy the relevant files in the app and cmd directories from a chain scaffolded with v30 into your v29 project, in case you did not modify anything in there.
Verify the upgrade
Update the dependencies with:
go mod tidy
Then run the IGNITE® doctor to update configuration files.
ignite cosmos doctor
Now start your chain.
ignite cosmos chain serve