Skip to content

Commit

Permalink
Merge pull request #42 from cosmic-horizon/feature/coho_mint_upgrade
Browse files Browse the repository at this point in the history
COHO 500M supply upgrade
  • Loading branch information
dpdanpittman authored Jun 20, 2023
2 parents 6d56c63 + 082d6c3 commit 9218ea2
Show file tree
Hide file tree
Showing 7 changed files with 255 additions and 47 deletions.
97 changes: 50 additions & 47 deletions app/app.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package app

import (
"fmt"
"io"
"net/http"
"os"
Expand All @@ -14,6 +15,9 @@ 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"
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"
Expand Down Expand Up @@ -170,6 +174,7 @@ func getGovProposalHandlers() []govclient.ProposalHandler {

govProposalHandlers = append(govProposalHandlers,
paramsclient.ProposalHandler,
upgradeclient.LegacyProposalHandler,
upgradeclient.LegacyCancelProposalHandler,
ibcclientclient.UpdateClientProposalHandler,
ibcclientclient.UpdateClientProposalHandler,
Expand All @@ -183,6 +188,8 @@ var (
// DefaultNodeHome default home directories for the application daemon
DefaultNodeHome string

Upgrades = []upgrades.Upgrade{v5_1.Upgrade}

// ModuleBasics defines the module BasicManager is in charge of setting up basic,
// non-dependant module elements, such as codec registration
// and genesis verification.
Expand Down Expand Up @@ -252,6 +259,7 @@ func init() {
// capabilities aren't needed for testing.
type App struct {
*baseapp.BaseApp
keepers.AppKeepers

legacyAmino *codec.LegacyAmino
appCodec codec.Codec
Expand All @@ -262,49 +270,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
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
Expand Down Expand Up @@ -377,7 +345,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
Expand Down Expand Up @@ -524,7 +492,6 @@ func New(
)
interTxModule := intertx.NewAppModule(appCodec, app.InterTxKeeper)
interTxIBCModule := intertx.NewIBCModule(app.InterTxKeeper)
_ = interTxIBCModule

app.AquiferKeeper = *aquiferkeeper.NewKeeper(
appCodec,
Expand Down Expand Up @@ -559,6 +526,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"
Expand All @@ -572,7 +541,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(),
Expand Down Expand Up @@ -763,7 +732,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))

Expand All @@ -773,6 +743,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)),
}
Expand Down Expand Up @@ -1010,3 +982,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,
),
)
}
}
66 changes: 66 additions & 0 deletions app/keepers/keepers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package keepers

import (
"github.com/CosmWasm/wasmd/x/wasm"
aquiferkeeper "github.com/cosmic-horizon/qwoyn/x/aquifer/keeper"
gamekeeper "github.com/cosmic-horizon/qwoyn/x/game/keeper"
intertxkeeper "github.com/cosmic-horizon/qwoyn/x/intertx/keeper"
mintkeeper "github.com/cosmic-horizon/qwoyn/x/mint/keeper"
stimuluskeeper "github.com/cosmic-horizon/qwoyn/x/stimulus/keeper"
authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper"
bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper"
consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper"
crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper"
distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper"
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"
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"
upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper"
icacontrollerkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/keeper"
icahostkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/keeper"
ibcfeekeeper "github.com/cosmos/ibc-go/v7/modules/apps/29-fee/keeper"
ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper"
ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper"
)

type AppKeepers struct {
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
ConsensusParamsKeeper consensusparamkeeper.Keeper
WasmKeeper wasm.Keeper
StimulusKeeper stimuluskeeper.Keeper
AquiferKeeper aquiferkeeper.Keeper
GameKeeper gamekeeper.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
ScopedWasmKeeper capabilitykeeper.ScopedKeeper
}
39 changes: 39 additions & 0 deletions app/upgrades/types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package upgrades

import (
"github.com/cosmic-horizon/qwoyn/app/keepers"
store "github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
)

