mukan-ignite/docs/versioned_docs/version-v29/06-migration/v0.18.md
Mukan Erkin Törük 26b204bd04
Some checks are pending
Docs Deploy / build_and_deploy (push) Waiting to run
Generate Docs / cli (push) Waiting to run
Generate Config Doc / cli (push) Waiting to run
Go formatting / go-formatting (push) Waiting to run
Check links / markdown-link-check (push) Waiting to run
Integration / pre-test (push) Waiting to run
Integration / test on (push) Blocked by required conditions
Integration / status (push) Blocked by required conditions
Lint / Lint Go code (push) Waiting to run
Test / test (ubuntu-latest) (push) Waiting to run
feat: fork Ignite CLI v29 as Mukan Ignite — remove cosmos-sdk restrictions
2026-05-11 03:31:37 +03:00

458 lines
12 KiB
Markdown

---
sidebar_position: 999
title: v0.18.0
description: For chains that were scaffolded with IGNITE® CLI versions lower than v0.18, changes are required to use IGNITE® CLI v0.18.
---
# Upgrading a Blockchain to use IGNITE® CLI v0.18
IGNITE® CLI v0.18 comes with Cosmos SDK v0.44. This version of Cosmos SDK introduced changes that are not compatible with
chains that were scaffolded with IGNITE® CLI versions lower than v0.18.
**Important:** After upgrading from IGNITE® CLI v0.17.3 to IGNITE® CLI v0.18, you must update the default blockchain
template to use blockchains that were scaffolded with earlier versions.
These instructions are written for a blockchain that was scaffolded with the following command:
```
ignite scaffold chain github.com/username/mars
```
If you used a different module path, replace `username` and `mars` with the correct values for your blockchain.
## Blockchain
For each file listed, make the required changes to the source code of the blockchain template.
### go.mod
```
module github.com/username/mars
go 1.16
require (
github.com/cosmos/cosmos-sdk v0.44.0
github.com/cosmos/ibc-go v1.2.0
github.com/gogo/protobuf v1.3.3
github.com/google/go-cmp v0.5.6 // indirect
github.com/gorilla/mux v1.8.0
github.com/grpc-ecosystem/grpc-gateway v1.16.0
github.com/spf13/cast v1.3.1
github.com/spf13/cobra v1.1.3
github.com/stretchr/testify v1.7.0
github.com/tendermint/spm v0.1.6
github.com/tendermint/tendermint v0.34.13
github.com/tendermint/tm-db v0.6.4
google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83
google.golang.org/grpc v1.40.0
)
replace (
github.com/99designs/keyring => github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76
github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1
google.golang.org/grpc => google.golang.org/grpc v1.33.2
)
```
### app/app.go
```go
package app
import (
//...
// Add the following packages:
"github.com/cosmos/cosmos-sdk/x/feegrant"
feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper"
feegrantmodule "github.com/cosmos/cosmos-sdk/x/feegrant/module"
"github.com/cosmos/ibc-go/modules/apps/transfer"
ibctransferkeeper "github.com/cosmos/ibc-go/modules/apps/transfer/keeper"
ibctransfertypes "github.com/cosmos/ibc-go/modules/apps/transfer/types"
ibc "github.com/cosmos/ibc-go/modules/core"
ibcclient "github.com/cosmos/ibc-go/modules/core/02-client"
ibcporttypes "github.com/cosmos/ibc-go/modules/core/05-port/types"
ibchost "github.com/cosmos/ibc-go/modules/core/24-host"
ibckeeper "github.com/cosmos/ibc-go/modules/core/keeper"
// Remove the following packages:
// transfer "github.com/cosmos/cosmos-sdk/x/ibc/applications/transfer"
// ibctransferkeeper "github.com/cosmos/cosmos-sdk/x/ibc/applications/transfer/keeper"
// ibctransfertypes "github.com/cosmos/cosmos-sdk/x/ibc/applications/transfer/types"
// ibc "github.com/cosmos/cosmos-sdk/x/ibc/core"
// ibcclient "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client"
// porttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/05-port/types"
// ibchost "github.com/cosmos/cosmos-sdk/x/ibc/core/24-host"
// ibckeeper "github.com/cosmos/cosmos-sdk/x/ibc/core/keeper"
)
var (
//...
ModuleBasics = module.NewBasicManager(
//...
slashing.AppModuleBasic{},
// Add feegrantmodule.AppModuleBasic{},
feegrantmodule.AppModuleBasic{}, // <--
ibc.AppModuleBasic{},
//...
)
//...
)
type App struct {
//...
// Replace codec.Marshaler with codec.Codec
appCodec codec.Codec // <--
// Add FeeGrantKeeper
FeeGrantKeeper feegrantkeeper.Keeper // <--
}
func New( /*...*/ ) {
//bApp.SetAppVersion(version.Version)
bApp.SetVersion(version.Version) // <--
keys := sdk.NewKVStoreKeys(
//...
upgradetypes.StoreKey,
// Add feegrant.StoreKey
feegrant.StoreKey, // <--
evidencetypes.StoreKey,
//...
)
app.FeeGrantKeeper = feegrantkeeper.NewKeeper(appCodec, keys[feegrant.StoreKey], app.AccountKeeper) // <--
// Add app.BaseApp as the last argument to upgradekeeper.NewKeeper
app.UpgradeKeeper = upgradekeeper.NewKeeper(skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, homePath, app.BaseApp)
app.IBCKeeper = ibckeeper.NewKeeper(
// Add app.UpgradeKeeper
appCodec, keys[ibchost.StoreKey], app.GetSubspace(ibchost.ModuleName), app.StakingKeeper, app.UpgradeKeeper, scopedIBCKeeper,
)
govRouter.AddRoute(govtypes.RouterKey, govtypes.ProposalHandler).
//...
// Replace NewClientUpdateProposalHandler with NewClientProposalHandler
AddRoute(ibchost.RouterKey, ibcclient.NewClientProposalHandler(app.IBCKeeper.ClientKeeper))
// Replace porttypes with ibcporttypes
ibcRouter := ibcporttypes.NewRouter()
app.mm.SetOrderBeginBlockers(
upgradetypes.ModuleName,
// Add capabilitytypes.ModuleName,
capabilitytypes.ModuleName,
minttypes.ModuleName,
//...
// Add feegrant.ModuleName,
feegrant.ModuleName,
)
// Add app.appCodec as an argument to module.NewConfigurator:
app.mm.RegisterServices(module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()))
// Replace:
// app.SetAnteHandler(
// ante.NewAnteHandler(
// app.AccountKeeper, app.BankKeeper, ante.DefaultSigVerificationGasConsumer,
// encodingConfig.TxConfig.SignModeHandler(),
// ),
// )
// With the following:
anteHandler, err := ante.NewAnteHandler(
ante.HandlerOptions{
AccountKeeper: app.AccountKeeper,
BankKeeper: app.BankKeeper,
SignModeHandler: encodingConfig.TxConfig.SignModeHandler(),
FeegrantKeeper: app.FeeGrantKeeper,
SigGasConsumer: ante.DefaultSigVerificationGasConsumer,
},
)
if err != nil {
panic(err)
}
app.SetAnteHandler(anteHandler)
// Remove the following:
// ctx := app.BaseApp.NewUncachedContext(true, tmproto.Header{})
// app.CapabilityKeeper.InitializeAndSeal(ctx)
}
func (app *App) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain {
var genesisState GenesisState
if err := tmjson.Unmarshal(req.AppStateBytes, &genesisState); err != nil {
panic(err)
}
// Add the following:
app.UpgradeKeeper.SetModuleVersionMap(ctx, app.mm.GetVersionMap())
return app.mm.InitGenesis(ctx, app.appCodec, genesisState)
}
// Replace Marshaler with Codec
func (app *App) AppCodec() codec.Codec {
return app.appCodec
}
// Replace BinaryMarshaler with BinaryCodec
func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey sdk.StoreKey) paramskeeper.Keeper {
//...
}
```
### app/genesis.go
```go
// Replace codec.JSONMarshaler with codec.JSONCodec
func NewDefaultGenesisState(cdc codec.JSONCodec) GenesisState {
// ...
}
```
### testutil/keeper/mars.go
Add the following code:
```go
package keeper
import (
"testing"
"github.com/cosmos/cosmos-sdk/codec"
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
"github.com/cosmos/cosmos-sdk/store"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/stretchr/testify/require"
"github.com/tendermint/tendermint/libs/log"
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
tmdb "github.com/tendermint/tm-db"
"github.com/username/mars/x/mars/keeper"
"github.com/username/mars/x/mars/types"
)
func MarsKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) {
storeKey := sdk.NewKVStoreKey(types.StoreKey)
memStoreKey := storetypes.NewMemoryStoreKey(types.MemStoreKey)
db := tmdb.NewMemDB()
stateStore := store.NewCommitMultiStore(db)
stateStore.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db)
stateStore.MountStoreWithDB(memStoreKey, sdk.StoreTypeMemory, nil)
require.NoError(t, stateStore.LoadLatestVersion())
registry := codectypes.NewInterfaceRegistry()
k := keeper.NewKeeper(
codec.NewProtoCodec(registry),
storeKey,
memStoreKey,
)
ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, log.NewNopLogger())
return k, ctx
}
```
If `mars` is an IBC-enabled module, add the following code, instead:
```go
package keeper
import (
"testing"
"github.com/cosmos/cosmos-sdk/codec"
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
"github.com/cosmos/cosmos-sdk/store"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper"
typesparams "github.com/cosmos/cosmos-sdk/x/params/types"
ibckeeper "github.com/cosmos/ibc-go/modules/core/keeper"
"github.com/stretchr/testify/require"
"github.com/tendermint/tendermint/libs/log"
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
tmdb "github.com/tendermint/tm-db"
"github.com/username/test/x/mars/keeper"
"github.com/username/test/x/mars/types"
)
func MarsKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) {
logger := log.NewNopLogger()
storeKey := sdk.NewKVStoreKey(types.StoreKey)
memStoreKey := storetypes.NewMemoryStoreKey(types.MemStoreKey)
db := tmdb.NewMemDB()
stateStore := store.NewCommitMultiStore(db)
stateStore.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db)
stateStore.MountStoreWithDB(memStoreKey, sdk.StoreTypeMemory, nil)
require.NoError(t, stateStore.LoadLatestVersion())
registry := codectypes.NewInterfaceRegistry()
appCodec := codec.NewProtoCodec(registry)
capabilityKeeper := capabilitykeeper.NewKeeper(appCodec, storeKey, memStoreKey)
amino := codec.NewLegacyAmino()
ss := typesparams.NewSubspace(appCodec,
amino,
storeKey,
memStoreKey,
"MarsSubSpace",
)
IBCKeeper := ibckeeper.NewKeeper(
appCodec,
storeKey,
ss,
nil,
nil,
capabilityKeeper.ScopeToModule("MarsIBCKeeper"),
)
k := keeper.NewKeeper(
codec.NewProtoCodec(registry),
storeKey,
memStoreKey,
IBCKeeper.ChannelKeeper,
&IBCKeeper.PortKeeper,
capabilityKeeper.ScopeToModule("MarsScopedKeeper"),
)
ctx := sdk.NewContext(stateStore, tmproto.Header{}, false, logger)
return k, ctx
}
```
### testutil/network/network.go
```go
func DefaultConfig() network.Config {
// ...
return network.Config{
// ...
// Add sdk.DefaultPowerReduction
AccountTokens: sdk.TokensFromConsensusPower(1000, sdk.DefaultPowerReduction),
StakingTokens: sdk.TokensFromConsensusPower(500, sdk.DefaultPowerReduction),
BondedTokens: sdk.TokensFromConsensusPower(100, sdk.DefaultPowerReduction),
// ...
}
}
```
### testutil/sample/sample.go
Add the following code:
```go
package sample
import (
"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
sdk "github.com/cosmos/cosmos-sdk/types"
)
// AccAddress returns a sample account address
func AccAddress() string {
pk := ed25519.GenPrivKey().PubKey()
addr := pk.Address()
return sdk.AccAddress(addr).String()
}
```
### BandChain Support
If your module includes integration with BandChain, added manually or scaffolded with `ignite scaffold band`, upgrade
the `github.com/bandprotocol/bandchain-packet` package to `v0.0.2` in `go.mod`.
## Module
### x/mars/keeper/keeper.go
```go
package keeper
// ...
type (
Keeper struct {
// Replace Marshaler with BinaryCodec
cdc codec.BinaryCodec
//...
}
)
func NewKeeper(
// Replace Marshaler with BinaryCodec
cdc codec.BinaryCodec,
// ...
) *Keeper {
// ...
}
```
### x/mars/keeper/msg_server_test.go
```go
package keeper_test
import (
//...
// Add the following:
keepertest "github.com/username/mars/testutil/keeper"
"github.com/username/mars/x/mars/keeper"
)
func setupMsgServer(t testing.TB) (types.MsgServer, context.Context) {
// Replace
// keeper, ctx := setupKeeper(t)
// return NewMsgServerImpl(*keeper), sdk.WrapSDKContext(ctx)
// With the following:
k, ctx := keepertest.MarsKeeper(t)
return keeper.NewMsgServerImpl(*k), sdk.WrapSDKContext(ctx)
}
```
### x/mars/module.go
```go
package mars
type AppModuleBasic struct {
// Replace Marshaler with BinaryCodec
cdc codec.BinaryCodec
}
// Replace Marshaler with BinaryCodec
func NewAppModuleBasic(cdc codec.BinaryCodec) AppModuleBasic {
return AppModuleBasic{cdc: cdc}
}
// Replace JSONMarshaler with JSONCodec
func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage {
return cdc.MustMarshalJSON(types.DefaultGenesis())
}
// Replace JSONMarshaler with JSONCodec
func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage) error {
//...
}
// Replace codec.Marshaller with codec.Codec
func NewAppModule(cdc codec.Codec, keeper keeper.Keeper) AppModule {
//...
}
// Replace JSONMarshaler with JSONCodec
func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.RawMessage) []abci.ValidatorUpdate {
//...
}
// Replace JSONMarshaler with JSONCodec
func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage {
//...
}
// Add the following
func (AppModule) ConsensusVersion() uint64 { return 2 }
```