diff --git a/app/app.go b/app/app.go index 7e24098..66d94c6 100644 --- a/app/app.go +++ b/app/app.go @@ -1,7 +1,7 @@ package app import ( - "github.com/cosmos/cosmos-sdk/x/group" + "fmt" "io" "net/http" "os" @@ -15,6 +15,10 @@ import ( tmjson "github.com/cometbft/cometbft/libs/json" "github.com/cometbft/cometbft/libs/log" tmos "github.com/cometbft/cometbft/libs/os" + keepers "github.com/cosmic-horizon/qwoyn/app/keepers" + "github.com/cosmic-horizon/qwoyn/app/upgrades" + v5_1 "github.com/cosmic-horizon/qwoyn/app/upgrades/v5_1" + v5_2 "github.com/cosmic-horizon/qwoyn/app/upgrades/v5_2" intertx "github.com/cosmic-horizon/qwoyn/x/intertx" intertxkeeper "github.com/cosmic-horizon/qwoyn/x/intertx/keeper" intertxtypes "github.com/cosmic-horizon/qwoyn/x/intertx/types" @@ -76,6 +80,7 @@ import ( govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + "github.com/cosmos/cosmos-sdk/x/group" groupkeeper "github.com/cosmos/cosmos-sdk/x/group/keeper" groupmodule "github.com/cosmos/cosmos-sdk/x/group/module" "github.com/cosmos/cosmos-sdk/x/params" @@ -173,6 +178,7 @@ func getGovProposalHandlers() []govclient.ProposalHandler { govProposalHandlers = append(govProposalHandlers, paramsclient.ProposalHandler, + upgradeclient.LegacyProposalHandler, upgradeclient.LegacyCancelProposalHandler, ibcclientclient.UpdateClientProposalHandler, ibcclientclient.UpdateClientProposalHandler, @@ -186,6 +192,8 @@ var ( // DefaultNodeHome default home directories for the application daemon DefaultNodeHome string + Upgrades = []upgrades.Upgrade{v5_1.Upgrade, v5_2.Upgrade} + // ModuleBasics defines the module BasicManager is in charge of setting up basic, // non-dependant module elements, such as codec registration // and genesis verification. @@ -256,6 +264,7 @@ func init() { // capabilities aren't needed for testing. type App struct { *baseapp.BaseApp + keepers.AppKeepers legacyAmino *codec.LegacyAmino appCodec codec.Codec @@ -266,50 +275,9 @@ type App struct { tkeys map[string]*storetypes.TransientStoreKey memKeys map[string]*storetypes.MemoryStoreKey - // keepers - AccountKeeper authkeeper.AccountKeeper - BankKeeper bankkeeper.Keeper - CapabilityKeeper *capabilitykeeper.Keeper - StakingKeeper *stakingkeeper.Keeper - SlashingKeeper slashingkeeper.Keeper - MintKeeper mintkeeper.Keeper - DistrKeeper distrkeeper.Keeper - GovKeeper govkeeper.Keeper - CrisisKeeper *crisiskeeper.Keeper - UpgradeKeeper *upgradekeeper.Keeper - ParamsKeeper paramskeeper.Keeper - IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly - IBCFeeKeeper ibcfeekeeper.Keeper - ICAHostKeeper icahostkeeper.Keeper - ICAControllerKeeper icacontrollerkeeper.Keeper - InterTxKeeper intertxkeeper.Keeper - EvidenceKeeper evidencekeeper.Keeper - TransferKeeper ibctransferkeeper.Keeper - FeeGrantKeeper feegrantkeeper.Keeper - AuthzKeeper authzkeeper.Keeper - GroupKeeper groupkeeper.Keeper - ConsensusParamsKeeper consensusparamkeeper.Keeper - - // make scoped keepers public for test purposes - ScopedIBCKeeper capabilitykeeper.ScopedKeeper - ScopedTransferKeeper capabilitykeeper.ScopedKeeper - ScopedIBCFeeKeeper capabilitykeeper.ScopedKeeper - ScopedICAControllerKeeper capabilitykeeper.ScopedKeeper - ScopedInterTxKeeper capabilitykeeper.ScopedKeeper - ScopedAquiferKeeper capabilitykeeper.ScopedKeeper - - WasmKeeper wasm.Keeper - scopedWasmKeeper capabilitykeeper.ScopedKeeper - - StimulusKeeper stimuluskeeper.Keeper - AquiferKeeper aquiferkeeper.Keeper - GameKeeper gamekeeper.Keeper - - // mm is the module manager - mm *module.Manager - - // sm is the simulation manager - sm *module.SimulationManager + mm *module.Manager + sm *module.SimulationManager + configurator module.Configurator } // New returns a reference to an initialized blockchain app @@ -382,7 +350,7 @@ func New( scopedICAHostKeeper := app.CapabilityKeeper.ScopeToModule(icahosttypes.SubModuleName) app.ScopedICAControllerKeeper = app.CapabilityKeeper.ScopeToModule(icacontrollertypes.SubModuleName) app.ScopedInterTxKeeper = app.CapabilityKeeper.ScopeToModule(intertxtypes.ModuleName) - app.scopedWasmKeeper = app.CapabilityKeeper.ScopeToModule(wasm.ModuleName) + app.ScopedWasmKeeper = app.CapabilityKeeper.ScopeToModule(wasm.ModuleName) app.ScopedAquiferKeeper = app.CapabilityKeeper.ScopeToModule(aquifertypes.ModuleName) // add keepers @@ -532,7 +500,6 @@ func New( ) interTxModule := intertx.NewAppModule(appCodec, app.InterTxKeeper) interTxIBCModule := intertx.NewIBCModule(app.InterTxKeeper) - _ = interTxIBCModule app.AquiferKeeper = *aquiferkeeper.NewKeeper( appCodec, @@ -567,6 +534,8 @@ func New( panic("error while reading wasm config: " + err.Error()) } + app.setupUpgradeStoreLoaders() + // The last arguments can contain custom message handlers, and custom query handlers, // if we want to allow any custom callbacks availableCapabilities := "iterator,staking,stargate,cosmwasm_1_1,cosmwasm_1_2" @@ -580,7 +549,7 @@ func New( app.IBCFeeKeeper, // ISC4 Wrapper: fee IBC middleware app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper, - app.scopedWasmKeeper, + app.ScopedWasmKeeper, app.TransferKeeper, app.MsgServiceRouter(), app.GRPCQueryRouter(), @@ -775,7 +744,8 @@ func New( ) app.mm.RegisterInvariants(app.CrisisKeeper) - app.mm.RegisterServices(module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter())) + app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) + app.mm.RegisterServices(app.configurator) autocliv1.RegisterQueryServer(app.GRPCQueryRouter(), runtimeservices.NewAutoCLIQueryService(app.mm.Modules)) @@ -785,6 +755,8 @@ func New( } reflectionv1.RegisterReflectionServiceServer(app.GRPCQueryRouter(), reflectionSvc) + app.setupUpgradeHandlers() + overrideModules := map[string]module.AppModuleSimulation{ authtypes.ModuleName: auth.NewAppModule(app.appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)), } @@ -1022,3 +994,34 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino func (app *App) SimulationManager() *module.SimulationManager { return app.sm } + +// configure store loader that checks if version == upgradeHeight and applies store upgrades +func (app *App) setupUpgradeStoreLoaders() { + upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk() + if err != nil { + panic(fmt.Sprintf("failed to read upgrade info from disk %s", err)) + } + + if app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) { + return + } + + for _, upgrade := range Upgrades { + if upgradeInfo.Name == upgrade.UpgradeName { + app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &upgrade.StoreUpgrades)) + } + } +} + +func (app *App) setupUpgradeHandlers() { + for _, upgrade := range Upgrades { + app.UpgradeKeeper.SetUpgradeHandler( + upgrade.UpgradeName, + upgrade.CreateUpgradeHandler( + app.mm, + app.configurator, + app.AppKeepers, + ), + ) + } +} diff --git a/app/keepers/keepers.go b/app/keepers/keepers.go index a127abd..d8743c9 100644 --- a/app/keepers/keepers.go +++ b/app/keepers/keepers.go @@ -17,6 +17,7 @@ import ( evidencekeeper "github.com/cosmos/cosmos-sdk/x/evidence/keeper" feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" + groupkeeper "github.com/cosmos/cosmos-sdk/x/group/keeper" paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" @@ -49,6 +50,7 @@ type AppKeepers struct { TransferKeeper ibctransferkeeper.Keeper FeeGrantKeeper feegrantkeeper.Keeper AuthzKeeper authzkeeper.Keeper + GroupKeeper groupkeeper.Keeper ConsensusParamsKeeper consensusparamkeeper.Keeper WasmKeeper wasm.Keeper StimulusKeeper stimuluskeeper.Keeper diff --git a/app/upgrades/v5_2/constants.go b/app/upgrades/v5_2/constants.go new file mode 100644 index 0000000..9bd8a78 --- /dev/null +++ b/app/upgrades/v5_2/constants.go @@ -0,0 +1,20 @@ +package v5_2 + +import ( + "github.com/cosmic-horizon/qwoyn/app/upgrades" + store "github.com/cosmos/cosmos-sdk/store/types" + "github.com/cosmos/cosmos-sdk/x/group" +) + +const ( + // UpgradeName defines the on-chain upgrade name. + UpgradeName = "v5.2.0" +) + +var Upgrade = upgrades.Upgrade{ + UpgradeName: UpgradeName, + CreateUpgradeHandler: CreateUpgradeHandler, + StoreUpgrades: store.StoreUpgrades{ + Added: []string{group.ModuleName}, + }, +} diff --git a/app/upgrades/v5_2/upgrades.go b/app/upgrades/v5_2/upgrades.go index ce1c2e0..22e3a1a 100644 --- a/app/upgrades/v5_2/upgrades.go +++ b/app/upgrades/v5_2/upgrades.go @@ -1,28 +1,18 @@ -package v5_2 //nolint:revive,stylecheck +package v5_2 import ( - storetypes "github.com/cosmos/cosmos-sdk/store/types" + "github.com/cosmic-horizon/qwoyn/app/keepers" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - "github.com/cosmos/cosmos-sdk/x/group" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - - "github.com/cosmic-horizon/QWOYN/v5_2/app/upgrades" ) -const Name = "v5.2.0" - -var Upgrade = upgrades.Upgrade{ - UpgradeName: Name, - CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { - return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { - - return mm.RunMigrations(ctx, cfg, fromVM) - } - }, - StoreUpgrades: storetypes.StoreUpgrades{ - Added: []string{ - group.ModuleName, - }, - }, +func CreateUpgradeHandler( + mm *module.Manager, + configurator module.Configurator, + keepers keepers.AppKeepers, +) upgradetypes.UpgradeHandler { + return func(ctx sdk.Context, plan upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { + return mm.RunMigrations(ctx, configurator, vm) + } } diff --git a/start50.sh b/start51.sh similarity index 59% rename from start50.sh rename to start51.sh index 684467b..bbe0119 100644 --- a/start50.sh +++ b/start51.sh @@ -7,25 +7,25 @@ echo "weather leader certain hard busy blouse click patient balcony return eleph echo "never chuckle bird almost jacket veteran weekend original rare habit point scorpion place gadget net train more plug upon pear renew mule material dynamic" > mnemonic2.txt; # Build genesis -qwoynd50 init --chain-id=qwoyn-1 test -qwoynd50 keys add validator --keyring-backend="test" < validator.txt; -qwoynd50 keys add maintainer --recover --keyring-backend=test < mnemonic.txt; -qwoynd50 keys add user1 --recover --keyring-backend=test < mnemonic2.txt; +qwoynd51 init --chain-id=qwoyn-1 test +qwoynd51 keys add validator --keyring-backend="test" < validator.txt; +qwoynd51 keys add maintainer --recover --keyring-backend=test < mnemonic.txt; +qwoynd51 keys add user1 --recover --keyring-backend=test < mnemonic2.txt; -VALIDATOR=$(qwoynd50 keys show validator -a --keyring-backend="test") -MAINTAINER=$(qwoynd50 keys show maintainer -a --keyring-backend="test") -USER1=$(qwoynd50 keys show user1 -a --keyring-backend="test") +VALIDATOR=$(qwoynd51 keys show validator -a --keyring-backend="test") +MAINTAINER=$(qwoynd51 keys show maintainer -a --keyring-backend="test") +USER1=$(qwoynd51 keys show user1 -a --keyring-backend="test") # VALIDATOR=qwoyn1hzqg4r2e789930hs88wqle25ef94xajuqay93r # MAINTAINER=qwoyn1h9krsew6kpg9huzcqgmgmns0n48jx9yd5vr0n5 # USER1=qwoyn13tqzdukugulllnk3p5js3w7hzw8gclkeenzp6e -qwoynd50 genesis add-genesis-account $VALIDATOR 1000000000000uqwoyn,1000000000000ucoho,1000000000000stake -qwoynd50 genesis add-genesis-account $MAINTAINER 1000000000000uqwoyn,1000000000000ucoho,1000000000000stake -qwoynd50 genesis add-genesis-account $USER1 1000000000000uqwoyn,1000000000000ucoho,1000000000000stake -qwoynd50 genesis gentx validator 100000000stake --keyring-backend="test" --chain-id=qwoyn-1 -qwoynd50 genesis collect-gentxs +qwoynd51 genesis add-genesis-account $VALIDATOR 1000000000000uqwoyn,1000000000000ucoho,1000000000000stake +qwoynd51 genesis add-genesis-account $MAINTAINER 1000000000000uqwoyn,1000000000000ucoho,1000000000000stake +qwoynd51 genesis add-genesis-account $USER1 1000000000000uqwoyn,1000000000000ucoho,1000000000000stake +qwoynd51 genesis gentx validator 100000000stake --keyring-backend="test" --chain-id=qwoyn-1 +qwoynd51 genesis collect-gentxs sed -i '' 's/"voting_period": "172800s"/"voting_period": "20s"/g' $HOME/.qwoynd/config/genesis.json # sed -i 's/stake/uqwoyn/g' $HOME/.qwoynd/config/genesis.json # Start node -qwoynd50 start --pruning=nothing --minimum-gas-prices="0stake" +qwoynd51 start --pruning=nothing --minimum-gas-prices="0stake" diff --git a/upgrade.sh b/upgrade.sh index b0b957b..e0cc6b1 100644 --- a/upgrade.sh +++ b/upgrade.sh @@ -1,16 +1,16 @@ #!/bin/sh -qwoynd51 tx gov submit-legacy-proposal software-upgrade "v5.1.0" \ +qwoynd51 tx gov submit-legacy-proposal software-upgrade "v5.2.0" \ --upgrade-height=12 \ ---title="Upgrade to v5.1.0" --description="Upgrade to v5.1.0" --no-validate \ +--title="Upgrade to v5.2.0" --description="Upgrade to v5.2.0" --no-validate \ --from=validator --keyring-backend=test \ --chain-id=qwoyn-1 --yes -b sync --deposit="100000000stake" -qwoynd50 tx gov vote 1 yes --from validator --chain-id qwoyn-1 \ +qwoynd51 tx gov vote 1 yes --from validator --chain-id qwoyn-1 \ -b sync -y --keyring-backend test -qwoynd50 query gov proposals +qwoynd51 query gov proposals -qwoynd51 start --pruning=nothing --minimum-gas-prices="0stake" +qwoynd52 start --pruning=nothing --minimum-gas-prices="0stake" -qwoynd51 query bank total \ No newline at end of file +qwoynd52 query bank total \ No newline at end of file