Skip to content

Commit

Permalink
working
Browse files Browse the repository at this point in the history
  • Loading branch information
rigelrozanski committed Sep 5, 2018
1 parent 38c6090 commit 53253aa
Show file tree
Hide file tree
Showing 12 changed files with 329 additions and 234 deletions.
76 changes: 76 additions & 0 deletions x/distribution/client/cli/tx.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
// nolint
package cli

import (
"os"

"github.com/cosmos/cosmos-sdk/client/context"
"github.com/cosmos/cosmos-sdk/client/utils"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/stake"
"github.com/spf13/cobra"
"github.com/spf13/viper"
wire "github.com/tendermint/go-wire"
)

type TxWithdrawDelegationRewardsAll struct {
delegatorAddr sdk.AccAddress
withdrawAddr sdk.AccAddress // address to make the withdrawal to
}

type TxWithdrawDelegationReward struct {
delegatorAddr sdk.AccAddress
validatorAddr sdk.AccAddress
withdrawAddr sdk.AccAddress // address to make the withdrawal to
}

type TxWithdrawValidatorRewardsAll struct {
operatorAddr sdk.AccAddress // validator address to withdraw from
withdrawAddr sdk.AccAddress // address to make the withdrawal to
}

var (
flagOnlyFromValidator = "only-from-validator"
flagIsValidator = "is-validator"
)

// GetCmdDelegate implements the delegate command.
func GetCmdWithdrawDelegationRewardsAll(cdc *wire.Codec) *cobra.Command {
cmd := &cobra.Command{
Use: "withdraw-rewards [delegator]",
Short: "withdraw rewards from delegation accounts",
RunE: func(cmd *cobra.Command, args []string) error {
txCtx := authctx.NewTxContextFromCLI().WithCodec(cdc)
cliCtx := context.NewCLIContext().
WithCodec(cdc).
WithLogger(os.Stdout).
WithAccountDecoder(authcmd.GetAccountDecoder(cdc))

amount, err := sdk.ParseCoin(viper.GetString(FlagAmount))
if err != nil {
return err
}

delAddr, err := cliCtx.GetFromAddress()
if err != nil {
return err
}

valAddr, err := sdk.ValAddressFromBech32(viper.GetString(FlagAddressValidator))
if err != nil {
return err
}

msg := stake.NewMsgDelegate(delAddr, valAddr, amount)

// build and sign the transaction, then broadcast to Tendermint
return utils.SendTx(txCtx, cliCtx, []sdk.Msg{msg})
},
}

// TODO add flags for "is-validator", "only-for-validator"
cmd.Flags().String(flagOnlyFromValidator, "", "Only withdraw from this validator address")
cmd.Flags().Bool(flagIsValidator, false, "Also withdraw validator's commission")

return cmd
}
140 changes: 5 additions & 135 deletions x/distribution/handler.go
Original file line number Diff line number Diff line change
@@ -1,144 +1,14 @@
package stake

import (
"time"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/stake/keeper"
)

// burn burn burn
func BurnFeeHandler(ctx sdk.Context, _ sdk.Tx, collectedFees sdk.Coins) {}

// Called every block, process inflation, update validator set
func EndBlocker(ctx sdk.Context, k keeper.Keeper) (ValidatorUpdates []abci.Validator) {
pool := k.GetPool(ctx)

// Process provision inflation
blockTime := ctx.BlockHeader().Time
if blockTime.Sub(pool.InflationLastTime) >= time.Hour {
params := k.GetParams(ctx)
pool.InflationLastTime = blockTime
pool = pool.ProcessProvisions(params)
k.SetPool(ctx, pool)
}

// reset the intra-transaction counter
k.SetIntraTxCounter(ctx, 0)

// calculate validator set changes
ValidatorUpdates = k.GetTendermintUpdates(ctx)
k.ClearTendermintUpdates(ctx)
return
}

