77 lines
2.5 KiB
Go
77 lines
2.5 KiB
Go
|
package gov
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
|
||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||
|
"github.com/cosmos/cosmos-sdk/x/gov/tags"
|
||
|
)
|
||
|
|
||
|
// Called every block, process inflation, update validator set
|
||
|
func EndBlocker(ctx sdk.Context, keeper Keeper) sdk.Tags {
|
||
|
logger := ctx.Logger().With("module", "x/gov")
|
||
|
resTags := sdk.NewTags()
|
||
|
|
||
|
inactiveIterator := keeper.InactiveProposalQueueIterator(ctx, ctx.BlockHeader().Time)
|
||
|
defer inactiveIterator.Close()
|
||
|
for ; inactiveIterator.Valid(); inactiveIterator.Next() {
|
||
|
var proposalID uint64
|
||
|
|
||
|
keeper.cdc.MustUnmarshalBinaryLengthPrefixed(inactiveIterator.Value(), &proposalID)
|
||
|
inactiveProposal := keeper.GetProposal(ctx, proposalID)
|
||
|
|
||
|
keeper.DeleteProposal(ctx, proposalID)
|
||
|
keeper.DeleteDeposits(ctx, proposalID) // delete any associated deposits (burned)
|
||
|
|
||
|
resTags = resTags.AppendTag(tags.ProposalID, fmt.Sprintf("%d", proposalID))
|
||
|
resTags = resTags.AppendTag(tags.ProposalResult, tags.ActionProposalDropped)
|
||
|
|
||
|
logger.Info(
|
||
|
fmt.Sprintf("proposal %d (%s) didn't meet minimum deposit of %s (had only %s); deleted",
|
||
|
inactiveProposal.GetProposalID(),
|
||
|
inactiveProposal.GetTitle(),
|
||
|
keeper.GetDepositParams(ctx).MinDeposit,
|
||
|
inactiveProposal.GetTotalDeposit(),
|
||
|
),
|
||
|
)
|
||
|
}
|
||
|
|
||
|
// fetch active proposals whose voting periods have ended (are passed the block time)
|
||
|
activeIterator := keeper.ActiveProposalQueueIterator(ctx, ctx.BlockHeader().Time)
|
||
|
defer activeIterator.Close()
|
||
|
for ; activeIterator.Valid(); activeIterator.Next() {
|
||
|
var proposalID uint64
|
||
|
|
||
|
keeper.cdc.MustUnmarshalBinaryLengthPrefixed(activeIterator.Value(), &proposalID)
|
||
|
activeProposal := keeper.GetProposal(ctx, proposalID)
|
||
|
passes, tallyResults := tally(ctx, keeper, activeProposal)
|
||
|
|
||
|
var tagValue string
|
||
|
if passes {
|
||
|
keeper.RefundDeposits(ctx, activeProposal.GetProposalID())
|
||
|
activeProposal.SetStatus(StatusPassed)
|
||
|
tagValue = tags.ActionProposalPassed
|
||
|
} else {
|
||
|
keeper.DeleteDeposits(ctx, activeProposal.GetProposalID())
|
||
|
activeProposal.SetStatus(StatusRejected)
|
||
|
tagValue = tags.ActionProposalRejected
|
||
|
}
|
||
|
|
||
|
activeProposal.SetFinalTallyResult(tallyResults)
|
||
|
keeper.SetProposal(ctx, activeProposal)
|
||
|
keeper.RemoveFromActiveProposalQueue(ctx, activeProposal.GetVotingEndTime(), activeProposal.GetProposalID())
|
||
|
|
||
|
logger.Info(
|
||
|
fmt.Sprintf(
|
||
|
"proposal %d (%s) tallied; passed: %v",
|
||
|
activeProposal.GetProposalID(), activeProposal.GetTitle(), passes,
|
||
|
),
|
||
|
)
|
||
|
|
||
|
resTags = resTags.AppendTag(tags.ProposalID, fmt.Sprintf("%d", proposalID))
|
||
|
resTags = resTags.AppendTag(tags.ProposalResult, tagValue)
|
||
|
}
|
||
|
|
||
|
return resTags
|
||
|
}
|