Skip to content
Cosmopediaby Unity Nodes
Documentationcosmos/cosmos-sdk-migration-mcpcosmos/cosmos-sdk-migration-mcp › src › cosmos_migration_mcp › migration_spec › v50-to-v54View on cosmos/cosmos-sdk-migration-mcp ↗

── verification ────────────────────────────────────────────────────────────

id: core-sdk-migration title: Core SDK v53 → v54 upgrades version: v50+ -> v54 description: | Baseline changes that apply to every chain upgrading from cosmos-sdk v0.53.x to v0.54.x. Covers go.mod version bumps, vanity-URL import rewrites, log/v2 migration, mock package migration, BaseApp API simplifications, and module ordering changes common to all apps.

upstream_sources:

  • docs://upgrading/v0.54
  • docs://upgrade-checklist/v0.54
  • docs://changelog/v0.54-breaking

depends_on: []

detection: sdk_version: max_exclusive: v0.54.0-0 imports: - github.com/cosmos/cosmos-sdk patterns: - cosmossdk.io/x/feegrant - cosmossdk.io/x/tx - cosmossdk.io/x/upgrade - cosmossdk.io/log

changes:

── go.mod ──────────────────────────────────────────────────────────────

go_mod: update: github.com/cosmos/cosmos-sdk: latest:v0.54

remove:
  - cosmossdk.io/log
  - cosmossdk.io/x/feegrant
  - cosmossdk.io/x/evidence
  - cosmossdk.io/x/tx
  - cosmossdk.io/x/upgrade
  - cosmossdk.io/x/circuit
  - cosmossdk.io/x/nft
  - cosmossdk.io/systemtests

add:
  cosmossdk.io/log/v2: latest:v2

strip_local_replaces: true

── imports ──────────────────────────────────────────────────────────────

imports: rewrites: # log/v2 - old: cosmossdk.io/log new: cosmossdk.io/log/v2 all_packages: false

  # Mock package migration
  - old: github.com/golang/mock/gomock
    new: go.uber.org/mock/gomock
    all_packages: true

  # Vanity URL → github.com/cosmos/cosmos-sdk
  - old: cosmossdk.io/x/feegrant
    new: github.com/cosmos/cosmos-sdk/x/feegrant
    all_packages: true

  - old: cosmossdk.io/x/evidence
    new: github.com/cosmos/cosmos-sdk/x/evidence
    all_packages: true

  - old: cosmossdk.io/x/tx
    new: github.com/cosmos/cosmos-sdk/x/tx
    all_packages: true

  - old: cosmossdk.io/x/upgrade
    new: github.com/cosmos/cosmos-sdk/x/upgrade
    all_packages: true

  - old: cosmossdk.io/systemtests
    new: github.com/cosmos/cosmos-sdk/tools/systemtests
    all_packages: true

  # Modules moved to contrib (import rewrite only; keepers/modules kept)
  - old: cosmossdk.io/x/circuit
    new: github.com/cosmos/cosmos-sdk/contrib/x/circuit
    all_packages: true

  - old: cosmossdk.io/x/nft
    new: github.com/cosmos/cosmos-sdk/contrib/x/nft
    all_packages: true

── text replacements ─────────────────────────────────────────────────

text_replacements: # BaseApp method aliases — the indirection was removed in v54. - old: app.BaseApp.GRPCQueryRouter() new: app.GRPCQueryRouter()

- old: app.BaseApp.Simulate
  new: app.Simulate

