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 }