/*
func AllocateFees(feesCollected sdk.Coins, global Global, proposer ValidatorDistribution,
sumPowerPrecommitValidators, totalBondedTokens, communityTax,
proposerCommissionRate sdk.Dec)
feesCollectedDec = MakeDecCoins(feesCollected)
proposerReward = feesCollectedDec * (0.01 + 0.04
* sumPowerPrecommitValidators / totalBondedTokens)
commission = proposerReward * proposerCommissionRate
proposer.PoolCommission += commission
proposer.Pool += proposerReward - commission
communityFunding = feesCollectedDec * communityTax
global.CommunityFund += communityFunding
poolReceived = feesCollectedDec - proposerReward - communityFunding
global.Pool += poolReceived
global.EverReceivedPool += poolReceived
global.LastReceivedPool = poolReceived
SetValidatorDistribution(proposer)
SetGlobal(global)
/////////////////////////////////////////////////////////////////////////////////////////////////////////
type TxWithdrawDelegationRewardsAll struct {
delegatorAddr sdk.AccAddress
withdrawAddr sdk.AccAddress // address to make the withdrawal to
}
func WithdrawDelegationRewardsAll(delegatorAddr, withdrawAddr sdk.AccAddress)
height = GetHeight()
withdraw = GetDelegatorRewardsAll(delegatorAddr, height)
AddCoins(withdrawAddr, withdraw.TruncateDecimal())
func GetDelegatorRewardsAll(delegatorAddr sdk.AccAddress, height int64) DecCoins
// distribution fee handler
func DistributionFeeHandler(ctx sdk.Context, _ sdk.Tx, collectedFees sdk.Coins) {

// get all distribution scenarios
delegations = GetDelegations(delegatorAddr)
// collect all entitled rewards
withdraw = 0
pool = stake.GetPool()
global = GetGlobal()
for delegation = range delegations
delInfo = GetDelegationDistInfo(delegation.DelegatorAddr,
delegation.ValidatorAddr)
valInfo = GetValidatorDistInfo(delegation.ValidatorAddr)
validator = GetValidator(delegation.ValidatorAddr)
global, diWithdraw = delInfo.WithdrawRewards(global, valInfo, height, pool.BondedTokens,
validator.Tokens, validator.DelegatorShares, validator.Commission)
withdraw += diWithdraw
SetGlobal(global)
return withdraw
/////////////////////////////////////////////////////////////////////////////////////////////////////////
type TxWithdrawDelegationReward struct {
delegatorAddr sdk.AccAddress
validatorAddr sdk.AccAddress
withdrawAddr sdk.AccAddress // address to make the withdrawal to
}

func WithdrawDelegationReward(delegatorAddr, validatorAddr, withdrawAddr sdk.AccAddress)
height = GetHeight()
// get all distribution scenarios
pool = stake.GetPool()
global = GetGlobal()
delInfo = GetDelegationDistInfo(delegatorAddr,
validatorAddr)
valInfo = GetValidatorDistInfo(validatorAddr)
validator = GetValidator(validatorAddr)
global, withdraw = delInfo.WithdrawRewards(global, valInfo, height, pool.BondedTokens,
validator.Tokens, validator.DelegatorShares, validator.Commission)
SetGlobal(global)
AddCoins(withdrawAddr, withdraw.TruncateDecimal())
/////////////////////////////////////////////////////////////////////////////////////////////////////////
type TxWithdrawValidatorRewardsAll struct {
operatorAddr sdk.AccAddress // validator address to withdraw from
withdrawAddr sdk.AccAddress // address to make the withdrawal to
}
func WithdrawValidatorRewardsAll(operatorAddr, withdrawAddr sdk.AccAddress)
height = GetHeight()
global = GetGlobal()
pool = GetPool()
ValInfo = GetValidatorDistInfo(delegation.ValidatorAddr)
validator = GetValidator(delegation.ValidatorAddr)
// withdraw self-delegation
withdraw = GetDelegatorRewardsAll(validator.OperatorAddr, height)
// withdrawal validator commission rewards
global, commission = valInfo.WithdrawCommission(global, valInfo, height, pool.BondedTokens,
validator.Tokens, validator.Commission)
withdraw += commission
SetGlobal(global)
AddCoins(withdrawAddr, withdraw.TruncateDecimal())
*/
//////////////////////////////////////////////////////////////////////////////////
// burn burn burn
func BurnFeeHandler(ctx sdk.Context, _ sdk.Tx, collectedFees sdk.Coins) {}
27 changes: 27 additions & 0 deletions x/distribution/keeper/allocation.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package keeper

import sdk "github.com/cosmos/cosmos-sdk/types"

