Merge PR #1697: Proposal Query filter by status
This commit is contained in:
parent
4c9c75a735
commit
d6969c1d22
11
CHANGELOG.md
11
CHANGELOG.md
|
@ -1,5 +1,16 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## TBD
|
||||||
|
|
||||||
|
BREAKING CHANGES
|
||||||
|
|
||||||
|
FEATURES
|
||||||
|
* [lcd] Can now query governance proposals by ProposalStatus
|
||||||
|
|
||||||
|
IMPROVEMENTS
|
||||||
|
|
||||||
|
BUG FIXES
|
||||||
|
|
||||||
## 0.22.0
|
## 0.22.0
|
||||||
|
|
||||||
*July 16th, 2018*
|
*July 16th, 2018*
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
|
||||||
name = "github.com/bartekn/go-bip39"
|
name = "github.com/bartekn/go-bip39"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
revision = "a05967ea095d81c8fe4833776774cfaff8e5036c"
|
revision = "a05967ea095d81c8fe4833776774cfaff8e5036c"
|
||||||
|
@ -135,7 +134,6 @@
|
||||||
".",
|
".",
|
||||||
"hcl/ast",
|
"hcl/ast",
|
||||||
"hcl/parser",
|
"hcl/parser",
|
||||||
"hcl/printer",
|
|
||||||
"hcl/scanner",
|
"hcl/scanner",
|
||||||
"hcl/strconv",
|
"hcl/strconv",
|
||||||
"hcl/token",
|
"hcl/token",
|
||||||
|
@ -503,6 +501,6 @@
|
||||||
[solve-meta]
|
[solve-meta]
|
||||||
analyzer-name = "dep"
|
analyzer-name = "dep"
|
||||||
analyzer-version = 1
|
analyzer-version = 1
|
||||||
inputs-digest = "94abff3ff321fd150a6e4b95d109297296cdc00693c648c9b2a48171b90e36b0"
|
inputs-digest = "71e86b1f1e9ec71901c20d8532dc8477df66eff37a407322379f6a8b03e5d91b"
|
||||||
solver-name = "gps-cdcl"
|
solver-name = "gps-cdcl"
|
||||||
solver-version = 1
|
solver-version = 1
|
||||||
|
|
|
@ -569,6 +569,16 @@ func TestProposalsQuery(t *testing.T) {
|
||||||
resultTx = doDeposit(t, port, seed2, name2, password2, addr2, proposalID3)
|
resultTx = doDeposit(t, port, seed2, name2, password2, addr2, proposalID3)
|
||||||
tests.WaitForHeight(resultTx.Height+1, port)
|
tests.WaitForHeight(resultTx.Height+1, port)
|
||||||
|
|
||||||
|
// Only proposals #1 should be in Deposit Period
|
||||||
|
proposals := getProposalsFilterStatus(t, port, gov.StatusDepositPeriod)
|
||||||
|
require.Len(t, proposals, 1)
|
||||||
|
require.Equal(t, proposalID1, proposals[0].GetProposalID())
|
||||||
|
// Only proposals #2 and #3 should be in Voting Period
|
||||||
|
proposals = getProposalsFilterStatus(t, port, gov.StatusVotingPeriod)
|
||||||
|
require.Len(t, proposals, 2)
|
||||||
|
require.Equal(t, proposalID2, proposals[0].GetProposalID())
|
||||||
|
require.Equal(t, proposalID3, proposals[1].GetProposalID())
|
||||||
|
|
||||||
// Addr1 votes on proposals #2 & #3
|
// Addr1 votes on proposals #2 & #3
|
||||||
resultTx = doVote(t, port, seed, name, password1, addr, proposalID2)
|
resultTx = doVote(t, port, seed, name, password1, addr, proposalID2)
|
||||||
tests.WaitForHeight(resultTx.Height+1, port)
|
tests.WaitForHeight(resultTx.Height+1, port)
|
||||||
|
@ -580,7 +590,7 @@ func TestProposalsQuery(t *testing.T) {
|
||||||
tests.WaitForHeight(resultTx.Height+1, port)
|
tests.WaitForHeight(resultTx.Height+1, port)
|
||||||
|
|
||||||
// Test query all proposals
|
// Test query all proposals
|
||||||
proposals := getProposalsAll(t, port)
|
proposals = getProposalsAll(t, port)
|
||||||
require.Equal(t, proposalID1, (proposals[0]).GetProposalID())
|
require.Equal(t, proposalID1, (proposals[0]).GetProposalID())
|
||||||
require.Equal(t, proposalID2, (proposals[1]).GetProposalID())
|
require.Equal(t, proposalID2, (proposals[1]).GetProposalID())
|
||||||
require.Equal(t, proposalID3, (proposals[2]).GetProposalID())
|
require.Equal(t, proposalID3, (proposals[2]).GetProposalID())
|
||||||
|
@ -910,6 +920,16 @@ func getProposalsFilterVoterDepositer(t *testing.T, port string, voterAddr, depo
|
||||||
return proposals
|
return proposals
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getProposalsFilterStatus(t *testing.T, port string, status gov.ProposalStatus) []gov.Proposal {
|
||||||
|
res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals?status=%s", status), nil)
|
||||||
|
require.Equal(t, http.StatusOK, res.StatusCode, body)
|
||||||
|
|
||||||
|
var proposals []gov.Proposal
|
||||||
|
err := cdc.UnmarshalJSON([]byte(body), &proposals)
|
||||||
|
require.Nil(t, err)
|
||||||
|
return proposals
|
||||||
|
}
|
||||||
|
|
||||||
func doSubmitProposal(t *testing.T, port, seed, name, password string, proposerAddr sdk.AccAddress) (resultTx ctypes.ResultBroadcastTxCommit) {
|
func doSubmitProposal(t *testing.T, port, seed, name, password string, proposerAddr sdk.AccAddress) (resultTx ctypes.ResultBroadcastTxCommit) {
|
||||||
// get the account to get the sequence
|
// get the account to get the sequence
|
||||||
acc := getAccount(t, port, proposerAddr)
|
acc := getAccount(t, port, proposerAddr)
|
||||||
|
|
|
@ -16,10 +16,11 @@ import (
|
||||||
// REST Variable names
|
// REST Variable names
|
||||||
// nolint
|
// nolint
|
||||||
const (
|
const (
|
||||||
RestProposalID = "proposalID"
|
RestProposalID = "proposalID"
|
||||||
RestDepositer = "depositer"
|
RestDepositer = "depositer"
|
||||||
RestVoter = "voter"
|
RestVoter = "voter"
|
||||||
storeName = "gov"
|
RestProposalStatus = "status"
|
||||||
|
storeName = "gov"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RegisterRoutes - Central function to define routes that get registered by the main application
|
// RegisterRoutes - Central function to define routes that get registered by the main application
|
||||||
|
@ -340,10 +341,12 @@ func queryProposalsWithParameterFn(cdc *wire.Codec) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
bechVoterAddr := r.URL.Query().Get(RestVoter)
|
bechVoterAddr := r.URL.Query().Get(RestVoter)
|
||||||
bechDepositerAddr := r.URL.Query().Get(RestDepositer)
|
bechDepositerAddr := r.URL.Query().Get(RestDepositer)
|
||||||
|
strProposalStatus := r.URL.Query().Get(RestProposalStatus)
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
var voterAddr sdk.AccAddress
|
var voterAddr sdk.AccAddress
|
||||||
var depositerAddr sdk.AccAddress
|
var depositerAddr sdk.AccAddress
|
||||||
|
var proposalStatus gov.ProposalStatus
|
||||||
|
|
||||||
if len(bechVoterAddr) != 0 {
|
if len(bechVoterAddr) != 0 {
|
||||||
voterAddr, err = sdk.AccAddressFromBech32(bechVoterAddr)
|
voterAddr, err = sdk.AccAddressFromBech32(bechVoterAddr)
|
||||||
|
@ -365,6 +368,16 @@ func queryProposalsWithParameterFn(cdc *wire.Codec) http.HandlerFunc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(strProposalStatus) != 0 {
|
||||||
|
proposalStatus, err = gov.ProposalStatusFromString(strProposalStatus)
|
||||||
|
if err != nil {
|
||||||
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
|
err := errors.Errorf("'%s' is not a valid Proposal Status", strProposalStatus)
|
||||||
|
w.Write([]byte(err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ctx := context.NewCoreContextFromViper()
|
ctx := context.NewCoreContextFromViper()
|
||||||
|
|
||||||
res, err := ctx.QueryStore(gov.KeyNextProposalID, storeName)
|
res, err := ctx.QueryStore(gov.KeyNextProposalID, storeName)
|
||||||
|
@ -397,9 +410,16 @@ func queryProposalsWithParameterFn(cdc *wire.Codec) http.HandlerFunc {
|
||||||
if err != nil || len(res) == 0 {
|
if err != nil || len(res) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
var proposal gov.Proposal
|
var proposal gov.Proposal
|
||||||
cdc.MustUnmarshalBinary(res, &proposal)
|
cdc.MustUnmarshalBinary(res, &proposal)
|
||||||
|
|
||||||
|
if len(strProposalStatus) != 0 {
|
||||||
|
if proposal.GetStatus() != proposalStatus {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
matchingProposals = append(matchingProposals, proposal)
|
matchingProposals = append(matchingProposals, proposal)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,7 @@ var (
|
||||||
// TODO Temporarily set to 10 minutes for testnets
|
// TODO Temporarily set to 10 minutes for testnets
|
||||||
defaultDowntimeUnbondDuration int64 = 60 * 10
|
defaultDowntimeUnbondDuration int64 = 60 * 10
|
||||||
|
|
||||||
defaultMinSignedPerWindow sdk.Rat = sdk.NewRat(1, 2)
|
defaultMinSignedPerWindow = sdk.NewRat(1, 2)
|
||||||
|
|
||||||
defaultSlashFractionDoubleSign = sdk.NewRat(1).Quo(sdk.NewRat(20))
|
defaultSlashFractionDoubleSign = sdk.NewRat(1).Quo(sdk.NewRat(20))
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ var (
|
||||||
sdk.AccAddress(pks[1].Address()),
|
sdk.AccAddress(pks[1].Address()),
|
||||||
sdk.AccAddress(pks[2].Address()),
|
sdk.AccAddress(pks[2].Address()),
|
||||||
}
|
}
|
||||||
initCoins sdk.Int = sdk.NewInt(200)
|
initCoins = sdk.NewInt(200)
|
||||||
)
|
)
|
||||||
|
|
||||||
func createTestCodec() *wire.Codec {
|
func createTestCodec() *wire.Codec {
|
||||||
|
|
|
@ -21,7 +21,7 @@ var _, _ sdk.Msg = &MsgBeginUnbonding{}, &MsgCompleteUnbonding{}
|
||||||
var _, _ sdk.Msg = &MsgBeginRedelegate{}, &MsgCompleteRedelegate{}
|
var _, _ sdk.Msg = &MsgBeginRedelegate{}, &MsgCompleteRedelegate{}
|
||||||
|
|
||||||
// Initialize Int for the denominator
|
// Initialize Int for the denominator
|
||||||
var maximumBondingRationalDenominator sdk.Int = sdk.NewInt(int64(math.Pow10(MaxBondDenominatorPrecision)))
|
var maximumBondingRationalDenominator = sdk.NewInt(int64(math.Pow10(MaxBondDenominatorPrecision)))
|
||||||
|
|
||||||
//______________________________________________________________________
|
//______________________________________________________________________
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue