github.com/Finschia/finschia-sdk@v0.48.1/x/distribution/keeper/hooks.go (about)

     1  package keeper
     2  
     3  import (
     4  	sdk "github.com/Finschia/finschia-sdk/types"
     5  	"github.com/Finschia/finschia-sdk/x/distribution/types"
     6  	stakingtypes "github.com/Finschia/finschia-sdk/x/staking/types"
     7  )
     8  
     9  // Wrapper struct
    10  type Hooks struct {
    11  	k Keeper
    12  }
    13  
    14  var _ stakingtypes.StakingHooks = Hooks{}
    15  
    16  // Create new distribution hooks
    17  func (k Keeper) Hooks() Hooks { return Hooks{k} }
    18  
    19  // initialize validator distribution record
    20  func (h Hooks) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) {
    21  	val := h.k.stakingKeeper.Validator(ctx, valAddr)
    22  	h.k.initializeValidator(ctx, val)
    23  }
    24  
    25  // AfterValidatorRemoved performs clean up after a validator is removed
    26  func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, _ sdk.ConsAddress, valAddr sdk.ValAddress) {
    27  	// fetch outstanding
    28  	outstanding := h.k.GetValidatorOutstandingRewardsCoins(ctx, valAddr)
    29  
    30  	// force-withdraw commission
    31  	commission := h.k.GetValidatorAccumulatedCommission(ctx, valAddr).Commission
    32  	if !commission.IsZero() {
    33  		// subtract from outstanding
    34  		outstanding = outstanding.Sub(commission)
    35  
    36  		// split into integral & remainder
    37  		coins, remainder := commission.TruncateDecimal()
    38  
    39  		// remainder to community pool
    40  		feePool := h.k.GetFeePool(ctx)
    41  		feePool.CommunityPool = feePool.CommunityPool.Add(remainder...)
    42  		h.k.SetFeePool(ctx, feePool)
    43  
    44  		// add to validator account
    45  		if !coins.IsZero() {
    46  			accAddr := sdk.AccAddress(valAddr)
    47  			withdrawAddr := h.k.GetDelegatorWithdrawAddr(ctx, accAddr)
    48  
    49  			if err := h.k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, withdrawAddr, coins); err != nil {
    50  				panic(err)
    51  			}
    52  		}
    53  	}
    54  
    55  	// Add outstanding to community pool
    56  	// The validator is removed only after it has no more delegations.
    57  	// This operation sends only the remaining dust to the community pool.
    58  	feePool := h.k.GetFeePool(ctx)
    59  	feePool.CommunityPool = feePool.CommunityPool.Add(outstanding...)
    60  	h.k.SetFeePool(ctx, feePool)
    61  
    62  	// delete outstanding
    63  	h.k.DeleteValidatorOutstandingRewards(ctx, valAddr)
    64  
    65  	// remove commission record
    66  	h.k.DeleteValidatorAccumulatedCommission(ctx, valAddr)
    67  
    68  	// clear slashes
    69  	h.k.DeleteValidatorSlashEvents(ctx, valAddr)
    70  
    71  	// clear historical rewards
    72  	h.k.DeleteValidatorHistoricalRewards(ctx, valAddr)
    73  
    74  	// clear current rewards
    75  	h.k.DeleteValidatorCurrentRewards(ctx, valAddr)
    76  }
    77  
    78  // increment period
    79  func (h Hooks) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
    80  	val := h.k.stakingKeeper.Validator(ctx, valAddr)
    81  	h.k.IncrementValidatorPeriod(ctx, val)
    82  }
    83  
    84  // withdraw delegation rewards (which also increments period)
    85  func (h Hooks) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
    86  	val := h.k.stakingKeeper.Validator(ctx, valAddr)
    87  	del := h.k.stakingKeeper.Delegation(ctx, delAddr, valAddr)
    88  
    89  	if _, err := h.k.withdrawDelegationRewards(ctx, val, del); err != nil {
    90  		panic(err)
    91  	}
    92  }
    93  
    94  // create new delegation period record
    95  func (h Hooks) AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
    96  	h.k.initializeDelegation(ctx, valAddr, delAddr)
    97  }
    98  
    99  // record the slash event
   100  func (h Hooks) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) {
   101  	h.k.updateValidatorSlashFraction(ctx, valAddr, fraction)
   102  }
   103  
   104  func (h Hooks) BeforeValidatorModified(_ sdk.Context, _ sdk.ValAddress)                         {}
   105  func (h Hooks) AfterValidatorBonded(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress)         {}
   106  func (h Hooks) AfterValidatorBeginUnbonding(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) {}
   107  func (h Hooks) BeforeDelegationRemoved(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress)       {}