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  }