-
Notifications
You must be signed in to change notification settings - Fork 91
/
block_rate_limit_config.go
96 lines (90 loc) · 3.55 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 (
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
)
const (
MaxShortTermOrdersPerMarketPerNBlocksNumBlocks = 1_000
MaxShortTermOrdersPerMarketPerNBlocksLimit = 10_000_000
MaxShortTermOrderCancellationsPerMarketPerNBlocksNumBlocks = 1_000
MaxShortTermOrderCancellationsPerMarketPerNBlocksLimit = 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 > MaxShortTermOrdersPerMarketPerNBlocksLimit` for short term order rate limits.
// - `NumBlocks == 0` || `NumBlocks > MaxShortTermOrdersPerMarketPerNBlocksNumBlocks` 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 > MaxShortTermOrderCancellationsPerMarketPerNBlocksNumBlocks` for short term order
// cancellation rate limits.
// - `NumBlocks == 0` || `NumBlocks > MaxShortTermOrderCancellationsPerMarketPerNBlocksLimit` for short term order
// cancellation rate limits.
// - There are multiple rate limits for the same `NumBlocks` in `MaxShortTermOrdersPerMarketPerNBlocks`,
// `MaxStatefulOrdersPerNBlocks`, or `MaxShortTermOrderCancellationsPerMarketPerNBlocks`.
func (lc BlockRateLimitConfiguration) Validate() error {
if err := (maxPerNBlocksRateLimits)(lc.MaxShortTermOrdersPerMarketPerNBlocks).validate(
"MaxShortTermOrdersPerMarketPerNBlocks",
MaxShortTermOrdersPerMarketPerNBlocksNumBlocks,
MaxShortTermOrdersPerMarketPerNBlocksLimit,
); err != nil {
return err
}
if err := (maxPerNBlocksRateLimits)(lc.MaxStatefulOrdersPerNBlocks).validate(
"MaxStatefulOrdersPerNBlocks",
MaxStatefulOrdersPerNBlocksNumBlocks,
MaxStatefulOrdersPerNBlocksLimit,
); err != nil {
return err
}
if err := (maxPerNBlocksRateLimits)(lc.MaxShortTermOrderCancellationsPerMarketPerNBlocks).validate(
"MaxShortTermOrderCancellationsPerMarketPerNBlocks",
MaxShortTermOrderCancellationsPerMarketPerNBlocksNumBlocks,
MaxShortTermOrderCancellationsPerMarketPerNBlocksLimit,
); 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 sdkerrors.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 sdkerrors.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 sdkerrors.Wrapf(
ErrInvalidBlockRateLimitConfig,
"%d is not a valid NumBlocks for %s rate limit %+v",
rl.NumBlocks,
field,
rl)
}
return nil
}