Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/upgrade handler #50

Merged
merged 4 commits into from
Nov 12, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -797,6 +797,7 @@ func New(
app.setAnteHandler(encodingConfig.TxConfig, maxGasWanted)
app.setPostHandler()
app.SetEndBlocker(app.EndBlocker)
SetupHandlers(app, app.EvmKeeper, app.IBCKeeper.ClientKeeper, app.ParamsKeeper, appCodec)

if loadLatest {
if err := app.LoadLatestVersion(); err != nil {
Expand Down
133 changes: 133 additions & 0 deletions app/setup_handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
package app

import (
didmoduletypes "swisstronik/x/did/types"
evmkeeper "swisstronik/x/evm/keeper"
evmmoduletypes "swisstronik/x/evm/types"
feemarketmoduletypes "swisstronik/x/feemarket/types"
vestmoduletypes "swisstronik/x/vesting/types"

"github.com/cosmos/cosmos-sdk/baseapp"
"github.com/cosmos/cosmos-sdk/codec"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
m "github.com/cosmos/cosmos-sdk/types/module"
"github.com/cosmos/cosmos-sdk/version"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types"
crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper"
paramstypes "github.com/cosmos/cosmos-sdk/x/params/types"
slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
ibctmmigrations "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint/migrations"
)

func SetupHandlers(
app *App,
ek *evmkeeper.Keeper,
clientKeeper ibctmmigrations.ClientKeeper,
pk paramskeeper.Keeper,
cdc codec.BinaryCodec) {
setUpgradeHandler(app, ek, clientKeeper, pk, cdc)

loadUpgradeStore(app)
}

func setUpgradeHandler(
app *App,
ek *evmkeeper.Keeper,
clientKeeper ibctmmigrations.ClientKeeper,
pk paramskeeper.Keeper,
cdc codec.BinaryCodec) {
// Set param key table for params module migration
for _, subspace := range app.ParamsKeeper.GetSubspaces() {
subspace := subspace

app.Logger().Info("Setting up upgrade handler for " + subspace.Name())

var keyTable paramstypes.KeyTable
switch subspace.Name() {
case authtypes.ModuleName:
keyTable = authtypes.ParamKeyTable() //nolint:staticcheck
case banktypes.ModuleName:
keyTable = banktypes.ParamKeyTable() //nolint:staticcheck
case stakingtypes.ModuleName:
keyTable = stakingtypes.ParamKeyTable() //nolint:staticcheck
case minttypes.ModuleName:
keyTable = minttypes.ParamKeyTable() //nolint:staticcheck
case slashingtypes.ModuleName:
keyTable = slashingtypes.ParamKeyTable() //nolint:staticcheck
case govtypes.ModuleName:
keyTable = govv1.ParamKeyTable() //nolint:staticcheck
case crisistypes.ModuleName:
keyTable = crisistypes.ParamKeyTable() //nolint:staticcheck
case didmoduletypes.ModuleName:
keyTable = didmoduletypes.ParamKeyTable()
case evmmoduletypes.ModuleName:
keyTable = evmmoduletypes.ParamKeyTable()
case feemarketmoduletypes.ModuleName:
keyTable = feemarketmoduletypes.ParamKeyTable()
case vestmoduletypes.ModuleName:
keyTable = vestmoduletypes.ParamKeyTable()
}
MikkySnow marked this conversation as resolved.
Show resolved Hide resolved

if !subspace.HasKeyTable() {
subspace.WithKeyTable(keyTable)
}
}

baseAppLegacySS := app.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramstypes.ConsensusParamsKeyTable())

app.UpgradeKeeper.SetUpgradeHandler(
version.Version,
func(ctx sdk.Context, plan upgradetypes.Plan, vm m.VersionMap) (m.VersionMap, error) {
app.Logger().Info("Running upgrade handler for " + version.Version)

// Migrate Tendermint consensus parameters from x/params module to a
// dedicated x/consensus module.
baseapp.MigrateParams(ctx, baseAppLegacySS, &app.ConsensusParamsKeeper)

// Include this when migrating to ibc-go v7 (optional)
// source: https:/cosmos/ibc-go/blob/v7.2.0/docs/migrations/v6-to-v7.md
// prune expired tendermint consensus states to save storage space
if _, err := ibctmmigrations.PruneExpiredConsensusStates(ctx, cdc, clientKeeper); err != nil {
return nil, err
}
// !! ATTENTION !!

return app.mm.RunMigrations(ctx, app.configurator, vm)
},
)
}

func loadUpgradeStore(app *App) {
upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk()
if err != nil {
panic(err)
}

if shouldLoadUpgradeStore(app, upgradeInfo) {
storeUpgrades := storetypes.StoreUpgrades{
Added: []string{
didmoduletypes.StoreKey,
consensusparamtypes.StoreKey,
crisistypes.ModuleName,
},
}
// Use upgrade store loader for the initial loading of all stores when app starts,
// it checks if version == upgradeHeight and applies store upgrades before loading the stores,
// so that new stores start with the correct version (the current height of chain),
// instead the default which is the latest version that store last committed i.e 0 for new stores.
app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades))
}
}

func shouldLoadUpgradeStore(app *App, upgradeInfo upgradetypes.Plan) bool {
return upgradeInfo.Name == version.Version && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height)
}