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 }