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 }