refactor SubVote to WeightedVoteOption && add utility for NewNonSplitVoteOption

This commit is contained in:
antstalepresh 2020-10-30 23:14:39 +10:00
parent a59ac3e31a
commit 73c757dc4f
30 changed files with 436 additions and 415 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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()

View File

@ -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))
}
}
})

View File

@ -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

View File

@ -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))
}
}
})

View File

@ -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
}

View File

@ -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
}

View File

@ -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)

View File

@ -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",

View File

@ -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

View File

@ -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}

View File

@ -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
}

View File

@ -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)
}

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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)),
),
)

View File

@ -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)))
}

View File

@ -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)),
}
}

View File

@ -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)

View File

@ -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())

View File

@ -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())

View File

@ -10,7 +10,6 @@ const (
AttributeKeyProposalResult = "proposal_result"
AttributeKeyOption = "option"
AttributeKeySubVotes = "sub_votes"
AttributeKeyProposalID = "proposal_id"
AttributeKeyVotingPeriodStart = "voting_period_start"
AttributeValueCategory = "governance"

View File

@ -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

View File

@ -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

View File

@ -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 {

View File

@ -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,
}
}

View File

@ -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

View File

@ -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.