github.com/InjectiveLabs/sdk-go@v1.53.0/chain/peggy/types/params.go (about)

     1  package types
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"strings"
     7  
     8  	"cosmossdk.io/errors"
     9  	"cosmossdk.io/math"
    10  	sdk "github.com/cosmos/cosmos-sdk/types"
    11  )
    12  
    13  // DefaultParamspace defines the default peggy module parameter subspace
    14  const (
    15  	DefaultParamspace = ModuleName
    16  )
    17  
    18  // DefaultParams returns a copy of the default params
    19  func DefaultParams() *Params {
    20  	return &Params{
    21  		PeggyId:                       "injective-peggyid",
    22  		SignedValsetsWindow:           10000,
    23  		SignedBatchesWindow:           10000,
    24  		SignedClaimsWindow:            10000,
    25  		TargetBatchTimeout:            43200000,
    26  		AverageBlockTime:              5000,
    27  		AverageEthereumBlockTime:      15000,
    28  		SlashFractionValset:           math.LegacyNewDec(1).Quo(math.LegacyNewDec(1000)),
    29  		SlashFractionBatch:            math.LegacyNewDec(1).Quo(math.LegacyNewDec(1000)),
    30  		SlashFractionClaim:            math.LegacyNewDec(1).Quo(math.LegacyNewDec(1000)),
    31  		SlashFractionConflictingClaim: math.LegacyNewDec(1).Quo(math.LegacyNewDec(1000)),
    32  		SlashFractionBadEthSignature:  math.LegacyNewDec(1).Quo(math.LegacyNewDec(1000)),
    33  		CosmosCoinDenom:               "inj",
    34  		UnbondSlashingValsetsWindow:   10000,
    35  		ClaimSlashingEnabled:          false,
    36  		Admins:                        nil,
    37  	}
    38  }
    39  
    40  // ValidateBasic checks that the parameters have valid values.
    41  func (p Params) ValidateBasic() error {
    42  	if err := validatePeggyID(p.PeggyId); err != nil {
    43  		return errors.Wrap(err, "peggy id")
    44  	}
    45  	if err := validateContractHash(p.ContractSourceHash); err != nil {
    46  		return errors.Wrap(err, "contract hash")
    47  	}
    48  	if err := validateBridgeContractAddress(p.BridgeEthereumAddress); err != nil {
    49  		return errors.Wrap(err, "bridge contract address")
    50  	}
    51  	if err := validateBridgeContractStartHeight(p.BridgeContractStartHeight); err != nil {
    52  		return errors.Wrap(err, "bridge contract start height")
    53  	}
    54  	if err := validateBridgeChainID(p.BridgeChainId); err != nil {
    55  		return errors.Wrap(err, "bridge chain id")
    56  	}
    57  	if err := validateCosmosCoinDenom(p.CosmosCoinDenom); err != nil {
    58  		return errors.Wrap(err, "cosmos coin denom")
    59  	}
    60  	if err := validateCosmosCoinErc20Contract(p.CosmosCoinErc20Contract); err != nil {
    61  		return errors.Wrap(err, "cosmos coin erc20 contract address")
    62  	}
    63  	if err := validateTargetBatchTimeout(p.TargetBatchTimeout); err != nil {
    64  		return errors.Wrap(err, "Batch timeout")
    65  	}
    66  	if err := validateAverageBlockTime(p.AverageBlockTime); err != nil {
    67  		return errors.Wrap(err, "Block time")
    68  	}
    69  	if err := validateAverageEthereumBlockTime(p.AverageEthereumBlockTime); err != nil {
    70  		return errors.Wrap(err, "Ethereum block time")
    71  	}
    72  	if err := validateSignedValsetsWindow(p.SignedValsetsWindow); err != nil {
    73  		return errors.Wrap(err, "signed blocks window")
    74  	}
    75  	if err := validateSignedBatchesWindow(p.SignedBatchesWindow); err != nil {
    76  		return errors.Wrap(err, "signed blocks window")
    77  	}
    78  	if err := validateSignedClaimsWindow(p.SignedClaimsWindow); err != nil {
    79  		return errors.Wrap(err, "signed blocks window")
    80  	}
    81  	if err := validateSlashFractionValset(p.SlashFractionValset); err != nil {
    82  		return errors.Wrap(err, "slash fraction valset")
    83  	}
    84  	if err := validateSlashFractionBatch(p.SlashFractionBatch); err != nil {
    85  		return errors.Wrap(err, "slash fraction valset")
    86  	}
    87  	if err := validateSlashFractionClaim(p.SlashFractionClaim); err != nil {
    88  		return errors.Wrap(err, "slash fraction valset")
    89  	}
    90  	if err := validateSlashFractionConflictingClaim(p.SlashFractionConflictingClaim); err != nil {
    91  		return errors.Wrap(err, "slash fraction valset")
    92  	}
    93  	if err := validateSlashFractionBadEthSignature(p.SlashFractionBadEthSignature); err != nil {
    94  		return errors.Wrap(err, "slash fraction BadEthSignature")
    95  	}
    96  	if err := validateUnbondSlashingValsetsWindow(p.UnbondSlashingValsetsWindow); err != nil {
    97  		return errors.Wrap(err, "unbond Slashing valset window")
    98  	}
    99  	if err := validateClaimSlashingEnabled(p.ClaimSlashingEnabled); err != nil {
   100  		return errors.Wrap(err, "claim slashing enabled")
   101  	}
   102  	if err := validateAdmins(p.Admins); err != nil {
   103  		return errors.Wrap(err, "admins")
   104  	}
   105  
   106  	return nil
   107  }
   108  
   109  // Equal returns a boolean determining if two Params types are identical.
   110  func (p Params) Equal(p2 Params) bool {
   111  	bz1 := ModuleCdc.MustMarshalLengthPrefixed(&p)
   112  	bz2 := ModuleCdc.MustMarshalLengthPrefixed(&p2)
   113  	return bytes.Equal(bz1, bz2)
   114  }
   115  
   116  func validatePeggyID(i interface{}) error {
   117  	v, ok := i.(string)
   118  	if !ok {
   119  		return fmt.Errorf("invalid parameter type: %T", i)
   120  	}
   121  	if _, err := strToFixByteArray(v); err != nil {
   122  		return err
   123  	}
   124  	return nil
   125  }
   126  
   127  func validateContractHash(i interface{}) error {
   128  	if _, ok := i.(string); !ok {
   129  		return fmt.Errorf("invalid parameter type: %T", i)
   130  	}
   131  	return nil
   132  }
   133  
   134  func validateBridgeChainID(i interface{}) error {
   135  	if _, ok := i.(uint64); !ok {
   136  		return fmt.Errorf("invalid parameter type: %T", i)
   137  	}
   138  	return nil
   139  }
   140  
   141  func validateBridgeContractStartHeight(i interface{}) error {
   142  	if _, ok := i.(uint64); !ok {
   143  		return fmt.Errorf("invalid parameter type: %T", i)
   144  	}
   145  	return nil
   146  }
   147  
   148  func validateTargetBatchTimeout(i interface{}) error {
   149  	val, ok := i.(uint64)
   150  	if !ok {
   151  		return fmt.Errorf("invalid parameter type: %T", i)
   152  	} else if val < 60000 {
   153  		return fmt.Errorf("invalid target batch timeout, less than 60 seconds is too short")
   154  	}
   155  	return nil
   156  }
   157  
   158  func validateAverageBlockTime(i interface{}) error {
   159  	val, ok := i.(uint64)
   160  	if !ok {
   161  		return fmt.Errorf("invalid parameter type: %T", i)
   162  	} else if val < 100 {
   163  		return fmt.Errorf("invalid average Cosmos block time, too short for latency limitations")
   164  	}
   165  	return nil
   166  }
   167  
   168  func validateAverageEthereumBlockTime(i interface{}) error {
   169  	val, ok := i.(uint64)
   170  	if !ok {
   171  		return fmt.Errorf("invalid parameter type: %T", i)
   172  	} else if val < 100 {
   173  		return fmt.Errorf("invalid average Ethereum block time, too short for latency limitations")
   174  	}
   175  	return nil
   176  }
   177  
   178  func validateBridgeContractAddress(i interface{}) error {
   179  	v, ok := i.(string)
   180  	if !ok {
   181  		return fmt.Errorf("invalid parameter type: %T", i)
   182  	}
   183  	if err := ValidateEthAddress(v); err != nil {
   184  		if !strings.Contains(err.Error(), "empty") {
   185  			return err
   186  		}
   187  	}
   188  	return nil
   189  }
   190  
   191  func validateSignedValsetsWindow(i interface{}) error {
   192  	if _, ok := i.(uint64); !ok {
   193  		return fmt.Errorf("invalid parameter type: %T", i)
   194  	}
   195  	return nil
   196  }
   197  
   198  func validateUnbondSlashingValsetsWindow(i interface{}) error {
   199  	if _, ok := i.(uint64); !ok {
   200  		return fmt.Errorf("invalid parameter type: %T", i)
   201  	}
   202  	return nil
   203  }
   204  
   205  func validateSlashFractionValset(i interface{}) error {
   206  	if _, ok := i.(math.LegacyDec); !ok {
   207  		return fmt.Errorf("invalid parameter type: %T", i)
   208  	}
   209  	return nil
   210  }
   211  
   212  func validateSignedBatchesWindow(i interface{}) error {
   213  	if _, ok := i.(uint64); !ok {
   214  		return fmt.Errorf("invalid parameter type: %T", i)
   215  	}
   216  	return nil
   217  }
   218  
   219  func validateSignedClaimsWindow(i interface{}) error {
   220  	if _, ok := i.(uint64); !ok {
   221  		return fmt.Errorf("invalid parameter type: %T", i)
   222  	}
   223  	return nil
   224  }
   225  
   226  func validateSlashFractionBatch(i interface{}) error {
   227  	if _, ok := i.(math.LegacyDec); !ok {
   228  		return fmt.Errorf("invalid parameter type: %T", i)
   229  	}
   230  	return nil
   231  }
   232  
   233  func validateSlashFractionClaim(i interface{}) error {
   234  	if _, ok := i.(math.LegacyDec); !ok {
   235  		return fmt.Errorf("invalid parameter type: %T", i)
   236  	}
   237  	return nil
   238  }
   239  
   240  func validateSlashFractionConflictingClaim(i interface{}) error {
   241  	if _, ok := i.(math.LegacyDec); !ok {
   242  		return fmt.Errorf("invalid parameter type: %T", i)
   243  	}
   244  	return nil
   245  }
   246  
   247  func strToFixByteArray(s string) ([32]byte, error) {
   248  	var out [32]byte
   249  	if len([]byte(s)) > 32 {
   250  		return out, fmt.Errorf("string too long")
   251  	}
   252  	copy(out[:], s)
   253  	return out, nil
   254  }
   255  
   256  func validateCosmosCoinDenom(i interface{}) error {
   257  	v, ok := i.(string)
   258  	if !ok {
   259  		return fmt.Errorf("invalid parameter type: %T", i)
   260  	}
   261  
   262  	if _, err := strToFixByteArray(v); err != nil {
   263  		return err
   264  	}
   265  	return nil
   266  }
   267  
   268  func validateCosmosCoinErc20Contract(i interface{}) error {
   269  	v, ok := i.(string)
   270  	if !ok {
   271  		return fmt.Errorf("invalid parameter type: %T", i)
   272  	}
   273  
   274  	// empty address is valid
   275  	if v == "" {
   276  		return nil
   277  	}
   278  
   279  	return ValidateEthAddress(v)
   280  }
   281  
   282  func validateClaimSlashingEnabled(i interface{}) error {
   283  	_, ok := i.(bool)
   284  	if !ok {
   285  		return fmt.Errorf("invalid parameter type: %T", i)
   286  	}
   287  	return nil
   288  }
   289  
   290  func validateSlashFractionBadEthSignature(i interface{}) error {
   291  	if _, ok := i.(math.LegacyDec); !ok {
   292  		return fmt.Errorf("invalid parameter type: %T", i)
   293  	}
   294  	return nil
   295  }
   296  
   297  func validateValsetReward(i interface{}) error {
   298  	return nil
   299  }
   300  
   301  func validateAdmins(i interface{}) error {
   302  	v, ok := i.([]string)
   303  	if !ok {
   304  		return fmt.Errorf("invalid parameter type: %T", i)
   305  	}
   306  
   307  	admins := make(map[string]struct{})
   308  
   309  	for _, admin := range v {
   310  		adminAddr, err := sdk.AccAddressFromBech32(admin)
   311  		if err != nil {
   312  			return fmt.Errorf("invalid admin address: %s", admin)
   313  		}
   314  
   315  		if _, found := admins[adminAddr.String()]; found {
   316  			return fmt.Errorf("duplicate admin: %s", admin)
   317  		}
   318  		admins[adminAddr.String()] = struct{}{}
   319  	}
   320  
   321  	return nil
   322  }