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

99 lines
2.8 KiB
Go
Raw Normal View History

2018-09-03 17:46:33 -07:00
package keeper
import (
2018-09-19 16:00:21 -07:00
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/distribution/types"
2018-09-18 21:42:05 -07:00
"github.com/cosmos/cosmos-sdk/x/params"
)
2019-01-11 12:08:01 -08:00
// keeper of the staking store
type Keeper struct {
2018-09-19 19:13:12 -07:00
storeKey sdk.StoreKey
cdc *codec.Codec
paramSpace params.Subspace
2018-09-19 19:13:12 -07:00
bankKeeper types.BankKeeper
2019-01-11 12:08:01 -08:00
stakingKeeper types.StakingKeeper
2018-09-19 19:13:12 -07:00
feeCollectionKeeper types.FeeCollectionKeeper
// codespace
codespace sdk.CodespaceType
}
2019-01-16 13:38:05 -08:00
// create a new keeper
func NewKeeper(cdc *codec.Codec, key sdk.StoreKey, paramSpace params.Subspace, ck types.BankKeeper,
2019-01-11 12:08:01 -08:00
sk types.StakingKeeper, fck types.FeeCollectionKeeper, codespace sdk.CodespaceType) Keeper {
keeper := Keeper{
2018-09-19 19:13:12 -07:00
storeKey: key,
cdc: cdc,
2019-02-04 18:13:04 -08:00
paramSpace: paramSpace.WithKeyTable(ParamKeyTable()),
2018-09-19 19:13:12 -07:00
bankKeeper: ck,
2019-01-11 12:08:01 -08:00
stakingKeeper: sk,
2018-09-19 19:13:12 -07:00
feeCollectionKeeper: fck,
codespace: codespace,
}
return keeper
}
// set withdraw address
func (k Keeper) SetWithdrawAddr(ctx sdk.Context, delegatorAddr sdk.AccAddress, withdrawAddr sdk.AccAddress) sdk.Error {
if !k.GetWithdrawAddrEnabled(ctx) {
return types.ErrSetWithdrawAddrDisabled(k.codespace)
}
k.SetDelegatorWithdrawAddr(ctx, delegatorAddr, withdrawAddr)
return nil
}
2019-01-16 13:38:05 -08:00
// withdraw rewards from a delegation
func (k Keeper) WithdrawDelegationRewards(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) sdk.Error {
val := k.stakingKeeper.Validator(ctx, valAddr)
if val == nil {
return types.ErrNoValidatorDistInfo(k.codespace)
}
2019-01-16 13:38:05 -08:00
del := k.stakingKeeper.Delegation(ctx, delAddr, valAddr)
if del == nil {
return types.ErrNoDelegationDistInfo(k.codespace)
2018-09-13 23:35:02 -07:00
}
2019-01-16 13:38:05 -08:00
// withdraw rewards
if err := k.withdrawDelegationRewards(ctx, val, del); err != nil {
return err
}
2019-01-16 13:38:05 -08:00
// reinitialize the delegation
k.initializeDelegation(ctx, valAddr, delAddr)
2019-01-16 13:38:05 -08:00
return nil
}
2019-01-16 13:38:05 -08:00
// withdraw validator commission
func (k Keeper) WithdrawValidatorCommission(ctx sdk.Context, valAddr sdk.ValAddress) sdk.Error {
2019-01-16 13:38:05 -08:00
// fetch validator accumulated commission
commission := k.GetValidatorAccumulatedCommission(ctx, valAddr)
if commission.IsZero() {
return types.ErrNoValidatorCommission(k.codespace)
}
2019-01-16 13:38:05 -08:00
coins, remainder := commission.TruncateDecimal()
k.SetValidatorAccumulatedCommission(ctx, valAddr, remainder) // leave remainder to withdraw later
2018-10-15 13:12:42 -07:00
2019-01-16 13:38:05 -08:00
// update outstanding
outstanding := k.GetValidatorOutstandingRewards(ctx, valAddr)
k.SetValidatorOutstandingRewards(ctx, valAddr, outstanding.Sub(sdk.NewDecCoins(coins)))
2018-10-15 13:12:42 -07:00
if !coins.IsZero() {
accAddr := sdk.AccAddress(valAddr)
withdrawAddr := k.GetDelegatorWithdrawAddr(ctx, accAddr)
2018-10-15 13:12:42 -07:00
if _, err := k.bankKeeper.AddCoins(ctx, withdrawAddr, coins); err != nil {
return err
}
2019-01-16 13:38:05 -08:00
}
2018-10-15 13:12:42 -07:00
2019-01-16 13:38:05 -08:00
return nil
2018-09-18 21:42:05 -07:00
}