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  }