address @cwgoes comments

This commit is contained in:
rigelrozanski
2018-10-15 02:34:01 -04:00
parent 06fa518e30
commit 2ece2ff37c
11 changed files with 46 additions and 68 deletions
+10 -2
View File
@@ -13,13 +13,21 @@ func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, k keeper.Keeper)
k.SetProposerConsAddr(ctx, consAddr)
// determine the total number of signed power
sumPrecommitPower := int64(0)
totalPower, sumPrecommitPower := int64(0), int64(0)
for _, voteInfo := range req.LastCommitInfo.GetVotes() {
totalPower += voteInfo.Validator.Power
if voteInfo.SignedLastBlock {
sumPrecommitPower += voteInfo.Validator.Power
}
}
k.SetSumPrecommitPower(ctx, sumPrecommitPower)
if totalPower == 0 {
k.SetPercentPrecommitVotes(ctx, sdk.ZeroDec())
return
}
percentPrecommitVotes := sdk.NewDec(sumPrecommitPower).Quo(sdk.NewDec(totalPower))
k.SetPercentPrecommitVotes(ctx, percentPrecommitVotes)
}
// allocate fees
+3 -15
View File
@@ -11,12 +11,6 @@ import (
func (k Keeper) AllocateFees(ctx sdk.Context) {
ctx.Logger().With("module", "x/distribution").Error(fmt.Sprintf("allocation height: %v", ctx.BlockHeight()))
// if there is no power in the system nothing should be allocated
bondedTokens := k.stakeKeeper.TotalPower(ctx).TruncateInt()
if bondedTokens.IsZero() {
return
}
// get the proposer of this block
proposerConsAddr := k.GetProposerConsAddr(ctx)
proposerValidator := k.stakeKeeper.ValidatorByConsAddr(ctx, proposerConsAddr)
@@ -28,20 +22,14 @@ func (k Keeper) AllocateFees(ctx sdk.Context) {
feesCollectedDec := types.NewDecCoins(feesCollected)
// allocated rewards to proposer
sumPowerPrecommitValidators := k.GetSumPrecommitPower(ctx)
percentVoting := sdk.NewDec(sumPowerPrecommitValidators).QuoInt(bondedTokens)
percentVotes := k.GetPercentPrecommitVotes(ctx)
// rare edge case for rounding tendermint power vs bonded decimal power
if percentVoting.GT(sdk.OneDec()) {
percentVoting = sdk.OneDec()
}
proposerMultiplier := sdk.NewDecWithPrec(1, 2).Add(sdk.NewDecWithPrec(4, 2).Mul(percentVoting))
proposerMultiplier := sdk.NewDecWithPrec(1, 2).Add(sdk.NewDecWithPrec(4, 2).Mul(percentVotes))
proposerReward := feesCollectedDec.MulDec(proposerMultiplier)
// apply commission
commission := proposerReward.MulDec(proposerValidator.GetCommission())
remaining := proposerReward.MulDec(sdk.OneDec().Sub(proposerValidator.GetCommission()))
remaining := proposerReward.Minus(commission)
proposerDist.PoolCommission = proposerDist.PoolCommission.Plus(commission)
proposerDist.Pool = proposerDist.Pool.Plus(remaining)
+3 -3
View File
@@ -42,7 +42,7 @@ func TestAllocateFeesBasic(t *testing.T) {
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.SetPercentPrecommitVotes(ctx, sdk.OneDec())
keeper.AllocateFees(ctx)
// verify that these fees have been received by the feePool
@@ -68,7 +68,7 @@ func TestAllocateFeesWithCommunityTax(t *testing.T) {
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.SetPercentPrecommitVotes(ctx, sdk.OneDec())
keeper.AllocateFees(ctx)
// verify that these fees have been received by the feePool
@@ -95,7 +95,7 @@ func TestAllocateFeesWithPartialPrecommitPower(t *testing.T) {
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, 25) // 25% precommit power
keeper.SetPercentPrecommitVotes(ctx, sdk.NewDecWithPrec(25, 2))
keeper.AllocateFees(ctx)
// verify that these fees have been received by the feePool
+6 -17
View File
@@ -26,14 +26,12 @@ func TestWithdrawDelegationRewardBasic(t *testing.T) {
amt := accMapper.GetAccount(ctx, delAddr1).GetCoins().AmountOf(denom)
require.Equal(t, int64(90), amt.Int64())
totalPower := int64(20)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.SetPercentPrecommitVotes(ctx, sdk.OneDec())
keeper.AllocateFees(ctx)
// withdraw delegation
@@ -64,14 +62,12 @@ func TestWithdrawDelegationRewardWithCommission(t *testing.T) {
amt := accMapper.GetAccount(ctx, delAddr1).GetCoins().AmountOf(denom)
require.Equal(t, int64(90), amt.Int64())
totalPower := int64(20)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.SetPercentPrecommitVotes(ctx, sdk.OneDec())
keeper.AllocateFees(ctx)
// withdraw delegation
@@ -108,14 +104,12 @@ func TestWithdrawDelegationRewardTwoDelegators(t *testing.T) {
amt = accMapper.GetAccount(ctx, delAddr2).GetCoins().AmountOf(denom)
require.Equal(t, int64(80), amt.Int64())
totalPower := int64(40)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.SetPercentPrecommitVotes(ctx, sdk.OneDec())
keeper.AllocateFees(ctx)
// delegator 1 withdraw delegation
@@ -154,14 +148,12 @@ func TestWithdrawDelegationRewardTwoDelegatorsUneven(t *testing.T) {
amt = accMapper.GetAccount(ctx, delAddr2).GetCoins().AmountOf(denom)
require.Equal(t, int64(90), amt.Int64())
totalPower := int64(30)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(90)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.SetPercentPrecommitVotes(ctx, sdk.OneDec())
keeper.AllocateFees(ctx)
ctx = ctx.WithBlockHeight(1)
@@ -177,7 +169,7 @@ func TestWithdrawDelegationRewardTwoDelegatorsUneven(t *testing.T) {
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.SetPercentPrecommitVotes(ctx, sdk.OneDec())
keeper.AllocateFees(ctx)
ctx = ctx.WithBlockHeight(2)
@@ -240,17 +232,14 @@ func TestWithdrawDelegationRewardsAll(t *testing.T) {
// validator 1: 10 (self) + 10 (delegator) = 20
// validator 2: 50 (self) + 20 (delegator) = 70
// validator 3: 40 (self) + 30 (delegator) = 70
//
// grand total: 160
totalPower := int64(160)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(1000)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.SetPercentPrecommitVotes(ctx, sdk.OneDec())
keeper.AllocateFees(ctx)
// withdraw delegation
+6 -6
View File
@@ -82,23 +82,23 @@ func (k Keeper) SetProposerConsAddr(ctx sdk.Context, consAddr sdk.ConsAddress) {
//______________________________________________________________________
// set the proposer public key for this block
func (k Keeper) GetSumPrecommitPower(ctx sdk.Context) (sumPrecommitPower int64) {
func (k Keeper) GetPercentPrecommitVotes(ctx sdk.Context) (percentPrecommitVotes sdk.Dec) {
tstore := ctx.KVStore(k.storeTKey)
b := tstore.Get(SumPrecommitPowerKey)
b := tstore.Get(PercentPrecommitVotesKey)
if b == nil {
panic("Proposer cons address was likely not set in begin block")
}
k.cdc.MustUnmarshalBinary(b, &sumPrecommitPower)
k.cdc.MustUnmarshalBinary(b, &percentPrecommitVotes)
return
}
// get the proposer public key for this block
func (k Keeper) SetSumPrecommitPower(ctx sdk.Context, sumPrecommitPower int64) {
func (k Keeper) SetPercentPrecommitVotes(ctx sdk.Context, percentPrecommitVotes sdk.Dec) {
tstore := ctx.KVStore(k.storeTKey)
b := k.cdc.MustMarshalBinary(sumPrecommitPower)
tstore.Set(SumPrecommitPowerKey, b)
b := k.cdc.MustMarshalBinary(percentPrecommitVotes)
tstore.Set(PercentPrecommitVotesKey, b)
}
//______________________________________________________________________
+5 -4
View File
@@ -16,12 +16,13 @@ func TestSetGetProposerConsAddr(t *testing.T) {
require.True(t, res.Equals(valConsAddr1), "expected: %v got: %v", valConsAddr1.String(), res.String())
}
func TestSetGetSumPrecommitPower(t *testing.T) {
func TestSetGetPercentPrecommitVotes(t *testing.T) {
ctx, _, keeper, _, _ := CreateTestInputDefault(t, false, 0)
keeper.SetSumPrecommitPower(ctx, 333)
res := keeper.GetSumPrecommitPower(ctx)
require.Equal(t, int64(333), res)
someDec := sdk.NewDec(333)
keeper.SetPercentPrecommitVotes(ctx, someDec)
res := keeper.GetPercentPrecommitVotes(ctx)
require.True(sdk.DecEq(t, someDec, res))
}
func TestSetGetCommunityTax(t *testing.T) {
+2 -2
View File
@@ -12,8 +12,8 @@ var (
DelegatorWithdrawInfoKey = []byte{0x03} // prefix for each key to a delegator withdraw info
// transient
ProposerKey = []byte{0x00} // key for storing the proposer operator address
SumPrecommitPowerKey = []byte{0x01} // key for storing the power of the precommit validators
ProposerKey = []byte{0x00} // key for storing the proposer operator address
PercentPrecommitVotesKey = []byte{0x01} // key for storing the power of the precommit validators
)
// nolint
+5 -15
View File
@@ -19,14 +19,12 @@ func TestWithdrawValidatorRewardsAllNoDelegator(t *testing.T) {
require.True(t, got.IsOK(), "expected msg to be ok, got %v", got)
_ = sk.ApplyAndReturnValidatorSetUpdates(ctx)
totalPower := int64(10)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.SetPercentPrecommitVotes(ctx, sdk.OneDec())
keeper.AllocateFees(ctx)
// withdraw self-delegation reward
@@ -55,14 +53,12 @@ func TestWithdrawValidatorRewardsAllDelegatorNoCommission(t *testing.T) {
amt := accMapper.GetAccount(ctx, delAddr1).GetCoins().AmountOf(denom)
require.Equal(t, int64(90), amt.Int64())
totalPower := int64(20)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.SetPercentPrecommitVotes(ctx, sdk.OneDec())
keeper.AllocateFees(ctx)
// withdraw self-delegation reward
@@ -93,14 +89,12 @@ func TestWithdrawValidatorRewardsAllDelegatorWithCommission(t *testing.T) {
amt := accMapper.GetAccount(ctx, delAddr1).GetCoins().AmountOf(denom)
require.Equal(t, int64(90), amt.Int64())
totalPower := int64(20)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.SetPercentPrecommitVotes(ctx, sdk.OneDec())
keeper.AllocateFees(ctx)
// withdraw validator reward
@@ -137,14 +131,12 @@ func TestWithdrawValidatorRewardsAllMultipleValidator(t *testing.T) {
_ = sk.ApplyAndReturnValidatorSetUpdates(ctx)
totalPower := int64(100)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(1000)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.SetPercentPrecommitVotes(ctx, sdk.OneDec())
keeper.AllocateFees(ctx)
// withdraw validator reward
@@ -187,14 +179,12 @@ func TestWithdrawValidatorRewardsAllMultipleDelegator(t *testing.T) {
amt = accMapper.GetAccount(ctx, delAddr2).GetCoins().AmountOf(denom)
require.Equal(t, int64(80), amt.Int64())
totalPower := int64(40)
// allocate 100 denom of fees
feeInputs := sdk.NewInt(100)
fck.SetCollectedFees(sdk.Coins{sdk.NewCoin(denom, feeInputs)})
require.Equal(t, feeInputs, fck.GetCollectedFees(ctx).AmountOf(denom))
keeper.SetProposerConsAddr(ctx, valConsAddr1)
keeper.SetSumPrecommitPower(ctx, totalPower)
keeper.SetPercentPrecommitVotes(ctx, sdk.OneDec())
keeper.AllocateFees(ctx)
// withdraw validator reward