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) {}