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  }