refactor SubVote to WeightedVoteOption && add utility for NewNonSplitVoteOption
This commit is contained in:
parent
a59ac3e31a
commit
73c757dc4f
|
@ -29,13 +29,13 @@ enum VoteOption {
|
|||
VOTE_OPTION_NO_WITH_VETO = 4 [(gogoproto.enumvalue_customname) = "OptionNoWithVeto"];
|
||||
}
|
||||
|
||||
// SubVote defines a unit of vote for vote split.
|
||||
message SubVote {
|
||||
// WeightedVoteOption defines a unit of vote for vote split.
|
||||
message WeightedVoteOption {
|
||||
VoteOption option = 1;
|
||||
string rate = 2 [
|
||||
string weight = 2 [
|
||||
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
|
||||
(gogoproto.nullable) = false,
|
||||
(gogoproto.moretags) = "yaml:\"rate\""
|
||||
(gogoproto.moretags) = "yaml:\"weight\""
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -129,9 +129,9 @@ message Vote {
|
|||
option (gogoproto.goproto_stringer) = false;
|
||||
option (gogoproto.equal) = false;
|
||||
|
||||
uint64 proposal_id = 1 [(gogoproto.moretags) = "yaml:\"proposal_id\""];
|
||||
string voter = 2;
|
||||
repeated SubVote sub_votes = 3 [(gogoproto.nullable) = false];
|
||||
uint64 proposal_id = 1 [(gogoproto.moretags) = "yaml:\"proposal_id\""];
|
||||
string voter = 2;
|
||||
repeated WeightedVoteOption options = 3 [(gogoproto.nullable) = false];
|
||||
}
|
||||
|
||||
// DepositParams defines the params for deposits on governance proposals.
|
||||
|
|
|
@ -50,9 +50,9 @@ message MsgVote {
|
|||
option (gogoproto.stringer) = false;
|
||||
option (gogoproto.goproto_getters) = false;
|
||||
|
||||
uint64 proposal_id = 1 [(gogoproto.jsontag) = "proposal_id", (gogoproto.moretags) = "yaml:\"proposal_id\""];
|
||||
string voter = 2;
|
||||
repeated SubVote sub_votes = 3 [(gogoproto.nullable) = false];
|
||||
uint64 proposal_id = 1 [(gogoproto.jsontag) = "proposal_id", (gogoproto.moretags) = "yaml:\"proposal_id\""];
|
||||
string voter = 2;
|
||||
repeated WeightedVoteOption options = 3 [(gogoproto.nullable) = false];
|
||||
}
|
||||
|
||||
// MsgVoteResponse defines the Msg/Vote response type.
|
||||
|
|
|
@ -307,7 +307,7 @@ func TestProposalPassedEndblocker(t *testing.T) {
|
|||
deposits := initialModuleAccCoins.Add(proposal.TotalDeposit...).Add(proposalCoins...)
|
||||
require.True(t, moduleAccCoins.IsEqual(deposits))
|
||||
|
||||
err = app.GovKeeper.AddVote(ctx, proposal.ProposalId, addrs[0], types.SubVotes{types.NewSubVote(types.OptionYes, 1)})
|
||||
err = app.GovKeeper.AddVote(ctx, proposal.ProposalId, addrs[0], types.NewNonSplitVoteOption(types.OptionYes))
|
||||
require.NoError(t, err)
|
||||
|
||||
newHeader := ctx.BlockHeader()
|
||||
|
@ -348,7 +348,7 @@ func TestEndBlockerProposalHandlerFailed(t *testing.T) {
|
|||
|
||||
handleAndCheck(t, gov.NewHandler(app.GovKeeper), ctx, newDepositMsg)
|
||||
|
||||
err = app.GovKeeper.AddVote(ctx, proposal.ProposalId, addrs[0], types.SubVotes{types.NewSubVote(types.OptionYes, 1)})
|
||||
err = app.GovKeeper.AddVote(ctx, proposal.ProposalId, addrs[0], types.NewNonSplitVoteOption(types.OptionYes))
|
||||
require.NoError(t, err)
|
||||
|
||||
newHeader := ctx.BlockHeader()
|
||||
|
|
|
@ -701,10 +701,10 @@ func (s *IntegrationTestSuite) TestCmdQueryVote() {
|
|||
val := s.network.Validators[0]
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
expSubVotes types.SubVotes
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
expVoteOptions types.WeightedVoteOptions
|
||||
}{
|
||||
{
|
||||
"get vote of non existing proposal",
|
||||
|
@ -713,7 +713,7 @@ func (s *IntegrationTestSuite) TestCmdQueryVote() {
|
|||
val.Address.String(),
|
||||
},
|
||||
true,
|
||||
types.SubVotes{types.NewSubVote(types.OptionYes, 1)},
|
||||
types.NewNonSplitVoteOption(types.OptionYes),
|
||||
},
|
||||
{
|
||||
"get vote by wrong voter",
|
||||
|
@ -722,7 +722,7 @@ func (s *IntegrationTestSuite) TestCmdQueryVote() {
|
|||
"wrong address",
|
||||
},
|
||||
true,
|
||||
types.SubVotes{types.NewSubVote(types.OptionYes, 1)},
|
||||
types.NewNonSplitVoteOption(types.OptionYes),
|
||||
},
|
||||
{
|
||||
"vote for valid proposal",
|
||||
|
@ -732,7 +732,7 @@ func (s *IntegrationTestSuite) TestCmdQueryVote() {
|
|||
fmt.Sprintf("--%s=json", tmcli.OutputFlag),
|
||||
},
|
||||
false,
|
||||
types.SubVotes{types.NewSubVote(types.OptionYes, 1)},
|
||||
types.NewNonSplitVoteOption(types.OptionYes),
|
||||
},
|
||||
{
|
||||
"split vote for valid proposal",
|
||||
|
@ -742,11 +742,11 @@ func (s *IntegrationTestSuite) TestCmdQueryVote() {
|
|||
fmt.Sprintf("--%s=json", tmcli.OutputFlag),
|
||||
},
|
||||
false,
|
||||
types.SubVotes{
|
||||
types.SubVote{Option: types.OptionYes, Rate: sdk.NewDecWithPrec(60, 2)},
|
||||
types.SubVote{Option: types.OptionNo, Rate: sdk.NewDecWithPrec(30, 2)},
|
||||
types.SubVote{Option: types.OptionAbstain, Rate: sdk.NewDecWithPrec(5, 2)},
|
||||
types.SubVote{Option: types.OptionNoWithVeto, Rate: sdk.NewDecWithPrec(5, 2)},
|
||||
types.WeightedVoteOptions{
|
||||
types.WeightedVoteOption{Option: types.OptionYes, Weight: sdk.NewDecWithPrec(60, 2)},
|
||||
types.WeightedVoteOption{Option: types.OptionNo, Weight: sdk.NewDecWithPrec(30, 2)},
|
||||
types.WeightedVoteOption{Option: types.OptionAbstain, Weight: sdk.NewDecWithPrec(5, 2)},
|
||||
types.WeightedVoteOption{Option: types.OptionNoWithVeto, Weight: sdk.NewDecWithPrec(5, 2)},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
@ -766,10 +766,10 @@ func (s *IntegrationTestSuite) TestCmdQueryVote() {
|
|||
|
||||
var vote types.Vote
|
||||
s.Require().NoError(clientCtx.JSONMarshaler.UnmarshalJSON(out.Bytes(), &vote), out.String())
|
||||
s.Require().Equal(len(vote.SubVotes), len(tc.expSubVotes))
|
||||
for i, subvote := range tc.expSubVotes {
|
||||
s.Require().Equal(subvote.Option, vote.SubVotes[i].Option)
|
||||
s.Require().True(subvote.Rate.Equal(vote.SubVotes[i].Rate))
|
||||
s.Require().Equal(len(vote.Options), len(tc.expVoteOptions))
|
||||
for i, option := range tc.expVoteOptions {
|
||||
s.Require().Equal(option.Option, vote.Options[i].Option)
|
||||
s.Require().True(option.Weight.Equal(vote.Options[i].Weight))
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
|
@ -229,14 +229,14 @@ $ %s tx gov vote 1 yes=0.6,no=0.3,abstain=0.05,no_with_veto=0.05 --from mykey
|
|||
return fmt.Errorf("proposal-id %s not a valid int, please input a valid proposal-id", args[0])
|
||||
}
|
||||
|
||||
// Figure out which subvotes user chose
|
||||
subvotes, err := types.SubVotesFromString(govutils.NormalizeSubVotes(args[1]))
|
||||
// Figure out which vote options user chose
|
||||
options, err := types.WeightedVoteOptionsFromString(govutils.NormalizeWeightedVoteOptions(args[1]))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Build vote message and run basic validation
|
||||
msg := types.NewMsgVote(from, proposalID, subvotes)
|
||||
msg := types.NewMsgVote(from, proposalID, options)
|
||||
err = msg.ValidateBasic()
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
|
@ -165,44 +165,44 @@ func (s *IntegrationTestSuite) TestGetProposalVoteGRPC() {
|
|||
voterAddressBase64 := val.Address.String()
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
url string
|
||||
expErr bool
|
||||
expSubVotes types.SubVotes
|
||||
name string
|
||||
url string
|
||||
expErr bool
|
||||
expVoteOptions types.WeightedVoteOptions
|
||||
}{
|
||||
{
|
||||
"empty proposal",
|
||||
fmt.Sprintf("%s/cosmos/gov/v1beta1/proposals/%s/votes/%s", val.APIAddress, "", voterAddressBase64),
|
||||
true,
|
||||
types.SubVotes{types.NewSubVote(types.OptionYes, 1)},
|
||||
types.NewNonSplitVoteOption(types.OptionYes),
|
||||
},
|
||||
{
|
||||
"get non existing proposal",
|
||||
fmt.Sprintf("%s/cosmos/gov/v1beta1/proposals/%s/votes/%s", val.APIAddress, "10", voterAddressBase64),
|
||||
true,
|
||||
types.SubVotes{types.NewSubVote(types.OptionYes, 1)},
|
||||
types.NewNonSplitVoteOption(types.OptionYes),
|
||||
},
|
||||
{
|
||||
"get proposal with wrong voter address",
|
||||
fmt.Sprintf("%s/cosmos/gov/v1beta1/proposals/%s/votes/%s", val.APIAddress, "1", "wrongVoterAddress"),
|
||||
true,
|
||||
types.SubVotes{types.NewSubVote(types.OptionYes, 1)},
|
||||
types.NewNonSplitVoteOption(types.OptionYes),
|
||||
},
|
||||
{
|
||||
"get proposal with id",
|
||||
fmt.Sprintf("%s/cosmos/gov/v1beta1/proposals/%s/votes/%s", val.APIAddress, "1", voterAddressBase64),
|
||||
false,
|
||||
types.SubVotes{types.NewSubVote(types.OptionYes, 1)},
|
||||
types.NewNonSplitVoteOption(types.OptionYes),
|
||||
},
|
||||
{
|
||||
"get proposal with id for split vote",
|
||||
fmt.Sprintf("%s/cosmos/gov/v1beta1/proposals/%s/votes/%s", val.APIAddress, "3", voterAddressBase64),
|
||||
false,
|
||||
types.SubVotes{
|
||||
types.SubVote{Option: types.OptionYes, Rate: sdk.NewDecWithPrec(60, 2)},
|
||||
types.SubVote{Option: types.OptionNo, Rate: sdk.NewDecWithPrec(30, 2)},
|
||||
types.SubVote{Option: types.OptionAbstain, Rate: sdk.NewDecWithPrec(5, 2)},
|
||||
types.SubVote{Option: types.OptionNoWithVeto, Rate: sdk.NewDecWithPrec(5, 2)},
|
||||
types.WeightedVoteOptions{
|
||||
types.WeightedVoteOption{Option: types.OptionYes, Weight: sdk.NewDecWithPrec(60, 2)},
|
||||
types.WeightedVoteOption{Option: types.OptionNo, Weight: sdk.NewDecWithPrec(30, 2)},
|
||||
types.WeightedVoteOption{Option: types.OptionAbstain, Weight: sdk.NewDecWithPrec(5, 2)},
|
||||
types.WeightedVoteOption{Option: types.OptionNoWithVeto, Weight: sdk.NewDecWithPrec(5, 2)},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
@ -221,10 +221,10 @@ func (s *IntegrationTestSuite) TestGetProposalVoteGRPC() {
|
|||
} else {
|
||||
s.Require().NoError(err)
|
||||
s.Require().NotEmpty(vote.Vote)
|
||||
s.Require().Equal(len(vote.Vote.SubVotes), len(tc.expSubVotes))
|
||||
for i, subvote := range tc.expSubVotes {
|
||||
s.Require().Equal(subvote.Option, vote.Vote.SubVotes[i].Option)
|
||||
s.Require().True(subvote.Rate.Equal(vote.Vote.SubVotes[i].Rate))
|
||||
s.Require().Equal(len(vote.Vote.Options), len(tc.expVoteOptions))
|
||||
for i, option := range tc.expVoteOptions {
|
||||
s.Require().Equal(option.Option, vote.Vote.Options[i].Option)
|
||||
s.Require().True(option.Weight.Equal(vote.Vote.Options[i].Weight))
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
|
@ -52,7 +52,7 @@ type DepositReq struct {
|
|||
|
||||
// VoteReq defines the properties of a vote request's body.
|
||||
type VoteReq struct {
|
||||
BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"`
|
||||
Voter sdk.AccAddress `json:"voter" yaml:"voter"` // address of the voter
|
||||
SubVotes string `json:"sub_votes" yaml:"sub_votes"` // option from OptionSet chosen by the voter
|
||||
BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"`
|
||||
Voter sdk.AccAddress `json:"voter" yaml:"voter"` // address of the voter
|
||||
Options string `json:"options" yaml:"options"` // option from OptionSet chosen by the voter
|
||||
}
|
||||
|
|
|
@ -111,14 +111,14 @@ func newVoteHandlerFn(clientCtx client.Context) http.HandlerFunc {
|
|||
return
|
||||
}
|
||||
|
||||
// Figure out which subvotes user chose
|
||||
subvotes, err := types.SubVotesFromString(gcutils.NormalizeSubVotes(req.SubVotes))
|
||||
// Figure out which vote options user chose
|
||||
options, err := types.WeightedVoteOptionsFromString(gcutils.NormalizeWeightedVoteOptions(req.Options))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// create the message
|
||||
msg := types.NewMsgVote(req.Voter, proposalID, subvotes)
|
||||
msg := types.NewMsgVote(req.Voter, proposalID, options)
|
||||
if rest.CheckBadRequestError(w, msg.ValidateBasic()) {
|
||||
return
|
||||
}
|
||||
|
|
|
@ -101,7 +101,7 @@ func QueryVotesByTxQuery(clientCtx client.Context, params types.QueryProposalVot
|
|||
votes = append(votes, types.Vote{
|
||||
Voter: voteMsg.Voter,
|
||||
ProposalId: params.ProposalID,
|
||||
SubVotes: voteMsg.SubVotes,
|
||||
Options: voteMsg.Options,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -148,7 +148,7 @@ func QueryVoteByTxQuery(clientCtx client.Context, params types.QueryVoteParams)
|
|||
vote := types.Vote{
|
||||
Voter: voteMsg.Voter,
|
||||
ProposalId: params.ProposalID,
|
||||
SubVotes: voteMsg.SubVotes,
|
||||
Options: voteMsg.Options,
|
||||
}
|
||||
|
||||
bz, err := clientCtx.JSONMarshaler.MarshalJSON(&vote)
|
||||
|
|
|
@ -70,12 +70,12 @@ func TestGetPaginatedVotes(t *testing.T) {
|
|||
acc2 := make(sdk.AccAddress, 20)
|
||||
acc2[0] = 2
|
||||
acc1Msgs := []sdk.Msg{
|
||||
types.NewMsgVote(acc1, 0, types.SubVotes{types.NewSubVote(types.OptionYes, 1)}),
|
||||
types.NewMsgVote(acc1, 0, types.SubVotes{types.NewSubVote(types.OptionYes, 1)}),
|
||||
types.NewMsgVote(acc1, 0, types.NewNonSplitVoteOption(types.OptionYes)),
|
||||
types.NewMsgVote(acc1, 0, types.NewNonSplitVoteOption(types.OptionYes)),
|
||||
}
|
||||
acc2Msgs := []sdk.Msg{
|
||||
types.NewMsgVote(acc2, 0, types.SubVotes{types.NewSubVote(types.OptionYes, 1)}),
|
||||
types.NewMsgVote(acc2, 0, types.SubVotes{types.NewSubVote(types.OptionYes, 1)}),
|
||||
types.NewMsgVote(acc2, 0, types.NewNonSplitVoteOption(types.OptionYes)),
|
||||
types.NewMsgVote(acc2, 0, types.NewNonSplitVoteOption(types.OptionYes)),
|
||||
}
|
||||
for _, tc := range []testCase{
|
||||
{
|
||||
|
@ -87,8 +87,8 @@ func TestGetPaginatedVotes(t *testing.T) {
|
|||
acc2Msgs[:1],
|
||||
},
|
||||
votes: []types.Vote{
|
||||
types.NewVote(0, acc1, types.SubVotes{types.NewSubVote(types.OptionYes, 1)}),
|
||||
types.NewVote(0, acc2, types.SubVotes{types.NewSubVote(types.OptionYes, 1)})},
|
||||
types.NewVote(0, acc1, types.NewNonSplitVoteOption(types.OptionYes)),
|
||||
types.NewVote(0, acc2, types.NewNonSplitVoteOption(types.OptionYes))},
|
||||
},
|
||||
{
|
||||
description: "2MsgPerTx1Chunk",
|
||||
|
@ -99,8 +99,9 @@ func TestGetPaginatedVotes(t *testing.T) {
|
|||
acc2Msgs,
|
||||
},
|
||||
votes: []types.Vote{
|
||||
types.NewVote(0, acc1, types.SubVotes{types.NewSubVote(types.OptionYes, 1)}),
|
||||
types.NewVote(0, acc1, types.SubVotes{types.NewSubVote(types.OptionYes, 1)})},
|
||||
types.NewVote(0, acc1, types.NewNonSplitVoteOption(types.OptionYes)),
|
||||
types.NewVote(0, acc1, types.NewNonSplitVoteOption(types.OptionYes)),
|
||||
},
|
||||
},
|
||||
{
|
||||
description: "2MsgPerTx2Chunk",
|
||||
|
@ -111,8 +112,9 @@ func TestGetPaginatedVotes(t *testing.T) {
|
|||
acc2Msgs,
|
||||
},
|
||||
votes: []types.Vote{
|
||||
types.NewVote(0, acc2, types.SubVotes{types.NewSubVote(types.OptionYes, 1)}),
|
||||
types.NewVote(0, acc2, types.SubVotes{types.NewSubVote(types.OptionYes, 1)})},
|
||||
types.NewVote(0, acc2, types.NewNonSplitVoteOption(types.OptionYes)),
|
||||
types.NewVote(0, acc2, types.NewNonSplitVoteOption(types.OptionYes)),
|
||||
},
|
||||
},
|
||||
{
|
||||
description: "IncompleteSearchTx",
|
||||
|
@ -121,7 +123,7 @@ func TestGetPaginatedVotes(t *testing.T) {
|
|||
msgs: [][]sdk.Msg{
|
||||
acc1Msgs[:1],
|
||||
},
|
||||
votes: []types.Vote{types.NewVote(0, acc1, types.SubVotes{types.NewSubVote(types.OptionYes, 1)})},
|
||||
votes: []types.Vote{types.NewVote(0, acc1, types.NewNonSplitVoteOption(types.OptionYes))},
|
||||
},
|
||||
{
|
||||
description: "InvalidPage",
|
||||
|
|
|
@ -26,18 +26,18 @@ func NormalizeVoteOption(option string) string {
|
|||
}
|
||||
}
|
||||
|
||||
// NormalizeSubVotes - normalize subvotes
|
||||
func NormalizeSubVotes(subvotes string) string {
|
||||
newSubVotes := []string{}
|
||||
for _, subvote := range strings.Split(subvotes, ",") {
|
||||
fields := strings.Split(subvote, "=")
|
||||
// NormalizeWeightedVoteOptions - normalize normalize vote options param string
|
||||
func NormalizeWeightedVoteOptions(options string) string {
|
||||
newOptions := []string{}
|
||||
for _, option := range strings.Split(options, ",") {
|
||||
fields := strings.Split(option, "=")
|
||||
fields[0] = NormalizeVoteOption(fields[0])
|
||||
if len(fields) < 2 {
|
||||
fields = append(fields, "1")
|
||||
}
|
||||
newSubVotes = append(newSubVotes, strings.Join(fields, "="))
|
||||
newOptions = append(newOptions, strings.Join(fields, "="))
|
||||
}
|
||||
return strings.Join(newSubVotes, ",")
|
||||
return strings.Join(newOptions, ",")
|
||||
}
|
||||
|
||||
//NormalizeProposalType - normalize user specified proposal type
|
||||
|
|
|
@ -183,7 +183,7 @@ func (suite *KeeperTestSuite) TestGRPCQueryProposals() {
|
|||
func() {
|
||||
testProposals[1].Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, testProposals[1])
|
||||
suite.Require().NoError(app.GovKeeper.AddVote(ctx, testProposals[1].ProposalId, addrs[0], types.SubVotes{types.NewSubVote(types.OptionAbstain, 1)}))
|
||||
suite.Require().NoError(app.GovKeeper.AddVote(ctx, testProposals[1].ProposalId, addrs[0], types.NewNonSplitVoteOption(types.OptionAbstain)))
|
||||
|
||||
req = &types.QueryProposalsRequest{
|
||||
Voter: addrs[0].String(),
|
||||
|
@ -291,14 +291,14 @@ func (suite *KeeperTestSuite) TestGRPCQueryVote() {
|
|||
func() {
|
||||
proposal.Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.ProposalId, addrs[0], types.SubVotes{types.NewSubVote(types.OptionAbstain, 1)}))
|
||||
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.ProposalId, addrs[0], types.NewNonSplitVoteOption(types.OptionAbstain)))
|
||||
|
||||
req = &types.QueryVoteRequest{
|
||||
ProposalId: proposal.ProposalId,
|
||||
Voter: addrs[0].String(),
|
||||
}
|
||||
|
||||
expRes = &types.QueryVoteResponse{Vote: types.NewVote(proposal.ProposalId, addrs[0], types.SubVotes{types.NewSubVote(types.OptionAbstain, 1)})}
|
||||
expRes = &types.QueryVoteResponse{Vote: types.NewVote(proposal.ProposalId, addrs[0], types.NewNonSplitVoteOption(types.OptionAbstain))}
|
||||
},
|
||||
true,
|
||||
},
|
||||
|
@ -395,15 +395,15 @@ func (suite *KeeperTestSuite) TestGRPCQueryVotes() {
|
|||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
|
||||
votes = []types.Vote{
|
||||
{proposal.ProposalId, addrs[0].String(), types.SubVotes{types.NewSubVote(types.OptionAbstain, 1)}},
|
||||
{proposal.ProposalId, addrs[1].String(), types.SubVotes{types.NewSubVote(types.OptionYes, 1)}},
|
||||
{proposal.ProposalId, addrs[0].String(), types.NewNonSplitVoteOption(types.OptionAbstain)},
|
||||
{proposal.ProposalId, addrs[1].String(), types.NewNonSplitVoteOption(types.OptionYes)},
|
||||
}
|
||||
accAddr1, err1 := sdk.AccAddressFromBech32(votes[0].Voter)
|
||||
accAddr2, err2 := sdk.AccAddressFromBech32(votes[1].Voter)
|
||||
suite.Require().NoError(err1)
|
||||
suite.Require().NoError(err2)
|
||||
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.ProposalId, accAddr1, votes[0].SubVotes))
|
||||
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.ProposalId, accAddr2, votes[1].SubVotes))
|
||||
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.ProposalId, accAddr1, votes[0].Options))
|
||||
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.ProposalId, accAddr2, votes[1].Options))
|
||||
|
||||
req = &types.QueryVotesRequest{
|
||||
ProposalId: proposal.ProposalId,
|
||||
|
@ -769,9 +769,9 @@ func (suite *KeeperTestSuite) TestGRPCQueryTally() {
|
|||
proposal.Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
|
||||
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.ProposalId, addrs[0], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.ProposalId, addrs[1], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.ProposalId, addrs[2], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.ProposalId, addrs[0], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.ProposalId, addrs[1], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.ProposalId, addrs[2], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
|
||||
req = &types.QueryTallyResultRequest{ProposalId: proposal.ProposalId}
|
||||
|
||||
|
|
|
@ -64,7 +64,7 @@ func (k msgServer) Vote(goCtx context.Context, msg *types.MsgVote) (*types.MsgVo
|
|||
if accErr != nil {
|
||||
return nil, accErr
|
||||
}
|
||||
err := k.Keeper.AddVote(ctx, msg.ProposalId, accAddr, msg.SubVotes)
|
||||
err := k.Keeper.AddVote(ctx, msg.ProposalId, accAddr, msg.Options)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
|
@ -101,7 +101,7 @@ func TestGetProposalsFiltered(t *testing.T) {
|
|||
|
||||
if i%2 == 0 {
|
||||
d := types.NewDeposit(proposalID, addr1, nil)
|
||||
v := types.NewVote(proposalID, addr1, types.SubVotes{types.NewSubVote(types.OptionYes, 1)})
|
||||
v := types.NewVote(proposalID, addr1, types.NewNonSplitVoteOption(types.OptionYes))
|
||||
app.GovKeeper.SetDeposit(ctx, d)
|
||||
app.GovKeeper.SetVote(ctx, v)
|
||||
}
|
||||
|
|
|
@ -251,13 +251,13 @@ func TestQueries(t *testing.T) {
|
|||
require.Equal(t, proposal3, proposals[1])
|
||||
|
||||
// Addrs[0] votes on proposals #2 & #3
|
||||
vote1 := types.NewVote(proposal2.ProposalId, TestAddrs[0], types.SubVotes{types.NewSubVote(types.OptionYes, 1)})
|
||||
vote2 := types.NewVote(proposal3.ProposalId, TestAddrs[0], types.SubVotes{types.NewSubVote(types.OptionYes, 1)})
|
||||
vote1 := types.NewVote(proposal2.ProposalId, TestAddrs[0], types.NewNonSplitVoteOption(types.OptionYes))
|
||||
vote2 := types.NewVote(proposal3.ProposalId, TestAddrs[0], types.NewNonSplitVoteOption(types.OptionYes))
|
||||
app.GovKeeper.SetVote(ctx, vote1)
|
||||
app.GovKeeper.SetVote(ctx, vote2)
|
||||
|
||||
// Addrs[1] votes on proposal #3
|
||||
vote3 := types.NewVote(proposal3.ProposalId, TestAddrs[1], types.SubVotes{types.NewSubVote(types.OptionYes, 1)})
|
||||
vote3 := types.NewVote(proposal3.ProposalId, TestAddrs[1], types.NewNonSplitVoteOption(types.OptionYes))
|
||||
app.GovKeeper.SetVote(ctx, vote3)
|
||||
|
||||
// Test query voted by TestAddrs[0]
|
||||
|
@ -323,7 +323,7 @@ func TestPaginatedVotesQuery(t *testing.T) {
|
|||
vote := types.Vote{
|
||||
ProposalId: proposal.ProposalId,
|
||||
Voter: addr.String(),
|
||||
SubVotes: types.SubVotes{types.NewSubVote(types.OptionYes, 1)},
|
||||
Options: types.NewNonSplitVoteOption(types.OptionYes),
|
||||
}
|
||||
votes[i] = vote
|
||||
app.GovKeeper.SetVote(ctx, vote)
|
||||
|
|
|
@ -27,7 +27,7 @@ func (keeper Keeper) Tally(ctx sdk.Context, proposal types.Proposal) (passes boo
|
|||
validator.GetBondedTokens(),
|
||||
validator.GetDelegatorShares(),
|
||||
sdk.ZeroDec(),
|
||||
types.SubVotes{},
|
||||
types.WeightedVoteOptions{},
|
||||
)
|
||||
|
||||
return false
|
||||
|
@ -43,7 +43,7 @@ func (keeper Keeper) Tally(ctx sdk.Context, proposal types.Proposal) (passes boo
|
|||
|
||||
valAddrStr := sdk.ValAddress(voter.Bytes()).String()
|
||||
if val, ok := currValidators[valAddrStr]; ok {
|
||||
val.Vote = vote.SubVotes
|
||||
val.Vote = vote.Options
|
||||
currValidators[valAddrStr] = val
|
||||
}
|
||||
|
||||
|
@ -61,12 +61,12 @@ func (keeper Keeper) Tally(ctx sdk.Context, proposal types.Proposal) (passes boo
|
|||
votingPower := delegatorShare.MulInt(val.BondedTokens)
|
||||
|
||||
totalRates := sdk.NewDec(0)
|
||||
for _, subvote := range vote.SubVotes {
|
||||
totalRates = totalRates.Add(subvote.Rate)
|
||||
for _, option := range vote.Options {
|
||||
totalRates = totalRates.Add(option.Weight)
|
||||
}
|
||||
for _, subvote := range vote.SubVotes {
|
||||
subPower := sdk.NewDecFromBigInt(votingPower.BigInt().Div(votingPower.Mul(subvote.Rate).BigInt(), totalRates.BigInt()))
|
||||
results[subvote.Option] = results[subvote.Option].Add(subPower)
|
||||
for _, option := range vote.Options {
|
||||
subPower := sdk.NewDecFromBigInt(votingPower.BigInt().Div(votingPower.Mul(option.Weight).BigInt(), totalRates.BigInt()))
|
||||
results[option.Option] = results[option.Option].Add(subPower)
|
||||
totalVotingPower = totalVotingPower.Add(subPower)
|
||||
}
|
||||
// TODO how should handle remainder?
|
||||
|
@ -91,12 +91,12 @@ func (keeper Keeper) Tally(ctx sdk.Context, proposal types.Proposal) (passes boo
|
|||
votingPower := fractionAfterDeductions.MulInt(val.BondedTokens)
|
||||
|
||||
totalRates := sdk.NewDec(0)
|
||||
for _, subvote := range val.Vote {
|
||||
totalRates = totalRates.Add(subvote.Rate)
|
||||
for _, option := range val.Vote {
|
||||
totalRates = totalRates.Add(option.Weight)
|
||||
}
|
||||
for _, subvote := range val.Vote {
|
||||
subPower := sdk.NewDecFromBigInt(votingPower.BigInt().Div(votingPower.Mul(subvote.Rate).BigInt(), totalRates.BigInt()))
|
||||
results[subvote.Option] = results[subvote.Option].Add(subPower)
|
||||
for _, option := range val.Vote {
|
||||
subPower := sdk.NewDecFromBigInt(votingPower.BigInt().Div(votingPower.Mul(option.Weight).BigInt(), totalRates.BigInt()))
|
||||
results[option.Option] = results[option.Option].Add(subPower)
|
||||
totalVotingPower = totalVotingPower.Add(subPower)
|
||||
// TODO how should handle remainder?
|
||||
// TODO how should handle when totalRates == 0
|
||||
|
|
|
@ -50,7 +50,7 @@ func TestTallyNoQuorum(t *testing.T) {
|
|||
proposal.Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
|
||||
err = app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.SubVotes{types.NewSubVote(types.OptionYes, 1)})
|
||||
err = app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.NewNonSplitVoteOption(types.OptionYes))
|
||||
require.Nil(t, err)
|
||||
|
||||
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
|
||||
|
@ -73,9 +73,9 @@ func TestTallyOnlyValidatorsAllYes(t *testing.T) {
|
|||
proposal.Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
|
||||
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
|
||||
require.True(t, ok)
|
||||
|
@ -99,8 +99,8 @@ func TestTallyOnlyValidators51No(t *testing.T) {
|
|||
proposal.Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], types.SubVotes{types.NewSubVote(types.OptionNo, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], types.NewNonSplitVoteOption(types.OptionNo)))
|
||||
|
||||
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
|
||||
require.True(t, ok)
|
||||
|
@ -123,8 +123,8 @@ func TestTallyOnlyValidators51Yes(t *testing.T) {
|
|||
proposal.Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], types.SubVotes{types.NewSubVote(types.OptionNo, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], types.NewNonSplitVoteOption(types.OptionNo)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
|
||||
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
|
||||
require.True(t, ok)
|
||||
|
@ -148,9 +148,9 @@ func TestTallyOnlyValidatorsVetoed(t *testing.T) {
|
|||
proposal.Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[2], types.SubVotes{types.NewSubVote(types.OptionNoWithVeto, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[2], types.NewNonSplitVoteOption(types.OptionNoWithVeto)))
|
||||
|
||||
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
|
||||
require.True(t, ok)
|
||||
|
@ -174,9 +174,9 @@ func TestTallyOnlyValidatorsAbstainPasses(t *testing.T) {
|
|||
proposal.Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], types.SubVotes{types.NewSubVote(types.OptionAbstain, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], types.SubVotes{types.NewSubVote(types.OptionNo, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[2], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], types.NewNonSplitVoteOption(types.OptionAbstain)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], types.NewNonSplitVoteOption(types.OptionNo)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[2], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
|
||||
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
|
||||
require.True(t, ok)
|
||||
|
@ -200,9 +200,9 @@ func TestTallyOnlyValidatorsAbstainFails(t *testing.T) {
|
|||
proposal.Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], types.SubVotes{types.NewSubVote(types.OptionAbstain, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[2], types.SubVotes{types.NewSubVote(types.OptionNo, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], types.NewNonSplitVoteOption(types.OptionAbstain)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[2], types.NewNonSplitVoteOption(types.OptionNo)))
|
||||
|
||||
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
|
||||
require.True(t, ok)
|
||||
|
@ -227,8 +227,8 @@ func TestTallyOnlyValidatorsNonVoter(t *testing.T) {
|
|||
proposal.Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddr1, types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddr2, types.SubVotes{types.NewSubVote(types.OptionNo, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddr1, types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddr2, types.NewNonSplitVoteOption(types.OptionNo)))
|
||||
|
||||
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
|
||||
require.True(t, ok)
|
||||
|
@ -261,10 +261,10 @@ func TestTallyDelgatorOverride(t *testing.T) {
|
|||
proposal.Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[3], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[4], types.SubVotes{types.NewSubVote(types.OptionNo, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[3], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[4], types.NewNonSplitVoteOption(types.OptionNo)))
|
||||
|
||||
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
|
||||
require.True(t, ok)
|
||||
|
@ -297,9 +297,9 @@ func TestTallyDelgatorInherit(t *testing.T) {
|
|||
proposal.Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.SubVotes{types.NewSubVote(types.OptionNo, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], types.SubVotes{types.NewSubVote(types.OptionNo, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.NewNonSplitVoteOption(types.OptionNo)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], types.NewNonSplitVoteOption(types.OptionNo)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
|
||||
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
|
||||
require.True(t, ok)
|
||||
|
@ -336,10 +336,10 @@ func TestTallyDelgatorMultipleOverride(t *testing.T) {
|
|||
proposal.Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[3], types.SubVotes{types.NewSubVote(types.OptionNo, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[3], types.NewNonSplitVoteOption(types.OptionNo)))
|
||||
|
||||
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
|
||||
require.True(t, ok)
|
||||
|
@ -378,9 +378,9 @@ func TestTallyDelgatorMultipleInherit(t *testing.T) {
|
|||
proposal.Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], types.SubVotes{types.NewSubVote(types.OptionNo, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], types.SubVotes{types.NewSubVote(types.OptionNo, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], types.NewNonSplitVoteOption(types.OptionNo)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], types.NewNonSplitVoteOption(types.OptionNo)))
|
||||
|
||||
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
|
||||
require.True(t, ok)
|
||||
|
@ -421,8 +421,8 @@ func TestTallyJailedValidator(t *testing.T) {
|
|||
proposal.Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], types.SubVotes{types.NewSubVote(types.OptionNo, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], types.NewNonSplitVoteOption(types.OptionNo)))
|
||||
|
||||
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
|
||||
require.True(t, ok)
|
||||
|
@ -453,9 +453,9 @@ func TestTallyValidatorMultipleDelegations(t *testing.T) {
|
|||
proposal.Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], types.SubVotes{types.NewSubVote(types.OptionNo, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], types.NewNonSplitVoteOption(types.OptionNo)))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
|
||||
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
|
||||
require.True(t, ok)
|
||||
|
|
|
@ -9,7 +9,7 @@ import (
|
|||
)
|
||||
|
||||
// AddVote adds a vote on a specific proposal
|
||||
func (keeper Keeper) AddVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress, subvotes types.SubVotes) error {
|
||||
func (keeper Keeper) AddVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress, options types.WeightedVoteOptions) error {
|
||||
proposal, ok := keeper.GetProposal(ctx, proposalID)
|
||||
if !ok {
|
||||
return sdkerrors.Wrapf(types.ErrUnknownProposal, "%d", proposalID)
|
||||
|
@ -18,19 +18,19 @@ func (keeper Keeper) AddVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.A
|
|||
return sdkerrors.Wrapf(types.ErrInactiveProposal, "%d", proposalID)
|
||||
}
|
||||
|
||||
for _, subvote := range subvotes {
|
||||
if !types.ValidSubVote(subvote) {
|
||||
return sdkerrors.Wrap(types.ErrInvalidVote, subvote.String())
|
||||
for _, option := range options {
|
||||
if !types.ValidWeightedVoteOption(option) {
|
||||
return sdkerrors.Wrap(types.ErrInvalidVote, option.String())
|
||||
}
|
||||
}
|
||||
|
||||
vote := types.NewVote(proposalID, voterAddr, subvotes)
|
||||
vote := types.NewVote(proposalID, voterAddr, options)
|
||||
keeper.SetVote(ctx, vote)
|
||||
|
||||
ctx.EventManager().EmitEvent(
|
||||
sdk.NewEvent(
|
||||
types.EventTypeProposalVote,
|
||||
sdk.NewAttribute(types.AttributeKeyOption, subvotes.String()),
|
||||
sdk.NewAttribute(types.AttributeKeyOption, options.String()),
|
||||
sdk.NewAttribute(types.AttributeKeyProposalID, fmt.Sprintf("%d", proposalID)),
|
||||
),
|
||||
)
|
||||
|
|
|
@ -24,52 +24,52 @@ func TestVotes(t *testing.T) {
|
|||
|
||||
var invalidOption types.VoteOption = 0x10
|
||||
|
||||
require.Error(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}), "proposal not on voting period")
|
||||
require.Error(t, app.GovKeeper.AddVote(ctx, 10, addrs[0], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}), "invalid proposal ID")
|
||||
require.Error(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.NewNonSplitVoteOption(types.OptionYes)), "proposal not on voting period")
|
||||
require.Error(t, app.GovKeeper.AddVote(ctx, 10, addrs[0], types.NewNonSplitVoteOption(types.OptionYes)), "invalid proposal ID")
|
||||
|
||||
proposal.Status = types.StatusVotingPeriod
|
||||
app.GovKeeper.SetProposal(ctx, proposal)
|
||||
|
||||
require.Error(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.SubVotes{types.NewSubVote(invalidOption, 1)}), "invalid option")
|
||||
require.Error(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.NewNonSplitVoteOption(invalidOption)), "invalid option")
|
||||
|
||||
// Test first vote
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.SubVotes{types.NewSubVote(types.OptionAbstain, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.NewNonSplitVoteOption(types.OptionAbstain)))
|
||||
vote, found := app.GovKeeper.GetVote(ctx, proposalID, addrs[0])
|
||||
require.True(t, found)
|
||||
require.Equal(t, addrs[0].String(), vote.Voter)
|
||||
require.Equal(t, proposalID, vote.ProposalId)
|
||||
require.True(t, len(vote.SubVotes) == 1)
|
||||
require.Equal(t, types.OptionAbstain, vote.SubVotes[0].Option)
|
||||
require.True(t, len(vote.Options) == 1)
|
||||
require.Equal(t, types.OptionAbstain, vote.Options[0].Option)
|
||||
|
||||
// Test change of vote
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.SubVotes{types.NewSubVote(types.OptionYes, 1)}))
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], types.NewNonSplitVoteOption(types.OptionYes)))
|
||||
vote, found = app.GovKeeper.GetVote(ctx, proposalID, addrs[0])
|
||||
require.True(t, found)
|
||||
require.Equal(t, addrs[0].String(), vote.Voter)
|
||||
require.Equal(t, proposalID, vote.ProposalId)
|
||||
require.True(t, len(vote.SubVotes) == 1)
|
||||
require.Equal(t, types.OptionYes, vote.SubVotes[0].Option)
|
||||
require.True(t, len(vote.Options) == 1)
|
||||
require.Equal(t, types.OptionYes, vote.Options[0].Option)
|
||||
|
||||
// Test second vote
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], types.SubVotes{
|
||||
types.SubVote{Option: types.OptionYes, Rate: sdk.NewDecWithPrec(60, 2)},
|
||||
types.SubVote{Option: types.OptionNo, Rate: sdk.NewDecWithPrec(30, 2)},
|
||||
types.SubVote{Option: types.OptionAbstain, Rate: sdk.NewDecWithPrec(5, 2)},
|
||||
types.SubVote{Option: types.OptionNoWithVeto, Rate: sdk.NewDecWithPrec(5, 2)},
|
||||
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], types.WeightedVoteOptions{
|
||||
types.WeightedVoteOption{Option: types.OptionYes, Weight: sdk.NewDecWithPrec(60, 2)},
|
||||
types.WeightedVoteOption{Option: types.OptionNo, Weight: sdk.NewDecWithPrec(30, 2)},
|
||||
types.WeightedVoteOption{Option: types.OptionAbstain, Weight: sdk.NewDecWithPrec(5, 2)},
|
||||
types.WeightedVoteOption{Option: types.OptionNoWithVeto, Weight: sdk.NewDecWithPrec(5, 2)},
|
||||
}))
|
||||
vote, found = app.GovKeeper.GetVote(ctx, proposalID, addrs[1])
|
||||
require.True(t, found)
|
||||
require.Equal(t, addrs[1].String(), vote.Voter)
|
||||
require.Equal(t, proposalID, vote.ProposalId)
|
||||
require.True(t, len(vote.SubVotes) == 4)
|
||||
require.Equal(t, types.OptionYes, vote.SubVotes[0].Option)
|
||||
require.Equal(t, types.OptionNo, vote.SubVotes[1].Option)
|
||||
require.Equal(t, types.OptionAbstain, vote.SubVotes[2].Option)
|
||||
require.Equal(t, types.OptionNoWithVeto, vote.SubVotes[3].Option)
|
||||
require.True(t, vote.SubVotes[0].Rate.Equal(sdk.NewDecWithPrec(60, 2)))
|
||||
require.True(t, vote.SubVotes[1].Rate.Equal(sdk.NewDecWithPrec(30, 2)))
|
||||
require.True(t, vote.SubVotes[2].Rate.Equal(sdk.NewDecWithPrec(5, 2)))
|
||||
require.True(t, vote.SubVotes[3].Rate.Equal(sdk.NewDecWithPrec(5, 2)))
|
||||
require.True(t, len(vote.Options) == 4)
|
||||
require.Equal(t, types.OptionYes, vote.Options[0].Option)
|
||||
require.Equal(t, types.OptionNo, vote.Options[1].Option)
|
||||
require.Equal(t, types.OptionAbstain, vote.Options[2].Option)
|
||||
require.Equal(t, types.OptionNoWithVeto, vote.Options[3].Option)
|
||||
require.True(t, vote.Options[0].Weight.Equal(sdk.NewDecWithPrec(60, 2)))
|
||||
require.True(t, vote.Options[1].Weight.Equal(sdk.NewDecWithPrec(30, 2)))
|
||||
require.True(t, vote.Options[2].Weight.Equal(sdk.NewDecWithPrec(5, 2)))
|
||||
require.True(t, vote.Options[3].Weight.Equal(sdk.NewDecWithPrec(5, 2)))
|
||||
|
||||
// Test vote iterator
|
||||
// NOTE order of deposits is determined by the addresses
|
||||
|
@ -78,13 +78,13 @@ func TestVotes(t *testing.T) {
|
|||
require.Equal(t, votes, app.GovKeeper.GetVotes(ctx, proposalID))
|
||||
require.Equal(t, addrs[0].String(), votes[0].Voter)
|
||||
require.Equal(t, proposalID, votes[0].ProposalId)
|
||||
require.True(t, len(votes[0].SubVotes) == 1)
|
||||
require.Equal(t, types.OptionYes, votes[0].SubVotes[0].Option)
|
||||
require.True(t, len(votes[0].Options) == 1)
|
||||
require.Equal(t, types.OptionYes, votes[0].Options[0].Option)
|
||||
require.Equal(t, addrs[1].String(), votes[1].Voter)
|
||||
require.Equal(t, proposalID, votes[1].ProposalId)
|
||||
require.True(t, len(votes[1].SubVotes) == 4)
|
||||
require.True(t, votes[1].SubVotes[0].Rate.Equal(sdk.NewDecWithPrec(60, 2)))
|
||||
require.True(t, votes[1].SubVotes[1].Rate.Equal(sdk.NewDecWithPrec(30, 2)))
|
||||
require.True(t, votes[1].SubVotes[2].Rate.Equal(sdk.NewDecWithPrec(5, 2)))
|
||||
require.True(t, votes[1].SubVotes[3].Rate.Equal(sdk.NewDecWithPrec(5, 2)))
|
||||
require.True(t, len(votes[1].Options) == 4)
|
||||
require.True(t, votes[1].Options[0].Weight.Equal(sdk.NewDecWithPrec(60, 2)))
|
||||
require.True(t, votes[1].Options[1].Weight.Equal(sdk.NewDecWithPrec(30, 2)))
|
||||
require.True(t, votes[1].Options[2].Weight.Equal(sdk.NewDecWithPrec(5, 2)))
|
||||
require.True(t, votes[1].Options[3].Weight.Equal(sdk.NewDecWithPrec(5, 2)))
|
||||
}
|
||||
|
|
|
@ -118,7 +118,7 @@ func Migrate(oldGovState v036gov.GenesisState) *v040gov.GenesisState {
|
|||
newVotes[i] = v040gov.Vote{
|
||||
ProposalId: oldVote.ProposalID,
|
||||
Voter: oldVote.Voter.String(),
|
||||
SubVotes: v040gov.SubVotes{v040gov.NewSubVote(migrateVoteOption(oldVote.Option), 1)},
|
||||
Options: v040gov.NewNonSplitVoteOption(migrateVoteOption(oldVote.Option)),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ func TestDecodeStore(t *testing.T) {
|
|||
proposalIDBz := make([]byte, 8)
|
||||
binary.LittleEndian.PutUint64(proposalIDBz, 1)
|
||||
deposit := types.NewDeposit(1, delAddr1, sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.OneInt())))
|
||||
vote := types.NewVote(1, delAddr1, types.SubVotes{types.NewSubVote(types.OptionYes, 1)})
|
||||
vote := types.NewVote(1, delAddr1, types.NewNonSplitVoteOption(types.OptionYes))
|
||||
|
||||
proposalBz, err := cdc.MarshalBinaryBare(&proposal)
|
||||
require.NoError(t, err)
|
||||
|
|
|
@ -281,7 +281,7 @@ func operationSimulateMsgVote(ak types.AccountKeeper, bk types.BankKeeper, k kee
|
|||
}
|
||||
|
||||
option := randomVotingOption(r)
|
||||
msg := types.NewMsgVote(simAccount.Address, proposalID, types.SubVotes{types.NewSubVote(option, 1)})
|
||||
msg := types.NewMsgVote(simAccount.Address, proposalID, types.NewNonSplitVoteOption(option))
|
||||
|
||||
account := ak.GetAccount(ctx, simAccount.Address)
|
||||
spendable := bk.SpendableCoins(ctx, account.GetAddress())
|
||||
|
|
|
@ -202,8 +202,8 @@ func TestSimulateMsgVote(t *testing.T) {
|
|||
require.True(t, operationMsg.OK)
|
||||
require.Equal(t, uint64(1), msg.ProposalId)
|
||||
require.Equal(t, "cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r", msg.Voter)
|
||||
require.True(t, len(msg.SubVotes) == 1)
|
||||
require.Equal(t, types.OptionYes, msg.SubVotes[0].Option)
|
||||
require.True(t, len(msg.Options) == 1)
|
||||
require.Equal(t, types.OptionYes, msg.Options[0].Option)
|
||||
require.Equal(t, "gov", msg.Route())
|
||||
require.Equal(t, types.TypeMsgVote, msg.Type())
|
||||
|
||||
|
|
|
@ -10,7 +10,6 @@ const (
|
|||
|
||||
AttributeKeyProposalResult = "proposal_result"
|
||||
AttributeKeyOption = "option"
|
||||
AttributeKeySubVotes = "sub_votes"
|
||||
AttributeKeyProposalID = "proposal_id"
|
||||
AttributeKeyVotingPeriodStart = "voting_period_start"
|
||||
AttributeValueCategory = "governance"
|
||||
|
|
|
@ -121,22 +121,23 @@ func (ProposalStatus) EnumDescriptor() ([]byte, []int) {
|
|||
return fileDescriptor_6e82113c1a9a4b7c, []int{1}
|
||||
}
|
||||
|
||||
type SubVote struct {
|
||||
// WeightedVoteOption defines a unit of vote for vote split.
|
||||
type WeightedVoteOption struct {
|
||||
Option VoteOption `protobuf:"varint,1,opt,name=option,proto3,enum=cosmos.gov.v1beta1.VoteOption" json:"option,omitempty"`
|
||||
Rate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=rate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"rate" yaml:"rate"`
|
||||
Weight github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=weight,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"weight" yaml:"weight"`
|
||||
}
|
||||
|
||||
func (m *SubVote) Reset() { *m = SubVote{} }
|
||||
func (*SubVote) ProtoMessage() {}
|
||||
func (*SubVote) Descriptor() ([]byte, []int) {
|
||||
func (m *WeightedVoteOption) Reset() { *m = WeightedVoteOption{} }
|
||||
func (*WeightedVoteOption) ProtoMessage() {}
|
||||
func (*WeightedVoteOption) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_6e82113c1a9a4b7c, []int{0}
|
||||
}
|
||||
func (m *SubVote) XXX_Unmarshal(b []byte) error {
|
||||
func (m *WeightedVoteOption) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
}
|
||||
func (m *SubVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
func (m *WeightedVoteOption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
if deterministic {
|
||||
return xxx_messageInfo_SubVote.Marshal(b, m, deterministic)
|
||||
return xxx_messageInfo_WeightedVoteOption.Marshal(b, m, deterministic)
|
||||
} else {
|
||||
b = b[:cap(b)]
|
||||
n, err := m.MarshalToSizedBuffer(b)
|
||||
|
@ -146,17 +147,17 @@ func (m *SubVote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
|||
return b[:n], nil
|
||||
}
|
||||
}
|
||||
func (m *SubVote) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_SubVote.Merge(m, src)
|
||||
func (m *WeightedVoteOption) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_WeightedVoteOption.Merge(m, src)
|
||||
}
|
||||
func (m *SubVote) XXX_Size() int {
|
||||
func (m *WeightedVoteOption) XXX_Size() int {
|
||||
return m.Size()
|
||||
}
|
||||
func (m *SubVote) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_SubVote.DiscardUnknown(m)
|
||||
func (m *WeightedVoteOption) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_WeightedVoteOption.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_SubVote proto.InternalMessageInfo
|
||||
var xxx_messageInfo_WeightedVoteOption proto.InternalMessageInfo
|
||||
|
||||
// TextProposal defines a standard text proposal whose changes need to be
|
||||
// manually updated in case of approval.
|
||||
|
@ -325,9 +326,9 @@ var xxx_messageInfo_TallyResult proto.InternalMessageInfo
|
|||
// Vote defines a vote on a governance proposal.
|
||||
// A Vote consists of a proposal ID, the voter, and the vote option.
|
||||
type Vote struct {
|
||||
ProposalId uint64 `protobuf:"varint,1,opt,name=proposal_id,json=proposalId,proto3" json:"proposal_id,omitempty" yaml:"proposal_id"`
|
||||
Voter string `protobuf:"bytes,2,opt,name=voter,proto3" json:"voter,omitempty"`
|
||||
SubVotes []SubVote `protobuf:"bytes,3,rep,name=sub_votes,json=subVotes,proto3" json:"sub_votes"`
|
||||
ProposalId uint64 `protobuf:"varint,1,opt,name=proposal_id,json=proposalId,proto3" json:"proposal_id,omitempty" yaml:"proposal_id"`
|
||||
Voter string `protobuf:"bytes,2,opt,name=voter,proto3" json:"voter,omitempty"`
|
||||
Options []WeightedVoteOption `protobuf:"bytes,3,rep,name=options,proto3" json:"options"`
|
||||
}
|
||||
|
||||
func (m *Vote) Reset() { *m = Vote{} }
|
||||
|
@ -488,7 +489,7 @@ var xxx_messageInfo_TallyParams proto.InternalMessageInfo
|
|||
func init() {
|
||||
proto.RegisterEnum("cosmos.gov.v1beta1.VoteOption", VoteOption_name, VoteOption_value)
|
||||
proto.RegisterEnum("cosmos.gov.v1beta1.ProposalStatus", ProposalStatus_name, ProposalStatus_value)
|
||||
proto.RegisterType((*SubVote)(nil), "cosmos.gov.v1beta1.SubVote")
|
||||
proto.RegisterType((*WeightedVoteOption)(nil), "cosmos.gov.v1beta1.WeightedVoteOption")
|
||||
proto.RegisterType((*TextProposal)(nil), "cosmos.gov.v1beta1.TextProposal")
|
||||
proto.RegisterType((*Deposit)(nil), "cosmos.gov.v1beta1.Deposit")
|
||||
proto.RegisterType((*Proposal)(nil), "cosmos.gov.v1beta1.Proposal")
|
||||
|
@ -502,98 +503,97 @@ func init() {
|
|||
func init() { proto.RegisterFile("cosmos/gov/v1beta1/gov.proto", fileDescriptor_6e82113c1a9a4b7c) }
|
||||
|
||||
var fileDescriptor_6e82113c1a9a4b7c = []byte{
|
||||
// 1442 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0x5f, 0x6c, 0xdb, 0x54,
|
||||
0x17, 0x8f, 0xd3, 0xf4, 0x4f, 0x6e, 0xd2, 0xd6, 0xbb, 0xed, 0xda, 0x34, 0xdb, 0x67, 0xfb, 0xf3,
|
||||
0xf7, 0x09, 0x55, 0xd3, 0x96, 0x6e, 0x05, 0x81, 0xe8, 0xc4, 0x44, 0xdc, 0x78, 0x2c, 0x68, 0x4a,
|
||||
0x82, 0xe3, 0x65, 0xda, 0x78, 0xb0, 0x9c, 0xe4, 0x2e, 0x35, 0xc4, 0xbe, 0x21, 0xbe, 0x29, 0xad,
|
||||
0x78, 0xe1, 0x71, 0x0a, 0x12, 0xda, 0x03, 0x0f, 0x93, 0x50, 0xc4, 0x24, 0xde, 0x78, 0xe6, 0x99,
|
||||
0xe7, 0x0a, 0x21, 0x31, 0xf1, 0x34, 0x81, 0x94, 0xb1, 0x4e, 0x42, 0x53, 0x1f, 0xfb, 0xc0, 0x33,
|
||||
0xb2, 0xef, 0x75, 0xe3, 0x24, 0x15, 0x25, 0x3c, 0xd5, 0xf7, 0xdc, 0xf3, 0xfb, 0xfd, 0xce, 0x39,
|
||||
0x3e, 0xe7, 0xc4, 0x05, 0x17, 0x6b, 0xd8, 0xb5, 0xb1, 0xbb, 0xd1, 0xc0, 0xbb, 0x1b, 0xbb, 0xd7,
|
||||
0xaa, 0x88, 0x98, 0xd7, 0xbc, 0xe7, 0x4c, 0xab, 0x8d, 0x09, 0x86, 0x90, 0xde, 0x66, 0x3c, 0x0b,
|
||||
0xbb, 0x4d, 0x0b, 0x0c, 0x51, 0x35, 0x5d, 0x74, 0x02, 0xa9, 0x61, 0xcb, 0xa1, 0x98, 0xf4, 0x72,
|
||||
0x03, 0x37, 0xb0, 0xff, 0xb8, 0xe1, 0x3d, 0x31, 0xeb, 0x1a, 0x45, 0x19, 0xf4, 0x82, 0xd1, 0xd2,
|
||||
0x2b, 0xb1, 0x81, 0x71, 0xa3, 0x89, 0x36, 0xfc, 0x53, 0xb5, 0xf3, 0x60, 0x83, 0x58, 0x36, 0x72,
|
||||
0x89, 0x69, 0xb7, 0x02, 0xec, 0xa8, 0x83, 0xe9, 0xec, 0xb3, 0x2b, 0x61, 0xf4, 0xaa, 0xde, 0x69,
|
||||
0x9b, 0xc4, 0xc2, 0x2c, 0x18, 0xf9, 0x2b, 0x0e, 0xcc, 0x96, 0x3b, 0xd5, 0x0a, 0x26, 0x08, 0xbe,
|
||||
0x09, 0x66, 0x70, 0xcb, 0xbb, 0x4b, 0x71, 0x12, 0xb7, 0xbe, 0xb0, 0x29, 0x64, 0xc6, 0xb3, 0xcb,
|
||||
0x78, 0x9e, 0x45, 0xdf, 0x4b, 0x63, 0xde, 0xf0, 0x03, 0x10, 0x6b, 0x9b, 0x04, 0xa5, 0xa2, 0x12,
|
||||
0xb7, 0x1e, 0x57, 0xde, 0x39, 0xe8, 0x8b, 0x91, 0x5f, 0xfb, 0xe2, 0x6b, 0x0d, 0x8b, 0xec, 0x74,
|
||||
0xaa, 0x99, 0x1a, 0xb6, 0x59, 0x3a, 0xec, 0xcf, 0x15, 0xb7, 0xfe, 0xf1, 0x06, 0xd9, 0x6f, 0x21,
|
||||
0x37, 0x93, 0x43, 0xb5, 0xe3, 0xbe, 0x98, 0xd8, 0x37, 0xed, 0xe6, 0x96, 0xec, 0x71, 0xc8, 0x9a,
|
||||
0x4f, 0x25, 0xdf, 0x05, 0x49, 0x1d, 0xed, 0x91, 0x52, 0x1b, 0xb7, 0xb0, 0x6b, 0x36, 0xe1, 0x32,
|
||||
0x98, 0x26, 0x16, 0x69, 0x22, 0x3f, 0xb2, 0xb8, 0x46, 0x0f, 0x50, 0x02, 0x89, 0x3a, 0x72, 0x6b,
|
||||
0x6d, 0x8b, 0x46, 0xed, 0xeb, 0x6b, 0x61, 0xd3, 0xd6, 0xe2, 0xab, 0x27, 0x22, 0xf7, 0xcb, 0xf7,
|
||||
0x57, 0x66, 0xb7, 0xb1, 0x43, 0x90, 0x43, 0xe4, 0x9f, 0x39, 0x30, 0x9b, 0x43, 0x2d, 0xec, 0x5a,
|
||||
0x04, 0xbe, 0x05, 0x12, 0x2d, 0x26, 0x60, 0x58, 0x75, 0x9f, 0x3a, 0xa6, 0xac, 0x1c, 0xf7, 0x45,
|
||||
0x48, 0x03, 0x0a, 0x5d, 0xca, 0x1a, 0x08, 0x4e, 0xf9, 0x3a, 0xbc, 0x08, 0xe2, 0x75, 0xca, 0x81,
|
||||
0xdb, 0x4c, 0x75, 0x60, 0x80, 0x35, 0x30, 0x63, 0xda, 0xb8, 0xe3, 0x90, 0xd4, 0x94, 0x34, 0xb5,
|
||||
0x9e, 0xd8, 0x5c, 0x0b, 0xca, 0xe8, 0x35, 0xc4, 0x49, 0x1d, 0xb7, 0xb1, 0xe5, 0x28, 0x57, 0xbd,
|
||||
0x5a, 0x7d, 0xf7, 0x5c, 0x5c, 0xff, 0x07, 0xb5, 0xf2, 0x00, 0xae, 0xc6, 0xa8, 0xb7, 0xe6, 0x1e,
|
||||
0x3e, 0x11, 0x23, 0xaf, 0x9e, 0x88, 0x11, 0xf9, 0xcf, 0x19, 0x30, 0x77, 0x52, 0xa7, 0x37, 0x4e,
|
||||
0x4b, 0x69, 0xe9, 0xa8, 0x2f, 0x46, 0xad, 0xfa, 0x71, 0x5f, 0x8c, 0xd3, 0xc4, 0x46, 0xf3, 0xb9,
|
||||
0x0e, 0x66, 0x6b, 0xb4, 0x3e, 0x7e, 0x36, 0x89, 0xcd, 0xe5, 0x0c, 0x6d, 0x9b, 0x4c, 0xd0, 0x36,
|
||||
0x99, 0xac, 0xb3, 0xaf, 0x24, 0x7e, 0x1c, 0x14, 0x52, 0x0b, 0x10, 0xb0, 0x02, 0x66, 0x5c, 0x62,
|
||||
0x92, 0x8e, 0x9b, 0x9a, 0xf2, 0xbb, 0x46, 0x3e, 0xad, 0x6b, 0x82, 0x00, 0xcb, 0xbe, 0xa7, 0x92,
|
||||
0x3e, 0xee, 0x8b, 0x2b, 0x23, 0x45, 0xa6, 0x24, 0xb2, 0xc6, 0xd8, 0x60, 0x0b, 0xc0, 0x07, 0x96,
|
||||
0x63, 0x36, 0x0d, 0x62, 0x36, 0x9b, 0xfb, 0x46, 0x1b, 0xb9, 0x9d, 0x26, 0x49, 0xc5, 0xfc, 0xf8,
|
||||
0xc4, 0xd3, 0x34, 0x74, 0xcf, 0x4f, 0xf3, 0xdd, 0x94, 0xff, 0x7a, 0x85, 0x3d, 0xee, 0x8b, 0x6b,
|
||||
0x54, 0x64, 0x9c, 0x48, 0xd6, 0x78, 0xdf, 0x18, 0x02, 0xc1, 0x0f, 0x41, 0xc2, 0xed, 0x54, 0x6d,
|
||||
0x8b, 0x18, 0xde, 0x80, 0xa5, 0xa6, 0x7d, 0xa9, 0xf4, 0x58, 0x29, 0xf4, 0x60, 0xfa, 0x14, 0x81,
|
||||
0xa9, 0xb0, 0x7e, 0x09, 0x81, 0xe5, 0x47, 0xcf, 0x45, 0x4e, 0x03, 0xd4, 0xe2, 0x01, 0xa0, 0x05,
|
||||
0x78, 0xd6, 0x22, 0x06, 0x72, 0xea, 0x54, 0x61, 0xe6, 0x4c, 0x85, 0xff, 0x31, 0x85, 0x55, 0xaa,
|
||||
0x30, 0xca, 0x40, 0x65, 0x16, 0x98, 0x59, 0x75, 0xea, 0xbe, 0xd4, 0x43, 0x0e, 0xcc, 0x13, 0x4c,
|
||||
0xcc, 0xa6, 0xc1, 0x2e, 0x52, 0xb3, 0x67, 0x35, 0xe2, 0x2d, 0xa6, 0xb3, 0x4c, 0x75, 0x86, 0xd0,
|
||||
0xf2, 0x44, 0x0d, 0x9a, 0xf4, 0xb1, 0xc1, 0x88, 0x35, 0xc1, 0xb9, 0x5d, 0x4c, 0x2c, 0xa7, 0xe1,
|
||||
0xbd, 0xde, 0x36, 0x2b, 0xec, 0xdc, 0x99, 0x69, 0xff, 0x9f, 0x85, 0x93, 0xa2, 0xe1, 0x8c, 0x51,
|
||||
0xd0, 0xbc, 0x17, 0xa9, 0xbd, 0xec, 0x99, 0xfd, 0xc4, 0x1f, 0x00, 0x66, 0x1a, 0x94, 0x38, 0x7e,
|
||||
0xa6, 0x96, 0xcc, 0xb4, 0x56, 0x86, 0xb4, 0x86, 0x2b, 0x3c, 0x4f, 0xad, 0xac, 0xc0, 0x5b, 0x31,
|
||||
0x6f, 0xab, 0xc8, 0x07, 0x51, 0x90, 0x08, 0xb7, 0xcf, 0xbb, 0x60, 0x6a, 0x1f, 0xb9, 0x74, 0x43,
|
||||
0x29, 0x99, 0x09, 0xb6, 0x60, 0xde, 0x21, 0x9a, 0x07, 0x85, 0xb7, 0xc0, 0xac, 0x59, 0x75, 0x89,
|
||||
0x69, 0xb1, 0x5d, 0x36, 0x31, 0x4b, 0x00, 0x87, 0x37, 0x40, 0xd4, 0xc1, 0xfe, 0x40, 0x4e, 0x4e,
|
||||
0x12, 0x75, 0x30, 0x6c, 0x80, 0xa4, 0x83, 0x8d, 0x4f, 0x2d, 0xb2, 0x63, 0xec, 0x22, 0x82, 0xfd,
|
||||
0xb1, 0x8b, 0x2b, 0xea, 0x64, 0x4c, 0xc7, 0x7d, 0x71, 0x89, 0x16, 0x35, 0xcc, 0x25, 0x6b, 0xc0,
|
||||
0xc1, 0x77, 0x2d, 0xb2, 0x53, 0x41, 0x04, 0xb3, 0x52, 0x7e, 0xc3, 0x81, 0x98, 0xff, 0x13, 0xf4,
|
||||
0xaf, 0x57, 0xf2, 0x32, 0x98, 0xde, 0xc5, 0x04, 0x05, 0xeb, 0x98, 0x1e, 0xe0, 0x0d, 0x10, 0x77,
|
||||
0x3b, 0x55, 0xc3, 0x3b, 0xb8, 0x6c, 0x1b, 0x5f, 0x38, 0x6d, 0x75, 0xb0, 0x5f, 0x40, 0x25, 0xe6,
|
||||
0x25, 0xa8, 0xcd, 0xb9, 0xf4, 0xe8, 0x6e, 0xcd, 0x3d, 0x0e, 0xb6, 0xec, 0x0f, 0x51, 0x30, 0xcf,
|
||||
0x9a, 0xba, 0x64, 0xb6, 0x4d, 0xdb, 0x85, 0x5f, 0x73, 0x20, 0x61, 0x5b, 0xce, 0xc9, 0x8c, 0x71,
|
||||
0x67, 0xcd, 0x98, 0xe1, 0x91, 0x1f, 0xf5, 0xc5, 0xf3, 0x21, 0xd4, 0x65, 0x6c, 0x5b, 0x04, 0xd9,
|
||||
0x2d, 0xb2, 0x3f, 0xc8, 0x31, 0x74, 0x3d, 0xd9, 0xe8, 0x01, 0xdb, 0x72, 0x82, 0xc1, 0xfb, 0x92,
|
||||
0x03, 0xd0, 0x36, 0xf7, 0x02, 0x22, 0xa3, 0x85, 0xda, 0x16, 0xae, 0xb3, 0xf5, 0xbe, 0x36, 0x36,
|
||||
0x0e, 0x39, 0xf6, 0x55, 0x40, 0x5f, 0xf1, 0x51, 0x5f, 0xbc, 0x38, 0x0e, 0x1e, 0x8a, 0x95, 0x2d,
|
||||
0xd6, 0x71, 0x2f, 0xf9, 0xb1, 0x37, 0x30, 0xbc, 0x6d, 0xee, 0x05, 0xe5, 0xa2, 0xe6, 0x2f, 0x38,
|
||||
0x90, 0xac, 0xf8, 0x53, 0xc4, 0xea, 0xf7, 0x19, 0x60, 0x53, 0x15, 0xc4, 0xc6, 0x9d, 0x15, 0xdb,
|
||||
0x75, 0x16, 0xdb, 0xea, 0x10, 0x6e, 0x28, 0xac, 0xe5, 0xa1, 0x21, 0x0e, 0x47, 0x94, 0xa4, 0x36,
|
||||
0x16, 0xcd, 0x6f, 0xc1, 0xec, 0xb2, 0x60, 0xee, 0x83, 0x99, 0x4f, 0x3a, 0xb8, 0xdd, 0xb1, 0xfd,
|
||||
0x28, 0x92, 0x8a, 0x32, 0xd9, 0x47, 0xcc, 0x51, 0x5f, 0xe4, 0x29, 0x7e, 0x10, 0x8d, 0xc6, 0x18,
|
||||
0x61, 0x0d, 0xc4, 0xc9, 0x4e, 0x1b, 0xb9, 0x3b, 0xb8, 0x49, 0x5f, 0x40, 0x72, 0xa2, 0x41, 0xa2,
|
||||
0xf4, 0x4b, 0x27, 0x14, 0x21, 0x85, 0x01, 0x2f, 0xec, 0x72, 0x60, 0xc1, 0x9b, 0x2e, 0x63, 0x20,
|
||||
0x35, 0xe5, 0x4b, 0xd5, 0x26, 0x96, 0x4a, 0x0d, 0xf3, 0x0c, 0xd5, 0xf7, 0x3c, 0xab, 0xef, 0x90,
|
||||
0x87, 0xac, 0xcd, 0x7b, 0x06, 0x3d, 0x38, 0x5f, 0xfa, 0x83, 0x03, 0x60, 0xf0, 0x9d, 0x08, 0x2f,
|
||||
0x83, 0xd5, 0x4a, 0x51, 0x57, 0x8d, 0x62, 0x49, 0xcf, 0x17, 0x0b, 0xc6, 0x9d, 0x42, 0xb9, 0xa4,
|
||||
0x6e, 0xe7, 0x6f, 0xe6, 0xd5, 0x1c, 0x1f, 0x49, 0x2f, 0x76, 0x7b, 0x52, 0x82, 0x3a, 0xaa, 0x9e,
|
||||
0x08, 0x94, 0xc1, 0x62, 0xd8, 0xfb, 0x9e, 0x5a, 0xe6, 0xb9, 0xf4, 0x7c, 0xb7, 0x27, 0xc5, 0xa9,
|
||||
0xd7, 0x3d, 0xe4, 0xc2, 0x4b, 0x60, 0x29, 0xec, 0x93, 0x55, 0xca, 0x7a, 0x36, 0x5f, 0xe0, 0xa3,
|
||||
0xe9, 0x73, 0xdd, 0x9e, 0x34, 0x4f, 0xfd, 0xb2, 0x6c, 0x15, 0x4a, 0x60, 0x21, 0xec, 0x5b, 0x28,
|
||||
0xf2, 0x53, 0xe9, 0x64, 0xb7, 0x27, 0xcd, 0x51, 0xb7, 0x02, 0x86, 0x9b, 0x20, 0x35, 0xec, 0x61,
|
||||
0xdc, 0xcd, 0xeb, 0xb7, 0x8c, 0x8a, 0xaa, 0x17, 0xf9, 0x58, 0x7a, 0xb9, 0xdb, 0x93, 0xf8, 0xc0,
|
||||
0x37, 0xd8, 0x5b, 0xe9, 0xd8, 0xc3, 0x6f, 0x85, 0xc8, 0xa5, 0x9f, 0xa2, 0x60, 0x61, 0xf8, 0xd3,
|
||||
0x06, 0x66, 0xc0, 0x85, 0x92, 0x56, 0x2c, 0x15, 0xcb, 0xd9, 0xdb, 0x46, 0x59, 0xcf, 0xea, 0x77,
|
||||
0xca, 0x23, 0x09, 0xfb, 0xa9, 0x50, 0xe7, 0x82, 0xd5, 0x84, 0xd7, 0x81, 0x30, 0xea, 0x9f, 0x53,
|
||||
0x4b, 0xc5, 0x72, 0x5e, 0x37, 0x4a, 0xaa, 0x96, 0x2f, 0xe6, 0x78, 0x2e, 0xbd, 0xda, 0xed, 0x49,
|
||||
0x4b, 0x14, 0x32, 0x34, 0x54, 0xf0, 0x6d, 0xf0, 0x9f, 0x51, 0x70, 0xa5, 0xa8, 0xe7, 0x0b, 0xef,
|
||||
0x05, 0xd8, 0x68, 0x7a, 0xa5, 0xdb, 0x93, 0x20, 0xc5, 0x56, 0x42, 0x13, 0x00, 0x2f, 0x83, 0x95,
|
||||
0x51, 0x68, 0x29, 0x5b, 0x2e, 0xab, 0x39, 0x7e, 0x2a, 0xcd, 0x77, 0x7b, 0x52, 0x92, 0x62, 0x4a,
|
||||
0xa6, 0xeb, 0xa2, 0x3a, 0xbc, 0x0a, 0x52, 0xa3, 0xde, 0x9a, 0xfa, 0xbe, 0xba, 0xad, 0xab, 0x39,
|
||||
0x3e, 0x96, 0x86, 0xdd, 0x9e, 0xb4, 0x40, 0xfd, 0x35, 0xf4, 0x11, 0xaa, 0x11, 0x74, 0x2a, 0xff,
|
||||
0xcd, 0x6c, 0xfe, 0xb6, 0x9a, 0xe3, 0xa7, 0xc3, 0xfc, 0x37, 0x4d, 0xab, 0x89, 0xea, 0xb4, 0x9c,
|
||||
0x4a, 0xe1, 0xe0, 0x85, 0x10, 0x79, 0xf6, 0x42, 0x88, 0x7c, 0x7e, 0x28, 0x44, 0x0e, 0x0e, 0x05,
|
||||
0xee, 0xe9, 0xa1, 0xc0, 0xfd, 0x7e, 0x28, 0x70, 0x8f, 0x5e, 0x0a, 0x91, 0xa7, 0x2f, 0x85, 0xc8,
|
||||
0xb3, 0x97, 0x42, 0xe4, 0xfe, 0xdf, 0x2f, 0xc4, 0x3d, 0xff, 0x3f, 0x35, 0xbf, 0x9f, 0xab, 0x33,
|
||||
0xfe, 0x0e, 0x79, 0xfd, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd7, 0x68, 0xea, 0xf2, 0xc4, 0x0d,
|
||||
0x00, 0x00,
|
||||
// 1438 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0x51, 0x68, 0xdb, 0x56,
|
||||
0x17, 0xb6, 0x1c, 0xc7, 0x89, 0xaf, 0x9d, 0x44, 0xbd, 0x49, 0x13, 0xc7, 0x7f, 0x7f, 0xc9, 0xd3,
|
||||
0x46, 0x09, 0xa5, 0x75, 0xda, 0x6c, 0x6c, 0x2c, 0x85, 0x6d, 0x56, 0xac, 0xac, 0x1e, 0xc5, 0x36,
|
||||
0xb2, 0xea, 0xd0, 0xee, 0x41, 0x28, 0xf6, 0xad, 0xa3, 0xcd, 0xd2, 0xf5, 0xac, 0xeb, 0x34, 0x66,
|
||||
0x2f, 0x7b, 0x2c, 0x1e, 0x8c, 0x3e, 0x16, 0x86, 0xa1, 0x30, 0xc6, 0x60, 0xcf, 0x7b, 0xde, 0x73,
|
||||
0x18, 0x83, 0x95, 0x3d, 0x95, 0x0d, 0xdc, 0x35, 0x85, 0x51, 0xf2, 0x98, 0x87, 0x3d, 0x0f, 0xe9,
|
||||
0x5e, 0xc5, 0xb2, 0x1d, 0x96, 0x79, 0x4f, 0xd1, 0x3d, 0xf7, 0x7c, 0xdf, 0x77, 0xce, 0xf1, 0x39,
|
||||
0x47, 0x0a, 0xb8, 0x54, 0xc5, 0x8e, 0x85, 0x9d, 0xf5, 0x3a, 0xde, 0x5f, 0xdf, 0xbf, 0xb1, 0x8b,
|
||||
0x88, 0x71, 0xc3, 0x7d, 0xce, 0x34, 0x5b, 0x98, 0x60, 0x08, 0xe9, 0x6d, 0xc6, 0xb5, 0xb0, 0xdb,
|
||||
0x94, 0xc0, 0x10, 0xbb, 0x86, 0x83, 0x4e, 0x21, 0x55, 0x6c, 0xda, 0x14, 0x93, 0x5a, 0xaa, 0xe3,
|
||||
0x3a, 0xf6, 0x1e, 0xd7, 0xdd, 0x27, 0x66, 0x5d, 0xa5, 0x28, 0x9d, 0x5e, 0x30, 0x5a, 0x7a, 0x25,
|
||||
0xd6, 0x31, 0xae, 0x37, 0xd0, 0xba, 0x77, 0xda, 0x6d, 0xdf, 0x5f, 0x27, 0xa6, 0x85, 0x1c, 0x62,
|
||||
0x58, 0x4d, 0x1f, 0x3b, 0xea, 0x60, 0xd8, 0x1d, 0x76, 0x25, 0x8c, 0x5e, 0xd5, 0xda, 0x2d, 0x83,
|
||||
0x98, 0x98, 0x05, 0x23, 0x7d, 0xcb, 0x01, 0xb8, 0x83, 0xcc, 0xfa, 0x1e, 0x41, 0xb5, 0x0a, 0x26,
|
||||
0xa8, 0xd8, 0x74, 0x2f, 0xe1, 0xdb, 0x20, 0x8a, 0xbd, 0xa7, 0x24, 0x97, 0xe6, 0xd6, 0xe6, 0x37,
|
||||
0x84, 0xcc, 0x78, 0xa2, 0x99, 0x81, 0xbf, 0xca, 0xbc, 0xe1, 0x0e, 0x88, 0x3e, 0xf0, 0xd8, 0x92,
|
||||
0xe1, 0x34, 0xb7, 0x16, 0x93, 0xdf, 0x3f, 0xec, 0x8b, 0xa1, 0xdf, 0xfa, 0xe2, 0xe5, 0xba, 0x49,
|
||||
0xf6, 0xda, 0xbb, 0x99, 0x2a, 0xb6, 0x58, 0x6e, 0xec, 0xcf, 0x35, 0xa7, 0xf6, 0xe9, 0x3a, 0xe9,
|
||||
0x34, 0x91, 0x93, 0xc9, 0xa1, 0xea, 0x49, 0x5f, 0x9c, 0xeb, 0x18, 0x56, 0x63, 0x53, 0xa2, 0x2c,
|
||||
0x92, 0xca, 0xe8, 0xa4, 0x1d, 0x90, 0xd0, 0xd0, 0x01, 0x29, 0xb5, 0x70, 0x13, 0x3b, 0x46, 0x03,
|
||||
0x2e, 0x81, 0x69, 0x62, 0x92, 0x06, 0xf2, 0xe2, 0x8b, 0xa9, 0xf4, 0x00, 0xd3, 0x20, 0x5e, 0x43,
|
||||
0x4e, 0xb5, 0x65, 0xd2, 0xd8, 0xbd, 0x18, 0xd4, 0xa0, 0x69, 0x73, 0xe1, 0xd5, 0x13, 0x91, 0xfb,
|
||||
0xf5, 0x87, 0x6b, 0x33, 0x5b, 0xd8, 0x26, 0xc8, 0x26, 0xd2, 0x2f, 0x1c, 0x98, 0xc9, 0xa1, 0x26,
|
||||
0x76, 0x4c, 0x02, 0xdf, 0x01, 0xf1, 0x26, 0x13, 0xd0, 0xcd, 0x9a, 0x47, 0x1d, 0x91, 0x97, 0x4f,
|
||||
0xfa, 0x22, 0xa4, 0x41, 0x05, 0x2e, 0x25, 0x15, 0xf8, 0xa7, 0x7c, 0x0d, 0x5e, 0x02, 0xb1, 0x1a,
|
||||
0xe5, 0xc0, 0x2d, 0xa6, 0x3a, 0x30, 0xc0, 0x2a, 0x88, 0x1a, 0x16, 0x6e, 0xdb, 0x24, 0x39, 0x95,
|
||||
0x9e, 0x5a, 0x8b, 0x6f, 0xac, 0xfa, 0xc5, 0x74, 0x3b, 0xe4, 0xb4, 0x9a, 0x5b, 0xd8, 0xb4, 0xe5,
|
||||
0xeb, 0x6e, 0xbd, 0xbe, 0x7f, 0x2e, 0xae, 0xfd, 0x8b, 0x7a, 0xb9, 0x00, 0x47, 0x65, 0xd4, 0x9b,
|
||||
0xb3, 0x0f, 0x9f, 0x88, 0xa1, 0x57, 0x4f, 0xc4, 0x90, 0xf4, 0x57, 0x14, 0xcc, 0x9e, 0xd6, 0xe9,
|
||||
0xad, 0xb3, 0x52, 0x5a, 0x3c, 0xee, 0x8b, 0x61, 0xb3, 0x76, 0xd2, 0x17, 0x63, 0x34, 0xb1, 0xd1,
|
||||
0x7c, 0x6e, 0x82, 0x99, 0x2a, 0xad, 0x8f, 0x97, 0x4d, 0x7c, 0x63, 0x29, 0x43, 0xfb, 0x28, 0xe3,
|
||||
0xf7, 0x51, 0x26, 0x6b, 0x77, 0xe4, 0xf8, 0x4f, 0x83, 0x42, 0xaa, 0x3e, 0x02, 0x56, 0x40, 0xd4,
|
||||
0x21, 0x06, 0x69, 0x3b, 0xc9, 0x29, 0xaf, 0x77, 0xa4, 0xb3, 0x7a, 0xc7, 0x0f, 0xb0, 0xec, 0x79,
|
||||
0xca, 0xa9, 0x93, 0xbe, 0xb8, 0x3c, 0x52, 0x64, 0x4a, 0x22, 0xa9, 0x8c, 0x0d, 0x36, 0x01, 0xbc,
|
||||
0x6f, 0xda, 0x46, 0x43, 0x27, 0x46, 0xa3, 0xd1, 0xd1, 0x5b, 0xc8, 0x69, 0x37, 0x48, 0x32, 0xe2,
|
||||
0xc5, 0x27, 0x9e, 0xa5, 0xa1, 0xb9, 0x7e, 0xaa, 0xe7, 0x26, 0xbf, 0xe6, 0x16, 0xf6, 0xa4, 0x2f,
|
||||
0xae, 0x52, 0x91, 0x71, 0x22, 0x49, 0xe5, 0x3d, 0x63, 0x00, 0x04, 0x3f, 0x06, 0x71, 0xa7, 0xbd,
|
||||
0x6b, 0x99, 0x44, 0x77, 0x27, 0x2e, 0x39, 0xed, 0x49, 0xa5, 0xc6, 0x4a, 0xa1, 0xf9, 0xe3, 0x28,
|
||||
0x0b, 0x4c, 0x85, 0xf5, 0x4b, 0x00, 0x2c, 0x3d, 0x7a, 0x2e, 0x72, 0x2a, 0xa0, 0x16, 0x17, 0x00,
|
||||
0x4d, 0xc0, 0xb3, 0x16, 0xd1, 0x91, 0x5d, 0xa3, 0x0a, 0xd1, 0x73, 0x15, 0x5e, 0x67, 0x0a, 0x2b,
|
||||
0x54, 0x61, 0x94, 0x81, 0xca, 0xcc, 0x33, 0xb3, 0x62, 0xd7, 0x3c, 0xa9, 0x87, 0x1c, 0x98, 0x23,
|
||||
0x98, 0x18, 0x0d, 0x9d, 0x5d, 0x24, 0x67, 0xce, 0x6b, 0xc4, 0x5b, 0x4c, 0x67, 0x89, 0xea, 0x0c,
|
||||
0xa1, 0xa5, 0x89, 0x1a, 0x34, 0xe1, 0x61, 0xfd, 0x11, 0x6b, 0x80, 0x0b, 0xfb, 0x98, 0x98, 0x76,
|
||||
0xdd, 0xfd, 0x79, 0x5b, 0xac, 0xb0, 0xb3, 0xe7, 0xa6, 0xfd, 0x06, 0x0b, 0x27, 0x49, 0xc3, 0x19,
|
||||
0xa3, 0xa0, 0x79, 0x2f, 0x50, 0x7b, 0xd9, 0x35, 0x7b, 0x89, 0xdf, 0x07, 0xcc, 0x34, 0x28, 0x71,
|
||||
0xec, 0x5c, 0x2d, 0x89, 0x69, 0x2d, 0x0f, 0x69, 0x0d, 0x57, 0x78, 0x8e, 0x5a, 0x59, 0x81, 0x37,
|
||||
0x23, 0xee, 0x56, 0x91, 0x0e, 0xc3, 0x20, 0x1e, 0x6c, 0x9f, 0x0f, 0xc0, 0x54, 0x07, 0x39, 0x74,
|
||||
0x43, 0xc9, 0x99, 0x09, 0x36, 0x61, 0xde, 0x26, 0xaa, 0x0b, 0x85, 0xb7, 0xc0, 0x8c, 0xb1, 0xeb,
|
||||
0x10, 0xc3, 0x64, 0xbb, 0x6c, 0x62, 0x16, 0x1f, 0x0e, 0xdf, 0x03, 0x61, 0x1b, 0x7b, 0x03, 0x39,
|
||||
0x39, 0x49, 0xd8, 0xc6, 0xb0, 0x0e, 0x12, 0x36, 0xd6, 0x1f, 0x98, 0x64, 0x4f, 0xdf, 0x47, 0x04,
|
||||
0x7b, 0x63, 0x17, 0x93, 0x95, 0xc9, 0x98, 0x4e, 0xfa, 0xe2, 0x22, 0x2d, 0x6a, 0x90, 0x4b, 0x52,
|
||||
0x81, 0x8d, 0x77, 0x4c, 0xb2, 0x57, 0x41, 0x04, 0xb3, 0x52, 0x7e, 0xc7, 0x81, 0x88, 0xfb, 0x7a,
|
||||
0xf9, 0xef, 0x2b, 0x79, 0x09, 0x4c, 0xef, 0x63, 0x82, 0xfc, 0x75, 0x4c, 0x0f, 0x70, 0x1b, 0xcc,
|
||||
0xd0, 0x37, 0x95, 0xc3, 0x76, 0xf1, 0xe5, 0xb3, 0x16, 0xc7, 0xf8, 0x0b, 0x51, 0x8e, 0xb8, 0x99,
|
||||
0xaa, 0x3e, 0x78, 0x73, 0xf6, 0xb1, 0xbf, 0x6d, 0x7f, 0x0c, 0x83, 0x39, 0xd6, 0xdc, 0x25, 0xa3,
|
||||
0x65, 0x58, 0x0e, 0xfc, 0x9a, 0x03, 0x71, 0xcb, 0xb4, 0x4f, 0x67, 0x8d, 0x3b, 0x6f, 0xd6, 0x74,
|
||||
0x97, 0xfb, 0xb8, 0x2f, 0x5e, 0x0c, 0xa0, 0xae, 0x62, 0xcb, 0x24, 0xc8, 0x6a, 0x92, 0xce, 0x20,
|
||||
0xd7, 0xc0, 0xf5, 0x64, 0x23, 0x08, 0x2c, 0xd3, 0xf6, 0x07, 0xf0, 0x2b, 0x0e, 0x40, 0xcb, 0x38,
|
||||
0xf0, 0x89, 0xf4, 0x26, 0x6a, 0x99, 0xb8, 0xc6, 0xd6, 0xfc, 0xea, 0xd8, 0x58, 0xe4, 0xd8, 0xe7,
|
||||
0x02, 0xfd, 0xa9, 0x8f, 0xfb, 0xe2, 0xa5, 0x71, 0xf0, 0x50, 0xac, 0x6c, 0xc1, 0x8e, 0x7b, 0x49,
|
||||
0x8f, 0xdd, 0xc1, 0xe1, 0x2d, 0xe3, 0xc0, 0x2f, 0x17, 0x35, 0x7f, 0xc9, 0x81, 0x44, 0xc5, 0x9b,
|
||||
0x26, 0x56, 0xbf, 0xcf, 0x01, 0x9b, 0x2e, 0x3f, 0x36, 0xee, 0xbc, 0xd8, 0x6e, 0xb2, 0xd8, 0x56,
|
||||
0x86, 0x70, 0x43, 0x61, 0x2d, 0x0d, 0x0d, 0x73, 0x30, 0xa2, 0x04, 0xb5, 0xb1, 0x68, 0x7e, 0xf7,
|
||||
0x67, 0x98, 0x05, 0x73, 0x0f, 0x44, 0x3f, 0x6b, 0xe3, 0x56, 0xdb, 0xf2, 0xa2, 0x48, 0xc8, 0xf2,
|
||||
0x64, 0x1f, 0x34, 0xc7, 0x7d, 0x91, 0xa7, 0xf8, 0x41, 0x34, 0x2a, 0x63, 0x84, 0x55, 0x10, 0x23,
|
||||
0x7b, 0x2d, 0xe4, 0xec, 0xe1, 0x06, 0xfd, 0x01, 0x12, 0x13, 0x0d, 0x14, 0xa5, 0x5f, 0x3c, 0xa5,
|
||||
0x08, 0x28, 0x0c, 0x78, 0x61, 0x97, 0x03, 0xf3, 0xee, 0x94, 0xe9, 0x03, 0xa9, 0x29, 0x4f, 0xaa,
|
||||
0x3a, 0xb1, 0x54, 0x72, 0x98, 0x67, 0xa8, 0xbe, 0x17, 0x59, 0x7d, 0x87, 0x3c, 0x24, 0x75, 0xce,
|
||||
0x35, 0x68, 0xfe, 0xf9, 0xca, 0x9f, 0x1c, 0x00, 0x81, 0xaf, 0xcc, 0xab, 0x60, 0xa5, 0x52, 0xd4,
|
||||
0x14, 0xbd, 0x58, 0xd2, 0xf2, 0xc5, 0x82, 0x7e, 0xa7, 0x50, 0x2e, 0x29, 0x5b, 0xf9, 0xed, 0xbc,
|
||||
0x92, 0xe3, 0x43, 0xa9, 0x85, 0x6e, 0x2f, 0x1d, 0xa7, 0x8e, 0x8a, 0x2b, 0x02, 0x25, 0xb0, 0x10,
|
||||
0xf4, 0xbe, 0xab, 0x94, 0x79, 0x2e, 0x35, 0xd7, 0xed, 0xa5, 0x63, 0xd4, 0xeb, 0x2e, 0x72, 0xe0,
|
||||
0x15, 0xb0, 0x18, 0xf4, 0xc9, 0xca, 0x65, 0x2d, 0x9b, 0x2f, 0xf0, 0xe1, 0xd4, 0x85, 0x6e, 0x2f,
|
||||
0x3d, 0x47, 0xfd, 0xb2, 0x6c, 0x25, 0xa6, 0xc1, 0x7c, 0xd0, 0xb7, 0x50, 0xe4, 0xa7, 0x52, 0x89,
|
||||
0x6e, 0x2f, 0x3d, 0x4b, 0xdd, 0x0a, 0x18, 0x6e, 0x80, 0xe4, 0xb0, 0x87, 0xbe, 0x93, 0xd7, 0x6e,
|
||||
0xe9, 0x15, 0x45, 0x2b, 0xf2, 0x91, 0xd4, 0x52, 0xb7, 0x97, 0xe6, 0x7d, 0x5f, 0x7f, 0x7f, 0xa5,
|
||||
0x22, 0x0f, 0xbf, 0x11, 0x42, 0x57, 0x7e, 0x0e, 0x83, 0xf9, 0xe1, 0x4f, 0x1c, 0x98, 0x01, 0xff,
|
||||
0x2b, 0xa9, 0xc5, 0x52, 0xb1, 0x9c, 0xbd, 0xad, 0x97, 0xb5, 0xac, 0x76, 0xa7, 0x3c, 0x92, 0xb0,
|
||||
0x97, 0x0a, 0x75, 0x2e, 0x98, 0x0d, 0x78, 0x13, 0x08, 0xa3, 0xfe, 0x39, 0xa5, 0x54, 0x2c, 0xe7,
|
||||
0x35, 0xbd, 0xa4, 0xa8, 0xf9, 0x62, 0x8e, 0xe7, 0x52, 0x2b, 0xdd, 0x5e, 0x7a, 0x91, 0x42, 0x86,
|
||||
0x86, 0x0a, 0xbe, 0x0b, 0xfe, 0x3f, 0x0a, 0xae, 0x14, 0xb5, 0x7c, 0xe1, 0x43, 0x1f, 0x1b, 0x4e,
|
||||
0x2d, 0x77, 0x7b, 0x69, 0x48, 0xb1, 0x95, 0xc0, 0x04, 0xc0, 0xab, 0x60, 0x79, 0x14, 0x5a, 0xca,
|
||||
0x96, 0xcb, 0x4a, 0x8e, 0x9f, 0x4a, 0xf1, 0xdd, 0x5e, 0x3a, 0x41, 0x31, 0x25, 0xc3, 0x71, 0x50,
|
||||
0x0d, 0x5e, 0x07, 0xc9, 0x51, 0x6f, 0x55, 0xf9, 0x48, 0xd9, 0xd2, 0x94, 0x1c, 0x1f, 0x49, 0xc1,
|
||||
0x6e, 0x2f, 0x3d, 0x4f, 0xfd, 0x55, 0xf4, 0x09, 0xaa, 0x12, 0x74, 0x26, 0xff, 0x76, 0x36, 0x7f,
|
||||
0x5b, 0xc9, 0xf1, 0xd3, 0x41, 0xfe, 0x6d, 0xc3, 0x6c, 0xa0, 0x1a, 0x2d, 0xa7, 0x5c, 0x38, 0x7c,
|
||||
0x21, 0x84, 0x9e, 0xbd, 0x10, 0x42, 0x5f, 0x1c, 0x09, 0xa1, 0xc3, 0x23, 0x81, 0x7b, 0x7a, 0x24,
|
||||
0x70, 0x7f, 0x1c, 0x09, 0xdc, 0xa3, 0x97, 0x42, 0xe8, 0xe9, 0x4b, 0x21, 0xf4, 0xec, 0xa5, 0x10,
|
||||
0xba, 0xf7, 0xcf, 0x0b, 0xf1, 0xc0, 0xfb, 0x17, 0xce, 0xeb, 0xe7, 0xdd, 0xa8, 0xb7, 0x43, 0xde,
|
||||
0xfc, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x2e, 0xc3, 0x29, 0x39, 0xdd, 0x0d, 0x00, 0x00,
|
||||
}
|
||||
|
||||
func (this *TextProposal) Equal(that interface{}) bool {
|
||||
|
@ -709,7 +709,7 @@ func (this *TallyResult) Equal(that interface{}) bool {
|
|||
}
|
||||
return true
|
||||
}
|
||||
func (m *SubVote) Marshal() (dAtA []byte, err error) {
|
||||
func (m *WeightedVoteOption) Marshal() (dAtA []byte, err error) {
|
||||
size := m.Size()
|
||||
dAtA = make([]byte, size)
|
||||
n, err := m.MarshalToSizedBuffer(dAtA[:size])
|
||||
|
@ -719,20 +719,20 @@ func (m *SubVote) Marshal() (dAtA []byte, err error) {
|
|||
return dAtA[:n], nil
|
||||
}
|
||||
|
||||
func (m *SubVote) MarshalTo(dAtA []byte) (int, error) {
|
||||
func (m *WeightedVoteOption) MarshalTo(dAtA []byte) (int, error) {
|
||||
size := m.Size()
|
||||
return m.MarshalToSizedBuffer(dAtA[:size])
|
||||
}
|
||||
|
||||
func (m *SubVote) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
||||
func (m *WeightedVoteOption) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
||||
i := len(dAtA)
|
||||
_ = i
|
||||
var l int
|
||||
_ = l
|
||||
{
|
||||
size := m.Rate.Size()
|
||||
size := m.Weight.Size()
|
||||
i -= size
|
||||
if _, err := m.Rate.MarshalTo(dAtA[i:]); err != nil {
|
||||
if _, err := m.Weight.MarshalTo(dAtA[i:]); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
i = encodeVarintGov(dAtA, i, uint64(size))
|
||||
|
@ -1017,10 +1017,10 @@ func (m *Vote) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
|||
_ = i
|
||||
var l int
|
||||
_ = l
|
||||
if len(m.SubVotes) > 0 {
|
||||
for iNdEx := len(m.SubVotes) - 1; iNdEx >= 0; iNdEx-- {
|
||||
if len(m.Options) > 0 {
|
||||
for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- {
|
||||
{
|
||||
size, err := m.SubVotes[iNdEx].MarshalToSizedBuffer(dAtA[:i])
|
||||
size, err := m.Options[iNdEx].MarshalToSizedBuffer(dAtA[:i])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
@ -1186,7 +1186,7 @@ func encodeVarintGov(dAtA []byte, offset int, v uint64) int {
|
|||
dAtA[offset] = uint8(v)
|
||||
return base
|
||||
}
|
||||
func (m *SubVote) Size() (n int) {
|
||||
func (m *WeightedVoteOption) Size() (n int) {
|
||||
if m == nil {
|
||||
return 0
|
||||
}
|
||||
|
@ -1195,7 +1195,7 @@ func (m *SubVote) Size() (n int) {
|
|||
if m.Option != 0 {
|
||||
n += 1 + sovGov(uint64(m.Option))
|
||||
}
|
||||
l = m.Rate.Size()
|
||||
l = m.Weight.Size()
|
||||
n += 1 + l + sovGov(uint64(l))
|
||||
return n
|
||||
}
|
||||
|
@ -1304,8 +1304,8 @@ func (m *Vote) Size() (n int) {
|
|||
if l > 0 {
|
||||
n += 1 + l + sovGov(uint64(l))
|
||||
}
|
||||
if len(m.SubVotes) > 0 {
|
||||
for _, e := range m.SubVotes {
|
||||
if len(m.Options) > 0 {
|
||||
for _, e := range m.Options {
|
||||
l = e.Size()
|
||||
n += 1 + l + sovGov(uint64(l))
|
||||
}
|
||||
|
@ -1362,7 +1362,7 @@ func sovGov(x uint64) (n int) {
|
|||
func sozGov(x uint64) (n int) {
|
||||
return sovGov(uint64((x << 1) ^ uint64((int64(x) >> 63))))
|
||||
}
|
||||
func (m *SubVote) Unmarshal(dAtA []byte) error {
|
||||
func (m *WeightedVoteOption) Unmarshal(dAtA []byte) error {
|
||||
l := len(dAtA)
|
||||
iNdEx := 0
|
||||
for iNdEx < l {
|
||||
|
@ -1385,10 +1385,10 @@ func (m *SubVote) Unmarshal(dAtA []byte) error {
|
|||
fieldNum := int32(wire >> 3)
|
||||
wireType := int(wire & 0x7)
|
||||
if wireType == 4 {
|
||||
return fmt.Errorf("proto: SubVote: wiretype end group for non-group")
|
||||
return fmt.Errorf("proto: WeightedVoteOption: wiretype end group for non-group")
|
||||
}
|
||||
if fieldNum <= 0 {
|
||||
return fmt.Errorf("proto: SubVote: illegal tag %d (wire type %d)", fieldNum, wire)
|
||||
return fmt.Errorf("proto: WeightedVoteOption: illegal tag %d (wire type %d)", fieldNum, wire)
|
||||
}
|
||||
switch fieldNum {
|
||||
case 1:
|
||||
|
@ -1412,7 +1412,7 @@ func (m *SubVote) Unmarshal(dAtA []byte) error {
|
|||
}
|
||||
case 2:
|
||||
if wireType != 2 {
|
||||
return fmt.Errorf("proto: wrong wireType = %d for field Rate", wireType)
|
||||
return fmt.Errorf("proto: wrong wireType = %d for field Weight", wireType)
|
||||
}
|
||||
var stringLen uint64
|
||||
for shift := uint(0); ; shift += 7 {
|
||||
|
@ -1440,7 +1440,7 @@ func (m *SubVote) Unmarshal(dAtA []byte) error {
|
|||
if postIndex > l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
if err := m.Rate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
|
||||
if err := m.Weight.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
|
||||
return err
|
||||
}
|
||||
iNdEx = postIndex
|
||||
|
@ -2320,7 +2320,7 @@ func (m *Vote) Unmarshal(dAtA []byte) error {
|
|||
iNdEx = postIndex
|
||||
case 3:
|
||||
if wireType != 2 {
|
||||
return fmt.Errorf("proto: wrong wireType = %d for field SubVotes", wireType)
|
||||
return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType)
|
||||
}
|
||||
var msglen int
|
||||
for shift := uint(0); ; shift += 7 {
|
||||
|
@ -2347,8 +2347,8 @@ func (m *Vote) Unmarshal(dAtA []byte) error {
|
|||
if postIndex > l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
m.SubVotes = append(m.SubVotes, SubVote{})
|
||||
if err := m.SubVotes[len(m.SubVotes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
|
||||
m.Options = append(m.Options, WeightedVoteOption{})
|
||||
if err := m.Options[len(m.Options)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
|
||||
return err
|
||||
}
|
||||
iNdEx = postIndex
|
||||
|
|
|
@ -177,8 +177,8 @@ func (msg MsgDeposit) GetSigners() []sdk.AccAddress {
|
|||
|
||||
// NewMsgVote creates a message to cast a vote on an active proposal
|
||||
//nolint:interfacer
|
||||
func NewMsgVote(voter sdk.AccAddress, proposalID uint64, subVotes []SubVote) *MsgVote {
|
||||
return &MsgVote{proposalID, voter.String(), subVotes}
|
||||
func NewMsgVote(voter sdk.AccAddress, proposalID uint64, options WeightedVoteOptions) *MsgVote {
|
||||
return &MsgVote{proposalID, voter.String(), options}
|
||||
}
|
||||
|
||||
// Route implements Msg
|
||||
|
@ -193,14 +193,25 @@ func (msg MsgVote) ValidateBasic() error {
|
|||
return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Voter)
|
||||
}
|
||||
|
||||
if len(msg.SubVotes) == 0 {
|
||||
return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, SubVotes(msg.SubVotes).String())
|
||||
if len(msg.Options) == 0 {
|
||||
return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, WeightedVoteOptions(msg.Options).String())
|
||||
}
|
||||
|
||||
for _, subvote := range msg.SubVotes {
|
||||
if !ValidSubVote(subvote) {
|
||||
return sdkerrors.Wrap(ErrInvalidVote, subvote.String())
|
||||
totalWeight := sdk.NewDec(0)
|
||||
usedOptions := make(map[VoteOption]bool)
|
||||
for _, option := range msg.Options {
|
||||
if !ValidWeightedVoteOption(option) {
|
||||
return sdkerrors.Wrap(ErrInvalidVote, option.String())
|
||||
}
|
||||
totalWeight = totalWeight.Add(option.Weight)
|
||||
if usedOptions[option.Option] {
|
||||
return sdkerrors.Wrap(ErrInvalidVote, "Duplicated vote option")
|
||||
}
|
||||
usedOptions[option.Option] = true
|
||||
}
|
||||
|
||||
if totalWeight.GT(sdk.NewDec(1)) {
|
||||
return sdkerrors.Wrap(ErrInvalidVote, "Total weight overflow 1.00")
|
||||
}
|
||||
|
||||
return nil
|
||||
|
|
|
@ -97,22 +97,34 @@ func TestMsgVote(t *testing.T) {
|
|||
tests := []struct {
|
||||
proposalID uint64
|
||||
voterAddr sdk.AccAddress
|
||||
subvotes SubVotes
|
||||
options WeightedVoteOptions
|
||||
expectPass bool
|
||||
}{
|
||||
{0, addrs[0], SubVotes{NewSubVote(OptionYes, 1)}, true},
|
||||
{0, sdk.AccAddress{}, SubVotes{NewSubVote(OptionYes, 1)}, false},
|
||||
{0, addrs[0], SubVotes{NewSubVote(OptionNo, 1)}, true},
|
||||
{0, addrs[0], SubVotes{NewSubVote(OptionNoWithVeto, 1)}, true},
|
||||
{0, addrs[0], SubVotes{NewSubVote(OptionAbstain, 1)}, true},
|
||||
{0, addrs[0], SubVotes{NewSubVote(OptionYes, 1), NewSubVote(OptionAbstain, 1)}, true},
|
||||
{0, addrs[0], SubVotes{NewSubVote(OptionYes, 0)}, false},
|
||||
{0, addrs[0], SubVotes{}, false},
|
||||
{0, addrs[0], SubVotes{NewSubVote(VoteOption(0x13), 1)}, false},
|
||||
{0, addrs[0], NewNonSplitVoteOption(OptionYes), true},
|
||||
{0, sdk.AccAddress{}, NewNonSplitVoteOption(OptionYes), false},
|
||||
{0, addrs[0], NewNonSplitVoteOption(OptionNo), true},
|
||||
{0, addrs[0], NewNonSplitVoteOption(OptionNoWithVeto), true},
|
||||
{0, addrs[0], NewNonSplitVoteOption(OptionAbstain), true},
|
||||
{0, addrs[0], WeightedVoteOptions{ // weight sum > 1
|
||||
WeightedVoteOption{Option: OptionYes, Weight: sdk.NewDec(1)},
|
||||
WeightedVoteOption{Option: OptionAbstain, Weight: sdk.NewDec(1)},
|
||||
}, false},
|
||||
{0, addrs[0], WeightedVoteOptions{ // duplicate option
|
||||
WeightedVoteOption{Option: OptionYes, Weight: sdk.NewDecWithPrec(5, 1)},
|
||||
WeightedVoteOption{Option: OptionYes, Weight: sdk.NewDecWithPrec(5, 1)},
|
||||
}, false},
|
||||
{0, addrs[0], WeightedVoteOptions{ // zero weight
|
||||
WeightedVoteOption{Option: OptionYes, Weight: sdk.NewDec(0)},
|
||||
}, false},
|
||||
{0, addrs[0], WeightedVoteOptions{ // negative weight
|
||||
WeightedVoteOption{Option: OptionYes, Weight: sdk.NewDec(-1)},
|
||||
}, false},
|
||||
{0, addrs[0], WeightedVoteOptions{}, false},
|
||||
{0, addrs[0], NewNonSplitVoteOption(VoteOption(0x13)), false},
|
||||
}
|
||||
|
||||
for i, tc := range tests {
|
||||
msg := NewMsgVote(tc.voterAddr, tc.proposalID, tc.subvotes)
|
||||
msg := NewMsgVote(tc.voterAddr, tc.proposalID, tc.options)
|
||||
if tc.expectPass {
|
||||
require.Nil(t, msg.ValidateBasic(), "test: %v", i)
|
||||
} else {
|
||||
|
|
|
@ -8,23 +8,23 @@ import (
|
|||
|
||||
// ValidatorGovInfo used for tallying
|
||||
type ValidatorGovInfo struct {
|
||||
Address sdk.ValAddress // address of the validator operator
|
||||
BondedTokens sdk.Int // Power of a Validator
|
||||
DelegatorShares sdk.Dec // Total outstanding delegator shares
|
||||
DelegatorDeductions sdk.Dec // Delegator deductions from validator's delegators voting independently
|
||||
Vote SubVotes // Vote of the validator
|
||||
Address sdk.ValAddress // address of the validator operator
|
||||
BondedTokens sdk.Int // Power of a Validator
|
||||
DelegatorShares sdk.Dec // Total outstanding delegator shares
|
||||
DelegatorDeductions sdk.Dec // Delegator deductions from validator's delegators voting independently
|
||||
Vote WeightedVoteOptions // Vote of the validator
|
||||
}
|
||||
|
||||
// NewValidatorGovInfo creates a ValidatorGovInfo instance
|
||||
func NewValidatorGovInfo(address sdk.ValAddress, bondedTokens sdk.Int, delegatorShares,
|
||||
delegatorDeductions sdk.Dec, subvotes SubVotes) ValidatorGovInfo {
|
||||
delegatorDeductions sdk.Dec, options WeightedVoteOptions) ValidatorGovInfo {
|
||||
|
||||
return ValidatorGovInfo{
|
||||
Address: address,
|
||||
BondedTokens: bondedTokens,
|
||||
DelegatorShares: delegatorShares,
|
||||
DelegatorDeductions: delegatorDeductions,
|
||||
Vote: subvotes,
|
||||
Vote: options,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -119,9 +119,9 @@ func (m *MsgSubmitProposalResponse) GetProposalId() uint64 {
|
|||
|
||||
// MsgVote defines a message to cast a vote.
|
||||
type MsgVote struct {
|
||||
ProposalId uint64 `protobuf:"varint,1,opt,name=proposal_id,json=proposalId,proto3" json:"proposal_id" yaml:"proposal_id"`
|
||||
Voter string `protobuf:"bytes,2,opt,name=voter,proto3" json:"voter,omitempty"`
|
||||
SubVotes []SubVote `protobuf:"bytes,3,rep,name=sub_votes,json=subVotes,proto3" json:"sub_votes"`
|
||||
ProposalId uint64 `protobuf:"varint,1,opt,name=proposal_id,json=proposalId,proto3" json:"proposal_id" yaml:"proposal_id"`
|
||||
Voter string `protobuf:"bytes,2,opt,name=voter,proto3" json:"voter,omitempty"`
|
||||
Options []WeightedVoteOption `protobuf:"bytes,3,rep,name=options,proto3" json:"options"`
|
||||
}
|
||||
|
||||
func (m *MsgVote) Reset() { *m = MsgVote{} }
|
||||
|
@ -281,45 +281,45 @@ func init() {
|
|||
func init() { proto.RegisterFile("cosmos/gov/v1beta1/tx.proto", fileDescriptor_3c053992595e3dce) }
|
||||
|
||||
var fileDescriptor_3c053992595e3dce = []byte{
|
||||
// 593 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x31, 0x6f, 0xd3, 0x40,
|
||||
0x14, 0xb6, 0x93, 0xd2, 0xb4, 0x17, 0xa9, 0xa5, 0xa7, 0x08, 0x25, 0x4e, 0x65, 0x47, 0x46, 0x45,
|
||||
0x59, 0x62, 0xd3, 0xb0, 0x15, 0x09, 0x09, 0x17, 0x21, 0x40, 0x8a, 0x04, 0xae, 0xc4, 0xc0, 0x12,
|
||||
0xd9, 0x8e, 0x6b, 0x2c, 0x12, 0x3f, 0x2b, 0x77, 0x8e, 0x9a, 0x8d, 0x11, 0x31, 0x00, 0x23, 0x63,
|
||||
0x66, 0x66, 0x16, 0xfe, 0x41, 0xc5, 0xd4, 0x91, 0x01, 0x05, 0x94, 0x2c, 0xc0, 0xd8, 0x5f, 0x80,
|
||||
0xec, 0xbb, 0x4b, 0xab, 0x26, 0x8d, 0x40, 0xea, 0x94, 0xbc, 0xf7, 0xdd, 0xf7, 0xe9, 0xbe, 0xef,
|
||||
0x3d, 0x1f, 0xaa, 0x7a, 0x40, 0x7a, 0x40, 0xcc, 0x00, 0x06, 0xe6, 0x60, 0xd7, 0xf5, 0xa9, 0xb3,
|
||||
0x6b, 0xd2, 0x23, 0x23, 0xee, 0x03, 0x05, 0x8c, 0x19, 0x68, 0x04, 0x30, 0x30, 0x38, 0xa8, 0xa8,
|
||||
0x9c, 0xe0, 0x3a, 0xc4, 0x9f, 0x31, 0x3c, 0x08, 0x23, 0xc6, 0x51, 0xb6, 0x17, 0x08, 0xa6, 0x7c,
|
||||
0x86, 0x56, 0x18, 0xda, 0xce, 0x2a, 0x93, 0xcb, 0x33, 0xa8, 0x14, 0x40, 0x00, 0xac, 0x9f, 0xfe,
|
||||
0x13, 0x84, 0x00, 0x20, 0xe8, 0xfa, 0x66, 0x56, 0xb9, 0xc9, 0xa1, 0xe9, 0x44, 0x43, 0x06, 0xe9,
|
||||
0xef, 0x73, 0x68, 0xab, 0x45, 0x82, 0x83, 0xc4, 0xed, 0x85, 0xf4, 0x69, 0x1f, 0x62, 0x20, 0x4e,
|
||||
0x17, 0xdf, 0x45, 0x05, 0x0f, 0x22, 0xea, 0x47, 0xb4, 0x2c, 0xd7, 0xe4, 0x7a, 0xb1, 0x59, 0x32,
|
||||
0x98, 0x84, 0x21, 0x24, 0x8c, 0xfb, 0xd1, 0xd0, 0x2a, 0x7e, 0xfd, 0xdc, 0x28, 0xec, 0xb3, 0x83,
|
||||
0xb6, 0x60, 0xe0, 0x77, 0x32, 0xda, 0x0c, 0xa3, 0x90, 0x86, 0x4e, 0xb7, 0xdd, 0xf1, 0x63, 0x20,
|
||||
0x21, 0x2d, 0xe7, 0x6a, 0xf9, 0x7a, 0xb1, 0x59, 0x31, 0xf8, 0x65, 0x53, 0xdf, 0x22, 0x0c, 0x63,
|
||||
0x1f, 0xc2, 0xc8, 0x7a, 0x72, 0x3c, 0xd6, 0xa4, 0xd3, 0xb1, 0x76, 0x63, 0xe8, 0xf4, 0xba, 0x7b,
|
||||
0xfa, 0x05, 0xbe, 0xfe, 0xe9, 0x87, 0x56, 0x0f, 0x42, 0xfa, 0x32, 0x71, 0x0d, 0x0f, 0x7a, 0xdc,
|
||||
0x33, 0xff, 0x69, 0x90, 0xce, 0x2b, 0x93, 0x0e, 0x63, 0x9f, 0x64, 0x52, 0xc4, 0xde, 0xe0, 0xec,
|
||||
0x07, 0x8c, 0x8c, 0x15, 0xb4, 0x16, 0x67, 0xce, 0xfc, 0x7e, 0x39, 0x5f, 0x93, 0xeb, 0xeb, 0xf6,
|
||||
0xac, 0xde, 0xbb, 0xfe, 0x66, 0xa4, 0x49, 0x1f, 0x47, 0x9a, 0xf4, 0x6b, 0xa4, 0x49, 0xaf, 0xbf,
|
||||
0xd7, 0x24, 0xdd, 0x43, 0x95, 0xb9, 0x40, 0x6c, 0x9f, 0xc4, 0x10, 0x11, 0x1f, 0x3f, 0x44, 0xc5,
|
||||
0x98, 0xf7, 0xda, 0x61, 0x27, 0x0b, 0x67, 0xc5, 0xda, 0xf9, 0x33, 0xd6, 0xce, 0xb7, 0x4f, 0xc7,
|
||||
0x1a, 0x66, 0x36, 0xce, 0x35, 0x75, 0x1b, 0x89, 0xea, 0x71, 0x47, 0xff, 0x22, 0xa3, 0x42, 0x8b,
|
||||
0x04, 0xcf, 0x81, 0x5e, 0x99, 0x26, 0x2e, 0xa1, 0x6b, 0x03, 0xa0, 0x7e, 0xbf, 0x9c, 0xcb, 0x3c,
|
||||
0xb2, 0x02, 0xdf, 0x43, 0xeb, 0x24, 0x71, 0xdb, 0x69, 0x41, 0xca, 0xf9, 0x6c, 0x0c, 0x55, 0x63,
|
||||
0x7e, 0x25, 0x8d, 0x83, 0xc4, 0x4d, 0x6f, 0x63, 0xad, 0xa4, 0x83, 0xb0, 0xd7, 0x08, 0x2b, 0xc9,
|
||||
0x82, 0x80, 0xb6, 0xd0, 0x26, 0xbf, 0xba, 0x88, 0x45, 0xff, 0x2d, 0x23, 0xd4, 0x22, 0x81, 0x08,
|
||||
0xfc, 0xaa, 0x1c, 0x6d, 0xa3, 0x75, 0xbe, 0x00, 0x20, 0x5c, 0x9d, 0x35, 0xb0, 0x87, 0x56, 0x9d,
|
||||
0x1e, 0x24, 0x11, 0xe5, 0xb6, 0x96, 0x6c, 0xd7, 0xed, 0xd4, 0xd4, 0x7f, 0xed, 0x10, 0x97, 0x5e,
|
||||
0x60, 0xbf, 0x84, 0xf0, 0x99, 0x55, 0x91, 0x40, 0xf3, 0x6d, 0x0e, 0xe5, 0x5b, 0x24, 0xc0, 0x87,
|
||||
0x68, 0xe3, 0xc2, 0xb7, 0xb4, 0xb3, 0x28, 0xed, 0xb9, 0x0d, 0x53, 0x1a, 0xff, 0x74, 0x6c, 0xb6,
|
||||
0x88, 0x8f, 0xd0, 0x4a, 0xb6, 0x3c, 0xd5, 0x4b, 0x68, 0x29, 0xa8, 0xdc, 0x5c, 0x02, 0xce, 0x94,
|
||||
0x9e, 0xa1, 0x82, 0x98, 0x9b, 0x7a, 0xc9, 0x79, 0x8e, 0x2b, 0xb7, 0x96, 0xe3, 0x42, 0xd2, 0xb2,
|
||||
0x8e, 0x27, 0xaa, 0x7c, 0x32, 0x51, 0xe5, 0x9f, 0x13, 0x55, 0xfe, 0x30, 0x55, 0xa5, 0x93, 0xa9,
|
||||
0x2a, 0x7d, 0x9b, 0xaa, 0xd2, 0x8b, 0xe5, 0x03, 0x38, 0xca, 0x1e, 0xbc, 0x6c, 0x0c, 0xee, 0x6a,
|
||||
0xf6, 0xd2, 0xdc, 0xf9, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x7e, 0x2c, 0x84, 0x48, 0x5c, 0x05, 0x00,
|
||||
0x00,
|
||||
// 596 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x3d, 0x6f, 0xd3, 0x50,
|
||||
0x14, 0xb5, 0x93, 0xd2, 0xd0, 0x17, 0xa9, 0xa5, 0x4f, 0x11, 0x4a, 0xd3, 0xca, 0x8e, 0x8c, 0x5a,
|
||||
0x65, 0xa9, 0x4d, 0xcb, 0x56, 0x26, 0x5c, 0x54, 0x01, 0x52, 0x04, 0x18, 0x09, 0x24, 0x96, 0xca,
|
||||
0x76, 0x5e, 0x5f, 0x2d, 0x12, 0x5f, 0x2b, 0xef, 0x25, 0x6a, 0x36, 0x46, 0xc4, 0x00, 0x8c, 0x8c,
|
||||
0x9d, 0x99, 0xf9, 0x03, 0x6c, 0x15, 0x53, 0x47, 0x06, 0x14, 0x50, 0xbb, 0x00, 0x63, 0x7f, 0x01,
|
||||
0xf2, 0xfb, 0x48, 0xab, 0x36, 0x8d, 0x40, 0xea, 0x94, 0xdc, 0x7b, 0xee, 0x39, 0xf2, 0x39, 0xf7,
|
||||
0xda, 0x68, 0x31, 0x06, 0xd6, 0x01, 0xe6, 0x51, 0xe8, 0x7b, 0xfd, 0xb5, 0x88, 0xf0, 0x70, 0xcd,
|
||||
0xe3, 0x7b, 0x6e, 0xd6, 0x05, 0x0e, 0x18, 0x4b, 0xd0, 0xa5, 0xd0, 0x77, 0x15, 0x58, 0xb3, 0x14,
|
||||
0x21, 0x0a, 0x19, 0x19, 0x31, 0x62, 0x48, 0x52, 0xc9, 0xa9, 0x2d, 0x8d, 0x11, 0xcc, 0xf9, 0x12,
|
||||
0x5d, 0x90, 0xe8, 0xb6, 0xa8, 0x3c, 0x25, 0x2f, 0xa1, 0x0a, 0x05, 0x0a, 0xb2, 0x9f, 0xff, 0xd3,
|
||||
0x04, 0x0a, 0x40, 0xdb, 0xc4, 0x13, 0x55, 0xd4, 0xdb, 0xf1, 0xc2, 0x74, 0x20, 0x21, 0xe7, 0x7d,
|
||||
0x01, 0xcd, 0x37, 0x19, 0x7d, 0xd6, 0x8b, 0x3a, 0x09, 0x7f, 0xd2, 0x85, 0x0c, 0x58, 0xd8, 0xc6,
|
||||
0x77, 0x51, 0x29, 0x86, 0x94, 0x93, 0x94, 0x57, 0xcd, 0xba, 0xd9, 0x28, 0xaf, 0x57, 0x5c, 0x29,
|
||||
0xe1, 0x6a, 0x09, 0xf7, 0x5e, 0x3a, 0xf0, 0xcb, 0x5f, 0x3f, 0xaf, 0x96, 0x36, 0xe5, 0x60, 0xa0,
|
||||
0x19, 0xf8, 0x9d, 0x89, 0xe6, 0x92, 0x34, 0xe1, 0x49, 0xd8, 0xde, 0x6e, 0x91, 0x0c, 0x58, 0xc2,
|
||||
0xab, 0x85, 0x7a, 0xb1, 0x51, 0x5e, 0x5f, 0x70, 0xd5, 0xc3, 0xe6, 0xbe, 0x75, 0x18, 0xee, 0x26,
|
||||
0x24, 0xa9, 0xff, 0xe8, 0x60, 0x68, 0x1b, 0x27, 0x43, 0xfb, 0xe6, 0x20, 0xec, 0xb4, 0x37, 0x9c,
|
||||
0x73, 0x7c, 0xe7, 0xd3, 0x0f, 0xbb, 0x41, 0x13, 0xbe, 0xdb, 0x8b, 0xdc, 0x18, 0x3a, 0xca, 0xb3,
|
||||
0xfa, 0x59, 0x65, 0xad, 0x57, 0x1e, 0x1f, 0x64, 0x84, 0x09, 0x29, 0x16, 0xcc, 0x2a, 0xf6, 0x7d,
|
||||
0x49, 0xc6, 0x35, 0x74, 0x3d, 0x13, 0xce, 0x48, 0xb7, 0x5a, 0xac, 0x9b, 0x8d, 0x99, 0x60, 0x54,
|
||||
0x6f, 0xdc, 0x78, 0xb3, 0x6f, 0x1b, 0x1f, 0xf7, 0x6d, 0xe3, 0xd7, 0xbe, 0x6d, 0xbc, 0xfe, 0x5e,
|
||||
0x37, 0x9c, 0x18, 0x2d, 0x5c, 0x08, 0x24, 0x20, 0x2c, 0x83, 0x94, 0x11, 0xbc, 0x85, 0xca, 0x99,
|
||||
0xea, 0x6d, 0x27, 0x2d, 0x11, 0xce, 0x94, 0xbf, 0xfc, 0x67, 0x68, 0x9f, 0x6d, 0x9f, 0x0c, 0x6d,
|
||||
0x2c, 0x6d, 0x9c, 0x69, 0x3a, 0x01, 0xd2, 0xd5, 0xc3, 0x96, 0xf3, 0xc5, 0x44, 0xa5, 0x26, 0xa3,
|
||||
0xcf, 0x81, 0x5f, 0x99, 0x26, 0xae, 0xa0, 0x6b, 0x7d, 0xe0, 0xa4, 0x5b, 0x2d, 0x08, 0x8f, 0xb2,
|
||||
0xc0, 0x5b, 0xa8, 0x04, 0x19, 0x4f, 0x20, 0x65, 0xd5, 0xa2, 0x58, 0xc2, 0x8a, 0x7b, 0xf1, 0x20,
|
||||
0xdd, 0x17, 0x24, 0xa1, 0xbb, 0x9c, 0xb4, 0xf2, 0x07, 0x7a, 0x2c, 0xc6, 0xfd, 0xa9, 0x7c, 0x23,
|
||||
0x81, 0x26, 0x8f, 0x09, 0x6a, 0x1e, 0xcd, 0x29, 0x0b, 0x3a, 0x1e, 0xe7, 0xb7, 0x89, 0x50, 0x93,
|
||||
0x51, 0x1d, 0xfc, 0x55, 0x39, 0x5b, 0x42, 0x33, 0xea, 0x10, 0x40, 0xbb, 0x3b, 0x6d, 0xe0, 0x18,
|
||||
0x4d, 0x87, 0x1d, 0xe8, 0xa5, 0x5c, 0x19, 0x9c, 0x70, 0x65, 0xb7, 0x73, 0x4f, 0xff, 0x75, 0x4b,
|
||||
0x4a, 0x7a, 0x8c, 0xfd, 0x0a, 0xc2, 0xa7, 0x56, 0x75, 0x02, 0xeb, 0x6f, 0x0b, 0xa8, 0xd8, 0x64,
|
||||
0x14, 0xef, 0xa0, 0xd9, 0x73, 0xef, 0xd4, 0xf2, 0xb8, 0xdc, 0x2f, 0x5c, 0x5a, 0x6d, 0xf5, 0x9f,
|
||||
0xc6, 0x46, 0x07, 0xf9, 0x00, 0x4d, 0x89, 0x23, 0x5a, 0xbc, 0x84, 0x96, 0x83, 0xb5, 0x5b, 0x13,
|
||||
0xc0, 0x91, 0xd2, 0x53, 0x54, 0xd2, 0x7b, 0xb3, 0x2e, 0x99, 0x57, 0x78, 0x6d, 0x65, 0x32, 0xae,
|
||||
0x25, 0x7d, 0xff, 0xe0, 0xc8, 0x32, 0x0f, 0x8f, 0x2c, 0xf3, 0xe7, 0x91, 0x65, 0x7e, 0x38, 0xb6,
|
||||
0x8c, 0xc3, 0x63, 0xcb, 0xf8, 0x76, 0x6c, 0x19, 0x2f, 0x27, 0x2f, 0x60, 0x4f, 0x7c, 0xf8, 0xc4,
|
||||
0x1a, 0xa2, 0x69, 0xf1, 0xc5, 0xb9, 0xf3, 0x37, 0x00, 0x00, 0xff, 0xff, 0xb6, 0x98, 0x0c, 0x31,
|
||||
0x64, 0x05, 0x00, 0x00,
|
||||
}
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
|
@ -584,10 +584,10 @@ func (m *MsgVote) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
|||
_ = i
|
||||
var l int
|
||||
_ = l
|
||||
if len(m.SubVotes) > 0 {
|
||||
for iNdEx := len(m.SubVotes) - 1; iNdEx >= 0; iNdEx-- {
|
||||
if len(m.Options) > 0 {
|
||||
for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- {
|
||||
{
|
||||
size, err := m.SubVotes[iNdEx].MarshalToSizedBuffer(dAtA[:i])
|
||||
size, err := m.Options[iNdEx].MarshalToSizedBuffer(dAtA[:i])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
@ -767,8 +767,8 @@ func (m *MsgVote) Size() (n int) {
|
|||
if l > 0 {
|
||||
n += 1 + l + sovTx(uint64(l))
|
||||
}
|
||||
if len(m.SubVotes) > 0 {
|
||||
for _, e := range m.SubVotes {
|
||||
if len(m.Options) > 0 {
|
||||
for _, e := range m.Options {
|
||||
l = e.Size()
|
||||
n += 1 + l + sovTx(uint64(l))
|
||||
}
|
||||
|
@ -1131,7 +1131,7 @@ func (m *MsgVote) Unmarshal(dAtA []byte) error {
|
|||
iNdEx = postIndex
|
||||
case 3:
|
||||
if wireType != 2 {
|
||||
return fmt.Errorf("proto: wrong wireType = %d for field SubVotes", wireType)
|
||||
return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType)
|
||||
}
|
||||
var msglen int
|
||||
for shift := uint(0); ; shift += 7 {
|
||||
|
@ -1158,8 +1158,8 @@ func (m *MsgVote) Unmarshal(dAtA []byte) error {
|
|||
if postIndex > l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
m.SubVotes = append(m.SubVotes, SubVote{})
|
||||
if err := m.SubVotes[len(m.SubVotes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
|
||||
m.Options = append(m.Options, WeightedVoteOption{})
|
||||
if err := m.Options[len(m.Options)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
|
||||
return err
|
||||
}
|
||||
iNdEx = postIndex
|
||||
|
|
|
@ -12,8 +12,8 @@ import (
|
|||
|
||||
// NewVote creates a new Vote instance
|
||||
//nolint:interfacer
|
||||
func NewVote(proposalID uint64, voter sdk.AccAddress, subvotes []SubVote) Vote {
|
||||
return Vote{proposalID, voter.String(), subvotes}
|
||||
func NewVote(proposalID uint64, voter sdk.AccAddress, options WeightedVoteOptions) Vote {
|
||||
return Vote{proposalID, voter.String(), options}
|
||||
}
|
||||
|
||||
func (v Vote) String() string {
|
||||
|
@ -45,7 +45,7 @@ func (v Votes) String() string {
|
|||
}
|
||||
out := fmt.Sprintf("Votes for Proposal %d:", v[0].ProposalId)
|
||||
for _, vot := range v {
|
||||
out += fmt.Sprintf("\n %s: %s", vot.Voter, vot.SubVotes)
|
||||
out += fmt.Sprintf("\n %s: %s", vot.Voter, vot.Options)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
@ -55,31 +55,31 @@ func (v Vote) Empty() bool {
|
|||
return v.String() == Vote{}.String()
|
||||
}
|
||||
|
||||
// NewSubVote creates a new Vote instance
|
||||
// NewNonSplitVoteOption creates a single option vote with weight 1
|
||||
//nolint:interfacer
|
||||
func NewSubVote(option VoteOption, rate int64) SubVote {
|
||||
return SubVote{option, sdk.NewDec(rate)}
|
||||
func NewNonSplitVoteOption(option VoteOption) WeightedVoteOptions {
|
||||
return WeightedVoteOptions{{option, sdk.NewDec(1)}}
|
||||
}
|
||||
|
||||
func (v SubVote) String() string {
|
||||
func (v WeightedVoteOption) String() string {
|
||||
out, _ := json.Marshal(v)
|
||||
return string(out)
|
||||
}
|
||||
|
||||
// SubVotes describes array of SubVote
|
||||
type SubVotes []SubVote
|
||||
// WeightedVoteOptions describes array of WeightedVoteOptions
|
||||
type WeightedVoteOptions []WeightedVoteOption
|
||||
|
||||
func (v SubVotes) String() string {
|
||||
func (v WeightedVoteOptions) String() string {
|
||||
out, _ := json.Marshal(v)
|
||||
return string(out)
|
||||
}
|
||||
|
||||
// ValidSubVote returns true if the sub vote is valid and false otherwise.
|
||||
func ValidSubVote(subvote SubVote) bool {
|
||||
if !subvote.Rate.IsPositive() {
|
||||
// ValidWeightedVoteOption returns true if the sub vote is valid and false otherwise.
|
||||
func ValidWeightedVoteOption(option WeightedVoteOption) bool {
|
||||
if !option.Weight.IsPositive() || option.Weight.GT(sdk.NewDec(1)) {
|
||||
return false
|
||||
}
|
||||
return ValidVoteOption(subvote.Option)
|
||||
return ValidVoteOption(option.Option)
|
||||
}
|
||||
|
||||
// VoteOptionFromString returns a VoteOption from a string. It returns an error
|
||||
|
@ -92,29 +92,26 @@ func VoteOptionFromString(str string) (VoteOption, error) {
|
|||
return VoteOption(option), nil
|
||||
}
|
||||
|
||||
// SubVotesFromString returns a SubVotes from a string. It returns an error
|
||||
// WeightedVoteOptionsFromString returns weighted vote options from string. It returns an error
|
||||
// if the string is invalid.
|
||||
func SubVotesFromString(str string) (SubVotes, error) {
|
||||
subvotes := SubVotes{}
|
||||
for _, subvote := range strings.Split(str, ",") {
|
||||
fields := strings.Split(subvote, "=")
|
||||
func WeightedVoteOptionsFromString(str string) (WeightedVoteOptions, error) {
|
||||
options := WeightedVoteOptions{}
|
||||
for _, option := range strings.Split(str, ",") {
|
||||
fields := strings.Split(option, "=")
|
||||
option, err := VoteOptionFromString(fields[0])
|
||||
if err != nil {
|
||||
return subvotes, err
|
||||
return options, err
|
||||
}
|
||||
if len(fields) < 2 {
|
||||
return subvotes, fmt.Errorf("rate field does not exist for %s opion", fields[0])
|
||||
return options, fmt.Errorf("weight field does not exist for %s option", fields[0])
|
||||
}
|
||||
rate, err := sdk.NewDecFromStr(fields[1])
|
||||
weight, err := sdk.NewDecFromStr(fields[1])
|
||||
if err != nil {
|
||||
return subvotes, err
|
||||
return options, err
|
||||
}
|
||||
subvotes = append(subvotes, SubVote{
|
||||
option,
|
||||
rate,
|
||||
})
|
||||
options = append(options, WeightedVoteOption{option, weight})
|
||||
}
|
||||
return subvotes, nil
|
||||
return options, nil
|
||||
}
|
||||
|
||||
// ValidVoteOption returns true if the vote option is valid and false otherwise.
|
||||
|
|
Loading…
Reference in New Issue