github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/gov/keeper/vote.go (about)

     1  package keeper
     2  
     3  import (
     4  	"fmt"
     5  
     6  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     7  	sdkerrors "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/errors"
     8  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/gov/types"
     9  )
    10  
    11  // AddVote adds a vote on a specific proposal
    12  func (keeper Keeper) AddVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress, option types.VoteOption) error {
    13  	proposal, ok := keeper.GetProposal(ctx, proposalID)
    14  	if !ok {
    15  		return sdkerrors.Wrapf(types.ErrUnknownProposal, "%d", proposalID)
    16  	}
    17  	if proposal.Status != types.StatusVotingPeriod {
    18  		return sdkerrors.Wrapf(types.ErrInactiveProposal, "%d", proposalID)
    19  	}
    20  
    21  	if !types.ValidVoteOption(option) {
    22  		return sdkerrors.Wrap(types.ErrInvalidVote, option.String())
    23  	}
    24  
    25  	vote := types.NewVote(proposalID, voterAddr, option)
    26  	keeper.SetVote(ctx, vote)
    27  
    28  	ctx.EventManager().EmitEvent(
    29  		sdk.NewEvent(
    30  			types.EventTypeProposalVote,
    31  			sdk.NewAttribute(types.AttributeKeyOption, option.String()),
    32  			sdk.NewAttribute(types.AttributeKeyProposalID, fmt.Sprintf("%d", proposalID)),
    33  		),
    34  	)
    35  
    36  	return nil
    37  }
    38  
    39  // GetAllVotes returns all the votes from the store
    40  func (keeper Keeper) GetAllVotes(ctx sdk.Context) (votes types.Votes) {
    41  	keeper.IterateAllVotes(ctx, func(vote types.Vote) bool {
    42  		votes = append(votes, vote)
    43  		return false
    44  	})
    45  	return
    46  }
    47  
    48  // GetVotes returns all the votes from a proposal
    49  func (keeper Keeper) GetVotes(ctx sdk.Context, proposalID uint64) (votes types.Votes) {
    50  	keeper.IterateVotes(ctx, proposalID, func(vote types.Vote) bool {
    51  		votes = append(votes, vote)
    52  		return false
    53  	})
    54  	return
    55  }
    56  
    57  // GetVote gets the vote from an address on a specific proposal
    58  func (keeper Keeper) GetVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress) (vote types.Vote, found bool) {
    59  	store := ctx.KVStore(keeper.storeKey)
    60  	bz := store.Get(types.VoteKey(proposalID, voterAddr))
    61  	if bz == nil {
    62  		return vote, false
    63  	}
    64  
    65  	keeper.cdc.MustUnmarshalBinaryLengthPrefixed(bz, &vote)
    66  	return vote, true
    67  }
    68  
    69  // SetVote sets a Vote to the gov store
    70  func (keeper Keeper) SetVote(ctx sdk.Context, vote types.Vote) {
    71  	store := ctx.KVStore(keeper.storeKey)
    72  	bz := keeper.cdc.MustMarshalBinaryLengthPrefixed(vote)
    73  	store.Set(types.VoteKey(vote.ProposalID, vote.Voter), bz)
    74  }
    75  
    76  // IterateAllVotes iterates over the all the stored votes and performs a callback function
    77  func (keeper Keeper) IterateAllVotes(ctx sdk.Context, cb func(vote types.Vote) (stop bool)) {
    78  	store := ctx.KVStore(keeper.storeKey)
    79  	iterator := sdk.KVStorePrefixIterator(store, types.VotesKeyPrefix)
    80  
    81  	defer iterator.Close()
    82  	for ; iterator.Valid(); iterator.Next() {
    83  		var vote types.Vote
    84  		keeper.cdc.MustUnmarshalBinaryLengthPrefixed(iterator.Value(), &vote)
    85  
    86  		if cb(vote) {
    87  			break
    88  		}
    89  	}
    90  }
    91  
    92  // IterateVotes iterates over the all the proposals votes and performs a callback function
    93  func (keeper Keeper) IterateVotes(ctx sdk.Context, proposalID uint64, cb func(vote types.Vote) (stop bool)) {
    94  	store := ctx.KVStore(keeper.storeKey)
    95  	iterator := sdk.KVStorePrefixIterator(store, types.VotesKey(proposalID))
    96  
    97  	defer iterator.Close()
    98  	for ; iterator.Valid(); iterator.Next() {
    99  		var vote types.Vote
   100  		keeper.cdc.MustUnmarshalBinaryLengthPrefixed(iterator.Value(), &vote)
   101  
   102  		if cb(vote) {
   103  			break
   104  		}
   105  	}
   106  }
   107  
   108  // deleteVote deletes a vote from a given proposalID and voter from the store
   109  func (keeper Keeper) deleteVote(ctx sdk.Context, proposalID uint64, voterAddr sdk.AccAddress) {
   110  	store := ctx.KVStore(keeper.storeKey)
   111  	store.Delete(types.VoteKey(proposalID, voterAddr))
   112  }