github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/staking/keeper/min_self_delegation.go (about) 1 package keeper 2 3 import ( 4 "time" 5 6 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 7 "github.com/fibonacci-chain/fbc/x/staking/types" 8 ) 9 10 // WithdrawMinSelfDelegation withdraws the msd from validator 11 func (k Keeper) WithdrawMinSelfDelegation(ctx sdk.Context, delAddr sdk.AccAddress, validator types.Validator, 12 ) (completionTime time.Time, err error) { 13 // 0.check the msd on validator 14 if validator.MinSelfDelegation.IsZero() { 15 return completionTime, types.ErrNoMinSelfDelegation(validator.OperatorAddress.String()) 16 } 17 18 // 1.check the remained shares on the validator 19 remainShares := validator.GetDelegatorShares().Sub(k.getSharesFromDefaultMinSelfDelegation()) 20 if remainShares.LT(sdk.ZeroDec()) { 21 return completionTime, types.ErrMoreMinSelfDelegation(validator.OperatorAddress.String()) 22 } 23 24 // 2.unbond msd 25 k.bondedTokensToNotBonded(ctx, sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, validator.MinSelfDelegation)) 26 completionTime = ctx.BlockHeader().Time.Add(k.UnbondingTime(ctx)) 27 minSelfUndelegation := types.NewUndelegationInfo(delAddr, validator.MinSelfDelegation, completionTime) 28 k.SetUndelegating(ctx, minSelfUndelegation) 29 k.SetAddrByTimeKeyWithNilValue(ctx, minSelfUndelegation.CompletionTime, minSelfUndelegation.DelegatorAddress) 30 31 // 3.clear the msd 32 validator.MinSelfDelegation = sdk.ZeroDec() 33 34 // 4.jail the validator 35 validator.Jailed = true 36 37 // 5.call the hooks of slashing module 38 k.AfterValidatorDestroyed(ctx, validator.ConsAddress(), validator.OperatorAddress) 39 40 // 6.change status of validator 41 switch validator.Status { 42 case sdk.Bonded: 43 // set the validator info to enforce the update of validator-set 44 k.AppendAbandonedValidatorAddrs(ctx, validator.ConsAddress()) 45 case sdk.Unbonding: 46 case sdk.Unbonded: 47 // if there is no shares on the validator, remove it 48 if remainShares.IsZero() && validator.GetMinSelfDelegation().IsZero() { 49 k.RemoveValidator(ctx, validator.OperatorAddress) 50 return 51 } 52 } 53 // kick out the val from the vals-set 54 k.DeleteValidatorByPowerIndex(ctx, validator) 55 // ATTENTION:update DelegatorShares must go after DeleteValidatorByPowerIndex 56 validator.DelegatorShares = remainShares 57 k.SetValidator(ctx, validator) 58 59 return 60 } 61 62 // AddSharesAsMinSelfDelegation adds shares of equal value of default msd (0.001fibo) to validator itself during the creation 63 func (k Keeper) AddSharesAsMinSelfDelegation(ctx sdk.Context, delAddr sdk.AccAddress, validator *types.Validator, 64 defaultMSDToken sdk.SysCoin) (err error) { 65 // 0. transfer account's fibo (0.001fibo as default) into bondPool 66 coins := sdk.SysCoins{defaultMSDToken} 67 err = k.supplyKeeper.DelegateCoinsFromAccountToModule(ctx, delAddr, types.BondedPoolName, coins) 68 if err != nil { 69 return err 70 } 71 72 // 1. add shares for default msd to validator itself 73 k.addSharesAsDefaultMinSelfDelegation(ctx, validator) 74 75 return nil 76 } 77 78 func (k Keeper) addSharesAsDefaultMinSelfDelegation(ctx sdk.Context, pValidator *types.Validator) { 79 k.DeleteValidatorByPowerIndex(ctx, *pValidator) 80 //TODO: current rule: any msd -> 1 shares 81 shares := k.getSharesFromDefaultMinSelfDelegation() 82 pValidator.DelegatorShares = pValidator.GetDelegatorShares().Add(shares) 83 k.SetValidator(ctx, *pValidator) 84 k.SetValidatorByPowerIndex(ctx, *pValidator) 85 } 86 87 // RULES: any msd -> 1 shares 88 func (k Keeper) getSharesFromDefaultMinSelfDelegation() sdk.Dec { 89 return sdk.OneDec() 90 }