package gov import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/gov/types" ) // AddVote Adds a vote on a specific proposal func (keeper Keeper) AddVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress, option VoteOption) sdk.Error { proposal, ok := keeper.GetProposal(ctx, proposalID) if !ok { return ErrUnknownProposal(keeper.codespace, proposalID) } if proposal.Status != StatusVotingPeriod { return ErrInactiveProposal(keeper.codespace, proposalID) } if !ValidVoteOption(option) { return ErrInvalidVote(keeper.codespace, option) } vote := NewVote(proposalID, voterAddr, option) keeper.setVote(ctx, proposalID, voterAddr, vote) ctx.EventManager().EmitEvent( sdk.NewEvent( types.EventTypeProposalVote, sdk.NewAttribute(types.AttributeKeyOption, option.String()), sdk.NewAttribute(types.AttributeKeyProposalID, fmt.Sprintf("%d", proposalID)), ), ) return nil } // GetAllVotes returns all the votes from the store func (keeper Keeper) GetAllVotes(ctx sdk.Context) (votes Votes) { keeper.IterateAllVotes(ctx, func(vote Vote) bool { votes = append(votes, vote) return false }) return } // GetVotes returns all the votes from a proposal func (keeper Keeper) GetVotes(ctx sdk.Context, proposalID uint64) (votes Votes) { keeper.IterateVotes(ctx, proposalID, func(vote Vote) bool { votes = append(votes, vote) return false }) return } // GetVote gets the vote from an address on a specific proposal func (keeper Keeper) GetVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress) (vote Vote, found bool) { store := ctx.KVStore(keeper.storeKey) bz := store.Get(types.VoteKey(proposalID, voterAddr)) if bz == nil { return vote, false } keeper.cdc.MustUnmarshalBinaryLengthPrefixed(bz, &vote) return vote, true } func (keeper Keeper) setVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress, vote Vote) { store := ctx.KVStore(keeper.storeKey) bz := keeper.cdc.MustMarshalBinaryLengthPrefixed(vote) store.Set(types.VoteKey(proposalID, voterAddr), bz) } // GetVotesIterator gets all the votes on a specific proposal as an sdk.Iterator func (keeper Keeper) GetVotesIterator(ctx sdk.Context, proposalID uint64) sdk.Iterator { store := ctx.KVStore(keeper.storeKey) return sdk.KVStorePrefixIterator(store, types.VotesKey(proposalID)) } func (keeper Keeper) deleteVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress) { store := ctx.KVStore(keeper.storeKey) store.Delete(types.VoteKey(proposalID, voterAddr)) }