// Upgrade defines a struct containing necessary fields that a SoftwareUpgradeProposal
// must have written, in order for the state migration to go smoothly.
// An upgrade must implement this struct, and then set it in the app.go.
// The app.go will then define the handler.
type Upgrade struct {
// Upgrade version name, for the upgrade handler, e.g. `v5.1.0`
UpgradeName string

// CreateUpgradeHandler defines the function that creates an upgrade handler
CreateUpgradeHandler func(*module.Manager, module.Configurator, keepers.AppKeepers) upgradetypes.UpgradeHandler

// Store upgrades, should be used for any new modules introduced, new modules deleted, or store names renamed.
StoreUpgrades store.StoreUpgrades
}

// Fork defines a struct containing the requisite fields for a non-software upgrade proposal
// Hard Fork at a given height to implement.
// There is one time code that can be added for the start of the Fork, in `BeginForkLogic`.
// Any other change in the code should be height-gated, if the goal is to have old and new binaries
// to be compatible prior to the upgrade height.
type Fork struct {
// Upgrade version name, for the upgrade handler, e.g. `v7`
UpgradeName string
// height the upgrade occurs at
UpgradeHeight int64

// Function that runs some custom state transition code at the beginning of a fork.
BeginForkLogic func(ctx sdk.Context)
}
20 changes: 20 additions & 0 deletions app/upgrades/v5_1/constants.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package v5_1

import (
store "github.com/cosmos/cosmos-sdk/store/types"

"github.com/cosmic-horizon/qwoyn/app/upgrades"
)

const (
// UpgradeName defines the on-chain upgrade name.
UpgradeName = "v5.1.0"
)

var Upgrade = upgrades.Upgrade{
UpgradeName: UpgradeName,
CreateUpgradeHandler: CreateUpgradeHandler,
StoreUpgrades: store.StoreUpgrades{
Added: []string{},
},
}
33 changes: 33 additions & 0 deletions app/upgrades/v5_1/upgrades.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package v5_1

import (
"github.com/cosmic-horizon/qwoyn/app/keepers"
minttypes "github.com/cosmic-horizon/qwoyn/x/mint/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
)

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) {
ctx.Logger().Info("start to run module migrations...")

gameManager := sdk.MustAccAddressFromBech32(keepers.GameKeeper.GetParamSet(ctx).Owner)
cohoAmount := sdk.NewInt(500_000_000).Mul(sdk.NewInt(1000_000)) // 500M COHO
err := keepers.BankKeeper.MintCoins(ctx, minttypes.ModuleName, sdk.NewCoins(sdk.NewCoin("ucoho", cohoAmount)))
if err != nil {
return vm, err
}

err = keepers.BankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, gameManager, sdk.NewCoins(sdk.NewCoin("ucoho", cohoAmount)))
if err != nil {
return vm, err
}

return mm.RunMigrations(ctx, configurator, vm)
}
}
31 changes: 31 additions & 0 deletions start50.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#!/bin/sh

rm -rf ~/.qwoynd

echo "silly slab oxygen reflect hawk wasp peace omit carbon pause turkey organ relax sing youth since fence increase record thing trial alien render begin" > validator.txt
echo "weather leader certain hard busy blouse click patient balcony return elephant hire mule gather danger curious visual boy estate army marine cinnamon snake flight" > mnemonic.txt;
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;

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=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
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"
16 changes: 16 additions & 0 deletions upgrade.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#!/bin/sh

qwoynd51 tx gov submit-legacy-proposal software-upgrade "v5.1.0" \
--upgrade-height=12 \
--title="Upgrade to v5.1.0" --description="Upgrade to v5.1.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 \
-b sync -y --keyring-backend test

qwoynd50 query gov proposals

qwoynd51 start --pruning=nothing --minimum-gas-prices="0stake"

qwoynd51 query bank total

0 comments on commit 9218ea2

Please sign in to comment.