// XXX TODO
func AllocateFees(feesCollected sdk.Coins, feePool FeePool, proposer ValidatorDistribution,
sumPowerPrecommitValidators, totalBondedTokens, communityTax,
proposerCommissionRate sdk.Dec) {

feesCollectedDec = MakeDecCoins(feesCollected)
proposerReward = feesCollectedDec * (0.01 + 0.04*sumPowerPrecommitValidators/totalBondedTokens)

commission = proposerReward * proposerCommissionRate
proposer.PoolCommission += commission
proposer.Pool += proposerReward - commission

communityFunding = feesCollectedDec * communityTax
feePool.CommunityFund += communityFunding

poolReceived = feesCollectedDec - proposerReward - communityFunding
feePool.Pool += poolReceived
feePool.EverReceivedPool += poolReceived
feePool.LastReceivedPool = poolReceived

SetValidatorDistribution(proposer)
SetFeePool(feePool)
}
84 changes: 84 additions & 0 deletions x/distribution/keeper/delegation.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package keeper

import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/distribution/types"
"github.com/cosmos/cosmos-sdk/x/stake"
)

// get the delegator distribution info
func (k Keeper) GetDelegatorDistInfo(ctx sdk.Context, delAddr sdk.AccAddress,
valOperatorAddr sdk.ValAddress) (ddi types.DelegatorDistInfo) {

store := ctx.KVStore(k.storeKey)

b := store.Get(GetDelegationDistInfoKey(delAddr, valOperatorAddr))
if b == nil {
panic("Stored delegation-distribution info should not have been nil")
}

k.cdc.MustUnmarshalBinary(b, &ddi)
return
}

// set the delegator distribution info
func (k Keeper) SetDelegatorDistInfo(ctx sdk.Context, ddi types.DelegatorDistInfo) {
store := ctx.KVStore(k.storeKey)
b := k.cdc.MustMarshalBinary(ddi)
store.Set(GetDelegationDistInfoKey(ddi.DelegatorAddr, ddi.ValOperatorAddr), b)
}

//___________________________________________________________________________________________

// XXX TODO
func (k Keeper) WithdrawDelegationReward(ctx sdk.Context, delegatorAddr, validatorAddr, withdrawAddr sdk.AccAddress) {
height = ctx.BlockHeight()

// get all distribution scenarios
pool = stake.GetPool()
feePool = GetFeePool()
delInfo = GetDelegationDistInfo(delegatorAddr,
validatorAddr)
valInfo = GetValidatorDistInfo(validatorAddr)
validator = GetValidator(validatorAddr)

feePool, withdraw = delInfo.WithdrawRewards(feePool, valInfo, height, pool.BondedTokens,
validator.Tokens, validator.DelegatorShares, validator.Commission)

SetFeePool(feePool)
AddCoins(withdrawAddr, withdraw.TruncateDecimal())
}

///////////////////////////////////////////////////////////////////////////////////////

// XXX TODO
func (k Keeper) WithdrawDelegationRewardsAll(ctx sdk.Context, delegatorAddr, withdrawAddr sdk.AccAddress) {
height = ctx.BlockHeight()
withdraw = GetDelegatorRewardsAll(delegatorAddr, height)
k.coinsKeeper.AddCoins(withdrawAddr, withdraw.Amount.TruncateDecimal())
}

// XXX TODO
func (k Keeper) GetDelegatorRewardsAll(ctx sdk.Context, delAddr sdk.AccAddress, height int64) DecCoins {

// collect all entitled rewards
withdraw = 0
pool = stake.GetPool()
feePool = GetFeePool()

// iterate over all the delegations
operationAtDelegation := func(_ int64, del types.Delegation) (stop bool) {
delInfo = GetDelegationDistInfo(delAddr, del.ValidatorAddr)
valInfo = GetValidatorDistInfo(del.ValidatorAddr)
validator = GetValidator(del.ValidatorAddr)

feePool, diWithdraw = delInfo.WithdrawRewards(feePool, valInfo, height, pool.BondedTokens,
validator.Tokens, validator.DelegatorShares, validator.Commission)
withdraw += diWithdraw
return false
}
k.stakeKeeper.IterateDelegations(ctx, delAddr, operationAtDelegation)

SetFeePool(feePool)
return withdraw
}
Loading

0 comments on commit 53253aa

Please sign in to comment.