144 lines
3.9 KiB
Go
144 lines
3.9 KiB
Go
package types
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
|
|
)
|
|
|
|
// Default parameter namespace
|
|
const (
|
|
DefaultSignedBlocksWindow = int64(100)
|
|
DefaultDowntimeJailDuration = 60 * 10 * time.Second
|
|
)
|
|
|
|
var (
|
|
DefaultMinSignedPerWindow = sdk.NewDecWithPrec(5, 1)
|
|
DefaultSlashFractionDoubleSign = sdk.NewDec(1).Quo(sdk.NewDec(20))
|
|
DefaultSlashFractionDowntime = sdk.NewDec(1).Quo(sdk.NewDec(100))
|
|
)
|
|
|
|
// Parameter store keys
|
|
var (
|
|
KeySignedBlocksWindow = []byte("SignedBlocksWindow")
|
|
KeyMinSignedPerWindow = []byte("MinSignedPerWindow")
|
|
KeyDowntimeJailDuration = []byte("DowntimeJailDuration")
|
|
KeySlashFractionDoubleSign = []byte("SlashFractionDoubleSign")
|
|
KeySlashFractionDowntime = []byte("SlashFractionDowntime")
|
|
)
|
|
|
|
// ParamKeyTable for slashing module
|
|
func ParamKeyTable() paramtypes.KeyTable {
|
|
return paramtypes.NewKeyTable().RegisterParamSet(&Params{})
|
|
}
|
|
|
|
// NewParams creates a new Params object
|
|
func NewParams(
|
|
signedBlocksWindow int64, minSignedPerWindow sdk.Dec, downtimeJailDuration time.Duration,
|
|
slashFractionDoubleSign, slashFractionDowntime sdk.Dec,
|
|
) Params {
|
|
|
|
return Params{
|
|
SignedBlocksWindow: signedBlocksWindow,
|
|
MinSignedPerWindow: minSignedPerWindow,
|
|
DowntimeJailDuration: downtimeJailDuration,
|
|
SlashFractionDoubleSign: slashFractionDoubleSign,
|
|
SlashFractionDowntime: slashFractionDowntime,
|
|
}
|
|
}
|
|
|
|
// ParamSetPairs - Implements params.ParamSet
|
|
func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs {
|
|
return paramtypes.ParamSetPairs{
|
|
paramtypes.NewParamSetPair(KeySignedBlocksWindow, &p.SignedBlocksWindow, validateSignedBlocksWindow),
|
|
paramtypes.NewParamSetPair(KeyMinSignedPerWindow, &p.MinSignedPerWindow, validateMinSignedPerWindow),
|
|
paramtypes.NewParamSetPair(KeyDowntimeJailDuration, &p.DowntimeJailDuration, validateDowntimeJailDuration),
|
|
paramtypes.NewParamSetPair(KeySlashFractionDoubleSign, &p.SlashFractionDoubleSign, validateSlashFractionDoubleSign),
|
|
paramtypes.NewParamSetPair(KeySlashFractionDowntime, &p.SlashFractionDowntime, validateSlashFractionDowntime),
|
|
}
|
|
}
|
|
|
|
// DefaultParams defines the parameters for this module
|
|
func DefaultParams() Params {
|
|
return NewParams(
|
|
DefaultSignedBlocksWindow, DefaultMinSignedPerWindow, DefaultDowntimeJailDuration,
|
|
DefaultSlashFractionDoubleSign, DefaultSlashFractionDowntime,
|
|
)
|
|
}
|
|
|
|
func validateSignedBlocksWindow(i interface{}) error {
|
|
v, ok := i.(int64)
|
|
if !ok {
|
|
return fmt.Errorf("invalid parameter type: %T", i)
|
|
}
|
|
|
|
if v <= 0 {
|
|
return fmt.Errorf("signed blocks window must be positive: %d", v)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func validateMinSignedPerWindow(i interface{}) error {
|
|
v, ok := i.(sdk.Dec)
|
|
if !ok {
|
|
return fmt.Errorf("invalid parameter type: %T", i)
|
|
}
|
|
|
|
if v.IsNegative() {
|
|
return fmt.Errorf("min signed per window cannot be negative: %s", v)
|
|
}
|
|
if v.GT(sdk.OneDec()) {
|
|
return fmt.Errorf("min signed per window too large: %s", v)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func validateDowntimeJailDuration(i interface{}) error {
|
|
v, ok := i.(time.Duration)
|
|
if !ok {
|
|
return fmt.Errorf("invalid parameter type: %T", i)
|
|
}
|
|
|
|
if v <= 0 {
|
|
return fmt.Errorf("downtime jail duration must be positive: %s", v)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func validateSlashFractionDoubleSign(i interface{}) error {
|
|
v, ok := i.(sdk.Dec)
|
|
if !ok {
|
|
return fmt.Errorf("invalid parameter type: %T", i)
|
|
}
|
|
|
|
if v.IsNegative() {
|
|
return fmt.Errorf("double sign slash fraction cannot be negative: %s", v)
|
|
}
|
|
if v.GT(sdk.OneDec()) {
|
|
return fmt.Errorf("double sign slash fraction too large: %s", v)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func validateSlashFractionDowntime(i interface{}) error {
|
|
v, ok := i.(sdk.Dec)
|
|
if !ok {
|
|
return fmt.Errorf("invalid parameter type: %T", i)
|
|
}
|
|
|
|
if v.IsNegative() {
|
|
return fmt.Errorf("downtime slash fraction cannot be negative: %s", v)
|
|
}
|
|
if v.GT(sdk.OneDec()) {
|
|
return fmt.Errorf("downtime slash fraction too large: %s", v)
|
|
}
|
|
|
|
return nil
|
|
}
|