From f2e4956d8803dfc8f478aeb2c1bf4a7231b46498 Mon Sep 17 00:00:00 2001 From: rhuairahrighairigh Date: Tue, 10 Mar 2020 22:29:16 +0000 Subject: [PATCH] hook into app to get integration tests running --- app/app.go | 50 +++++---- app/test_common.go | 2 + x/committee/alias.go | 36 +++++++ x/committee/keeper/keeper.go | 18 +++- x/committee/keeper/keeper_test.go | 35 +++++++ x/committee/module.go | 162 ++++++++++++++++++++++++++++++ x/committee/types/codec.go | 22 ++++ x/committee/types/keys.go | 19 ++++ 8 files changed, 319 insertions(+), 25 deletions(-) create mode 100644 x/committee/alias.go create mode 100644 x/committee/keeper/keeper_test.go create mode 100644 x/committee/module.go create mode 100644 x/committee/types/codec.go create mode 100644 x/committee/types/keys.go diff --git a/app/app.go b/app/app.go index 51f811db..151c5836 100644 --- a/app/app.go +++ b/app/app.go @@ -30,10 +30,9 @@ import ( "github.com/kava-labs/kava/x/auction" "github.com/kava-labs/kava/x/cdp" + "github.com/kava-labs/kava/x/committee" "github.com/kava-labs/kava/x/pricefeed" validatorvesting "github.com/kava-labs/kava/x/validator-vesting" - shutdownAnte "github.com/kava-labs/kava/x/shutdown/ante" - "github.com/kava-labs/kava/x/shutdown" ) const ( @@ -64,6 +63,7 @@ var ( auction.AppModuleBasic{}, cdp.AppModuleBasic{}, pricefeed.AppModuleBasic{}, + committee.AppModuleBasic{}, ) // module account permissions @@ -107,6 +107,7 @@ type App struct { auctionKeeper auction.Keeper cdpKeeper cdp.Keeper pricefeedKeeper pricefeed.Keeper + committeeKeeper committee.Keeper // the module manager mm *module.Manager @@ -130,7 +131,7 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, bam.MainStoreKey, auth.StoreKey, staking.StoreKey, supply.StoreKey, mint.StoreKey, distr.StoreKey, slashing.StoreKey, gov.StoreKey, params.StoreKey, validatorvesting.StoreKey, - auction.StoreKey, cdp.StoreKey, pricefeed.StoreKey, + auction.StoreKey, cdp.StoreKey, pricefeed.StoreKey, committee.StoreKey, ) tkeys := sdk.NewTransientStoreKeys(params.TStoreKey) @@ -245,6 +246,11 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, app.auctionKeeper, app.supplyKeeper, cdp.DefaultCodespace) + app.committeeKeeper = committee.NewKeeper( + app.cdc, + keys[committee.StoreKey], + // TODO blacklist module addresses? + ) // register the staking hooks // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks @@ -268,6 +274,7 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, auction.NewAppModule(app.auctionKeeper, app.supplyKeeper), cdp.NewAppModule(app.cdpKeeper, app.pricefeedKeeper), pricefeed.NewAppModule(app.pricefeedKeeper), + committee.NewAppModule(app.committeeKeeper), ) // During begin block slashing happens after distr.BeginBlocker so that @@ -287,7 +294,7 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, auth.ModuleName, validatorvesting.ModuleName, distr.ModuleName, staking.ModuleName, bank.ModuleName, slashing.ModuleName, gov.ModuleName, mint.ModuleName, supply.ModuleName, crisis.ModuleName, genutil.ModuleName, - pricefeed.ModuleName, cdp.ModuleName, auction.ModuleName, // TODO is this order ok? + pricefeed.ModuleName, cdp.ModuleName, auction.ModuleName, committee.ModuleName, // TODO is this order ok? ) app.mm.RegisterInvariants(&app.crisisKeeper) @@ -310,6 +317,7 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, cdp.NewAppModule(app.cdpKeeper, app.pricefeedKeeper), // TODO how is the order be decided here? Is this order correct? pricefeed.NewAppModule(app.pricefeedKeeper), auction.NewAppModule(app.auctionKeeper, app.supplyKeeper), + // TODO committee ) app.sm.RegisterStoreDecoders() @@ -321,7 +329,7 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, // initialize the app app.SetInitChainer(app.InitChainer) app.SetBeginBlocker(app.BeginBlocker) - app.SetAnteHandler(NewAnteHandler(app.accountKeeper, app.supplyKeeper, app.shutdownKeeper, auth.DefaultSigVerificationGasConsumer)) + // app.SetAnteHandler(NewAnteHandler(app.accountKeeper, app.supplyKeeper, app.shutdownKeeper, auth.DefaultSigVerificationGasConsumer)) app.SetEndBlocker(app.EndBlocker) // load store @@ -335,22 +343,22 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, return app } -func NewAnteHandler(ak auth.AccountKeeper, supplyKeeper supply.SupplyKeeper, shutdownKeeper shutdown.Keeper, sigGasConsumer SignatureVerificationGasConsumer) sdk.AnteHandler { - return sdk.ChainAnteDecorators( - auth.NewSetUpContextDecorator(), // outermost AnteDecorator. SetUpContext must be called first - shutdownAnte.NewDisableMsgDecorator(shutdownKeeper) - auth.NewMempoolFeeDecorator(), - auth.NewValidateBasicDecorator(), - auth.NewValidateMemoDecorator(ak), - auth.NewConsumeGasForTxSizeDecorator(ak), - auth.NewSetPubKeyDecorator(ak), // SetPubKeyDecorator must be called before all signature verification decorators - auth.NewValidateSigCountDecorator(ak), - auth.NewDeductFeeDecorator(ak, supplyKeeper), - auth.NewSigGasConsumeDecorator(ak, sigGasConsumer), - auth.NewSigVerificationDecorator(ak), - auth.NewIncrementSequenceDecorator(ak), // innermost AnteDecorator - ) -} +// func NewAnteHandler(ak auth.AccountKeeper, supplyKeeper supply.Keeper, shutdownKeeper shutdown.Keeper, sigGasConsumer SignatureVerificationGasConsumer) sdk.AnteHandler { +// return sdk.ChainAnteDecorators( +// auth.NewSetUpContextDecorator(), // outermost AnteDecorator. SetUpContext must be called first +// shutdownAnte.NewDisableMsgDecorator(shutdownKeeper), +// auth.NewMempoolFeeDecorator(), +// auth.NewValidateBasicDecorator(), +// auth.NewValidateMemoDecorator(ak), +// auth.NewConsumeGasForTxSizeDecorator(ak), +// auth.NewSetPubKeyDecorator(ak), // SetPubKeyDecorator must be called before all signature verification decorators +// auth.NewValidateSigCountDecorator(ak), +// auth.NewDeductFeeDecorator(ak, supplyKeeper), +// auth.NewSigGasConsumeDecorator(ak, sigGasConsumer), +// auth.NewSigVerificationDecorator(ak), +// auth.NewIncrementSequenceDecorator(ak), // innermost AnteDecorator +// ) +// } // custom tx codec func MakeCodec() *codec.Codec { diff --git a/app/test_common.go b/app/test_common.go index 7bb0da05..3d687a5a 100644 --- a/app/test_common.go +++ b/app/test_common.go @@ -29,6 +29,7 @@ import ( "github.com/kava-labs/kava/x/auction" "github.com/kava-labs/kava/x/cdp" + "github.com/kava-labs/kava/x/committee" "github.com/kava-labs/kava/x/pricefeed" validatorvesting "github.com/kava-labs/kava/x/validator-vesting" ) @@ -67,6 +68,7 @@ func (tApp TestApp) GetVVKeeper() validatorvesting.Keeper { return tApp.vvKeeper func (tApp TestApp) GetAuctionKeeper() auction.Keeper { return tApp.auctionKeeper } func (tApp TestApp) GetCDPKeeper() cdp.Keeper { return tApp.cdpKeeper } func (tApp TestApp) GetPriceFeedKeeper() pricefeed.Keeper { return tApp.pricefeedKeeper } +func (tApp TestApp) GetCommitteeKeeper() committee.Keeper { return tApp.committeeKeeper } // This calls InitChain on the app using the default genesis state, overwitten with any passed in genesis states func (tApp TestApp) InitializeFromGenesisStates(genesisStates ...GenesisState) TestApp { diff --git a/x/committee/alias.go b/x/committee/alias.go new file mode 100644 index 00000000..41aadd1b --- /dev/null +++ b/x/committee/alias.go @@ -0,0 +1,36 @@ +// nolint +// DO NOT EDIT - generated by aliasgen tool (github.com/rhuairahrighairidh/aliasgen) +package committee + +import ( + "github.com/kava-labs/kava/x/committee/keeper" + "github.com/kava-labs/kava/x/committee/types" +) + +const ( + ModuleName = types.ModuleName + StoreKey = types.StoreKey +) + +var ( + // function aliases + NewKeeper = keeper.NewKeeper + RegisterCodec = types.RegisterCodec + + // variable aliases + ModuleCdc = types.ModuleCdc +) + +type ( + Keeper = keeper.Keeper + Committee = types.Committee + GeneralShutdownPermission = types.GeneralShutdownPermission + GroupChangeProposal = types.GroupChangeProposal + InflationRateChangePermission = types.InflationRateChangePermission + MsgSubmitProposal = types.MsgSubmitProposal + MsgVote = types.MsgVote + Permission = types.Permission + Proposal = types.Proposal + ShutdownCDPDepsitPermission = types.ShutdownCDPDepsitPermission + Vote = types.Vote +) diff --git a/x/committee/keeper/keeper.go b/x/committee/keeper/keeper.go index 3952f0e1..a35e1b9b 100644 --- a/x/committee/keeper/keeper.go +++ b/x/committee/keeper/keeper.go @@ -1,17 +1,27 @@ package keeper import ( + "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + + //govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/kava-labs/kava/x/committee/types" ) type Keeper struct { - // TODO other stuff as needed + cdc *codec.Codec + storeKey sdk.StoreKey - // Proposal router - router govtypes.Router + // TODO Proposal router + //router govtypes.Router +} + +func NewKeeper(cdc *codec.Codec, storeKey sdk.StoreKey) Keeper { + return Keeper{ + cdc: cdc, + storeKey: storeKey, + } } /* TODO keeper methods - very similar to gov diff --git a/x/committee/keeper/keeper_test.go b/x/committee/keeper/keeper_test.go new file mode 100644 index 00000000..f38d3acd --- /dev/null +++ b/x/committee/keeper/keeper_test.go @@ -0,0 +1,35 @@ +package keeper_test + +import ( + "testing" + "github.com/stretchr/testify/suite" + + abci "github.com/tendermint/tendermint/abci/types" + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/kava-labs/kava/app" + "github.com/kava-labs/kava/x/committee/keeper" +) + +type KeeperTestSuite struct { + suite.Suite + + keeper keeper.Keeper + app app.TestApp + ctx sdk.Context +} + +func (suite *KeeperTestSuite) SetupTest() { + + suite.app = app.NewTestApp() + suite.keeper = suite.app.GetCommitteeKeeper() + suite.ctx = suite.app.NewContext(true, abci.Header{}) +} + +func (suite *KeeperTestSuite) TestGetSetCommittee() { +} + + +func TestKeeperTestSuite(t *testing.T) { + suite.Run(t, new(KeeperTestSuite)) +} \ No newline at end of file diff --git a/x/committee/module.go b/x/committee/module.go new file mode 100644 index 00000000..fe068a93 --- /dev/null +++ b/x/committee/module.go @@ -0,0 +1,162 @@ +package committee + +import ( + "encoding/json" + + "github.com/gorilla/mux" + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client/context" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + abci "github.com/tendermint/tendermint/abci/types" +) + +var ( + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + // TODO_ module.AppModuleSimulation = AppModuleSimulation{} +) + +// AppModuleBasic app module basics object +type AppModuleBasic struct{} + +// Name get module name +func (AppModuleBasic) Name() string { + return ModuleName +} + +// RegisterCodec register module codec +func (AppModuleBasic) RegisterCodec(cdc *codec.Codec) { + RegisterCodec(cdc) +} + +// DefaultGenesis default genesis state +func (AppModuleBasic) DefaultGenesis() json.RawMessage { + //return ModuleCdc.MustMarshalJSON(DefaultGenesisState()) + return nil +} + +// ValidateGenesis module validate genesis +func (AppModuleBasic) ValidateGenesis(bz json.RawMessage) error { + // var gs GenesisState + // err := ModuleCdc.UnmarshalJSON(bz, &gs) + // if err != nil { + // return err + // } + // return gs.Validate() + return nil +} + +// RegisterRESTRoutes registers the REST routes for the module. +func (AppModuleBasic) RegisterRESTRoutes(ctx context.CLIContext, rtr *mux.Router) { + //rest.RegisterRoutes(ctx, rtr) +} + +// GetTxCmd returns the root tx command for the module. +func (AppModuleBasic) GetTxCmd(cdc *codec.Codec) *cobra.Command { + //return cli.GetTxCmd(cdc) + return nil +} + +// GetQueryCmd returns the root query command for the auction module. +func (AppModuleBasic) GetQueryCmd(cdc *codec.Codec) *cobra.Command { + //return cli.GetQueryCmd(StoreKey, cdc) + return nil +} + +//____________________________________________________________________________ + +// TODO +// // AppModuleSimulation defines the module simulation functions used by the module. +// type AppModuleSimulation struct{} + +// // RegisterStoreDecoder registers a decoder for the module's types +// func (AppModuleSimulation) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry) { +// sdr[StoreKey] = simulation.DecodeStore +// } + +// // GenerateGenesisState creates a randomized GenState of the module +// func (AppModuleSimulation) GenerateGenesisState(simState *module.SimulationState) { +// simulation.RandomizedGenState(simState) +// } + +// // RandomizedParams creates randomized param changes for the simulator. +// func (AppModuleSimulation) RandomizedParams(r *rand.Rand) []sim.ParamChange { +// return simulation.ParamChanges(r) +// } + +//____________________________________________________________________________ + +// AppModule app module type +type AppModule struct { + AppModuleBasic + // TODO AppModuleSimulation + + keeper Keeper +} + +// NewAppModule creates a new AppModule object +func NewAppModule(keeper Keeper) AppModule { + return AppModule{ + AppModuleBasic: AppModuleBasic{}, + keeper: keeper, + } +} + +// Name module name +func (AppModule) Name() string { + return ModuleName +} + +// RegisterInvariants register module invariants +func (AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} + +// Route module message route name +func (AppModule) Route() string { + return ModuleName +} + +// NewHandler module handler +func (am AppModule) NewHandler() sdk.Handler { + //return NewHandler(am.keeper) + return nil +} + +// QuerierRoute module querier route name +func (AppModule) QuerierRoute() string { + return ModuleName +} + +// NewQuerierHandler module querier +func (am AppModule) NewQuerierHandler() sdk.Querier { + // return NewQuerier(am.keeper) + return nil +} + +// InitGenesis module init-genesis +func (am AppModule) InitGenesis(ctx sdk.Context, data json.RawMessage) []abci.ValidatorUpdate { + // var genesisState GenesisState + // ModuleCdc.MustUnmarshalJSON(data, &genesisState) + // InitGenesis(ctx, am.keeper, am.pricefeedKeeper, genesisState) + + return []abci.ValidatorUpdate{} +} + +// ExportGenesis module export genesis +func (am AppModule) ExportGenesis(ctx sdk.Context) json.RawMessage { + // gs := ExportGenesis(ctx, am.keeper) + // return ModuleCdc.MustMarshalJSON(gs) + return nil +} + +// BeginBlock module begin-block +func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { + // TODO BeginBlocker(ctx, req, am.keeper) +} + +// EndBlock module end-block +func (am AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { + return []abci.ValidatorUpdate{} +} diff --git a/x/committee/types/codec.go b/x/committee/types/codec.go new file mode 100644 index 00000000..898769d3 --- /dev/null +++ b/x/committee/types/codec.go @@ -0,0 +1,22 @@ +package types + +import "github.com/cosmos/cosmos-sdk/codec" + +// ModuleCdc generic sealed codec to be used throughout module +var ModuleCdc *codec.Codec + +func init() { + cdc := codec.New() + RegisterCodec(cdc) + ModuleCdc = cdc.Seal() +} + +// RegisterCodec registers the necessary types for the module +func RegisterCodec(cdc *codec.Codec) { + // TODO + // cdc.RegisterConcrete(MsgCreateCDP{}, "cdp/MsgCreateCDP", nil) + // cdc.RegisterConcrete(MsgDeposit{}, "cdp/MsgDeposit", nil) + // cdc.RegisterConcrete(MsgWithdraw{}, "cdp/MsgWithdraw", nil) + // cdc.RegisterConcrete(MsgDrawDebt{}, "cdp/MsgDrawDebt", nil) + // cdc.RegisterConcrete(MsgRepayDebt{}, "cdp/MsgRepayDebt", nil) +} diff --git a/x/committee/types/keys.go b/x/committee/types/keys.go new file mode 100644 index 00000000..1a945680 --- /dev/null +++ b/x/committee/types/keys.go @@ -0,0 +1,19 @@ +package types + +const ( + // ModuleName The name that will be used throughout the module + ModuleName = "committee" + + // StoreKey Top level store key where all module items will be stored + StoreKey = ModuleName +/* + // RouterKey Top level router key + RouterKey = ModuleName + + // QuerierRoute Top level query string + QuerierRoute = ModuleName + + // DefaultParamspace default name for parameter store + DefaultParamspace = ModuleName + */ +) \ No newline at end of file