From 18fdccf95b097b2273db2bb13417a5d0ccac15fc Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Wed, 19 Sep 2018 22:13:12 -0400 Subject: [PATCH] ... --- types/stake.go | 1 + x/distribution/keeper/allocation.go | 25 +++++++++++----------- x/distribution/keeper/delegation.go | 20 +++++++++--------- x/distribution/keeper/keeper.go | 29 ++++++++++++++------------ x/distribution/types/delegator_info.go | 3 ++- x/distribution/types/keepers.go | 7 ++++--- x/distribution/types/validator_info.go | 10 +++++---- x/stake/types/validator.go | 1 + 8 files changed, 53 insertions(+), 43 deletions(-) diff --git a/types/stake.go b/types/stake.go index 6012e4643..3d5969f9d 100644 --- a/types/stake.go +++ b/types/stake.go @@ -44,6 +44,7 @@ type Validator interface { GetPubKey() crypto.PubKey // validation pubkey GetPower() Dec // validation power GetTokens() Dec // validation tokens + GetCommission() Dec // validator commission rate GetDelegatorShares() Dec // Total out standing delegator shares GetBondHeight() int64 // height in which the validator became active } diff --git a/x/distribution/keeper/allocation.go b/x/distribution/keeper/allocation.go index d6e586b60..a20055bbb 100644 --- a/x/distribution/keeper/allocation.go +++ b/x/distribution/keeper/allocation.go @@ -2,6 +2,7 @@ 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 @@ -10,22 +11,22 @@ 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.GetFeeDistribution(ctx, proserValidator.OperatorAddr) + 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 := NewDecCoins(feesCollected) + feesCollected := k.feeCollectionKeeper.GetCollectedFees(ctx) + feesCollectedDec := types.NewDecCoins(feesCollected) // allocated rewards to proposer - stakePool := k.stakeKeeper.GetPool(ctx) + 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).Div(stakePool.BondedTokens)) + sumPowerPrecommitValidators).Quo(bondedTokens)) proposerReward := feesCollectedDec.Mul(proposerMultiplier) // apply commission - commission := proposerReward.Mul(proserValidator.Commission) + commission := proposerReward.Mul(proserValidator.GetCommission()) proposerDist.PoolCommission = proposerDist.PoolCommission.Add(commission) proposerDist.Pool = proposerDist.Pool.Add(proposerReward.Sub(commission)) @@ -33,15 +34,15 @@ func (k Keeper) AllocateFees(ctx sdk.Context) { communityTax := k.GetCommunityTax(ctx) communityFunding := feesCollectedDec.Mul(communityTax) feePool := k.GetFeePool(ctx) - feePool.CommunityFund = feePool.CommunityFund.Add(communityFunding) + feePool.CommunityPool = feePool.CommunityPool.Add(communityFunding) // set the global pool within the distribution module - poolReceived := feesCollectedDec.Sub(proposerReward).Sub(communityFunding) - feePool.Pool = feePool.Pool.Add(poolReceived) + poolReceived := feesCollectedDec.Mul(sdk.OneDec().Sub(proposerMultiplier).Sub(communityTax)) + feePool.Pool = feePool.Pool.Plus(poolReceived) - SetValidatorDistribution(proposerDist) - SetFeePool(feePool) + k.SetValidatorDistInfo(ctx, proposerDist) + k.SetFeePool(ctx, feePool) // clear the now distributed fees - k.FeeCollectionKeeper.ClearCollectedFees(ctx) + k.feeCollectionKeeper.ClearCollectedFees(ctx) } diff --git a/x/distribution/keeper/delegation.go b/x/distribution/keeper/delegation.go index 5bf6793f1..1323f2dbc 100644 --- a/x/distribution/keeper/delegation.go +++ b/x/distribution/keeper/delegation.go @@ -32,7 +32,7 @@ func (k Keeper) RemoveDelegatorDistInfo(ctx sdk.Context, delAddr sdk.AccAddress, valOperatorAddr sdk.ValAddress) { store := ctx.KVStore(k.storeKey) - store.Delete(GetDelegationDistInfoKey(DelegatorAddr, ValOperatorAddr)) + store.Delete(GetDelegationDistInfoKey(delAddr, valOperatorAddr)) } //___________________________________________________________________________________________ @@ -45,13 +45,13 @@ func (k Keeper) GetDelegatorWithdrawAddr(ctx sdk.Context, delAddr sdk.AccAddress if b == nil { return delAddr } - return sdk.AccAddress{b} + return sdk.AccAddress(b) } // set the delegator withdraw address func (k Keeper) SetDelegatorWithdrawAddr(ctx sdk.Context, delAddr, withdrawAddr sdk.AccAddress) { store := ctx.KVStore(k.storeKey) - store.Set(GetDelegatorWithdrawAddrKey(ddi.DelegatorAddr), withdrawAddr.Bytes()) + store.Set(GetDelegatorWithdrawAddrKey(delAddr), withdrawAddr.Bytes()) } // remove a delegator withdraw info @@ -67,18 +67,18 @@ func (k Keeper) WithdrawDelegationReward(ctx sdk.Context, delegatorAddr sdk.AccA validatorAddr sdk.ValAddress) { height := ctx.BlockHeight() - pool := k.sk.GetPool(ctx) + bondedTokens := k.stakeKeeper.TotalPower(ctx) feePool := k.GetFeePool(ctx) - delInfo := k.GetDelegationDistInfo(ctx, delegatorAddr, validatorAddr) + delInfo := k.GetDelegatorDistInfo(ctx, delegatorAddr, validatorAddr) valInfo := k.GetValidatorDistInfo(ctx, validatorAddr) - validator := k.GetValidator(ctx, validatorAddr) + validator := k.stakeKeeper.GetValidator(ctx, validatorAddr) - feePool, withdraw := delInfo.WithdrawRewards(feePool, valInfo, height, pool.BondedTokens, + delInfo, feePool, withdraw := delInfo.WithdrawRewards(ctx, feePool, valInfo, height, bondedTokens, validator.Tokens, validator.DelegatorShares, validator.Commission) k.SetFeePool(ctx, feePool) - withdrawAddr := k.GetDelegatorWithdrawAddr(delegatorAddr) - k.ck.AddCoins(ctx, withdrawAddr, withdraw.TruncateDecimal()) + withdrawAddr := k.GetDelegatorWithdrawAddr(ctx, delegatorAddr) + k.bankKeeper.AddCoins(ctx, withdrawAddr, withdraw.TruncateDecimal()) } //___________________________________________________________________________________________ @@ -92,7 +92,7 @@ func (k Keeper) WithdrawDelegationRewardsAll(ctx sdk.Context, delegatorAddr sdk. } // return all rewards for all delegations of a delegator -func (k Keeper) GetDelegatorRewardsAll(ctx sdk.Context, delAddr sdk.AccAddress, height int64) DecCoins { +func (k Keeper) GetDelegatorRewardsAll(ctx sdk.Context, delAddr sdk.AccAddress, height int64) types.DecCoins { withdraw := sdk.NewDec(0) pool := k.sk.GetPool(ctx) diff --git a/x/distribution/keeper/keeper.go b/x/distribution/keeper/keeper.go index 01f0ee078..bbf4c1541 100644 --- a/x/distribution/keeper/keeper.go +++ b/x/distribution/keeper/keeper.go @@ -14,26 +14,29 @@ const ( // keeper of the stake store type Keeper struct { - storeKey sdk.StoreKey - storeTKey sdk.StoreKey - cdc *codec.Codec - ps params.Setter - coinKeeper types.CoinKeeper - stakeKeeper types.StakeKeeper + storeKey sdk.StoreKey + storeTKey sdk.StoreKey + cdc *codec.Codec + ps params.Setter + bankKeeper types.BankKeeper + stakeKeeper types.StakeKeeper + feeCollectionKeeper types.FeeCollectionKeeper // codespace codespace sdk.CodespaceType } -func NewKeeper(cdc *codec.Codec, key, tkey sdk.StoreKey, ps params.Setter, ck types.CoinKeeper, - sk types.StakeKeeper, codespace sdk.CodespaceType) Keeper { +func NewKeeper(cdc *codec.Codec, key, tkey sdk.StoreKey, ps params.Setter, ck types.BankKeeper, + sk types.StakeKeeper, fck types.FeeCollectionKeeper, codespace sdk.CodespaceType) Keeper { keeper := Keeper{ - storeKey: key, - storeTKey: tkey, - cdc: cdc, - coinKeeper: ck, - codespace: codespace, + storeKey: key, + storeTKey: tkey, + cdc: cdc, + bankKeeper: ck, + stakeKeeper: sk, + feeCollectionKeeper: fck, + codespace: codespace, } return keeper } diff --git a/x/distribution/types/delegator_info.go b/x/distribution/types/delegator_info.go index eeb5af11d..4bb02e20c 100644 --- a/x/distribution/types/delegator_info.go +++ b/x/distribution/types/delegator_info.go @@ -21,8 +21,9 @@ func (di DelegatorDistInfo) WithdrawRewards(fp FeePool, vi ValidatorDistInfo, di.WithdrawalHeight = height accum := delegatorShares.Mul(sdk.NewDec(blocks)) withdrawalTokens := vi.Pool.Mul(accum.Quo(vi.DelAccum.Accum)) + remainingTokens := vi.Pool.Mul(sdk.OneDec().Sub(accum.Quo(vi.DelAccum.Accum))) - vi.Pool = vi.Pool.Sub(withdrawalTokens) + vi.Pool = remainingTokens vi.DelAccum.Accum = vi.DelAccum.Accum.Sub(accum) return di, fp, withdrawalTokens diff --git a/x/distribution/types/keepers.go b/x/distribution/types/keepers.go index 3cf34da2a..b33e916b8 100644 --- a/x/distribution/types/keepers.go +++ b/x/distribution/types/keepers.go @@ -6,9 +6,10 @@ import sdk "github.com/cosmos/cosmos-sdk/types" type StakeKeeper interface { IterateDelegations(ctx sdk.Context, delegator sdk.AccAddress, fn func(index int64, delegation sdk.Delegation) (stop bool)) - GetDelegation(ctx sdk.Context, delAddr sdk.AccAddress) - GetValidator(ctx sdk.Context, valAddr sdk.AccAddress) - GetPool(ctx sdk.Context) + GetDelegation(ctx sdk.Context, delAddr sdk.AccAddress) sdk.Delegation + GetValidator(ctx sdk.Context, valAddr sdk.AccAddress) sdk.Validator + GetValidatorFromConsAddr(ctx sdk.Context, consAddr sdk.ConsAddress) sdk.Validator + TotalPower(ctx sdk.Context) sdk.Dec } // expected coin keeper diff --git a/x/distribution/types/validator_info.go b/x/distribution/types/validator_info.go index b2f2592ea..7c41b7e50 100644 --- a/x/distribution/types/validator_info.go +++ b/x/distribution/types/validator_info.go @@ -31,13 +31,15 @@ func (vi ValidatorDistInfo) TakeFeePoolRewards(fp FeePool, height int64, totalBo vi.FeePoolWithdrawalHeight = height accum := sdk.NewDec(blocks).Mul(vdTokens) withdrawalTokens := fp.Pool.Mul(accum.Quo(fp.ValAccum.Accum)) + remainingTokens := fp.Pool.Mul(sdk.OneDec().Sub(accum.Quo(fp.ValAccum.Accum))) + commission := withdrawalTokens.Mul(commissionRate) - afterCommission := withdrawalTokens.Sub(commission) + afterCommission := withdrawalTokens.Mul(sdk.OneDec().Sub(commissionRate)) fp.ValAccum.Accum = fp.ValAccum.Accum.Sub(accum) - fp.Pool = fp.Pool.Sub(withdrawalTokens) - vi.PoolCommission = vi.PoolCommission.Add(commission) - vi.Pool = vi.Pool.Add(afterCommission) + fp.Pool = remainingTokens + vi.PoolCommission = vi.PoolCommission.Plus(commission) + vi.Pool = vi.Pool.Plus(afterCommission) return vi, fp } diff --git a/x/stake/types/validator.go b/x/stake/types/validator.go index 6c5066a78..d7463eb79 100644 --- a/x/stake/types/validator.go +++ b/x/stake/types/validator.go @@ -477,5 +477,6 @@ func (v Validator) GetOperator() sdk.ValAddress { return v.OperatorAddr } func (v Validator) GetPubKey() crypto.PubKey { return v.ConsPubKey } func (v Validator) GetPower() sdk.Dec { return v.BondedTokens() } func (v Validator) GetTokens() sdk.Dec { return v.Tokens } +func (v Validator) GetCommission() sdk.Dec { return v.Commission } func (v Validator) GetDelegatorShares() sdk.Dec { return v.DelegatorShares } func (v Validator) GetBondHeight() int64 { return v.BondHeight }