...
This commit is contained in:
parent
7002438d5f
commit
18fdccf95b
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -18,21 +18,24 @@ type Keeper struct {
|
|||
storeTKey sdk.StoreKey
|
||||
cdc *codec.Codec
|
||||
ps params.Setter
|
||||
coinKeeper types.CoinKeeper
|
||||
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,
|
||||
bankKeeper: ck,
|
||||
stakeKeeper: sk,
|
||||
feeCollectionKeeper: fck,
|
||||
codespace: codespace,
|
||||
}
|
||||
return keeper
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 }
|
||||
|
|
Loading…
Reference in New Issue