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

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