package v4
import (
"fmt"
icqtypes "github.com/cosmos/ibc-apps/modules/async-icq/v7/types"
icacontrollertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types"
icahosttypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types"
"github.com/cosmos/ibc-go/v7/modules/core/exported"
generaltypes "github.com/cybercongress/go-cyber/v7/types"
clocktypes "github.com/cybercongress/go-cyber/v7/x/clock/types"
tokenfactorytypes "github.com/cybercongress/go-cyber/v7/x/tokenfactory/types"
"time"
liquiditytypes "github.com/cybercongress/go-cyber/v7/x/liquidity/types"
"github.com/cosmos/cosmos-sdk/baseapp"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types"
distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
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"
ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
bandwidthtypes "github.com/cybercongress/go-cyber/v7/x/bandwidth/types"
dmntypes "github.com/cybercongress/go-cyber/v7/x/dmn/types"
gridtypes "github.com/cybercongress/go-cyber/v7/x/grid/types"
ranktypes "github.com/cybercongress/go-cyber/v7/x/rank/types"
resourcestypes "github.com/cybercongress/go-cyber/v7/x/resources/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
"github.com/cybercongress/go-cyber/v7/app/keepers"
)
const NewDenomCreationGasConsume uint64 = 2_000_000
func CreateV4UpgradeHandler(
mm *module.Manager,
cfg module.Configurator,
keepers *keepers.AppKeepers,
) upgradetypes.UpgradeHandler {
return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) {
before := time.Now()
logger := ctx.Logger().With("upgrade", UpgradeName)
for _, subspace := range keepers.ParamsKeeper.GetSubspaces() {
subspace := subspace
var keyTable paramstypes.KeyTable
switch subspace.Name() {
case authtypes.ModuleName:
keyTable = authtypes.ParamKeyTable() case banktypes.ModuleName:
keyTable = banktypes.ParamKeyTable() case stakingtypes.ModuleName:
keyTable = stakingtypes.ParamKeyTable()
case minttypes.ModuleName:
keyTable = minttypes.ParamKeyTable() case distrtypes.ModuleName:
keyTable = distrtypes.ParamKeyTable() case slashingtypes.ModuleName:
keyTable = slashingtypes.ParamKeyTable() case govtypes.ModuleName:
keyTable = govtypesv1.ParamKeyTable() case crisistypes.ModuleName:
keyTable = crisistypes.ParamKeyTable()
case ibctransfertypes.ModuleName:
keyTable = ibctransfertypes.ParamKeyTable()
case icahosttypes.SubModuleName:
keyTable = icahosttypes.ParamKeyTable()
case icacontrollertypes.SubModuleName:
keyTable = icacontrollertypes.ParamKeyTable()
case bandwidthtypes.ModuleName:
keyTable = bandwidthtypes.ParamKeyTable() case dmntypes.ModuleName:
keyTable = dmntypes.ParamKeyTable() case gridtypes.ModuleName:
keyTable = gridtypes.ParamKeyTable() case ranktypes.ModuleName:
keyTable = ranktypes.ParamKeyTable() case resourcestypes.ModuleName:
keyTable = resourcestypes.ParamKeyTable() case liquiditytypes.ModuleName:
keyTable = liquiditytypes.ParamKeyTable() case tokenfactorytypes.ModuleName:
keyTable = tokenfactorytypes.ParamKeyTable() case icqtypes.ModuleName:
keyTable = icqtypes.ParamKeyTable()
}
if !subspace.HasKeyTable() {
logger.Info(fmt.Sprintf("set key table for subspace %s", subspace.Name()))
subspace.WithKeyTable(keyTable)
}
}
baseAppLegacySS := keepers.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramstypes.ConsensusParamsKeyTable())
baseapp.MigrateParams(ctx, baseAppLegacySS, &keepers.ConsensusParamsKeeper)
logger.Info(fmt.Sprintf("pre migrate version map: %v", vm))
versionMap, err := mm.RunMigrations(ctx, cfg, vm)
if err != nil {
return nil, err
}
logger.Info(fmt.Sprintf("post migrate version map: %v", versionMap))
after := time.Now()
ctx.Logger().Info("migration time", "duration ms", after.Sub(before).Milliseconds())
params := keepers.IBCKeeper.ClientKeeper.GetParams(ctx)
params.AllowedClients = append(params.AllowedClients, exported.Localhost)
keepers.IBCKeeper.ClientKeeper.SetParams(ctx, params)
logger.Info("set ibc client params with localhost")
newTokenFactoryParams := tokenfactorytypes.Params{
DenomCreationFee: sdk.NewCoins(sdk.NewCoin(generaltypes.CYB, sdk.NewInt(10*generaltypes.Giga))),
DenomCreationGasConsume: NewDenomCreationGasConsume,
}
if err := keepers.TokenFactoryKeeper.SetParams(ctx, newTokenFactoryParams); err != nil {
return nil, err
}
logger.Info("set tokenfactory params")
if err := keepers.ClockKeeper.SetParams(ctx, clocktypes.Params{
ContractGasLimit: 20_000_000,
}); err != nil {
return nil, err
}
logger.Info("set clock params")
keepers.ICAControllerKeeper.SetParams(ctx, icacontrollertypes.DefaultParams())
hostParams := icahosttypes.Params{
HostEnabled: true,
AllowMessages: []string{icahosttypes.AllowAllHostMsgs},
}
keepers.ICAHostKeeper.SetParams(ctx, hostParams)
logger.Info("set interchain accounts host and controller params")
icqParams := icqtypes.DefaultParams()
if err := keepers.ICQKeeper.SetParams(ctx, icqParams); err != nil {
return nil, err
}
logger.Info("set interchain queries params")
bootDenom, exist := keepers.BankKeeper.GetDenomMetaData(ctx, "boot")
if exist {
bootDenom.DenomUnits = append(bootDenom.DenomUnits, &banktypes.DenomUnit{
Denom: "root",
Exponent: 9,
Aliases: []string{"ROOT"},
})
keepers.BankKeeper.SetDenomMetaData(ctx, bootDenom)
logger.Info("update boot denom metadata with root denom")
}
after = time.Now()
ctx.Logger().Info("upgrade time", "duration ms", after.Sub(before).Milliseconds())
return versionMap, err
}
}