mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-27 00:35:18 +00:00
address minor TODOs
This commit is contained in:
parent
ace9a2363e
commit
4298564096
@ -126,8 +126,6 @@ func GetCmdVote(cdc *codec.Codec) *cobra.Command {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO This could replace the whole gov submit-proposal cmd. It would align how it works with how submiting proposal to committees works.
|
|
||||||
// Requires removing and replacing the gov cmd in kvcli main.go
|
|
||||||
// GetGovCmdSubmitProposal returns a command to submit a proposal to the gov module. It is passed to the gov module for use on its command subtree.
|
// GetGovCmdSubmitProposal returns a command to submit a proposal to the gov module. It is passed to the gov module for use on its command subtree.
|
||||||
func GetGovCmdSubmitProposal(cdc *codec.Codec) *cobra.Command {
|
func GetGovCmdSubmitProposal(cdc *codec.Codec) *cobra.Command {
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
|
@ -24,7 +24,9 @@ func registerQueryRoutes(cliCtx context.CLIContext, r *mux.Router) {
|
|||||||
r.HandleFunc(fmt.Sprintf("/%s/proposals/{%s}/votes", types.ModuleName, RestProposalID), queryVotesOnProposalHandlerFn(cliCtx)).Methods("GET")
|
r.HandleFunc(fmt.Sprintf("/%s/proposals/{%s}/votes", types.ModuleName, RestProposalID), queryVotesOnProposalHandlerFn(cliCtx)).Methods("GET")
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------- Committees ----------
|
// ------------------------------------------
|
||||||
|
// Committees
|
||||||
|
// ------------------------------------------
|
||||||
|
|
||||||
func queryCommitteesHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
func queryCommitteesHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
@ -85,7 +87,9 @@ func queryCommitteeHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------- Proposals ----------
|
// ------------------------------------------
|
||||||
|
// Proposals
|
||||||
|
// ------------------------------------------
|
||||||
|
|
||||||
func queryProposalsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
func queryProposalsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
@ -190,7 +194,9 @@ func queryProposerHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------- Votes ----------
|
// ------------------------------------------
|
||||||
|
// Votes
|
||||||
|
// ------------------------------------------
|
||||||
|
|
||||||
func queryVotesOnProposalHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
func queryVotesOnProposalHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
@ -224,27 +230,6 @@ func queryVotesOnProposalHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO should add this feature back
|
|
||||||
// var proposal types.Proposal
|
|
||||||
// if err := cliCtx.Codec.UnmarshalJSON(res, &proposal); err != nil {
|
|
||||||
// rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error())
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // For inactive proposals we must query the txs directly to get the votes
|
|
||||||
// // as they're no longer in state.
|
|
||||||
// propStatus := proposal.Status
|
|
||||||
// if !(propStatus == types.StatusVotingPeriod || propStatus == types.StatusDepositPeriod) {
|
|
||||||
// res, err = gcutils.QueryVotesByTxQuery(cliCtx, params)
|
|
||||||
// } else {
|
|
||||||
// res, _, err = cliCtx.QueryWithData("custom/gov/votes", bz)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if err != nil {
|
|
||||||
// rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error())
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Write response
|
// Write response
|
||||||
cliCtx = cliCtx.WithHeight(height)
|
cliCtx = cliCtx.WithHeight(height)
|
||||||
rest.PostProcessResponse(w, cliCtx, res)
|
rest.PostProcessResponse(w, cliCtx, res)
|
||||||
|
@ -106,11 +106,10 @@ func postVoteHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------- --------
|
// This is a rest handler for for the gov module, that handles committee change/delete proposals.
|
||||||
// TODO this could replace the POST gov/proposals endpoint, would need to overwrite routes in kvcli main, hacky
|
|
||||||
type PostGovProposalReq struct {
|
type PostGovProposalReq struct {
|
||||||
BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"`
|
BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"`
|
||||||
Content govtypes.Content `json:"content" yaml:"content"` //TODO use same PubProposal name?
|
Content govtypes.Content `json:"content" yaml:"content"`
|
||||||
Proposer sdk.AccAddress `json:"proposer" yaml:"proposer"`
|
Proposer sdk.AccAddress `json:"proposer" yaml:"proposer"`
|
||||||
Deposit sdk.Coins `json:"deposit" yaml:"deposit"`
|
Deposit sdk.Coins `json:"deposit" yaml:"deposit"`
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,9 @@ func NewKeeper(cdc *codec.Codec, storeKey sdk.StoreKey, router govtypes.Router,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------- Committees ----------
|
// ------------------------------------------
|
||||||
|
// Committees
|
||||||
|
// ------------------------------------------
|
||||||
|
|
||||||
// GetCommittee gets a committee from the store.
|
// GetCommittee gets a committee from the store.
|
||||||
func (k Keeper) GetCommittee(ctx sdk.Context, committeeID uint64) (types.Committee, bool) {
|
func (k Keeper) GetCommittee(ctx sdk.Context, committeeID uint64) (types.Committee, bool) {
|
||||||
@ -76,7 +78,9 @@ func (k Keeper) IterateCommittees(ctx sdk.Context, cb func(committee types.Commi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------- Proposals ----------
|
// ------------------------------------------
|
||||||
|
// Proposals
|
||||||
|
// ------------------------------------------
|
||||||
|
|
||||||
// SetNextProposalID stores an ID to be used for the next created proposal
|
// SetNextProposalID stores an ID to be used for the next created proposal
|
||||||
func (k Keeper) SetNextProposalID(ctx sdk.Context, id uint64) {
|
func (k Keeper) SetNextProposalID(ctx sdk.Context, id uint64) {
|
||||||
@ -167,7 +171,9 @@ func (k Keeper) IterateProposals(ctx sdk.Context, cb func(proposal types.Proposa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------- Votes ----------
|
// ------------------------------------------
|
||||||
|
// Votes
|
||||||
|
// ------------------------------------------
|
||||||
|
|
||||||
// GetVote gets a vote from the store.
|
// GetVote gets a vote from the store.
|
||||||
func (k Keeper) GetVote(ctx sdk.Context, proposalID uint64, voter sdk.AccAddress) (types.Vote, bool) {
|
func (k Keeper) GetVote(ctx sdk.Context, proposalID uint64, voter sdk.AccAddress) (types.Vote, bool) {
|
||||||
|
@ -7,6 +7,7 @@ import (
|
|||||||
"github.com/cosmos/cosmos-sdk/codec"
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
"github.com/cosmos/cosmos-sdk/x/gov"
|
"github.com/cosmos/cosmos-sdk/x/gov"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/params"
|
||||||
abci "github.com/tendermint/tendermint/abci/types"
|
abci "github.com/tendermint/tendermint/abci/types"
|
||||||
|
|
||||||
"github.com/kava-labs/kava/app"
|
"github.com/kava-labs/kava/app"
|
||||||
@ -78,8 +79,7 @@ func (suite *KeeperTestSuite) TestSubmitProposal() {
|
|||||||
|
|
||||||
for _, tc := range testcases {
|
for _, tc := range testcases {
|
||||||
suite.Run(tc.name, func() {
|
suite.Run(tc.name, func() {
|
||||||
// Create local testApp because suite doesn't run the SetupTest function for subtests,
|
// Create local testApp because suite doesn't run the SetupTest function for subtests
|
||||||
// which would mean the app state is not be reset between subtests.
|
|
||||||
tApp := app.NewTestApp()
|
tApp := app.NewTestApp()
|
||||||
keeper := tApp.GetCommitteeKeeper()
|
keeper := tApp.GetCommitteeKeeper()
|
||||||
ctx := tApp.NewContext(true, abci.Header{})
|
ctx := tApp.NewContext(true, abci.Header{})
|
||||||
@ -148,7 +148,7 @@ func (suite *KeeperTestSuite) TestAddVote() {
|
|||||||
|
|
||||||
for _, tc := range testcases {
|
for _, tc := range testcases {
|
||||||
suite.Run(tc.name, func() {
|
suite.Run(tc.name, func() {
|
||||||
// Create local testApp because suite doesn't run the SetupTest function for subtests, which would mean the app state is not be reset between subtests.
|
// Create local testApp because suite doesn't run the SetupTest function for subtests
|
||||||
tApp := app.NewTestApp()
|
tApp := app.NewTestApp()
|
||||||
keeper := tApp.GetCommitteeKeeper()
|
keeper := tApp.GetCommitteeKeeper()
|
||||||
ctx := tApp.NewContext(true, abci.Header{Height: 1, Time: firstBlockTime})
|
ctx := tApp.NewContext(true, abci.Header{Height: 1, Time: firstBlockTime})
|
||||||
@ -217,7 +217,7 @@ func (suite *KeeperTestSuite) TestGetProposalResult() {
|
|||||||
|
|
||||||
for _, tc := range testcases {
|
for _, tc := range testcases {
|
||||||
suite.Run(tc.name, func() {
|
suite.Run(tc.name, func() {
|
||||||
// Create local testApp because suite doesn't run the SetupTest function for subtests, which would mean the app state is not be reset between subtests.
|
// Create local testApp because suite doesn't run the SetupTest function for subtests
|
||||||
tApp := app.NewTestApp()
|
tApp := app.NewTestApp()
|
||||||
keeper := tApp.GetCommitteeKeeper()
|
keeper := tApp.GetCommitteeKeeper()
|
||||||
ctx := tApp.NewContext(true, abci.Header{Height: 1, Time: firstBlockTime})
|
ctx := tApp.NewContext(true, abci.Header{Height: 1, Time: firstBlockTime})
|
||||||
@ -294,7 +294,21 @@ func (suite *KeeperTestSuite) TestValidatePubProposal() {
|
|||||||
pubProposal: nil,
|
pubProposal: nil,
|
||||||
expectPass: false,
|
expectPass: false,
|
||||||
},
|
},
|
||||||
// TODO test case when the handler fails
|
{
|
||||||
|
name: "invalid (proposal handler fails)",
|
||||||
|
pubProposal: params.NewParameterChangeProposal(
|
||||||
|
"A Title",
|
||||||
|
"A description of this proposal.",
|
||||||
|
[]params.ParamChange{{
|
||||||
|
Subspace: "non existant",
|
||||||
|
Key: "non existant",
|
||||||
|
Value: "nonsense",
|
||||||
|
}},
|
||||||
|
),
|
||||||
|
expectPass: false,
|
||||||
|
},
|
||||||
|
// Some proposals can cause the proposal handler to panic.
|
||||||
|
// However panics will be caught when the proposal is first submitted so should avoid making it onto the chain.
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range testcases {
|
for _, tc := range testcases {
|
||||||
|
@ -36,7 +36,9 @@ func NewQuerier(keeper Keeper) sdk.Querier {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------- Committees ----------
|
// ------------------------------------------
|
||||||
|
// Committees
|
||||||
|
// ------------------------------------------
|
||||||
|
|
||||||
func queryCommittees(ctx sdk.Context, path []string, _ abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
|
func queryCommittees(ctx sdk.Context, path []string, _ abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
|
||||||
|
|
||||||
@ -72,7 +74,9 @@ func queryCommittee(ctx sdk.Context, path []string, req abci.RequestQuery, keepe
|
|||||||
return bz, nil
|
return bz, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------- Proposals ----------
|
// ------------------------------------------
|
||||||
|
// Proposals
|
||||||
|
// ------------------------------------------
|
||||||
|
|
||||||
func queryProposals(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
|
func queryProposals(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
|
||||||
var params types.QueryCommitteeParams
|
var params types.QueryCommitteeParams
|
||||||
@ -115,7 +119,9 @@ func queryProposal(ctx sdk.Context, path []string, req abci.RequestQuery, keeper
|
|||||||
return bz, nil
|
return bz, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------- Votes ----------
|
// ------------------------------------------
|
||||||
|
// Votes
|
||||||
|
// ------------------------------------------
|
||||||
|
|
||||||
func queryVotes(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
|
func queryVotes(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
|
||||||
var params types.QueryProposalParams
|
var params types.QueryProposalParams
|
||||||
@ -157,7 +163,9 @@ func queryVote(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Kee
|
|||||||
return bz, nil
|
return bz, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------- Tally ----------
|
// ------------------------------------------
|
||||||
|
// Tally
|
||||||
|
// ------------------------------------------
|
||||||
|
|
||||||
func queryTally(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
|
func queryTally(ctx sdk.Context, path []string, req abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
|
||||||
var params types.QueryProposalParams
|
var params types.QueryProposalParams
|
||||||
|
@ -5,8 +5,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
TypeMsgSubmitProposal = "submit_proposal" // TODO these are the same as the gov module, will there be collisions?
|
TypeMsgSubmitProposal = "commmittee_submit_proposal" // 'committee' prefix appended to avoid potential conflicts with gov msg types
|
||||||
TypeMsgVote = "vote"
|
TypeMsgVote = "committee_vote"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _, _ sdk.Msg = MsgSubmitProposal{}, MsgVote{}
|
var _, _ sdk.Msg = MsgSubmitProposal{}, MsgVote{}
|
||||||
@ -41,10 +41,6 @@ func (msg MsgSubmitProposal) ValidateBasic() sdk.Error {
|
|||||||
if msg.Proposer.Empty() {
|
if msg.Proposer.Empty() {
|
||||||
return sdk.ErrInvalidAddress(msg.Proposer.String())
|
return sdk.ErrInvalidAddress(msg.Proposer.String())
|
||||||
}
|
}
|
||||||
// TODO
|
|
||||||
// if !IsValidProposalType(msg.Content.ProposalType()) {
|
|
||||||
// return ErrInvalidProposalType(DefaultCodespace, msg.Content.ProposalType())
|
|
||||||
// }
|
|
||||||
|
|
||||||
return msg.PubProposal.ValidateBasic()
|
return msg.PubProposal.ValidateBasic()
|
||||||
}
|
}
|
||||||
|
@ -110,6 +110,6 @@ func (perm ShutdownPermission) MarshalYAML() (interface{}, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO add more permissions?
|
// TODO add more permissions?
|
||||||
// - limit parameter changes to bew withing small ranges or fixed sets
|
// - limit parameter changes to be within small ranges
|
||||||
// - allow community spend proposals
|
// - allow community spend proposals
|
||||||
// - allow committee change proposals
|
// - allow committee change proposals
|
||||||
|
@ -11,7 +11,9 @@ import (
|
|||||||
|
|
||||||
const MaxCommitteeDescriptionLength int = 5000
|
const MaxCommitteeDescriptionLength int = 5000
|
||||||
|
|
||||||
// -------- Committees --------
|
// ------------------------------------------
|
||||||
|
// Committees
|
||||||
|
// ------------------------------------------
|
||||||
|
|
||||||
// A Committee is a collection of addresses that are allowed to vote and enact any governance proposal that passes their permissions.
|
// A Committee is a collection of addresses that are allowed to vote and enact any governance proposal that passes their permissions.
|
||||||
type Committee struct {
|
type Committee struct {
|
||||||
@ -94,10 +96,12 @@ type Permission interface {
|
|||||||
Allows(PubProposal) bool
|
Allows(PubProposal) bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------- Proposals --------
|
// ------------------------------------------
|
||||||
|
// Proposals
|
||||||
|
// ------------------------------------------
|
||||||
|
|
||||||
// PubProposal is an interface that all gov proposals defined in other modules must satisfy.
|
// PubProposal is an interface that all gov proposals defined in other modules must satisfy.
|
||||||
type PubProposal = gov.Content // TODO find a better name
|
type PubProposal = gov.Content
|
||||||
|
|
||||||
type Proposal struct {
|
type Proposal struct {
|
||||||
PubProposal `json:"pub_proposal" yaml:"pub_proposal"`
|
PubProposal `json:"pub_proposal" yaml:"pub_proposal"`
|
||||||
@ -118,6 +122,10 @@ func (p Proposal) String() string {
|
|||||||
return string(bz)
|
return string(bz)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------
|
||||||
|
// Votes
|
||||||
|
// ------------------------------------------
|
||||||
|
|
||||||
type Vote struct {
|
type Vote struct {
|
||||||
ProposalID uint64 `json:"proposal_id" yaml:"proposal_id"`
|
ProposalID uint64 `json:"proposal_id" yaml:"proposal_id"`
|
||||||
Voter sdk.AccAddress `json:"voter" yaml:"voter"`
|
Voter sdk.AccAddress `json:"voter" yaml:"voter"`
|
||||||
|
Loading…
Reference in New Issue
Block a user