Merge PR #1845: Query-proposals CLI command
This commit is contained in:
parent
7fc2ed61d7
commit
d3fcfdba57
|
@ -38,6 +38,7 @@ FEATURES
|
||||||
* [tests] Remotenet commands for AWS (awsnet)
|
* [tests] Remotenet commands for AWS (awsnet)
|
||||||
* [store] Add transient store
|
* [store] Add transient store
|
||||||
* [gov] Add slashing for validators who do not vote on a proposal
|
* [gov] Add slashing for validators who do not vote on a proposal
|
||||||
|
* [cli] added `gov query-proposals` command to CLI. Can filter by `depositer`, `voter`, and `status`
|
||||||
|
|
||||||
IMPROVEMENTS
|
IMPROVEMENTS
|
||||||
* [baseapp] Allow any alphanumeric character in route
|
* [baseapp] Allow any alphanumeric character in route
|
||||||
|
|
|
@ -176,7 +176,10 @@ func TestGaiaCLISubmitProposal(t *testing.T) {
|
||||||
fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", fooAddr, flags))
|
fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", fooAddr, flags))
|
||||||
require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak").Int64())
|
require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak").Int64())
|
||||||
|
|
||||||
// unbond a single share
|
proposalsQuery := tests.ExecuteT(t, fmt.Sprintf("gaiacli gov query-proposals %v", flags))
|
||||||
|
require.Equal(t, "No matching proposals found", proposalsQuery)
|
||||||
|
|
||||||
|
// submit a test proposal
|
||||||
spStr := fmt.Sprintf("gaiacli gov submit-proposal %v", flags)
|
spStr := fmt.Sprintf("gaiacli gov submit-proposal %v", flags)
|
||||||
spStr += fmt.Sprintf(" --from=%s", "foo")
|
spStr += fmt.Sprintf(" --from=%s", "foo")
|
||||||
spStr += fmt.Sprintf(" --deposit=%s", "5steak")
|
spStr += fmt.Sprintf(" --deposit=%s", "5steak")
|
||||||
|
@ -194,6 +197,9 @@ func TestGaiaCLISubmitProposal(t *testing.T) {
|
||||||
require.Equal(t, int64(1), proposal1.GetProposalID())
|
require.Equal(t, int64(1), proposal1.GetProposalID())
|
||||||
require.Equal(t, gov.StatusDepositPeriod, proposal1.GetStatus())
|
require.Equal(t, gov.StatusDepositPeriod, proposal1.GetStatus())
|
||||||
|
|
||||||
|
proposalsQuery = tests.ExecuteT(t, fmt.Sprintf("gaiacli gov query-proposals %v", flags))
|
||||||
|
require.Equal(t, " 1 - Test", proposalsQuery)
|
||||||
|
|
||||||
depositStr := fmt.Sprintf("gaiacli gov deposit %v", flags)
|
depositStr := fmt.Sprintf("gaiacli gov deposit %v", flags)
|
||||||
depositStr += fmt.Sprintf(" --from=%s", "foo")
|
depositStr += fmt.Sprintf(" --from=%s", "foo")
|
||||||
depositStr += fmt.Sprintf(" --deposit=%s", "10steak")
|
depositStr += fmt.Sprintf(" --deposit=%s", "10steak")
|
||||||
|
@ -224,6 +230,26 @@ func TestGaiaCLISubmitProposal(t *testing.T) {
|
||||||
require.Len(t, votes, 1)
|
require.Len(t, votes, 1)
|
||||||
require.Equal(t, int64(1), votes[0].ProposalID)
|
require.Equal(t, int64(1), votes[0].ProposalID)
|
||||||
require.Equal(t, gov.OptionYes, votes[0].Option)
|
require.Equal(t, gov.OptionYes, votes[0].Option)
|
||||||
|
|
||||||
|
proposalsQuery = tests.ExecuteT(t, fmt.Sprintf("gaiacli gov query-proposals --status=DepositPeriod %v", flags))
|
||||||
|
require.Equal(t, "No matching proposals found", proposalsQuery)
|
||||||
|
|
||||||
|
proposalsQuery = tests.ExecuteT(t, fmt.Sprintf("gaiacli gov query-proposals --status=VotingPeriod %v", flags))
|
||||||
|
require.Equal(t, " 1 - Test", proposalsQuery)
|
||||||
|
|
||||||
|
// submit a second test proposal
|
||||||
|
spStr = fmt.Sprintf("gaiacli gov submit-proposal %v", flags)
|
||||||
|
spStr += fmt.Sprintf(" --from=%s", "foo")
|
||||||
|
spStr += fmt.Sprintf(" --deposit=%s", "5steak")
|
||||||
|
spStr += fmt.Sprintf(" --type=%s", "Text")
|
||||||
|
spStr += fmt.Sprintf(" --title=%s", "Apples")
|
||||||
|
spStr += fmt.Sprintf(" --description=%s", "test")
|
||||||
|
|
||||||
|
executeWrite(t, spStr, pass)
|
||||||
|
tests.WaitForNextNBlocksTM(2, port)
|
||||||
|
|
||||||
|
proposalsQuery = tests.ExecuteT(t, fmt.Sprintf("gaiacli gov query-proposals --latest=1 %v", flags))
|
||||||
|
require.Equal(t, " 2 - Apples", proposalsQuery)
|
||||||
}
|
}
|
||||||
|
|
||||||
//___________________________________________________________________________________
|
//___________________________________________________________________________________
|
||||||
|
|
|
@ -113,6 +113,7 @@ func main() {
|
||||||
govcmd.GetCmdQueryProposal("gov", cdc),
|
govcmd.GetCmdQueryProposal("gov", cdc),
|
||||||
govcmd.GetCmdQueryVote("gov", cdc),
|
govcmd.GetCmdQueryVote("gov", cdc),
|
||||||
govcmd.GetCmdQueryVotes("gov", cdc),
|
govcmd.GetCmdQueryVotes("gov", cdc),
|
||||||
|
govcmd.GetCmdQueryProposals("gov", cdc),
|
||||||
)...)
|
)...)
|
||||||
govCmd.AddCommand(
|
govCmd.AddCommand(
|
||||||
client.PostCommands(
|
client.PostCommands(
|
||||||
|
|
|
@ -15,13 +15,16 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
flagProposalID = "proposal-id"
|
flagProposalID = "proposal-id"
|
||||||
flagTitle = "title"
|
flagTitle = "title"
|
||||||
flagDescription = "description"
|
flagDescription = "description"
|
||||||
flagProposalType = "type"
|
flagProposalType = "type"
|
||||||
flagDeposit = "deposit"
|
flagDeposit = "deposit"
|
||||||
flagVoter = "voter"
|
flagVoter = "voter"
|
||||||
flagOption = "option"
|
flagOption = "option"
|
||||||
|
flagDepositer = "depositer"
|
||||||
|
flagStatus = "status"
|
||||||
|
flagLatestProposalIDs = "latest"
|
||||||
)
|
)
|
||||||
|
|
||||||
// submit a proposal tx
|
// submit a proposal tx
|
||||||
|
@ -203,6 +206,111 @@ func GetCmdQueryProposal(storeName string, cdc *wire.Codec) *cobra.Command {
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// nolint: gocyclo
|
||||||
|
// Command to Query Proposals
|
||||||
|
func GetCmdQueryProposals(storeName string, cdc *wire.Codec) *cobra.Command {
|
||||||
|
cmd := &cobra.Command{
|
||||||
|
Use: "query-proposals",
|
||||||
|
Short: "query proposals with optional filters",
|
||||||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
bechDepositerAddr := viper.GetString(flagDepositer)
|
||||||
|
bechVoterAddr := viper.GetString(flagVoter)
|
||||||
|
strProposalStatus := viper.GetString(flagStatus)
|
||||||
|
latestProposalsIDs := viper.GetInt64(flagLatestProposalIDs)
|
||||||
|
|
||||||
|
var err error
|
||||||
|
var voterAddr sdk.AccAddress
|
||||||
|
var depositerAddr sdk.AccAddress
|
||||||
|
var proposalStatus gov.ProposalStatus
|
||||||
|
|
||||||
|
if len(bechDepositerAddr) != 0 {
|
||||||
|
depositerAddr, err = sdk.AccAddressFromBech32(bechDepositerAddr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(bechVoterAddr) != 0 {
|
||||||
|
voterAddr, err = sdk.AccAddressFromBech32(bechVoterAddr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(strProposalStatus) != 0 {
|
||||||
|
proposalStatus, err = gov.ProposalStatusFromString(strProposalStatus)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := context.NewCoreContextFromViper()
|
||||||
|
|
||||||
|
res, err := ctx.QueryStore(gov.KeyNextProposalID, storeName)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var maxProposalID int64
|
||||||
|
cdc.MustUnmarshalBinary(res, &maxProposalID)
|
||||||
|
|
||||||
|
matchingProposals := []gov.Proposal{}
|
||||||
|
|
||||||
|
if latestProposalsIDs == 0 {
|
||||||
|
latestProposalsIDs = maxProposalID
|
||||||
|
}
|
||||||
|
|
||||||
|
for proposalID := maxProposalID - latestProposalsIDs; proposalID < maxProposalID; proposalID++ {
|
||||||
|
if voterAddr != nil {
|
||||||
|
res, err = ctx.QueryStore(gov.KeyVote(proposalID, voterAddr), storeName)
|
||||||
|
if err != nil || len(res) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if depositerAddr != nil {
|
||||||
|
res, err = ctx.QueryStore(gov.KeyDeposit(proposalID, depositerAddr), storeName)
|
||||||
|
if err != nil || len(res) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err = ctx.QueryStore(gov.KeyProposal(proposalID), storeName)
|
||||||
|
if err != nil || len(res) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
var proposal gov.Proposal
|
||||||
|
cdc.MustUnmarshalBinary(res, &proposal)
|
||||||
|
|
||||||
|
if len(strProposalStatus) != 0 {
|
||||||
|
if proposal.GetStatus() != proposalStatus {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
matchingProposals = append(matchingProposals, proposal)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(matchingProposals) == 0 {
|
||||||
|
fmt.Println("No matching proposals found")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, proposal := range matchingProposals {
|
||||||
|
fmt.Printf(" %d - %s\n", proposal.GetProposalID(), proposal.GetTitle())
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.Flags().String(flagLatestProposalIDs, "", "(optional) limit to latest [number] proposals. Defaults to all proposals")
|
||||||
|
cmd.Flags().String(flagDepositer, "", "(optional) filter by proposals deposited on by depositer")
|
||||||
|
cmd.Flags().String(flagVoter, "", "(optional) filter by proposals voted on by voted")
|
||||||
|
cmd.Flags().String(flagStatus, "", "(optional) filter proposals by proposal status")
|
||||||
|
|
||||||
|
return cmd
|
||||||
|
}
|
||||||
|
|
||||||
// Command to Get a Proposal Information
|
// Command to Get a Proposal Information
|
||||||
func GetCmdQueryVote(storeName string, cdc *wire.Codec) *cobra.Command {
|
func GetCmdQueryVote(storeName string, cdc *wire.Codec) *cobra.Command {
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
|
|
Loading…
Reference in New Issue