/
block_rate_limit_config.go
96 lines (90 loc) · 3.36 KB
/
block_rate_limit_config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package types
import (
errorsmod "cosmossdk.io/errors"
)
const (
MaxShortTermOrdersPerNBlocksNumBlocks = 1_000
MaxShortTermOrdersPerNBlocksLimit = 10_000_000
MaxShortTermOrderCancellationsPerNBlocksNumBlocks = 1_000
MaxShortTermOrderCancellationsPerNBlocksLimit = 10_000_000
MaxStatefulOrdersPerNBlocksNumBlocks = 10_000
MaxStatefulOrdersPerNBlocksLimit = 1_000_000
)
// Validate validates each individual MaxPerNBlocksRateLimit.
// It returns an error if any of the rate limits fail the following validations:
// - `Limit == 0` || `Limit > MaxShortTermOrdersPerNBlocksLimit` for short term order rate limits.
// - `NumBlocks == 0` || `NumBlocks > MaxShortTermOrdersPerNBlocksNumBlocks` for short term order rate
// limits.
// - `Limit == 0` || `Limit > MaxStatefulOrdersPerNBlocksLimit` for stateful order rate limits.
// - `NumBlocks == 0` || `NumBlocks > MaxStatefulOrdersPerNBlocksNumBlocks` for stateful order rate limits.
// - `Limit == 0` || `Limit > MaxShortTermOrderCancellationsPerNBlocksNumBlocks` for short term order
// cancellation rate limits.
// - `NumBlocks == 0` || `NumBlocks > MaxShortTermOrderCancellationsPerNBlocksLimit` for short term order
// cancellation rate limits.
// - There are multiple rate limits for the same `NumBlocks` in `MaxShortTermOrdersPerNBlocks`,
// `MaxStatefulOrdersPerNBlocks`, or `MaxShortTermOrderCancellationsPerNBlocks`.
func (lc BlockRateLimitConfiguration) Validate() error {
if err := (maxPerNBlocksRateLimits)(lc.MaxShortTermOrdersPerNBlocks).validate(
"MaxShortTermOrdersPerNBlocks",
MaxShortTermOrdersPerNBlocksNumBlocks,
MaxShortTermOrdersPerNBlocksLimit,
); err != nil {
return err
}
if err := (maxPerNBlocksRateLimits)(lc.MaxStatefulOrdersPerNBlocks).validate(
"MaxStatefulOrdersPerNBlocks",
MaxStatefulOrdersPerNBlocksNumBlocks,
MaxStatefulOrdersPerNBlocksLimit,
); err != nil {
return err
}
if err := (maxPerNBlocksRateLimits)(lc.MaxShortTermOrderCancellationsPerNBlocks).validate(
"MaxShortTermOrderCancellationsPerNBlocks",
MaxShortTermOrderCancellationsPerNBlocksNumBlocks,
MaxShortTermOrderCancellationsPerNBlocksLimit,
); err != nil {
return err
}
return nil
}
type maxPerNBlocksRateLimits []MaxPerNBlocksRateLimit
func (rl maxPerNBlocksRateLimits) validate(field string, maxBlocks uint32, maxOrders uint32) error {
duplicates := make(map[uint32]MaxPerNBlocksRateLimit, 0)
for _, rateLimit := range rl {
if err := rateLimit.validate(
field,
maxBlocks,
maxOrders); err != nil {
return err
}
if existing, found := duplicates[rateLimit.NumBlocks]; found {
return errorsmod.Wrapf(
ErrInvalidBlockRateLimitConfig,
"Multiple rate limits %+v and %+v for the same block height found for %s",
existing,
rateLimit,
field)
}
duplicates[rateLimit.NumBlocks] = rateLimit
}
return nil
}
func (rl MaxPerNBlocksRateLimit) validate(field string, maxBlocks uint32, maxOrders uint32) error {
if rl.Limit == 0 || rl.Limit > maxOrders {
return errorsmod.Wrapf(
ErrInvalidBlockRateLimitConfig,
"%d is not a valid Limit for %s rate limit %+v",
rl.Limit,
field,
rl)
}
if rl.NumBlocks == 0 || rl.NumBlocks > maxBlocks {
return errorsmod.Wrapf(
ErrInvalidBlockRateLimitConfig,
"%d is not a valid NumBlocks for %s rate limit %+v",
rl.NumBlocks,
field,
rl)
}
return nil
}