cosmos-sdk/x/distribution/keeper/allocation.go

49 lines
1.8 KiB
Go

package keeper
import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/distribution/types"
)
// Allocate fees handles distribution of the collected fees
func (k Keeper) AllocateFees(ctx sdk.Context) {
// get the proposer of this block
proposerConsAddr := k.GetProposerConsAddr(ctx)
proserValidator := k.stakeKeeper.GetValidatorFromConsAddr(ctx, proposerConsAddr)
proposerDist := k.GetValidatorDistInfo(ctx, proserValidator.GetOperator())
// get the fees which have been getting collected through all the
// transactions in the block
feesCollected := k.feeCollectionKeeper.GetCollectedFees(ctx)
feesCollectedDec := types.NewDecCoins(feesCollected)
// allocated rewards to proposer
bondedTokens := k.stakeKeeper.TotalPower(ctx)
sumPowerPrecommitValidators := sdk.NewDec(1) // XXX TODO actually calculate this
proposerMultiplier := sdk.NewDecWithPrec(1, 2).Add(sdk.NewDecWithPrec(4, 2).Mul(
sumPowerPrecommitValidators).Quo(bondedTokens))
proposerReward := feesCollectedDec.Mul(proposerMultiplier)
// apply commission
commission := proposerReward.Mul(proserValidator.GetCommission())
proposerDist.PoolCommission = proposerDist.PoolCommission.Add(commission)
proposerDist.Pool = proposerDist.Pool.Add(proposerReward.Sub(commission))
// allocate community funding
communityTax := k.GetCommunityTax(ctx)
communityFunding := feesCollectedDec.Mul(communityTax)
feePool := k.GetFeePool(ctx)
feePool.CommunityPool = feePool.CommunityPool.Add(communityFunding)
// set the global pool within the distribution module
poolReceived := feesCollectedDec.Mul(sdk.OneDec().Sub(proposerMultiplier).Sub(communityTax))
feePool.Pool = feePool.Pool.Plus(poolReceived)
k.SetValidatorDistInfo(ctx, proposerDist)
k.SetFeePool(ctx, feePool)
// clear the now distributed fees
k.feeCollectionKeeper.ClearCollectedFees(ctx)
}