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
458 lines
12 KiB
Markdown
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 }
|
|
```
|