github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/gov/endblocker.go (about) 1 package gov 2 3 import ( 4 "fmt" 5 6 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 7 "github.com/fibonacci-chain/fbc/libs/tendermint/libs/log" 8 "github.com/fibonacci-chain/fbc/x/gov/types" 9 10 "github.com/fibonacci-chain/fbc/x/common/perf" 11 "github.com/fibonacci-chain/fbc/x/gov/keeper" 12 ) 13 14 // EndBlocker called every block, process inflation, update validator set. 15 func EndBlocker(ctx sdk.Context, k keeper.Keeper) { 16 logger := k.Logger(ctx) 17 18 seq := perf.GetPerf().OnEndBlockEnter(ctx, types.ModuleName) 19 defer perf.GetPerf().OnEndBlockExit(ctx, types.ModuleName, seq) 20 21 handleWaitingProposals(ctx, k, logger) 22 handleInActiveProposals(ctx, k, logger) 23 handleActiveProposals(ctx, k, logger) 24 } 25 26 // handle proposals which is executed on future block height appointed when it is submitted 27 func handleWaitingProposals(ctx sdk.Context, k keeper.Keeper, logger log.Logger) { 28 k.IterateWaitingProposalsQueue(ctx, uint64(ctx.BlockHeight()), func(proposal Proposal) bool { 29 handler := k.Router().GetRoute(proposal.ProposalRoute()) 30 cacheCtx, writeCache := ctx.CacheContext() 31 err := handler(cacheCtx, &proposal) 32 if err != nil { 33 logger.Info( 34 fmt.Sprintf("proposal %d (%s) excute failed", 35 proposal.ProposalID, 36 proposal.GetTitle(), 37 ), 38 ) 39 } else { 40 logger.Info( 41 fmt.Sprintf("proposal %d (%s) excute successfully", 42 proposal.ProposalID, 43 proposal.GetTitle(), 44 ), 45 ) 46 writeCache() 47 } 48 49 return false 50 }) 51 } 52 53 func handleInActiveProposals(ctx sdk.Context, k keeper.Keeper, logger log.Logger) { 54 // delete inactive proposal from store and its deposits 55 k.IterateInactiveProposalsQueue(ctx, ctx.BlockHeader().Time, func(proposal Proposal) bool { 56 k.DeleteProposal(ctx, proposal.ProposalID) 57 k.DistributeDeposits(ctx, proposal.ProposalID) 58 59 ctx.EventManager().EmitEvent( 60 sdk.NewEvent( 61 types.EventTypeInactiveProposal, 62 sdk.NewAttribute(types.AttributeKeyProposalID, fmt.Sprintf("%d", proposal.ProposalID)), 63 sdk.NewAttribute(types.AttributeKeyProposalResult, types.AttributeValueProposalDropped), 64 ), 65 ) 66 67 logger.Info( 68 fmt.Sprintf("proposal %d (%s) didn't meet minimum deposit of %s (had only %s); deleted", 69 proposal.ProposalID, 70 proposal.GetTitle(), 71 k.GetDepositParams(ctx).MinDeposit, 72 proposal.TotalDeposit, 73 ), 74 ) 75 return false 76 }) 77 } 78 79 func handleActiveProposals(ctx sdk.Context, k keeper.Keeper, logger log.Logger) { 80 // fetch active proposals whose voting periods have ended (are passed the block time) 81 k.IterateActiveProposalsQueue(ctx, ctx.BlockHeader().Time, func(proposal Proposal) bool { 82 83 status, distribute, tallyResults := keeper.Tally(ctx, k, proposal, true) 84 tagValue, logMsg := handleProposalAfterTally(ctx, k, &proposal, distribute, status) 85 proposal.FinalTallyResult = tallyResults 86 k.SetProposal(ctx, proposal) 87 k.RemoveFromActiveProposalQueue(ctx, proposal.ProposalID, proposal.VotingEndTime) 88 k.DeleteVotes(ctx, proposal.ProposalID) 89 90 logger.Info( 91 fmt.Sprintf("proposal %d (%s) tallied; result: %s", 92 proposal.ProposalID, proposal.GetTitle(), logMsg, 93 ), 94 ) 95 96 ctx.EventManager().EmitEvent( 97 sdk.NewEvent( 98 types.EventTypeActiveProposal, 99 sdk.NewAttribute(types.AttributeKeyProposalID, fmt.Sprintf("%d", proposal.ProposalID)), 100 sdk.NewAttribute(types.AttributeKeyProposalResult, tagValue), 101 ), 102 ) 103 return false 104 }) 105 }