github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/distribution/keeper/hooks.go (about)

     1  package keeper
     2  
     3  import (
     4  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     5  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/distribution/types"
     6  	stakingtypes "github.com/fibonacci-chain/fbc/libs/cosmos-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  // cleanup for after validator is removed
    26  func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, _ sdk.ConsAddress, valAddr sdk.ValAddress) {
    27  
    28  	// fetch outstanding
    29  	outstanding := h.k.GetValidatorOutstandingRewards(ctx, valAddr)
    30  
    31  	// force-withdraw commission
    32  	commission := h.k.GetValidatorAccumulatedCommission(ctx, valAddr)
    33  	if !commission.IsZero() {
    34  		// subtract from outstanding
    35  		outstanding = outstanding.Sub(commission)
    36  
    37  		// split into integral & remainder
    38  		coins, remainder := commission.TruncateDecimal()
    39  
    40  		// remainder to community pool
    41  		feePool := h.k.GetFeePool(ctx)
    42  		feePool.CommunityPool = feePool.CommunityPool.Add(remainder...)
    43  		h.k.SetFeePool(ctx, feePool)
    44  
    45  		// add to validator account
    46  		if !coins.IsZero() {
    47  
    48  			accAddr := sdk.AccAddress(valAddr)
    49  			withdrawAddr := h.k.GetDelegatorWithdrawAddr(ctx, accAddr)
    50  			err := h.k.supplyKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, withdrawAddr, coins)
    51  			if err != nil {
    52  				panic(err)
    53  			}
    54  		}
    55  	}
    56  
    57  	// add outstanding to 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  	if _, err := h.k.withdrawDelegationRewards(ctx, val, del); err != nil {
    89  		panic(err)
    90  	}
    91  }
    92  
    93  // create new delegation period record
    94  func (h Hooks) AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
    95  	h.k.initializeDelegation(ctx, valAddr, delAddr)
    96  }
    97  
    98  // record the slash event
    99  func (h Hooks) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) {
   100  	h.k.updateValidatorSlashFraction(ctx, valAddr, fraction)
   101  }
   102  
   103  // nolint - unused hooks
   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)       {}