# tx.Factory: non-critical extension options folded into WithExtensionOptions.
- old: .WithNonCriticalExtensionOptions(
  new: .WithExtensionOptions(

# Telemetry metric key constants removed; use string literals instead.
- old: telemetry.MetricKeyPrecommiter
  new: '"precommitter"'

- old: telemetry.MetricKeyPrepareCheckStater
  new: '"prepare_check_stater"'

# nodeservice: new 4th argument for earliest version.
- old: nodeservice.RegisterNodeService(clientCtx, app.GRPCQueryRouter(), cfg)
  new: "nodeservice.RegisterNodeService(clientCtx, app.GRPCQueryRouter(), cfg, func() int64 { return app.CommitMultiStore().EarliestVersion() })"

# SetModuleVersionMap: error return added in v54.
- old: "\tapp.UpgradeKeeper.SetModuleVersionMap(ctx, app.ModuleManager.GetVersionMap())\n\treturn app.ModuleManager.InitGenesis("
  new: "\terr := app.UpgradeKeeper.SetModuleVersionMap(ctx, app.ModuleManager.GetVersionMap())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn app.ModuleManager.InitGenesis("

# auth/tx import dedup in app.go (two imports for same package — remove unaliased).
- old: "\t\"github.com/cosmos/cosmos-sdk/x/auth/tx\"\n"
  new: ""
  file_match: app.go

- old: tx.NewTxConfig(
  new: authtx.NewTxConfig(
  file_match: app.go

- old: tx.DefaultSignModes
  new: authtx.DefaultSignModes
  file_match: app.go

- old: tx.ConfigOptions
  new: authtx.ConfigOptions
  file_match: app.go

- old: tx.NewTxConfigWithOptions(
  new: authtx.NewTxConfigWithOptions(
  file_match: app.go

# Repair double-prefix if authtx was already aliased.
- old: authauthtx.
  new: authtx.
  file_match: app.go

# traceStore parameter removed from NewSimApp and related helpers.
- old: "\tdb dbm.DB,\n\ttraceStore io.Writer,\n\tloadLatest bool,\n"
  new: "\tdb dbm.DB,\n\tloadLatest bool,\n"
  file_match: app.go

- old: "\tbApp.SetCommitMultiStoreTracer(traceStore)\n"
  new: ""
  file_match: app.go

- old: "\tbApp.SetCommitMultiStoreTracer(nil)\n"
  new: ""
  file_match: app_test.go

- old: "\tlogger log.Logger,\n\tdb dbm.DB,\n\ttraceStore io.Writer,\n\tappOpts servertypes.AppOptions,\n"
  new: "\tlogger log.Logger,\n\tdb dbm.DB,\n\tappOpts servertypes.AppOptions,\n"
  file_match: simd/cmd/commands.go

- old: "\t\tlogger, db, traceStore, true,\n"
  new: "\t\tlogger, db, true,\n"
  file_match: simd/cmd/commands.go

- old: "\tlogger log.Logger,\n\tdb dbm.DB,\n\ttraceStore io.Writer,\n\theight int64,\n"
  new: "\tlogger log.Logger,\n\tdb dbm.DB,\n\theight int64,\n"
  file_match: simd/cmd/commands.go

- old: "\t\tsimApp = simapp.NewSimApp(logger, db, traceStore, false, appOpts)\n"
  new: "\t\tsimApp = simapp.NewSimApp(logger, db, false, appOpts)\n"
  file_match: simd/cmd/commands.go

- old: "\t\tsimApp = simapp.NewSimApp(logger, db, traceStore, true, appOpts)\n"
  new: "\t\tsimApp = simapp.NewSimApp(logger, db, true, appOpts)\n"
  file_match: simd/cmd/commands.go

- old: NewSimApp(log.NewNopLogger(), db, nil, true, appOptions)
  new: NewSimApp(log.NewNopLogger(), db, true, appOptions)
  file_match: test_helpers.go

- old: NewSimApp(options.Logger, options.DB, nil, true, options.AppOpts)
  new: NewSimApp(options.Logger, options.DB, true, options.AppOpts)
  file_match: test_helpers.go

- old: NewSimApp(log.NewNopLogger(), dbm.NewMemDB(), nil, true, simtestutil.NewAppOptionsWithFlagHome(dir))
  new: NewSimApp(log.NewNopLogger(), dbm.NewMemDB(), true, simtestutil.NewAppOptionsWithFlagHome(dir))
  file_match: test_helpers.go

- old: "NewSimApp(\n\t\t\tlog.NewNopLogger(), dbm.NewMemDB(), nil, true,"
  new: "NewSimApp(\n\t\t\tlog.NewNopLogger(), dbm.NewMemDB(), true,"
  file_match: test_helpers.go

- old: "return NewSimApp(\n\t\t\tval.GetCtx().Logger, dbm.NewMemDB(), nil, true,\n"
  new: "return NewSimApp(\n\t\t\tval.GetCtx().Logger, dbm.NewMemDB(), true,\n"
  file_match: test_helpers.go

- old: NewSimApp(logger, db, nil, true, appOpts, append(baseAppOptions, interBlockCacheOpt())...)
  new: NewSimApp(logger, db, true, appOpts, append(baseAppOptions, interBlockCacheOpt())...)
  file_match: sim_test.go

- old: "func(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp)) *SimApp"
  new: "func(logger log.Logger, db dbm.DB, loadLatest bool, appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp)) *SimApp"
  file_match: sim_test.go

- old: "\t\"io\"\n"
  new: ""
  file_match: sim_test.go

- old: NewSimApp(logger.With("instance", "second"), db, nil, true, simtestutil.NewAppOptionsWithFlagHome(t.TempDir()))
  new: NewSimApp(logger.With("instance", "second"), db, true, simtestutil.NewAppOptionsWithFlagHome(t.TempDir()))
  file_match: app_test.go

- old: NewSimApp(logger.With("instance", "simapp"), db, nil, true, simtestutil.NewAppOptionsWithFlagHome(t.TempDir()))
  new: NewSimApp(logger.With("instance", "simapp"), db, true, simtestutil.NewAppOptionsWithFlagHome(t.TempDir()))
  file_match: app_test.go

- old: NewSimApp(log.NewTestLogger(t), db, nil, true, simtestutil.NewAppOptionsWithFlagHome(t.TempDir()))
  new: NewSimApp(log.NewTestLogger(t), db, true, simtestutil.NewAppOptionsWithFlagHome(t.TempDir()))
  file_match: app_test.go

- old: NewSimApp(logger, db, nil, true, appOptions, interBlockCacheOpt(), baseapp.SetChainID(simsx.SimAppChainID))
  new: NewSimApp(logger, db, true, appOptions, interBlockCacheOpt(), baseapp.SetChainID(simsx.SimAppChainID))
  file_match: sim_bench_test.go

- old: simapp.NewSimApp(log.NewNopLogger(), dbm.NewMemDB(), nil, true, simtestutil.NewAppOptionsWithFlagHome(simapp.DefaultNodeHome))
  new: simapp.NewSimApp(log.NewNopLogger(), dbm.NewMemDB(), true, simtestutil.NewAppOptionsWithFlagHome(simapp.DefaultNodeHome))
  file_match: simd/cmd/root.go

── verification ────────────────────────────────────────────────────────────

verification: must_not_import: - cosmossdk.io/x/feegrant - cosmossdk.io/x/evidence - cosmossdk.io/x/upgrade - cosmossdk.io/log # must use cosmossdk.io/log/v2 (not the bare path) - github.com/golang/mock/gomock must_not_contain: - pattern: '"cosmossdk.io/log"' # the quoted import line (bare, not /v2) - pattern: app.BaseApp.GRPCQueryRouter() - pattern: traceStore io.Writer - pattern: .WithNonCriticalExtensionOptions( - pattern: telemetry.MetricKeyPrecommiter - pattern: telemetry.MetricKeyPrepareCheckStater