github.com/cosmos/cosmos-sdk@v0.50.10/x/gov/keeper/vote.go (about) 1 package keeper 2 3 import ( 4 "context" 5 "fmt" 6 7 "cosmossdk.io/collections" 8 "cosmossdk.io/errors" 9 10 sdk "github.com/cosmos/cosmos-sdk/types" 11 "github.com/cosmos/cosmos-sdk/x/gov/types" 12 v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" 13 ) 14 15 // AddVote adds a vote on a specific proposal 16 func (keeper Keeper) AddVote(ctx context.Context, proposalID uint64, voterAddr sdk.AccAddress, options v1.WeightedVoteOptions, metadata string) error { 17 // Check if proposal is in voting period. 18 inVotingPeriod, err := keeper.VotingPeriodProposals.Has(ctx, proposalID) 19 if err != nil { 20 return err 21 } 22 23 if !inVotingPeriod { 24 return errors.Wrapf(types.ErrInactiveProposal, "%d", proposalID) 25 } 26 27 err = keeper.assertMetadataLength(metadata) 28 if err != nil { 29 return err 30 } 31 32 for _, option := range options { 33 if !v1.ValidWeightedVoteOption(*option) { 34 return errors.Wrap(types.ErrInvalidVote, option.String()) 35 } 36 } 37 38 vote := v1.NewVote(proposalID, voterAddr, options, metadata) 39 err = keeper.Votes.Set(ctx, collections.Join(proposalID, voterAddr), vote) 40 if err != nil { 41 return err 42 } 43 44 // called after a vote on a proposal is cast 45 err = keeper.Hooks().AfterProposalVote(ctx, proposalID, voterAddr) 46 if err != nil { 47 return err 48 } 49 50 sdkCtx := sdk.UnwrapSDKContext(ctx) 51 sdkCtx.EventManager().EmitEvent( 52 sdk.NewEvent( 53 types.EventTypeProposalVote, 54 sdk.NewAttribute(types.AttributeKeyVoter, voterAddr.String()), 55 sdk.NewAttribute(types.AttributeKeyOption, options.String()), 56 sdk.NewAttribute(types.AttributeKeyProposalID, fmt.Sprintf("%d", proposalID)), 57 ), 58 ) 59 60 return nil 61 } 62 63 // deleteVotes deletes all the votes from a given proposalID. 64 func (keeper Keeper) deleteVotes(ctx context.Context, proposalID uint64) error { 65 rng := collections.NewPrefixedPairRange[uint64, sdk.AccAddress](proposalID) 66 err := keeper.Votes.Clear(ctx, rng) 67 if err != nil { 68 return err 69 } 70 71 return nil 72 }