-
Notifications
You must be signed in to change notification settings - Fork 0
/
rateLimiter.go
93 lines (81 loc) · 3.95 KB
/
rateLimiter.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
package client
import (
"golang.org/x/time/rate"
)
var endpointLimits = map[string]rate.Limit{
// Orders
"POST /v5/order/create": rate.Limit(10),
"POST /v5/order/amend": rate.Limit(10),
"POST /v5/order/cancel": rate.Limit(10),
"POST /v5/order/cancel-all": rate.Limit(10),
"GET /v5/order/realtime": rate.Limit(10),
"GET /v5/order/history": rate.Limit(10),
"GET /v5/execution/list": rate.Limit(10),
// Position
"GET /v5/position/list": rate.Limit(10),
"GET /v5/position/closed-pnl": rate.Limit(10),
"POST /v5/position/set-leverage": rate.Limit(10),
// Account
"GET /v5/account/wallet-balance": rate.Limit(20),
"GET /v5/account/fee-rate": rate.Limit(10),
// Asset
"GET /v5/asset/transfer/query-asset-info": rate.Limit(1), // Corrected for 60 req/min
"GET /v5/asset/transfer/query-transfer-coin-list": rate.Limit(1), // Corrected for 60 req/min
"GET /v5/asset/transfer/query-inter-transfer-list": rate.Limit(1), // Corrected for 60 req/min
"GET /v5/asset/transfer/query-sub-member-list": rate.Limit(1), // Corrected for 60 req/min
"GET /v5/asset/transfer/query-universal-transfer-list": rate.Limit(5),
"GET /v5/asset/transfer/query-account-coins-balance": rate.Limit(5),
"GET /v5/asset/deposit/query-record": rate.Limit(100),
"GET /v5/asset/deposit/query-sub-member-record": rate.Limit(300),
"GET /v5/asset/deposit/query-address": rate.Limit(300),
"GET /v5/asset/deposit/query-sub-member-address": rate.Limit(300),
"GET /v5/asset/withdraw/query-record": rate.Limit(300),
"GET /v5/asset/coin/query-info": rate.Limit(2),
"GET /v5/asset/exchange/order-record": rate.Limit(600),
"POST /v5/asset/transfer/inter-transfer": rate.Limit(20 / 60), // Corrected for 20 req/min
"POST /v5/asset/transfer/save-transfer-sub-member": rate.Limit(20),
"POST /v5/asset/transfer/universal-transfer": rate.Limit(5),
"POST /v5/asset/withdraw/create": rate.Limit(1),
"POST /v5/asset/withdraw/cancel": rate.Limit(60 / 60), // Corrected for 60 req/min
// User
"POST /v5/user/create-sub-member": rate.Limit(5),
"POST /v5/user/create-sub-api": rate.Limit(5),
"POST /v5/user/frozen-sub-member": rate.Limit(5),
"POST /v5/user/update-api": rate.Limit(5),
"POST /v5/user/update-sub-api": rate.Limit(5),
"POST /v5/user/delete-api": rate.Limit(5),
"POST /v5/user/delete-sub-api": rate.Limit(5),
"GET /v5/user/query-sub-members": rate.Limit(10),
"GET /v5/user/query-api": rate.Limit(10),
// Spot Leverage Token
"GET /v5/spot-lever-token/order-record": rate.Limit(50),
"POST /v5/spot-lever-token/purchase": rate.Limit(20),
"POST /v5/spot-lever-token/redeem": rate.Limit(20),
// Spot Margin Trade (Classic)
"GET /v5/spot-cross-margin-trade/loan-info": rate.Limit(50),
"GET /v5/spot-cross-margin-trade/account": rate.Limit(50),
"GET /v5/spot-cross-margin-trade/orders": rate.Limit(50),
"GET /v5/spot-cross-margin-trade/repay-history": rate.Limit(50),
"POST /v5/spot-cross-margin-trade/loan": rate.Limit(20),
"POST /v5/spot-cross-margin-trade/repay": rate.Limit(20),
"POST /v5/spot-cross-margin-trade/switch": rate.Limit(20),
}
type EndpointRateLimiter struct {
limiters map[string]*rate.Limiter
}
func NewEndpointRateLimiter() *EndpointRateLimiter {
return &EndpointRateLimiter{
limiters: make(map[string]*rate.Limiter),
}
}
// SetLimiter updates or creates a rate limiter for a specific endpoint
func (e *EndpointRateLimiter) SetLimiter(endpointKey string, limiter *rate.Limiter) {
e.limiters[endpointKey] = limiter
}
// GetLimiter retrieves an existing rate limiter for an endpoint, returning nil if not found
func (e *EndpointRateLimiter) GetLimiter(endpointKey string) *rate.Limiter {
if limiter, exists := e.limiters[endpointKey]; exists {
return limiter
}
return nil
}