feat: Add metadata field to Vote in x/gov (#11308)

## Description

Closes: #11268 

Add metadata to Vote in x/gov using the existing maxMetadataLen constraint.

---

### Author Checklist

*All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.*

I have...

- [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] added `!` to the type prefix if API or client breaking change
- [ ] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting))
- [ ] provided a link to the relevant issue or specification
- [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules)
- [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing)
- [ ] added a changelog entry to `CHANGELOG.md`
- [ ] included comments for [documenting Go code](https://blog.golang.org/godoc)
- [ ] updated the relevant documentation or specification
- [ ] reviewed "Files changed" and left comments if necessary
- [ ] confirmed all CI checks have passed

### Reviewers Checklist

*All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.*

I have...

- [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] confirmed `!` in the type prefix if API or client breaking change
- [ ] confirmed all author checklist items have been addressed 
- [ ] reviewed state machine logic
- [ ] reviewed API design and naming
- [ ] reviewed documentation is accurate
- [ ] reviewed tests and test coverage
- [ ] manually tested (if applicable)
This commit is contained in:
likhita-809
2022-03-03 14:38:26 +00:00
committed by GitHub
parent 8296ad9592
commit 918330bcf7
27 changed files with 810 additions and 365 deletions
+1 -1
View File
@@ -93,7 +93,7 @@ func (s *MWTestSuite) TestTips() {
ctx, accts := s.setupAcctsForTips(ctx)
tipper, feePayer := accts[0], accts[1]
msg = govtypes.NewMsgVote(tipper.acc.GetAddress(), 1, govtypes.OptionYes)
msg = govtypes.NewMsgVote(tipper.acc.GetAddress(), 1, govtypes.OptionYes, "")
auxSignerData := s.mkTipperAuxSignerData(tipper.priv, msg, tc.tip, signing.SignMode_SIGN_MODE_DIRECT_AUX, tipper.accNum, 0, ctx.ChainID())
feePayerTxBuilder := s.mkFeePayerTxBuilder(s.clientCtx, auxSignerData, feePayer.priv, signing.SignMode_SIGN_MODE_DIRECT, tx.Fee{Amount: tc.fee, GasLimit: tc.gasLimit}, feePayer.accNum, 0, ctx.ChainID())
+2 -2
View File
@@ -310,7 +310,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.Id, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes))
err = app.GovKeeper.AddVote(ctx, proposal.Id, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), "")
require.NoError(t, err)
newHeader := ctx.BlockHeader()
@@ -354,7 +354,7 @@ func TestEndBlockerProposalHandlerFailed(t *testing.T) {
require.NoError(t, err)
require.NotNil(t, res)
err = app.GovKeeper.AddVote(ctx, proposal.Id, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes))
err = app.GovKeeper.AddVote(ctx, proposal.Id, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), "")
require.NoError(t, err)
newHeader := ctx.BlockHeader()
+15 -2
View File
@@ -31,6 +31,7 @@ const (
flagVoter = "voter"
flagDepositor = "depositor"
flagStatus = "status"
flagMetadata = "metadata"
// Deprecated: only used for v1beta1 legacy proposals.
FlagProposal = "proposal"
)
@@ -282,13 +283,19 @@ $ %s tx gov vote 1 yes --from mykey
return err
}
metadata, err := cmd.Flags().GetString(flagMetadata)
if err != nil {
return err
}
// Build vote message and run basic validation
msg := v1beta2.NewMsgVote(from, proposalID, byteVoteOption)
msg := v1beta2.NewMsgVote(from, proposalID, byteVoteOption, metadata)
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
},
}
cmd.Flags().String(flagMetadata, "", "Specify metadata of the vote")
flags.AddTxFlagsToCmd(cmd)
return cmd
@@ -331,12 +338,18 @@ $ %s tx gov weighted-vote 1 yes=0.6,no=0.3,abstain=0.05,no_with_veto=0.05 --from
return err
}
metadata, err := cmd.Flags().GetString(flagMetadata)
if err != nil {
return err
}
// Build vote message and run basic validation
msg := v1beta2.NewMsgVoteWeighted(from, proposalID, options)
msg := v1beta2.NewMsgVoteWeighted(from, proposalID, options, metadata)
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
},
}
cmd.Flags().String(flagMetadata, "", "Specify metadata of the weighted vote")
flags.AddTxFlagsToCmd(cmd)
return cmd
+27
View File
@@ -879,6 +879,7 @@ func (s *IntegrationTestSuite) TestNewCmdVote() {
fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock),
fmt.Sprintf("--metadata=%s", "AQ=="),
fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
},
false, 2,
@@ -895,6 +896,19 @@ func (s *IntegrationTestSuite) TestNewCmdVote() {
},
false, 0,
},
{
"valid vote with metadata",
[]string{
"1",
"yes",
fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock),
fmt.Sprintf("--metadata=%s", "AQ=="),
fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
},
false, 0,
},
}
for _, tc := range testCases {
@@ -955,6 +969,19 @@ func (s *IntegrationTestSuite) TestNewCmdWeightedVote() {
},
false, 0,
},
{
"valid vote with metadata",
[]string{
"1",
"yes",
fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock),
fmt.Sprintf("--metadata=%s", "AQ=="),
fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
},
false, 0,
},
{
"invalid valid split vote string",
[]string{
+11 -11
View File
@@ -88,12 +88,12 @@ func TestGetPaginatedVotes(t *testing.T) {
acc2 := make(sdk.AccAddress, 20)
acc2[0] = 2
acc1Msgs := []sdk.Msg{
v1beta2.NewMsgVote(acc1, 0, v1beta2.OptionYes),
v1beta2.NewMsgVote(acc1, 0, v1beta2.OptionYes),
v1beta2.NewMsgVote(acc1, 0, v1beta2.OptionYes, ""),
v1beta2.NewMsgVote(acc1, 0, v1beta2.OptionYes, ""),
}
acc2Msgs := []sdk.Msg{
v1beta2.NewMsgVote(acc2, 0, v1beta2.OptionYes),
v1beta2.NewMsgVoteWeighted(acc2, 0, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)),
v1beta2.NewMsgVote(acc2, 0, v1beta2.OptionYes, ""),
v1beta2.NewMsgVoteWeighted(acc2, 0, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""),
}
for _, tc := range []testCase{
{
@@ -105,8 +105,8 @@ func TestGetPaginatedVotes(t *testing.T) {
acc2Msgs[:1],
},
votes: []v1beta2.Vote{
v1beta2.NewVote(0, acc1, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)),
v1beta2.NewVote(0, acc2, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes))},
v1beta2.NewVote(0, acc1, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""),
v1beta2.NewVote(0, acc2, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), "")},
},
{
description: "2MsgPerTx1Chunk",
@@ -117,8 +117,8 @@ func TestGetPaginatedVotes(t *testing.T) {
acc2Msgs,
},
votes: []v1beta2.Vote{
v1beta2.NewVote(0, acc1, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)),
v1beta2.NewVote(0, acc1, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)),
v1beta2.NewVote(0, acc1, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""),
v1beta2.NewVote(0, acc1, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""),
},
},
{
@@ -130,8 +130,8 @@ func TestGetPaginatedVotes(t *testing.T) {
acc2Msgs,
},
votes: []v1beta2.Vote{
v1beta2.NewVote(0, acc2, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)),
v1beta2.NewVote(0, acc2, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)),
v1beta2.NewVote(0, acc2, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""),
v1beta2.NewVote(0, acc2, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""),
},
},
{
@@ -141,7 +141,7 @@ func TestGetPaginatedVotes(t *testing.T) {
msgs: [][]sdk.Msg{
acc1Msgs[:1],
},
votes: []v1beta2.Vote{v1beta2.NewVote(0, acc1, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes))},
votes: []v1beta2.Vote{v1beta2.NewVote(0, acc1, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), "")},
},
{
description: "InvalidPage",
+10 -10
View File
@@ -190,7 +190,7 @@ func (suite *KeeperTestSuite) TestGRPCQueryProposals() {
for i := 0; i < 5; i++ {
govAddress := app.GovKeeper.GetGovernanceAccount(suite.ctx).GetAddress()
testProposal := []sdk.Msg{
v1beta2.NewMsgVote(govAddress, uint64(i), v1beta2.OptionYes),
v1beta2.NewMsgVote(govAddress, uint64(i), v1beta2.OptionYes, ""),
}
proposal, err := app.GovKeeper.SubmitProposal(ctx, testProposal, "")
suite.Require().NotEmpty(proposal)
@@ -269,7 +269,7 @@ func (suite *KeeperTestSuite) TestGRPCQueryProposals() {
func() {
testProposals[1].Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, *testProposals[1])
suite.Require().NoError(app.GovKeeper.AddVote(ctx, testProposals[1].Id, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionAbstain)))
suite.Require().NoError(app.GovKeeper.AddVote(ctx, testProposals[1].Id, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionAbstain), ""))
req = &v1beta2.QueryProposalsRequest{
Voter: addrs[0].String(),
@@ -384,7 +384,7 @@ func (suite *KeeperTestSuite) TestGRPCQueryVote() {
func() {
proposal.Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, proposal)
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.Id, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionAbstain)))
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.Id, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionAbstain), ""))
req = &v1beta2.QueryVoteRequest{
ProposalId: proposal.Id,
@@ -495,8 +495,8 @@ func (suite *KeeperTestSuite) TestGRPCQueryVotes() {
accAddr2, err2 := sdk.AccAddressFromBech32(votes[1].Voter)
suite.Require().NoError(err1)
suite.Require().NoError(err2)
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.Id, accAddr1, votes[0].Options))
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.Id, accAddr2, votes[1].Options))
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.Id, accAddr1, votes[0].Options, ""))
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.Id, accAddr2, votes[1].Options, ""))
req = &v1beta2.QueryVotesRequest{
ProposalId: proposal.Id,
@@ -596,8 +596,8 @@ func (suite *KeeperTestSuite) TestLegacyGRPCQueryVotes() {
accAddr2, err2 := sdk.AccAddressFromBech32(votes[1].Voter)
suite.Require().NoError(err1)
suite.Require().NoError(err2)
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.Id, accAddr1, v1beta2.NewNonSplitVoteOption(v1beta2.OptionAbstain)))
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.Id, accAddr2, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.Id, accAddr1, v1beta2.NewNonSplitVoteOption(v1beta2.OptionAbstain), ""))
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.Id, accAddr2, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
req = &v1beta1.QueryVotesRequest{
ProposalId: proposal.Id,
@@ -1055,9 +1055,9 @@ func (suite *KeeperTestSuite) TestGRPCQueryTally() {
proposal.Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, proposal)
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.Id, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.Id, addrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.Id, addrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.Id, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.Id, addrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
suite.Require().NoError(app.GovKeeper.AddVote(ctx, proposal.Id, addrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
req = &v1beta2.QueryTallyResultRequest{ProposalId: proposal.Id}
+1 -1
View File
@@ -83,7 +83,7 @@ func TestHooks(t *testing.T) {
require.NoError(t, err)
require.True(t, govHooksReceiver.AfterProposalDepositValid)
err = app.GovKeeper.AddVote(ctx, p2.Id, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes))
err = app.GovKeeper.AddVote(ctx, p2.Id, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), "")
require.NoError(t, err)
require.True(t, govHooksReceiver.AfterProposalVoteValid)
+9
View File
@@ -197,3 +197,12 @@ func (keeper Keeper) InactiveProposalQueueIterator(ctx sdk.Context, endTime time
store := ctx.KVStore(keeper.storeKey)
return store.Iterator(types.InactiveProposalQueuePrefix, sdk.PrefixEndBytes(types.InactiveProposalByTimeKey(endTime)))
}
// assertMetadataLength returns an error if given metadata length
// is greater than a pre-defined maxMetadataLen.
func (k Keeper) assertMetadataLength(metadata string) error {
if metadata != "" && uint64(len(metadata)) > k.config.MaxMetadataLen {
return types.ErrMetadataTooLong.Wrapf("got metadata with length %d", len(metadata))
}
return nil
}
+2 -2
View File
@@ -114,7 +114,7 @@ func (k msgServer) Vote(goCtx context.Context, msg *v1beta2.MsgVote) (*v1beta2.M
if accErr != nil {
return nil, accErr
}
err := k.Keeper.AddVote(ctx, msg.ProposalId, accAddr, v1beta2.NewNonSplitVoteOption(msg.Option))
err := k.Keeper.AddVote(ctx, msg.ProposalId, accAddr, v1beta2.NewNonSplitVoteOption(msg.Option), msg.Metadata)
if err != nil {
return nil, err
}
@@ -144,7 +144,7 @@ func (k msgServer) VoteWeighted(goCtx context.Context, msg *v1beta2.MsgVoteWeigh
if accErr != nil {
return nil, accErr
}
err := k.Keeper.AddVote(ctx, msg.ProposalId, accAddr, msg.Options)
err := k.Keeper.AddVote(ctx, msg.ProposalId, accAddr, msg.Options, msg.Metadata)
if err != nil {
return nil, err
}
+3 -2
View File
@@ -12,8 +12,9 @@ import (
// SubmitProposal create new proposal given an array of messages
func (keeper Keeper) SubmitProposal(ctx sdk.Context, messages []sdk.Msg, metadata string) (v1beta2.Proposal, error) {
if metadata != "" && uint64(len(metadata)) > keeper.config.MaxMetadataLen {
return v1beta2.Proposal{}, types.ErrMetadataTooLong.Wrapf("got metadata with length %d", len(metadata))
err := keeper.assertMetadataLength(metadata)
if err != nil {
return v1beta2.Proposal{}, err
}
// Will hold a comma-separated string of all Msg type URLs.
+1 -1
View File
@@ -101,7 +101,7 @@ func (suite *KeeperTestSuite) TestGetProposalsFiltered() {
if i%2 == 0 {
d := v1beta2.NewDeposit(proposalID, addr1, nil)
v := v1beta2.NewVote(proposalID, addr1, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes))
v := v1beta2.NewVote(proposalID, addr1, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), "")
suite.app.GovKeeper.SetDeposit(suite.ctx, d)
suite.app.GovKeeper.SetVote(suite.ctx, v)
}
+3 -3
View File
@@ -254,13 +254,13 @@ func TestQueries(t *testing.T) {
checkEqualProposal(t, proposal3, *proposals[1])
// Addrs[0] votes on proposals #2 & #3
vote1 := v1beta2.NewVote(proposal2.Id, TestAddrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes))
vote2 := v1beta2.NewVote(proposal3.Id, TestAddrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes))
vote1 := v1beta2.NewVote(proposal2.Id, TestAddrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), "")
vote2 := v1beta2.NewVote(proposal3.Id, TestAddrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), "")
app.GovKeeper.SetVote(ctx, vote1)
app.GovKeeper.SetVote(ctx, vote2)
// Addrs[1] votes on proposal #3
vote3 := v1beta2.NewVote(proposal3.Id, TestAddrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes))
vote3 := v1beta2.NewVote(proposal3.Id, TestAddrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), "")
app.GovKeeper.SetVote(ctx, vote3)
// Test query voted by TestAddrs[0]
+39 -39
View File
@@ -50,7 +50,7 @@ func TestTallyNoQuorum(t *testing.T) {
proposal.Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, proposal)
err = app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes))
err = app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), "")
require.Nil(t, err)
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
@@ -73,9 +73,9 @@ func TestTallyOnlyValidatorsAllYes(t *testing.T) {
proposal.Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, proposal)
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
@@ -99,8 +99,8 @@ func TestTallyOnlyValidators51No(t *testing.T) {
proposal.Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, proposal)
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo), ""))
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
@@ -123,8 +123,8 @@ func TestTallyOnlyValidators51Yes(t *testing.T) {
proposal.Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, proposal)
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
@@ -148,9 +148,9 @@ func TestTallyOnlyValidatorsVetoed(t *testing.T) {
proposal.Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, proposal)
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNoWithVeto)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNoWithVeto), ""))
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
@@ -174,9 +174,9 @@ func TestTallyOnlyValidatorsAbstainPasses(t *testing.T) {
proposal.Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, proposal)
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionAbstain)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionAbstain), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
@@ -200,9 +200,9 @@ func TestTallyOnlyValidatorsAbstainFails(t *testing.T) {
proposal.Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, proposal)
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionAbstain)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionAbstain), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo), ""))
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
@@ -227,8 +227,8 @@ func TestTallyOnlyValidatorsNonVoter(t *testing.T) {
proposal.Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, proposal)
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddr1, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddr2, v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddr1, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, valAccAddr2, v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo), ""))
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
@@ -261,10 +261,10 @@ func TestTallyDelgatorOverride(t *testing.T) {
proposal.Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, proposal)
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[3], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[4], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[3], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[4], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo), ""))
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
@@ -297,9 +297,9 @@ func TestTallyDelgatorInherit(t *testing.T) {
proposal.Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, proposal)
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
@@ -336,10 +336,10 @@ func TestTallyDelgatorMultipleOverride(t *testing.T) {
proposal.Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, proposal)
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[3], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[3], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo), ""))
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
@@ -378,9 +378,9 @@ func TestTallyDelgatorMultipleInherit(t *testing.T) {
proposal.Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, proposal)
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo), ""))
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
@@ -421,9 +421,9 @@ func TestTallyJailedValidator(t *testing.T) {
proposal.Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, proposal)
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo), ""))
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
@@ -454,9 +454,9 @@ func TestTallyValidatorMultipleDelegations(t *testing.T) {
proposal.Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, proposal)
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[1], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo), ""))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[2], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
proposal, ok := app.GovKeeper.GetProposal(ctx, proposalID)
require.True(t, ok)
+6 -2
View File
@@ -10,7 +10,7 @@ import (
)
// AddVote adds a vote on a specific proposal
func (keeper Keeper) AddVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress, options v1beta2.WeightedVoteOptions) error {
func (keeper Keeper) AddVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress, options v1beta2.WeightedVoteOptions, metadata string) error {
proposal, ok := keeper.GetProposal(ctx, proposalID)
if !ok {
return sdkerrors.Wrapf(types.ErrUnknownProposal, "%d", proposalID)
@@ -18,6 +18,10 @@ func (keeper Keeper) AddVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.A
if proposal.Status != v1beta2.StatusVotingPeriod {
return sdkerrors.Wrapf(types.ErrInactiveProposal, "%d", proposalID)
}
err := keeper.assertMetadataLength(metadata)
if err != nil {
return err
}
for _, option := range options {
if !v1beta2.ValidWeightedVoteOption(*option) {
@@ -25,7 +29,7 @@ func (keeper Keeper) AddVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.A
}
}
vote := v1beta2.NewVote(proposalID, voterAddr, options)
vote := v1beta2.NewVote(proposalID, voterAddr, options, metadata)
keeper.SetVote(ctx, vote)
// called after a vote on a proposal is cast
+7 -6
View File
@@ -21,19 +21,20 @@ func TestVotes(t *testing.T) {
proposal, err := app.GovKeeper.SubmitProposal(ctx, tp, "")
require.NoError(t, err)
proposalID := proposal.Id
metadata := "metadata"
var invalidOption v1beta2.VoteOption = 0x10
require.Error(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)), "proposal not on voting period")
require.Error(t, app.GovKeeper.AddVote(ctx, 10, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)), "invalid proposal ID")
require.Error(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), metadata), "proposal not on voting period")
require.Error(t, app.GovKeeper.AddVote(ctx, 10, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""), "invalid proposal ID")
proposal.Status = v1beta2.StatusVotingPeriod
app.GovKeeper.SetProposal(ctx, proposal)
require.Error(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(invalidOption)), "invalid option")
require.Error(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(invalidOption), ""), "invalid option")
// Test first vote
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionAbstain)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionAbstain), metadata))
vote, found := app.GovKeeper.GetVote(ctx, proposalID, addrs[0])
require.True(t, found)
require.Equal(t, addrs[0].String(), vote.Voter)
@@ -42,7 +43,7 @@ func TestVotes(t *testing.T) {
require.Equal(t, v1beta2.OptionAbstain, vote.Options[0].Option)
// Test change of vote
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes)))
require.NoError(t, app.GovKeeper.AddVote(ctx, proposalID, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), ""))
vote, found = app.GovKeeper.GetVote(ctx, proposalID, addrs[0])
require.True(t, found)
require.Equal(t, addrs[0].String(), vote.Voter)
@@ -56,7 +57,7 @@ func TestVotes(t *testing.T) {
v1beta2.NewWeightedVoteOption(v1beta2.OptionNo, sdk.NewDecWithPrec(30, 2)),
v1beta2.NewWeightedVoteOption(v1beta2.OptionAbstain, sdk.NewDecWithPrec(5, 2)),
v1beta2.NewWeightedVoteOption(v1beta2.OptionNoWithVeto, 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)
+2
View File
@@ -125,6 +125,7 @@ func TestMigrateJSON(t *testing.T) {
},
"votes": [
{
"metadata": "",
"options": [
{
"option": "VOTE_OPTION_ABSTAIN",
@@ -135,6 +136,7 @@ func TestMigrateJSON(t *testing.T) {
"voter": "cosmos1fl48vsnmsdzcv85q5d2q4z5ajdha8yu34mf0eh"
},
{
"metadata": "",
"options": [
{
"option": "VOTE_OPTION_NO",
+2 -2
View File
@@ -301,7 +301,7 @@ func operationSimulateMsgVote(ak types.AccountKeeper, bk types.BankKeeper, k kee
}
option := randomVotingOption(r)
msg := v1beta2.NewMsgVote(simAccount.Address, proposalID, option)
msg := v1beta2.NewMsgVote(simAccount.Address, proposalID, option, "")
account := ak.GetAccount(ctx, simAccount.Address)
spendable := bk.SpendableCoins(ctx, account.GetAddress())
@@ -354,7 +354,7 @@ func operationSimulateMsgVoteWeighted(ak types.AccountKeeper, bk types.BankKeepe
}
options := randomWeightedVotingOptions(r)
msg := v1beta2.NewMsgVoteWeighted(simAccount.Address, proposalID, options)
msg := v1beta2.NewMsgVoteWeighted(simAccount.Address, proposalID, options, "")
account := ak.GetAccount(ctx, simAccount.Address)
spendable := bk.SpendableCoins(ctx, account.GetAddress())
+116 -63
View File
@@ -431,6 +431,8 @@ type Vote struct {
ProposalId uint64 `protobuf:"varint,1,opt,name=proposal_id,json=proposalId,proto3" json:"proposal_id,omitempty"`
Voter string `protobuf:"bytes,2,opt,name=voter,proto3" json:"voter,omitempty"`
Options []*WeightedVoteOption `protobuf:"bytes,4,rep,name=options,proto3" json:"options,omitempty"`
// metadata is any arbitrary metadata to attached to the vote.
Metadata string `protobuf:"bytes,5,opt,name=metadata,proto3" json:"metadata,omitempty"`
}
func (m *Vote) Reset() { *m = Vote{} }
@@ -487,6 +489,13 @@ func (m *Vote) GetOptions() []*WeightedVoteOption {
return nil
}
func (m *Vote) GetMetadata() string {
if m != nil {
return m.Metadata
}
return ""
}
// DepositParams defines the params for deposits on governance proposals.
type DepositParams struct {
// Minimum deposit for a proposal to enter voting period.
@@ -671,76 +680,77 @@ func init() {
func init() { proto.RegisterFile("cosmos/gov/v1beta2/gov.proto", fileDescriptor_5abf7b8852811c49) }
var fileDescriptor_5abf7b8852811c49 = []byte{
// 1101 bytes of a gzipped FileDescriptorProto
// 1108 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x56, 0x41, 0x53, 0xdb, 0x46,
0x14, 0x46, 0xb6, 0x30, 0xe6, 0x19, 0x8c, 0xba, 0xd0, 0x46, 0x10, 0x62, 0x53, 0x4f, 0x9b, 0xa1,
0xb4, 0xd8, 0x81, 0xcc, 0xa4, 0x33, 0xe9, 0xa5, 0x36, 0x56, 0x1a, 0x33, 0x14, 0xbb, 0x92, 0x62,
0x26, 0xbd, 0x68, 0x64, 0xb4, 0xb1, 0x35, 0xb5, 0xb4, 0xae, 0x76, 0x4d, 0xf0, 0x4f, 0xe8, 0x2d,
0xc7, 0xce, 0xf4, 0xd0, 0x3f, 0x91, 0x1f, 0x91, 0x53, 0x27, 0x93, 0x4b, 0xdb, 0x8b, 0x9b, 0xc2,
0x8d, 0x5f, 0x91, 0xd1, 0x6a, 0x85, 0x8d, 0x71, 0x06, 0x4e, 0x96, 0xde, 0xfb, 0xbe, 0xef, 0xbd,
0xb7, 0xfb, 0xed, 0x5a, 0xb0, 0x7e, 0x4c, 0xa8, 0x47, 0x68, 0xa9, 0x4d, 0x4e, 0x4a, 0x27, 0x3b,
0xc7, 0xce, 0xf4, 0x6f, 0xe4, 0xd6, 0x3f, 0x90, 0x53, 0x27, 0x93, 0x4b, 0xdb, 0x8b, 0x9b, 0xc2,
0x8d, 0x5f, 0x91, 0xd1, 0x6a, 0x85, 0x8d, 0x71, 0x06, 0x4e, 0x96, 0xdf, 0xfb, 0xbe, 0xef, 0xbd,
0xb7, 0xfb, 0xed, 0x4a, 0xb0, 0x7e, 0x4c, 0xa8, 0x47, 0x68, 0xa9, 0x4d, 0x4e, 0x4a, 0x27, 0x3b,
0x2d, 0xcc, 0xec, 0xdd, 0xf0, 0xb9, 0xd8, 0x0b, 0x08, 0x23, 0x08, 0x45, 0xd9, 0x62, 0x18, 0x11,
0xd9, 0xb5, 0x9c, 0x60, 0xb4, 0x6c, 0x8a, 0x05, 0x65, 0xa7, 0x74, 0x4c, 0x5c, 0x3f, 0xe2, 0xac,
0xad, 0xb4, 0x49, 0x9b, 0xf0, 0xc7, 0x52, 0xf8, 0x24, 0xa2, 0xf9, 0x36, 0x21, 0xed, 0x2e, 0x2e,
0xf1, 0xb7, 0x56, 0xff, 0x45, 0x89, 0xb9, 0x1e, 0xa6, 0xcc, 0xf6, 0x7a, 0x02, 0xb0, 0x3a, 0x09,
0xb0, 0xfd, 0x81, 0x48, 0xe5, 0x26, 0x53, 0x4e, 0x3f, 0xb0, 0x99, 0x4b, 0xe2, 0x8a, 0xab, 0x51,
0x47, 0x56, 0x54, 0x54, 0xb4, 0xcc, 0x5f, 0x0a, 0x0c, 0xd0, 0x11, 0x76, 0xdb, 0x1d, 0x86, 0x9d,
0x26, 0x61, 0xb8, 0xde, 0x0b, 0x69, 0xe8, 0x11, 0xa4, 0x08, 0x7f, 0x52, 0xa5, 0x0d, 0x69, 0x33,
0xbb, 0x9b, 0x2b, 0x5e, 0x9f, 0xb3, 0x38, 0xc2, 0xeb, 0x02, 0x8d, 0xee, 0x43, 0xea, 0x25, 0x57,
0x53, 0x13, 0x1b, 0xd2, 0xe6, 0x7c, 0x25, 0xfb, 0xee, 0xf5, 0x36, 0x08, 0x6a, 0x15, 0x1f, 0xeb,
0x22, 0x5b, 0xf8, 0x43, 0x82, 0xb9, 0x2a, 0xee, 0x11, 0xea, 0x32, 0x94, 0x87, 0x4c, 0x2f, 0x20,
0x3d, 0x42, 0xed, 0xae, 0xe5, 0x3a, 0xbc, 0xa0, 0xac, 0x43, 0x1c, 0xaa, 0x39, 0xe8, 0x11, 0xcc,
0x3b, 0x11, 0x96, 0x04, 0x42, 0x57, 0x7d, 0xf7, 0x7a, 0x7b, 0x45, 0xe8, 0x96, 0x1d, 0x27, 0xc0,
0x94, 0x1a, 0x2c, 0x70, 0xfd, 0xb6, 0x3e, 0x82, 0xa2, 0x6f, 0x21, 0x65, 0x7b, 0xa4, 0xef, 0x33,
0x35, 0xb9, 0x91, 0xdc, 0xcc, 0xec, 0xae, 0xc6, 0x43, 0x84, 0x1b, 0x23, 0xa6, 0xd8, 0x29, 0xee,
0x11, 0xd7, 0xaf, 0xc8, 0x6f, 0x86, 0xf9, 0x19, 0x5d, 0xc0, 0x0b, 0xef, 0x65, 0x48, 0x37, 0x44,
0x7d, 0x94, 0x85, 0xc4, 0x65, 0x57, 0x09, 0xd7, 0x41, 0x0f, 0x20, 0xed, 0x61, 0x4a, 0xed, 0x36,
0xa6, 0x6a, 0x82, 0xeb, 0xae, 0x14, 0xa3, 0xe5, 0x2f, 0xc6, 0xcb, 0x5f, 0x2c, 0xfb, 0x03, 0xfd,
0x12, 0x85, 0x1e, 0x43, 0x8a, 0x32, 0x9b, 0xf5, 0xa9, 0x9a, 0xe4, 0x8b, 0x59, 0x98, 0xb6, 0x98,
0x71, 0x3d, 0x83, 0x23, 0x75, 0xc1, 0x40, 0x3f, 0x02, 0x7a, 0xe1, 0xfa, 0x76, 0xd7, 0x62, 0x76,
0xb7, 0x3b, 0xb0, 0x02, 0x4c, 0xfb, 0x5d, 0xa6, 0xca, 0x1b, 0xd2, 0x66, 0x66, 0x37, 0x3f, 0x4d,
0xc7, 0x0c, 0x71, 0x3a, 0x87, 0xe9, 0x0a, 0xa7, 0x8e, 0x45, 0x50, 0x19, 0x32, 0xb4, 0xdf, 0xf2,
0x5c, 0x66, 0x85, 0xee, 0x52, 0x67, 0xb9, 0xce, 0xda, 0xb5, 0xfe, 0xcd, 0xd8, 0x7a, 0x15, 0xf9,
0xd5, 0x7f, 0x79, 0x49, 0x87, 0x88, 0x14, 0x86, 0xd1, 0x3e, 0x28, 0x62, 0x89, 0x2d, 0xec, 0x3b,
0x91, 0x4e, 0xea, 0x96, 0x3a, 0x59, 0xc1, 0xd4, 0x7c, 0x87, 0x6b, 0x55, 0x61, 0x91, 0x11, 0x66,
0x77, 0x2d, 0x11, 0x57, 0xe7, 0x6e, 0xb7, 0x51, 0x0b, 0x9c, 0x15, 0x1b, 0xe8, 0x00, 0x3e, 0x39,
0x21, 0xcc, 0xf5, 0xdb, 0x16, 0x65, 0x76, 0x20, 0x46, 0x4b, 0xdf, 0xb2, 0xa5, 0xa5, 0x88, 0x6a,
0x84, 0x4c, 0xde, 0xd3, 0x53, 0x10, 0xa1, 0xd1, 0x78, 0xf3, 0xb7, 0xd4, 0x5a, 0x8c, 0x88, 0xf1,
0x74, 0x6b, 0xa1, 0x53, 0x98, 0xed, 0xd8, 0xcc, 0x56, 0x21, 0xb4, 0xad, 0x7e, 0xf9, 0x5e, 0xf8,
0x5b, 0x82, 0xcc, 0xf8, 0xc6, 0x7c, 0x0d, 0xf3, 0x03, 0x4c, 0xad, 0x63, 0x6e, 0x57, 0xe9, 0xda,
0xd9, 0xa9, 0xf9, 0x4c, 0x4f, 0x0f, 0x30, 0xdd, 0x0b, 0xf3, 0xe8, 0x21, 0x2c, 0xda, 0x2d, 0xca,
0x6c, 0xd7, 0x17, 0x84, 0xc4, 0x54, 0xc2, 0x82, 0x00, 0x45, 0xa4, 0xaf, 0x20, 0xed, 0x13, 0x81,
0x4f, 0x4e, 0xc5, 0xcf, 0xf9, 0x24, 0x82, 0x7e, 0x07, 0xc8, 0x27, 0xd6, 0x4b, 0x97, 0x75, 0xac,
0x13, 0xcc, 0x62, 0x92, 0x3c, 0x95, 0xb4, 0xe4, 0x93, 0x23, 0x97, 0x75, 0x9a, 0x98, 0x45, 0xe4,
0xc2, 0x9f, 0x12, 0xc8, 0xe1, 0xcd, 0x70, 0xf3, 0xb9, 0x2e, 0xc2, 0xec, 0x09, 0x61, 0xf8, 0xe6,
0x33, 0x1d, 0xc1, 0xd0, 0xf7, 0x30, 0x17, 0x5d, 0x33, 0x54, 0x95, 0xb9, 0x4f, 0xee, 0x4f, 0x3b,
0x00, 0xd7, 0x6f, 0x33, 0x3d, 0xa6, 0xed, 0xcb, 0xe9, 0xa4, 0x22, 0x17, 0xfe, 0x95, 0x60, 0x51,
0x78, 0xa7, 0x61, 0x07, 0xb6, 0x47, 0xd1, 0x73, 0xc8, 0x78, 0xae, 0x7f, 0xe9, 0x42, 0xe9, 0x26,
0x17, 0xde, 0x0b, 0x5d, 0x78, 0x31, 0xcc, 0x7f, 0x3a, 0xc6, 0xfa, 0x86, 0x78, 0x2e, 0xc3, 0x5e,
0x8f, 0x0d, 0x74, 0xf0, 0x5c, 0x3f, 0x36, 0xa7, 0x07, 0xc8, 0xb3, 0x4f, 0x63, 0x90, 0xd5, 0xc3,
0x81, 0x4b, 0x1c, 0x3e, 0x71, 0x58, 0x61, 0xd2, 0x51, 0x55, 0x71, 0x6f, 0x57, 0xbe, 0xb8, 0x18,
0xe6, 0xd7, 0xaf, 0x13, 0x47, 0x45, 0x7e, 0x0f, 0x0d, 0xa7, 0x78, 0xf6, 0x69, 0x3c, 0x09, 0xcf,
0x17, 0x4c, 0x58, 0x68, 0x72, 0x13, 0x8a, 0xc9, 0xaa, 0x20, 0x4c, 0x19, 0x57, 0x96, 0x6e, 0xaa,
0x2c, 0x73, 0xe5, 0x85, 0x88, 0x25, 0x54, 0xff, 0x8f, 0xdd, 0x2a, 0x54, 0x1f, 0x43, 0xea, 0xd7,
0x3e, 0x09, 0xfa, 0x9e, 0xb0, 0x6a, 0xe1, 0x62, 0x98, 0x57, 0xa2, 0xc8, 0xa8, 0xc3, 0xc9, 0xab,
0x3f, 0xca, 0xa3, 0x3d, 0x98, 0x67, 0x9d, 0x00, 0xd3, 0x0e, 0xe9, 0x3a, 0x62, 0xe7, 0xbf, 0xbc,
0x18, 0xe6, 0x97, 0x2f, 0x83, 0x1f, 0x55, 0x18, 0xf1, 0xd0, 0x4f, 0x90, 0xe5, 0xce, 0x1c, 0x29,
0x45, 0x96, 0xde, 0xba, 0x18, 0xe6, 0xd5, 0xab, 0x99, 0x8f, 0xca, 0x2d, 0x86, 0x38, 0x33, 0x86,
0x6d, 0xfd, 0x26, 0x01, 0x8c, 0xfd, 0x03, 0xde, 0x85, 0x3b, 0xcd, 0xba, 0xa9, 0x59, 0xf5, 0x86,
0x59, 0xab, 0x1f, 0x5a, 0xcf, 0x0e, 0x8d, 0x86, 0xb6, 0x57, 0x7b, 0x52, 0xd3, 0xaa, 0xca, 0x0c,
0x5a, 0x86, 0xa5, 0xf1, 0xe4, 0x73, 0xcd, 0x50, 0x24, 0x74, 0x07, 0x96, 0xc7, 0x83, 0xe5, 0x8a,
0x61, 0x96, 0x6b, 0x87, 0x4a, 0x02, 0x21, 0xc8, 0x8e, 0x27, 0x0e, 0xeb, 0x4a, 0x12, 0xad, 0x83,
0x7a, 0x35, 0x66, 0x1d, 0xd5, 0xcc, 0xa7, 0x56, 0x53, 0x33, 0xeb, 0x8a, 0xbc, 0xf5, 0x97, 0x04,
0xd9, 0xab, 0x7f, 0x08, 0x28, 0x0f, 0x77, 0x1b, 0x7a, 0xbd, 0x51, 0x37, 0xca, 0x07, 0x96, 0x61,
0x96, 0xcd, 0x67, 0xc6, 0x44, 0x4f, 0x05, 0xc8, 0x4d, 0x02, 0xaa, 0x5a, 0xa3, 0x6e, 0xd4, 0x4c,
0xab, 0xa1, 0xe9, 0xb5, 0x7a, 0x55, 0x91, 0xd0, 0xe7, 0x70, 0x6f, 0x12, 0xd3, 0xac, 0x9b, 0xb5,
0xc3, 0x1f, 0x62, 0x48, 0x02, 0xad, 0xc1, 0x67, 0x93, 0x90, 0x46, 0xd9, 0x30, 0xb4, 0x6a, 0xd4,
0xf4, 0x64, 0x4e, 0xd7, 0xf6, 0xb5, 0x3d, 0x53, 0xab, 0x2a, 0xf2, 0x34, 0xe6, 0x93, 0x72, 0xed,
0x40, 0xab, 0x2a, 0xb3, 0x95, 0xfd, 0x37, 0x67, 0x39, 0xe9, 0xed, 0x59, 0x4e, 0x7a, 0x7f, 0x96,
0x93, 0x5e, 0x9d, 0xe7, 0x66, 0xde, 0x9e, 0xe7, 0x66, 0xfe, 0x39, 0xcf, 0xcd, 0xfc, 0xfc, 0xa0,
0xed, 0xb2, 0x4e, 0xbf, 0x55, 0x3c, 0x26, 0x9e, 0xf8, 0x30, 0x11, 0x3f, 0xdb, 0xd4, 0xf9, 0xa5,
0x74, 0xca, 0x3f, 0xbb, 0xd8, 0xa0, 0x87, 0x69, 0xfc, 0xf1, 0xd5, 0x4a, 0x71, 0xcf, 0x3e, 0xfc,
0x10, 0x00, 0x00, 0xff, 0xff, 0xe9, 0xbe, 0x2b, 0x6a, 0x99, 0x09, 0x00, 0x00,
0xf1, 0x7f, 0xad, 0xfe, 0x8b, 0x12, 0x73, 0x3d, 0x4c, 0x99, 0xed, 0xf5, 0x04, 0x60, 0x75, 0x12,
0x60, 0xfb, 0x03, 0x91, 0xca, 0x4d, 0xa6, 0x9c, 0x7e, 0x60, 0x33, 0x97, 0xc4, 0x15, 0x57, 0xa3,
0x8e, 0xac, 0xa8, 0xa8, 0x68, 0x99, 0xff, 0x29, 0x30, 0x40, 0x47, 0xd8, 0x6d, 0x77, 0x18, 0x76,
0x9a, 0x84, 0xe1, 0x7a, 0x2f, 0xa4, 0xa1, 0x47, 0x90, 0x22, 0xfc, 0x49, 0x95, 0x36, 0xa4, 0xcd,
0xec, 0x6e, 0xae, 0x78, 0x7d, 0xce, 0xe2, 0x08, 0xaf, 0x0b, 0x34, 0xba, 0x0f, 0xa9, 0x97, 0x5c,
0x4d, 0x4d, 0x6c, 0x48, 0x9b, 0xf3, 0x95, 0xec, 0xbb, 0xd7, 0xdb, 0x20, 0xa8, 0x55, 0x7c, 0xac,
0x8b, 0x6c, 0xe1, 0x0f, 0x09, 0xe6, 0xaa, 0xb8, 0x47, 0xa8, 0xcb, 0x50, 0x1e, 0x32, 0xbd, 0x80,
0xf4, 0x08, 0xb5, 0xbb, 0x96, 0xeb, 0xf0, 0x82, 0xb2, 0x0e, 0x71, 0xa8, 0xe6, 0xa0, 0x47, 0x30,
0xef, 0x44, 0x58, 0x12, 0x08, 0x5d, 0xf5, 0xdd, 0xeb, 0xed, 0x15, 0xa1, 0x5b, 0x76, 0x9c, 0x00,
0x53, 0x6a, 0xb0, 0xc0, 0xf5, 0xdb, 0xfa, 0x08, 0x8a, 0xbe, 0x85, 0x94, 0xed, 0x91, 0xbe, 0xcf,
0xd4, 0xe4, 0x46, 0x72, 0x33, 0xb3, 0xbb, 0x1a, 0x0f, 0x11, 0x6e, 0x8c, 0x98, 0x62, 0xa7, 0xb8,
0x47, 0x5c, 0xbf, 0x22, 0xbf, 0x19, 0xe6, 0x67, 0x74, 0x01, 0x2f, 0xbc, 0x97, 0x21, 0xdd, 0x10,
0xf5, 0x51, 0x16, 0x12, 0x97, 0x5d, 0x25, 0x5c, 0x07, 0x3d, 0x80, 0xb4, 0x87, 0x29, 0xb5, 0xdb,
0x98, 0xaa, 0x09, 0xae, 0xbb, 0x52, 0x8c, 0x96, 0xbf, 0x18, 0x2f, 0x7f, 0xb1, 0xec, 0x0f, 0xf4,
0x4b, 0x14, 0x7a, 0x0c, 0x29, 0xca, 0x6c, 0xd6, 0xa7, 0x6a, 0x92, 0x2f, 0x66, 0x61, 0xda, 0x62,
0xc6, 0xf5, 0x0c, 0x8e, 0xd4, 0x05, 0x03, 0xfd, 0x08, 0xe8, 0x85, 0xeb, 0xdb, 0x5d, 0x8b, 0xd9,
0xdd, 0xee, 0xc0, 0x0a, 0x30, 0xed, 0x77, 0x99, 0x2a, 0x6f, 0x48, 0x9b, 0x99, 0xdd, 0xfc, 0x34,
0x1d, 0x33, 0xc4, 0xe9, 0x1c, 0xa6, 0x2b, 0x9c, 0x3a, 0x16, 0x41, 0x65, 0xc8, 0xd0, 0x7e, 0xcb,
0x73, 0x99, 0x15, 0xba, 0x4b, 0x9d, 0xe5, 0x3a, 0x6b, 0xd7, 0xfa, 0x37, 0x63, 0xeb, 0x55, 0xe4,
0x57, 0xff, 0xe5, 0x25, 0x1d, 0x22, 0x52, 0x18, 0x46, 0xfb, 0xa0, 0x88, 0x25, 0xb6, 0xb0, 0xef,
0x44, 0x3a, 0xa9, 0x5b, 0xea, 0x64, 0x05, 0x53, 0xf3, 0x1d, 0xae, 0x55, 0x85, 0x45, 0x46, 0x98,
0xdd, 0xb5, 0x44, 0x5c, 0x9d, 0xbb, 0xdd, 0x46, 0x2d, 0x70, 0x56, 0x6c, 0xa0, 0x03, 0xf8, 0xe4,
0x84, 0x30, 0xd7, 0x6f, 0x5b, 0x94, 0xd9, 0x81, 0x18, 0x2d, 0x7d, 0xcb, 0x96, 0x96, 0x22, 0xaa,
0x11, 0x32, 0x79, 0x4f, 0x4f, 0x41, 0x84, 0x46, 0xe3, 0xcd, 0xdf, 0x52, 0x6b, 0x31, 0x22, 0xc6,
0xd3, 0xad, 0x85, 0x4e, 0x61, 0xb6, 0x63, 0x33, 0x5b, 0x85, 0xd0, 0xb6, 0xfa, 0xe5, 0xff, 0xc2,
0xdf, 0x12, 0x64, 0xc6, 0x37, 0xe6, 0x6b, 0x98, 0x1f, 0x60, 0x6a, 0x1d, 0x73, 0xbb, 0x4a, 0xd7,
0xce, 0x4e, 0xcd, 0x67, 0x7a, 0x7a, 0x80, 0xe9, 0x5e, 0x98, 0x47, 0x0f, 0x61, 0xd1, 0x6e, 0x51,
0x66, 0xbb, 0xbe, 0x20, 0x24, 0xa6, 0x12, 0x16, 0x04, 0x28, 0x22, 0x7d, 0x05, 0x69, 0x9f, 0x08,
0x7c, 0x72, 0x2a, 0x7e, 0xce, 0x27, 0x11, 0xf4, 0x3b, 0x40, 0x3e, 0xb1, 0x5e, 0xba, 0xac, 0x63,
0x9d, 0x60, 0x16, 0x93, 0xe4, 0xa9, 0xa4, 0x25, 0x9f, 0x1c, 0xb9, 0xac, 0xd3, 0xc4, 0x2c, 0x22,
0x17, 0xfe, 0x94, 0x40, 0x0e, 0x6f, 0x86, 0x9b, 0xcf, 0x75, 0x11, 0x66, 0x4f, 0x08, 0xc3, 0x37,
0x9f, 0xe9, 0x08, 0x86, 0xbe, 0x87, 0xb9, 0xe8, 0x9a, 0xa1, 0xaa, 0xcc, 0x7d, 0x72, 0x7f, 0xda,
0x01, 0xb8, 0x7e, 0x9b, 0xe9, 0x31, 0xed, 0xca, 0x8e, 0xcc, 0x5e, 0xdd, 0x91, 0x7d, 0x39, 0x9d,
0x54, 0xe4, 0xc2, 0xbf, 0x12, 0x2c, 0x0a, 0x5f, 0x35, 0xec, 0xc0, 0xf6, 0x28, 0x7a, 0x0e, 0x19,
0xcf, 0xf5, 0x2f, 0x1d, 0x2a, 0xdd, 0xe4, 0xd0, 0x7b, 0xa1, 0x43, 0x2f, 0x86, 0xf9, 0x4f, 0xc7,
0x58, 0xdf, 0x10, 0xcf, 0x65, 0xd8, 0xeb, 0xb1, 0x81, 0x0e, 0x9e, 0xeb, 0xc7, 0xc6, 0xf5, 0x00,
0x79, 0xf6, 0x69, 0x0c, 0xb2, 0x7a, 0x38, 0x70, 0x89, 0xc3, 0x57, 0x23, 0xac, 0x30, 0xe9, 0xb6,
0xaa, 0xb8, 0xd3, 0x2b, 0x5f, 0x5c, 0x0c, 0xf3, 0xeb, 0xd7, 0x89, 0xa3, 0x22, 0xbf, 0x87, 0x66,
0x54, 0x3c, 0xfb, 0x34, 0x9e, 0x84, 0xe7, 0x0b, 0x26, 0x2c, 0x34, 0xb9, 0x41, 0xc5, 0x64, 0x55,
0x10, 0x86, 0x8d, 0x2b, 0x4b, 0x37, 0x55, 0x96, 0xb9, 0xf2, 0x42, 0xc4, 0x12, 0xaa, 0xff, 0xc7,
0x4e, 0x16, 0xaa, 0x8f, 0x21, 0xf5, 0x6b, 0x9f, 0x04, 0x7d, 0x4f, 0xd8, 0xb8, 0x70, 0x31, 0xcc,
0x2b, 0x51, 0x64, 0xd4, 0xe1, 0xe4, 0x6b, 0x21, 0xca, 0xa3, 0x3d, 0x98, 0x67, 0x9d, 0x00, 0xd3,
0x0e, 0xe9, 0x3a, 0xc2, 0x15, 0x5f, 0x5e, 0x0c, 0xf3, 0xcb, 0x97, 0xc1, 0x8f, 0x2a, 0x8c, 0x78,
0xe8, 0x27, 0xc8, 0x72, 0xd7, 0x8e, 0x94, 0x22, 0xbb, 0x6f, 0x5d, 0x0c, 0xf3, 0xea, 0xd5, 0xcc,
0x47, 0xe5, 0x16, 0x43, 0x9c, 0x19, 0xc3, 0xb6, 0x7e, 0x93, 0x00, 0xc6, 0xde, 0x8e, 0x77, 0xe1,
0x4e, 0xb3, 0x6e, 0x6a, 0x56, 0xbd, 0x61, 0xd6, 0xea, 0x87, 0xd6, 0xb3, 0x43, 0xa3, 0xa1, 0xed,
0xd5, 0x9e, 0xd4, 0xb4, 0xaa, 0x32, 0x83, 0x96, 0x61, 0x69, 0x3c, 0xf9, 0x5c, 0x33, 0x14, 0x09,
0xdd, 0x81, 0xe5, 0xf1, 0x60, 0xb9, 0x62, 0x98, 0xe5, 0xda, 0xa1, 0x92, 0x40, 0x08, 0xb2, 0xe3,
0x89, 0xc3, 0xba, 0x92, 0x44, 0xeb, 0xa0, 0x5e, 0x8d, 0x59, 0x47, 0x35, 0xf3, 0xa9, 0xd5, 0xd4,
0xcc, 0xba, 0x22, 0x6f, 0xfd, 0x25, 0x41, 0xf6, 0xea, 0xcb, 0x02, 0xe5, 0xe1, 0x6e, 0x43, 0xaf,
0x37, 0xea, 0x46, 0xf9, 0xc0, 0x32, 0xcc, 0xb2, 0xf9, 0xcc, 0x98, 0xe8, 0xa9, 0x00, 0xb9, 0x49,
0x40, 0x55, 0x6b, 0xd4, 0x8d, 0x9a, 0x69, 0x35, 0x34, 0xbd, 0x56, 0xaf, 0x2a, 0x12, 0xfa, 0x1c,
0xee, 0x4d, 0x62, 0x9a, 0x75, 0xb3, 0x76, 0xf8, 0x43, 0x0c, 0x49, 0xa0, 0x35, 0xf8, 0x6c, 0x12,
0xd2, 0x28, 0x1b, 0x86, 0x56, 0x8d, 0x9a, 0x9e, 0xcc, 0xe9, 0xda, 0xbe, 0xb6, 0x67, 0x6a, 0x55,
0x45, 0x9e, 0xc6, 0x7c, 0x52, 0xae, 0x1d, 0x68, 0x55, 0x65, 0xb6, 0xb2, 0xff, 0xe6, 0x2c, 0x27,
0xbd, 0x3d, 0xcb, 0x49, 0xef, 0xcf, 0x72, 0xd2, 0xab, 0xf3, 0xdc, 0xcc, 0xdb, 0xf3, 0xdc, 0xcc,
0x3f, 0xe7, 0xb9, 0x99, 0x9f, 0x1f, 0xb4, 0x5d, 0xd6, 0xe9, 0xb7, 0x8a, 0xc7, 0xc4, 0x13, 0x1f,
0x2d, 0xe2, 0x67, 0x9b, 0x3a, 0xbf, 0x94, 0x4e, 0xf9, 0x27, 0x19, 0x1b, 0xf4, 0x30, 0x8d, 0x3f,
0xcc, 0x5a, 0x29, 0xee, 0xd9, 0x87, 0x1f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xf1, 0x23, 0xf2, 0x27,
0xb5, 0x09, 0x00, 0x00,
}
func (m *WeightedVoteOption) Marshal() (dAtA []byte, err error) {
@@ -1018,6 +1028,13 @@ func (m *Vote) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if len(m.Metadata) > 0 {
i -= len(m.Metadata)
copy(dAtA[i:], m.Metadata)
i = encodeVarintGov(dAtA, i, uint64(len(m.Metadata)))
i--
dAtA[i] = 0x2a
}
if len(m.Options) > 0 {
for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- {
{
@@ -1315,6 +1332,10 @@ func (m *Vote) Size() (n int) {
n += 1 + l + sovGov(uint64(l))
}
}
l = len(m.Metadata)
if l > 0 {
n += 1 + l + sovGov(uint64(l))
}
return n
}
@@ -2273,6 +2294,38 @@ func (m *Vote) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 5:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGov
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthGov
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthGov
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Metadata = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipGov(dAtA[iNdEx:])
+4 -4
View File
@@ -140,8 +140,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, option VoteOption) *MsgVote {
return &MsgVote{proposalID, voter.String(), option}
func NewMsgVote(voter sdk.AccAddress, proposalID uint64, option VoteOption, metadata string) *MsgVote {
return &MsgVote{proposalID, voter.String(), option, metadata}
}
// Route implements Msg
@@ -176,8 +176,8 @@ func (msg MsgVote) GetSigners() []sdk.AccAddress {
// NewMsgVoteWeighted creates a message to cast a vote on an active proposal
//nolint:interfacer
func NewMsgVoteWeighted(voter sdk.AccAddress, proposalID uint64, options WeightedVoteOptions) *MsgVoteWeighted {
return &MsgVoteWeighted{proposalID, voter.String(), options}
func NewMsgVoteWeighted(voter sdk.AccAddress, proposalID uint64, options WeightedVoteOptions, metadata string) *MsgVoteWeighted {
return &MsgVoteWeighted{proposalID, voter.String(), options, metadata}
}
// Route implements Msg
+25 -21
View File
@@ -59,22 +59,24 @@ func TestMsgDeposit(t *testing.T) {
// test ValidateBasic for MsgVote
func TestMsgVote(t *testing.T) {
metadata := "metadata"
tests := []struct {
proposalID uint64
voterAddr sdk.AccAddress
option v1beta2.VoteOption
metadata string
expectPass bool
}{
{0, addrs[0], v1beta2.OptionYes, true},
{0, sdk.AccAddress{}, v1beta2.OptionYes, false},
{0, addrs[0], v1beta2.OptionNo, true},
{0, addrs[0], v1beta2.OptionNoWithVeto, true},
{0, addrs[0], v1beta2.OptionAbstain, true},
{0, addrs[0], v1beta2.VoteOption(0x13), false},
{0, addrs[0], v1beta2.OptionYes, metadata, true},
{0, sdk.AccAddress{}, v1beta2.OptionYes, "", false},
{0, addrs[0], v1beta2.OptionNo, metadata, true},
{0, addrs[0], v1beta2.OptionNoWithVeto, "", true},
{0, addrs[0], v1beta2.OptionAbstain, "", true},
{0, addrs[0], v1beta2.VoteOption(0x13), "", false},
}
for i, tc := range tests {
msg := v1beta2.NewMsgVote(tc.voterAddr, tc.proposalID, tc.option)
msg := v1beta2.NewMsgVote(tc.voterAddr, tc.proposalID, tc.option, tc.metadata)
if tc.expectPass {
require.Nil(t, msg.ValidateBasic(), "test: %v", i)
} else {
@@ -85,40 +87,42 @@ func TestMsgVote(t *testing.T) {
// test ValidateBasic for MsgVoteWeighted
func TestMsgVoteWeighted(t *testing.T) {
metadata := "metadata"
tests := []struct {
proposalID uint64
voterAddr sdk.AccAddress
options v1beta2.WeightedVoteOptions
metadata string
expectPass bool
}{
{0, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), true},
{0, sdk.AccAddress{}, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), false},
{0, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo), true},
{0, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNoWithVeto), true},
{0, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionAbstain), true},
{0, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), metadata, true},
{0, sdk.AccAddress{}, v1beta2.NewNonSplitVoteOption(v1beta2.OptionYes), "", false},
{0, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNo), "", true},
{0, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionNoWithVeto), "", true},
{0, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.OptionAbstain), "", true},
{0, addrs[0], v1beta2.WeightedVoteOptions{ // weight sum > 1
v1beta2.NewWeightedVoteOption(v1beta2.OptionYes, sdk.NewDec(1)),
v1beta2.NewWeightedVoteOption(v1beta2.OptionAbstain, sdk.NewDec(1)),
}, false},
}, "", false},
{0, addrs[0], v1beta2.WeightedVoteOptions{ // duplicate option
v1beta2.NewWeightedVoteOption(v1beta2.OptionYes, sdk.NewDecWithPrec(5, 1)),
v1beta2.NewWeightedVoteOption(v1beta2.OptionYes, sdk.NewDecWithPrec(5, 1)),
}, false},
}, "", false},
{0, addrs[0], v1beta2.WeightedVoteOptions{ // zero weight
v1beta2.NewWeightedVoteOption(v1beta2.OptionYes, sdk.NewDec(0)),
}, false},
}, "", false},
{0, addrs[0], v1beta2.WeightedVoteOptions{ // negative weight
v1beta2.NewWeightedVoteOption(v1beta2.OptionYes, sdk.NewDec(-1)),
}, false},
{0, addrs[0], v1beta2.WeightedVoteOptions{}, false},
{0, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.VoteOption(0x13)), false},
}, "", false},
{0, addrs[0], v1beta2.WeightedVoteOptions{}, "", false},
{0, addrs[0], v1beta2.NewNonSplitVoteOption(v1beta2.VoteOption(0x13)), "", false},
{0, addrs[0], v1beta2.WeightedVoteOptions{ // weight sum <1
v1beta2.NewWeightedVoteOption(v1beta2.OptionYes, sdk.NewDecWithPrec(5, 1)),
}, false},
}, "", false},
}
for i, tc := range tests {
msg := v1beta2.NewMsgVoteWeighted(tc.voterAddr, tc.proposalID, tc.options)
msg := v1beta2.NewMsgVoteWeighted(tc.voterAddr, tc.proposalID, tc.options, tc.metadata)
if tc.expectPass {
require.Nil(t, msg.ValidateBasic(), "test: %v", i)
} else {
@@ -165,7 +169,7 @@ func TestMsgSubmitProposal_ValidateBasic(t *testing.T) {
// this tests that Amino JSON MsgSubmitProposal.GetSignBytes() still works with Content as Any using the ModuleCdc
func TestMsgSubmitProposal_GetSignBytes(t *testing.T) {
proposal := []sdk.Msg{v1beta2.NewMsgVote(addrs[0], 1, v1beta2.OptionYes)}
proposal := []sdk.Msg{v1beta2.NewMsgVote(addrs[0], 1, v1beta2.OptionYes, "")}
msg, err := v1beta2.NewMsgSubmitProposal(proposal, sdk.NewCoins(), sdk.AccAddress{}.String(), "")
require.NoError(t, err)
var bz []byte
+149 -47
View File
@@ -246,6 +246,7 @@ type MsgVote struct {
ProposalId uint64 `protobuf:"varint,1,opt,name=proposal_id,json=proposalId,proto3" json:"proposal_id"`
Voter string `protobuf:"bytes,2,opt,name=voter,proto3" json:"voter,omitempty"`
Option VoteOption `protobuf:"varint,3,opt,name=option,proto3,enum=cosmos.gov.v1beta2.VoteOption" json:"option,omitempty"`
Metadata string `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"`
}
func (m *MsgVote) Reset() { *m = MsgVote{} }
@@ -302,6 +303,13 @@ func (m *MsgVote) GetOption() VoteOption {
return VoteOption_VOTE_OPTION_UNSPECIFIED
}
func (m *MsgVote) GetMetadata() string {
if m != nil {
return m.Metadata
}
return ""
}
// MsgVoteResponse defines the Msg/Vote response type.
type MsgVoteResponse struct {
}
@@ -344,6 +352,7 @@ type MsgVoteWeighted struct {
ProposalId uint64 `protobuf:"varint,1,opt,name=proposal_id,json=proposalId,proto3" json:"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,omitempty"`
Metadata string `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"`
}
func (m *MsgVoteWeighted) Reset() { *m = MsgVoteWeighted{} }
@@ -400,6 +409,13 @@ func (m *MsgVoteWeighted) GetOptions() []*WeightedVoteOption {
return nil
}
func (m *MsgVoteWeighted) GetMetadata() string {
if m != nil {
return m.Metadata
}
return ""
}
// MsgVoteWeightedResponse defines the Msg/VoteWeighted response type.
type MsgVoteWeightedResponse struct {
}
@@ -551,53 +567,53 @@ func init() {
func init() { proto.RegisterFile("cosmos/gov/v1beta2/tx.proto", fileDescriptor_4214261f6b3f9ed4) }
var fileDescriptor_4214261f6b3f9ed4 = []byte{
// 733 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xcf, 0x4f, 0x13, 0x41,
0x14, 0xee, 0xd2, 0x4a, 0xe1, 0xa1, 0x25, 0x4c, 0x9a, 0xb0, 0x5d, 0xc8, 0x42, 0xd6, 0x48, 0x1a,
0x4d, 0x77, 0xdb, 0x6a, 0x30, 0x41, 0x0f, 0x52, 0x34, 0x41, 0x63, 0xa3, 0x2e, 0x89, 0x26, 0x5e,
0x70, 0xdb, 0x1d, 0x86, 0x8d, 0x74, 0x67, 0xb3, 0x33, 0x6d, 0xe8, 0x51, 0xff, 0x02, 0xff, 0x13,
0x3d, 0x70, 0x37, 0xde, 0x88, 0x27, 0xe2, 0xc9, 0x8b, 0xc4, 0xc0, 0xc1, 0xc4, 0x93, 0x7f, 0x82,
0xd9, 0xdd, 0xd9, 0x2d, 0xd0, 0x1f, 0xd4, 0x8b, 0xa7, 0xce, 0xbc, 0xef, 0xfb, 0xde, 0xbc, 0x6f,
0xfa, 0xde, 0x0e, 0x2c, 0x34, 0x29, 0x6b, 0x51, 0x66, 0x10, 0xda, 0x31, 0x3a, 0x95, 0x06, 0xe6,
0x56, 0xd5, 0xe0, 0xfb, 0xba, 0xe7, 0x53, 0x4e, 0x11, 0x8a, 0x40, 0x9d, 0xd0, 0x8e, 0x2e, 0x40,
0x45, 0x15, 0x82, 0x86, 0xc5, 0xb0, 0x50, 0x54, 0x8c, 0x26, 0x75, 0xdc, 0x48, 0xa3, 0x2c, 0x0e,
0x48, 0x18, 0xe8, 0x23, 0x34, 0x4f, 0x28, 0xa1, 0xe1, 0xd2, 0x08, 0x56, 0x22, 0x5a, 0x88, 0x34,
0xdb, 0x11, 0x20, 0x0e, 0x15, 0x10, 0xa1, 0x94, 0xec, 0x61, 0x23, 0xdc, 0x35, 0xda, 0x3b, 0x86,
0xe5, 0x76, 0x05, 0x34, 0x2f, 0x4e, 0x6a, 0x31, 0x62, 0x74, 0x2a, 0xc1, 0x4f, 0x04, 0x68, 0x7f,
0x24, 0x98, 0xab, 0x33, 0xb2, 0xd5, 0x6e, 0xb4, 0x1c, 0xfe, 0xdc, 0xa7, 0x1e, 0x65, 0xd6, 0x1e,
0x2a, 0xc3, 0x54, 0x0b, 0x33, 0x66, 0x11, 0xcc, 0x64, 0x69, 0x39, 0x5d, 0x9c, 0xa9, 0xe6, 0xf5,
0x28, 0xb9, 0x1e, 0x27, 0xd7, 0xd7, 0xdd, 0xae, 0x99, 0xb0, 0xd0, 0x26, 0xcc, 0x3a, 0xae, 0xc3,
0x1d, 0x6b, 0x6f, 0xdb, 0xc6, 0x1e, 0x65, 0x0e, 0x97, 0x27, 0x42, 0x61, 0x41, 0x17, 0x35, 0x06,
0x97, 0x20, 0x6e, 0xa6, 0xa2, 0x6f, 0x50, 0xc7, 0xad, 0x65, 0x0e, 0x8f, 0x97, 0x52, 0x66, 0x4e,
0xe8, 0x1e, 0x46, 0x32, 0x74, 0x07, 0xa6, 0xbc, 0xb0, 0x0e, 0xec, 0xcb, 0xe9, 0x65, 0xa9, 0x38,
0x5d, 0x93, 0xbf, 0x1d, 0x94, 0xf2, 0x22, 0xcb, 0xba, 0x6d, 0xfb, 0x98, 0xb1, 0x2d, 0xee, 0x3b,
0x2e, 0x31, 0x13, 0x26, 0x52, 0x82, 0x8a, 0xb9, 0x65, 0x5b, 0xdc, 0x92, 0x33, 0x81, 0xca, 0x4c,
0xf6, 0x6b, 0xd7, 0xde, 0xff, 0xfa, 0x74, 0x33, 0xa1, 0x6a, 0xf7, 0xa1, 0xd0, 0xe7, 0xd8, 0xc4,
0xcc, 0xa3, 0x2e, 0xc3, 0x68, 0x09, 0x66, 0x3c, 0x11, 0xdb, 0x76, 0x6c, 0x59, 0x5a, 0x96, 0x8a,
0x19, 0x13, 0xe2, 0xd0, 0x63, 0x5b, 0x7b, 0x27, 0x41, 0xbe, 0xce, 0xc8, 0xa3, 0x7d, 0xdc, 0x7c,
0x8a, 0x89, 0xd5, 0xec, 0x6e, 0x50, 0x97, 0x63, 0x97, 0xa3, 0x7b, 0x90, 0x6d, 0x46, 0xcb, 0x50,
0x35, 0xe4, 0xca, 0x6a, 0x33, 0x5f, 0x0f, 0x4a, 0x59, 0xa1, 0x31, 0x63, 0x05, 0x5a, 0x84, 0x69,
0xab, 0xcd, 0x77, 0xa9, 0xef, 0xf0, 0xae, 0x3c, 0x11, 0xd6, 0xdf, 0x0b, 0xac, 0xe5, 0x02, 0x03,
0xbd, 0xbd, 0xa6, 0xc2, 0xe2, 0xa0, 0x12, 0x62, 0x13, 0xda, 0x47, 0x09, 0xb2, 0x75, 0x46, 0x5e,
0x52, 0x8e, 0x51, 0x79, 0x80, 0xa1, 0xda, 0xec, 0xef, 0xe3, 0xa5, 0xb3, 0xe1, 0xb3, 0x0e, 0x91,
0x0e, 0x57, 0x3a, 0x94, 0x63, 0x3f, 0xaa, 0x63, 0xc4, 0xed, 0x47, 0x34, 0xb4, 0x0a, 0x93, 0xd4,
0xe3, 0x0e, 0x75, 0xc3, 0xbf, 0x2b, 0x57, 0x55, 0xf5, 0xfe, 0x51, 0xd0, 0x83, 0x5a, 0x9e, 0x85,
0x2c, 0x53, 0xb0, 0xd7, 0x20, 0x70, 0x15, 0xe5, 0xd0, 0xe6, 0x60, 0x56, 0x14, 0x9c, 0x98, 0xf8,
0x22, 0x25, 0xb1, 0x57, 0xd8, 0x21, 0xbb, 0x1c, 0xdb, 0xff, 0xc1, 0xcc, 0x03, 0xc8, 0x46, 0xe5,
0x31, 0x39, 0x1d, 0xf6, 0xef, 0xca, 0x20, 0x37, 0x71, 0x41, 0x67, 0x5c, 0xc5, 0xb2, 0x73, 0xb6,
0x0a, 0x30, 0x7f, 0xc1, 0x42, 0x62, 0xef, 0xb3, 0x04, 0x50, 0x67, 0x24, 0xee, 0xfa, 0x7f, 0x77,
0xb6, 0x0a, 0xd3, 0x62, 0xd2, 0xe8, 0xe5, 0xee, 0x7a, 0x54, 0x74, 0x17, 0x26, 0xad, 0x16, 0x6d,
0xbb, 0x5c, 0x18, 0xbc, 0x74, 0x40, 0x05, 0x5d, 0x74, 0x61, 0x92, 0x48, 0xcb, 0x03, 0xea, 0x19,
0x88, 0x7d, 0x55, 0x7f, 0xa4, 0x21, 0x5d, 0x67, 0x04, 0xed, 0x40, 0xee, 0xc2, 0x47, 0xe5, 0xc6,
0xa0, 0x9b, 0xec, 0x9b, 0x44, 0xa5, 0x34, 0x16, 0x2d, 0x19, 0x58, 0x0a, 0x73, 0xfd, 0xb3, 0x58,
0x1c, 0x92, 0xa3, 0x8f, 0xa9, 0x94, 0xc7, 0x65, 0x26, 0x07, 0x6e, 0x42, 0x26, 0x1c, 0xac, 0x85,
0x21, 0xca, 0x00, 0x54, 0xae, 0x8f, 0x00, 0x93, 0x4c, 0x6f, 0xe0, 0xea, 0xb9, 0xee, 0x1e, 0x25,
0x8a, 0x49, 0xca, 0xad, 0x31, 0x48, 0xc9, 0x09, 0x2f, 0x20, 0x1b, 0x37, 0x98, 0x3a, 0x44, 0x27,
0x70, 0x65, 0x65, 0x34, 0x1e, 0xa7, 0xac, 0x3d, 0x39, 0x3c, 0x51, 0xa5, 0xa3, 0x13, 0x55, 0xfa,
0x79, 0xa2, 0x4a, 0x1f, 0x4e, 0xd5, 0xd4, 0xd1, 0xa9, 0x9a, 0xfa, 0x7e, 0xaa, 0xa6, 0x5e, 0x97,
0x89, 0xc3, 0x77, 0xdb, 0x0d, 0xbd, 0x49, 0x5b, 0xe2, 0x5d, 0x12, 0x3f, 0x25, 0x66, 0xbf, 0x35,
0xf6, 0xc3, 0x57, 0x8e, 0x77, 0x3d, 0xcc, 0xe2, 0xb7, 0xae, 0x31, 0x19, 0x7e, 0x19, 0x6f, 0xff,
0x0d, 0x00, 0x00, 0xff, 0xff, 0x50, 0xa3, 0xc5, 0x32, 0x59, 0x07, 0x00, 0x00,
// 735 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0x4f, 0x6f, 0xd3, 0x4e,
0x10, 0x8d, 0x9b, 0xfc, 0x9a, 0x76, 0xfa, 0x23, 0x55, 0x57, 0x91, 0xea, 0xb8, 0x95, 0x5b, 0x19,
0x51, 0x45, 0xa0, 0xd8, 0x49, 0x40, 0x45, 0x2a, 0x1c, 0x68, 0x0a, 0x52, 0x41, 0x44, 0x80, 0x2b,
0x81, 0xc4, 0xa5, 0x38, 0xf1, 0x76, 0x6b, 0xd1, 0x78, 0x2d, 0xef, 0x26, 0x6a, 0x8e, 0xf0, 0x09,
0xf8, 0x28, 0x1c, 0x7a, 0xe7, 0x5a, 0xc1, 0xa5, 0xe2, 0xc4, 0xa5, 0x15, 0x6a, 0x0f, 0x48, 0x9c,
0xf8, 0x08, 0xc8, 0xf6, 0xda, 0x09, 0xcd, 0x9f, 0x86, 0x0b, 0x27, 0x7b, 0xe7, 0xbd, 0x37, 0x3b,
0x6f, 0xbc, 0xe3, 0x85, 0xa5, 0x26, 0x65, 0x2d, 0xca, 0x0c, 0x42, 0x3b, 0x46, 0xa7, 0xd2, 0xc0,
0xdc, 0xaa, 0x1a, 0xfc, 0x50, 0xf7, 0x7c, 0xca, 0x29, 0x42, 0x11, 0xa8, 0x13, 0xda, 0xd1, 0x05,
0xa8, 0xa8, 0x42, 0xd0, 0xb0, 0x18, 0x16, 0x8a, 0x8a, 0xd1, 0xa4, 0x8e, 0x1b, 0x69, 0x94, 0xe5,
0x21, 0x09, 0x03, 0x7d, 0x84, 0xe6, 0x09, 0x25, 0x34, 0x7c, 0x35, 0x82, 0x37, 0x11, 0x2d, 0x44,
0x9a, 0xdd, 0x08, 0x10, 0x9b, 0x0a, 0x88, 0x50, 0x4a, 0x0e, 0xb0, 0x11, 0xae, 0x1a, 0xed, 0x3d,
0xc3, 0x72, 0xbb, 0x02, 0x5a, 0x14, 0x3b, 0xb5, 0x18, 0x31, 0x3a, 0x95, 0xe0, 0x11, 0x01, 0xda,
0x2f, 0x09, 0x16, 0xea, 0x8c, 0xec, 0xb4, 0x1b, 0x2d, 0x87, 0x3f, 0xf7, 0xa9, 0x47, 0x99, 0x75,
0x80, 0xca, 0x30, 0xd3, 0xc2, 0x8c, 0x59, 0x04, 0x33, 0x59, 0x5a, 0x4d, 0x17, 0xe7, 0xaa, 0x79,
0x3d, 0x4a, 0xae, 0xc7, 0xc9, 0xf5, 0x4d, 0xb7, 0x6b, 0x26, 0x2c, 0xb4, 0x0d, 0xf3, 0x8e, 0xeb,
0x70, 0xc7, 0x3a, 0xd8, 0xb5, 0xb1, 0x47, 0x99, 0xc3, 0xe5, 0xa9, 0x50, 0x58, 0xd0, 0x45, 0x8d,
0x41, 0x13, 0x44, 0x67, 0x2a, 0xfa, 0x16, 0x75, 0xdc, 0x5a, 0xe6, 0xf8, 0x6c, 0x25, 0x65, 0xe6,
0x84, 0xee, 0x61, 0x24, 0x43, 0x77, 0x60, 0xc6, 0x0b, 0xeb, 0xc0, 0xbe, 0x9c, 0x5e, 0x95, 0x8a,
0xb3, 0x35, 0xf9, 0xeb, 0x51, 0x29, 0x2f, 0xb2, 0x6c, 0xda, 0xb6, 0x8f, 0x19, 0xdb, 0xe1, 0xbe,
0xe3, 0x12, 0x33, 0x61, 0x22, 0x25, 0xa8, 0x98, 0x5b, 0xb6, 0xc5, 0x2d, 0x39, 0x13, 0xa8, 0xcc,
0x64, 0xbd, 0x71, 0xed, 0xfd, 0x8f, 0x8f, 0x37, 0x13, 0xaa, 0x76, 0x1f, 0x0a, 0x03, 0x8e, 0x4d,
0xcc, 0x3c, 0xea, 0x32, 0x8c, 0x56, 0x60, 0xce, 0x13, 0xb1, 0x5d, 0xc7, 0x96, 0xa5, 0x55, 0xa9,
0x98, 0x31, 0x21, 0x0e, 0x3d, 0xb6, 0xb5, 0x77, 0x12, 0xe4, 0xeb, 0x8c, 0x3c, 0x3a, 0xc4, 0xcd,
0xa7, 0x98, 0x58, 0xcd, 0xee, 0x16, 0x75, 0x39, 0x76, 0x39, 0xba, 0x07, 0xd9, 0x66, 0xf4, 0x1a,
0xaa, 0x46, 0xb4, 0xac, 0x36, 0xf7, 0xf9, 0xa8, 0x94, 0x15, 0x1a, 0x33, 0x56, 0xa0, 0x65, 0x98,
0xb5, 0xda, 0x7c, 0x9f, 0xfa, 0x0e, 0xef, 0xca, 0x53, 0x61, 0xfd, 0xbd, 0xc0, 0x46, 0x2e, 0x30,
0xd0, 0x5b, 0x6b, 0x2a, 0x2c, 0x0f, 0x2b, 0x21, 0x36, 0xa1, 0x7d, 0x91, 0x20, 0x5b, 0x67, 0xe4,
0x25, 0xe5, 0x18, 0x95, 0x87, 0x18, 0xaa, 0xcd, 0xff, 0x3c, 0x5b, 0xe9, 0x0f, 0xf7, 0x3b, 0x44,
0x3a, 0xfc, 0xd7, 0xa1, 0x1c, 0xfb, 0x51, 0x1d, 0x63, 0xba, 0x1f, 0xd1, 0xd0, 0x3a, 0x4c, 0x53,
0x8f, 0x3b, 0xd4, 0x0d, 0x3f, 0x57, 0xae, 0xaa, 0xea, 0x83, 0xa3, 0xa0, 0x07, 0xb5, 0x3c, 0x0b,
0x59, 0xa6, 0x60, 0x8f, 0xfd, 0x64, 0x10, 0x38, 0x8e, 0xf2, 0x6b, 0x0b, 0x30, 0x2f, 0xcc, 0x24,
0x06, 0x4f, 0xa5, 0x24, 0xf6, 0x0a, 0x3b, 0x64, 0x9f, 0x63, 0xfb, 0x1f, 0x18, 0x7d, 0x00, 0xd9,
0xa8, 0x74, 0x26, 0xa7, 0xc3, 0xb3, 0xbd, 0x36, 0xcc, 0x69, 0x5c, 0x50, 0x9f, 0xe3, 0x58, 0x36,
0xb1, 0xe5, 0x02, 0x2c, 0x5e, 0xb2, 0x97, 0x58, 0xff, 0x24, 0x01, 0xd4, 0x19, 0x89, 0xa7, 0xe5,
0xef, 0x5d, 0xaf, 0xc3, 0xac, 0x98, 0x50, 0x7a, 0xb5, 0xf3, 0x1e, 0x15, 0xdd, 0x85, 0x69, 0xab,
0x45, 0xdb, 0x2e, 0x17, 0xe6, 0xaf, 0x1c, 0x6c, 0x41, 0x17, 0xa7, 0x37, 0x49, 0xa4, 0xe5, 0x01,
0xf5, 0x0c, 0xc4, 0xbe, 0xaa, 0xa7, 0x69, 0x48, 0xd7, 0x19, 0x41, 0x7b, 0x90, 0xbb, 0xf4, 0x33,
0xba, 0x31, 0xac, 0xcb, 0x03, 0x13, 0xac, 0x94, 0x26, 0xa2, 0x25, 0x83, 0x4e, 0x61, 0x61, 0x70,
0x86, 0x8b, 0x23, 0x72, 0x0c, 0x30, 0x95, 0xf2, 0xa4, 0xcc, 0x64, 0xc3, 0x6d, 0xc8, 0x84, 0x03,
0xb9, 0x34, 0x42, 0x19, 0x80, 0xca, 0xf5, 0x31, 0x60, 0x92, 0xe9, 0x0d, 0xfc, 0xff, 0xc7, 0xc9,
0x1f, 0x27, 0x8a, 0x49, 0xca, 0xad, 0x09, 0x48, 0xc9, 0x0e, 0x2f, 0x20, 0x1b, 0x1f, 0x30, 0x75,
0x84, 0x4e, 0xe0, 0xca, 0xda, 0x78, 0x3c, 0x4e, 0x59, 0x7b, 0x72, 0x7c, 0xae, 0x4a, 0x27, 0xe7,
0xaa, 0xf4, 0xfd, 0x5c, 0x95, 0x3e, 0x5c, 0xa8, 0xa9, 0x93, 0x0b, 0x35, 0xf5, 0xed, 0x42, 0x4d,
0xbd, 0x2e, 0x13, 0x87, 0xef, 0xb7, 0x1b, 0x7a, 0x93, 0xb6, 0xc4, 0x7d, 0x26, 0x1e, 0x25, 0x66,
0xbf, 0x35, 0x0e, 0xc3, 0xdb, 0x91, 0x77, 0x3d, 0xcc, 0xe2, 0x3b, 0xb2, 0x31, 0x1d, 0xfe, 0x51,
0x6f, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x2b, 0xc6, 0x08, 0x2b, 0x91, 0x07, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -1014,6 +1030,13 @@ func (m *MsgVote) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if len(m.Metadata) > 0 {
i -= len(m.Metadata)
copy(dAtA[i:], m.Metadata)
i = encodeVarintTx(dAtA, i, uint64(len(m.Metadata)))
i--
dAtA[i] = 0x22
}
if m.Option != 0 {
i = encodeVarintTx(dAtA, i, uint64(m.Option))
i--
@@ -1077,6 +1100,13 @@ func (m *MsgVoteWeighted) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if len(m.Metadata) > 0 {
i -= len(m.Metadata)
copy(dAtA[i:], m.Metadata)
i = encodeVarintTx(dAtA, i, uint64(len(m.Metadata)))
i--
dAtA[i] = 0x22
}
if len(m.Options) > 0 {
for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- {
{
@@ -1295,6 +1325,10 @@ func (m *MsgVote) Size() (n int) {
if m.Option != 0 {
n += 1 + sovTx(uint64(m.Option))
}
l = len(m.Metadata)
if l > 0 {
n += 1 + l + sovTx(uint64(l))
}
return n
}
@@ -1326,6 +1360,10 @@ func (m *MsgVoteWeighted) Size() (n int) {
n += 1 + l + sovTx(uint64(l))
}
}
l = len(m.Metadata)
if l > 0 {
n += 1 + l + sovTx(uint64(l))
}
return n
}
@@ -1893,6 +1931,38 @@ func (m *MsgVote) Unmarshal(dAtA []byte) error {
break
}
}
case 4:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowTx
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthTx
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthTx
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Metadata = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipTx(dAtA[iNdEx:])
@@ -2078,6 +2148,38 @@ func (m *MsgVoteWeighted) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 4:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowTx
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthTx
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthTx
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Metadata = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipTx(dAtA[iNdEx:])
+2 -2
View File
@@ -17,8 +17,8 @@ const (
// NewVote creates a new Vote instance
//nolint:interfacer
func NewVote(proposalID uint64, voter sdk.AccAddress, options WeightedVoteOptions) Vote {
return Vote{ProposalId: proposalID, Voter: voter.String(), Options: options}
func NewVote(proposalID uint64, voter sdk.AccAddress, options WeightedVoteOptions, metadata string) Vote {
return Vote{ProposalId: proposalID, Voter: voter.String(), Options: options, Metadata: metadata}
}
// Empty returns whether a vote is empty.