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