github.com/Finschia/finschia-sdk@v0.49.1/x/slashing/types/params.go (about)

     1  package types
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	sdk "github.com/Finschia/finschia-sdk/types"
     8  	paramtypes "github.com/Finschia/finschia-sdk/x/params/types"
     9  )
    10  
    11  // Default parameter namespace
    12  const (
    13  	DefaultSignedBlocksWindow   = int64(100)
    14  	DefaultDowntimeJailDuration = 60 * 10 * time.Second
    15  )
    16  
    17  var (
    18  	DefaultMinSignedPerWindow      = sdk.NewDecWithPrec(5, 1)
    19  	DefaultSlashFractionDoubleSign = sdk.NewDec(1).Quo(sdk.NewDec(20))
    20  	DefaultSlashFractionDowntime   = sdk.NewDec(1).Quo(sdk.NewDec(100))
    21  )
    22  
    23  // Parameter store keys
    24  var (
    25  	KeySignedBlocksWindow      = []byte("SignedBlocksWindow")
    26  	KeyMinSignedPerWindow      = []byte("MinSignedPerWindow")
    27  	KeyDowntimeJailDuration    = []byte("DowntimeJailDuration")
    28  	KeySlashFractionDoubleSign = []byte("SlashFractionDoubleSign")
    29  	KeySlashFractionDowntime   = []byte("SlashFractionDowntime")
    30  )
    31  
    32  // ParamKeyTable for slashing module
    33  func ParamKeyTable() paramtypes.KeyTable {
    34  	return paramtypes.NewKeyTable().RegisterParamSet(&Params{})
    35  }
    36  
    37  // NewParams creates a new Params object
    38  func NewParams(
    39  	signedBlocksWindow int64, minSignedPerWindow sdk.Dec, downtimeJailDuration time.Duration,
    40  	slashFractionDoubleSign, slashFractionDowntime sdk.Dec,
    41  ) Params {
    42  	return Params{
    43  		SignedBlocksWindow:      signedBlocksWindow,
    44  		MinSignedPerWindow:      minSignedPerWindow,
    45  		DowntimeJailDuration:    downtimeJailDuration,
    46  		SlashFractionDoubleSign: slashFractionDoubleSign,
    47  		SlashFractionDowntime:   slashFractionDowntime,
    48  	}
    49  }
    50  
    51  // ParamSetPairs - Implements params.ParamSet
    52  func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs {
    53  	return paramtypes.ParamSetPairs{
    54  		paramtypes.NewParamSetPair(KeySignedBlocksWindow, &p.SignedBlocksWindow, validateSignedBlocksWindow),
    55  		paramtypes.NewParamSetPair(KeyMinSignedPerWindow, &p.MinSignedPerWindow, validateMinSignedPerWindow),
    56  		paramtypes.NewParamSetPair(KeyDowntimeJailDuration, &p.DowntimeJailDuration, validateDowntimeJailDuration),
    57  		paramtypes.NewParamSetPair(KeySlashFractionDoubleSign, &p.SlashFractionDoubleSign, validateSlashFractionDoubleSign),
    58  		paramtypes.NewParamSetPair(KeySlashFractionDowntime, &p.SlashFractionDowntime, validateSlashFractionDowntime),
    59  	}
    60  }
    61  
    62  // DefaultParams defines the parameters for this module
    63  func DefaultParams() Params {
    64  	return NewParams(
    65  		DefaultSignedBlocksWindow, DefaultMinSignedPerWindow, DefaultDowntimeJailDuration,
    66  		DefaultSlashFractionDoubleSign, DefaultSlashFractionDowntime,
    67  	)
    68  }
    69  
    70  func validateSignedBlocksWindow(i interface{}) error {
    71  	v, ok := i.(int64)
    72  	if !ok {
    73  		return fmt.Errorf("invalid parameter type: %T", i)
    74  	}
    75  
    76  	if v <= 0 {
    77  		return fmt.Errorf("signed blocks window must be positive: %d", v)
    78  	}
    79  
    80  	return nil
    81  }
    82  
    83  func validateMinSignedPerWindow(i interface{}) error {
    84  	v, ok := i.(sdk.Dec)
    85  	if !ok {
    86  		return fmt.Errorf("invalid parameter type: %T", i)
    87  	}
    88  	if v.IsNil() {
    89  		return fmt.Errorf("min signed per window cannot be nil: %s", v)
    90  	}
    91  	if v.IsNegative() {
    92  		return fmt.Errorf("min signed per window cannot be negative: %s", v)
    93  	}
    94  	if v.GT(sdk.OneDec()) {
    95  		return fmt.Errorf("min signed per window too large: %s", v)
    96  	}
    97  
    98  	return nil
    99  }
   100  
   101  func validateDowntimeJailDuration(i interface{}) error {
   102  	v, ok := i.(time.Duration)
   103  	if !ok {
   104  		return fmt.Errorf("invalid parameter type: %T", i)
   105  	}
   106  
   107  	if v <= 0 {
   108  		return fmt.Errorf("downtime jail duration must be positive: %s", v)
   109  	}
   110  
   111  	return nil
   112  }
   113  
   114  func validateSlashFractionDoubleSign(i interface{}) error {
   115  	v, ok := i.(sdk.Dec)
   116  	if !ok {
   117  		return fmt.Errorf("invalid parameter type: %T", i)
   118  	}
   119  	if v.IsNil() {
   120  		return fmt.Errorf("double sign slash fraction cannot be nil: %s", v)
   121  	}
   122  	if v.IsNegative() {
   123  		return fmt.Errorf("double sign slash fraction cannot be negative: %s", v)
   124  	}
   125  	if v.GT(sdk.OneDec()) {
   126  		return fmt.Errorf("double sign slash fraction too large: %s", v)
   127  	}
   128  
   129  	return nil
   130  }
   131  
   132  func validateSlashFractionDowntime(i interface{}) error {
   133  	v, ok := i.(sdk.Dec)
   134  	if !ok {
   135  		return fmt.Errorf("invalid parameter type: %T", i)
   136  	}
   137  	if v.IsNil() {
   138  		return fmt.Errorf("downtime slash fraction cannot be nil: %s", v)
   139  	}
   140  	if v.IsNegative() {
   141  		return fmt.Errorf("downtime slash fraction cannot be negative: %s", v)
   142  	}
   143  	if v.GT(sdk.OneDec()) {
   144  		return fmt.Errorf("downtime slash fraction too large: %s", v)
   145  	}
   146  
   147  	return nil
   148  }