Skip to main content

nautilus_binance/common/
consts.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2026 Nautech Systems Pty Ltd. All rights reserved.
3//  https://nautechsystems.io
4//
5//  Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
6//  You may not use this file except in compliance with the License.
7//  You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
8//
9//  Unless required by applicable law or agreed to in writing, software
10//  distributed under the License is distributed on an "AS IS" BASIS,
11//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//  See the License for the specific language governing permissions and
13//  limitations under the License.
14// -------------------------------------------------------------------------------------------------
15
16//! Binance venue constants and API endpoints.
17
18use std::{num::NonZeroU32, sync::LazyLock};
19
20use nautilus_model::identifiers::Venue;
21use nautilus_network::ratelimiter::quota::Quota;
22use ustr::Ustr;
23
24use super::enums::{BinanceRateLimitInterval, BinanceRateLimitType};
25
26/// The Binance venue identifier string.
27pub const BINANCE: &str = "BINANCE";
28
29/// Static venue instance for Binance.
30pub static BINANCE_VENUE: LazyLock<Venue> = LazyLock::new(|| Venue::new(BINANCE));
31
32/// Binance Spot API base URL (mainnet).
33pub const BINANCE_SPOT_HTTP_URL: &str = "https://api.binance.com";
34
35/// Binance USD-M Futures API base URL (mainnet).
36pub const BINANCE_FUTURES_USD_HTTP_URL: &str = "https://fapi.binance.com";
37
38/// Binance COIN-M Futures API base URL (mainnet).
39pub const BINANCE_FUTURES_COIN_HTTP_URL: &str = "https://dapi.binance.com";
40
41/// Binance European Options API base URL (mainnet).
42pub const BINANCE_OPTIONS_HTTP_URL: &str = "https://eapi.binance.com";
43
44/// Binance Spot API base URL (testnet).
45pub const BINANCE_SPOT_TESTNET_HTTP_URL: &str = "https://testnet.binance.vision";
46
47/// Binance USD-M Futures API base URL (testnet).
48pub const BINANCE_FUTURES_USD_TESTNET_HTTP_URL: &str = "https://testnet.binancefuture.com";
49
50/// Binance COIN-M Futures API base URL (testnet).
51pub const BINANCE_FUTURES_COIN_TESTNET_HTTP_URL: &str = "https://testnet.binancefuture.com";
52
53/// Binance Spot API base URL (demo).
54pub const BINANCE_SPOT_DEMO_HTTP_URL: &str = "https://demo-api.binance.com";
55
56/// Binance Futures API base URL (demo, same as futures testnet).
57pub const BINANCE_FUTURES_DEMO_HTTP_URL: &str = "https://testnet.binancefuture.com";
58
59/// Binance Spot WebSocket base URL (mainnet).
60pub const BINANCE_SPOT_WS_URL: &str = "wss://stream.binance.com:9443/ws";
61
62/// Binance USD-M Futures WebSocket base URL (mainnet).
63pub const BINANCE_FUTURES_USD_WS_URL: &str = "wss://fstream.binance.com/ws";
64
65/// Binance COIN-M Futures WebSocket base URL (mainnet).
66pub const BINANCE_FUTURES_COIN_WS_URL: &str = "wss://dstream.binance.com/ws";
67
68/// Binance European Options WebSocket base URL (mainnet).
69pub const BINANCE_OPTIONS_WS_URL: &str = "wss://nbstream.binance.com/eoptions";
70
71/// Binance Spot SBE WebSocket stream URL (mainnet).
72pub const BINANCE_SPOT_SBE_WS_URL: &str = "wss://stream-sbe.binance.com/ws";
73
74/// Binance Spot SBE WebSocket API URL (mainnet).
75pub const BINANCE_SPOT_SBE_WS_API_URL: &str =
76    "wss://ws-api.binance.com:443/ws-api/v3?responseFormat=sbe&sbeSchemaId=3&sbeSchemaVersion=2";
77
78/// Binance Spot SBE WebSocket API URL (testnet).
79pub const BINANCE_SPOT_SBE_WS_API_TESTNET_URL: &str =
80    "wss://testnet.binance.vision/ws-api/v3?responseFormat=sbe&sbeSchemaId=3&sbeSchemaVersion=2";
81
82/// Binance Spot SBE WebSocket API URL (demo).
83pub const BINANCE_SPOT_SBE_WS_API_DEMO_URL: &str =
84    "wss://demo-ws-api.binance.com/ws-api/v3?responseFormat=sbe&sbeSchemaId=3&sbeSchemaVersion=2";
85
86/// Binance Spot WebSocket base URL (testnet).
87pub const BINANCE_SPOT_TESTNET_WS_URL: &str = "wss://stream.testnet.binance.vision/ws";
88
89/// Binance Spot WebSocket base URL (demo).
90pub const BINANCE_SPOT_DEMO_WS_URL: &str = "wss://demo-stream.binance.com/ws";
91
92/// Binance USD-M Futures WebSocket base URL (testnet).
93pub const BINANCE_FUTURES_USD_TESTNET_WS_URL: &str = "wss://stream.binancefuture.com/ws";
94
95/// Binance COIN-M Futures WebSocket base URL (testnet).
96pub const BINANCE_FUTURES_COIN_TESTNET_WS_URL: &str = "wss://dstream.binancefuture.com/ws";
97
98/// Binance Spot API version path.
99pub const BINANCE_SPOT_API_PATH: &str = "/api/v3";
100
101/// Binance USD-M Futures API version path.
102pub const BINANCE_FAPI_PATH: &str = "/fapi/v1";
103
104/// Binance COIN-M Futures API version path.
105pub const BINANCE_DAPI_PATH: &str = "/dapi/v1";
106
107/// Binance European Options API version path.
108pub const BINANCE_EAPI_PATH: &str = "/eapi/v1";
109
110/// Describes a static rate limit quota for a product type.
111#[derive(Clone, Copy, Debug)]
112pub struct BinanceRateLimitQuota {
113    /// Rate limit type.
114    pub rate_limit_type: BinanceRateLimitType,
115    /// Time interval unit.
116    pub interval: BinanceRateLimitInterval,
117    /// Number of intervals.
118    pub interval_num: u32,
119    /// Maximum allowed requests for the interval.
120    pub limit: u32,
121}
122
123/// Spot & margin REST limits (default IP weights).
124///
125/// References:
126/// - <https://developers.binance.com/docs/binance-spot-api-docs/limits>
127pub const BINANCE_SPOT_RATE_LIMITS: &[BinanceRateLimitQuota] = &[
128    BinanceRateLimitQuota {
129        rate_limit_type: BinanceRateLimitType::RequestWeight,
130        interval: BinanceRateLimitInterval::Minute,
131        interval_num: 1,
132        limit: 1_200,
133    },
134    BinanceRateLimitQuota {
135        rate_limit_type: BinanceRateLimitType::Orders,
136        interval: BinanceRateLimitInterval::Second,
137        interval_num: 1,
138        limit: 10,
139    },
140    BinanceRateLimitQuota {
141        rate_limit_type: BinanceRateLimitType::Orders,
142        interval: BinanceRateLimitInterval::Day,
143        interval_num: 1,
144        limit: 100_000,
145    },
146];
147
148/// USD-M Futures REST limits (default IP weights).
149///
150/// References:
151/// - <https://developers.binance.com/docs/derivatives/usds-margined-futures/general-info#limits>
152pub const BINANCE_FAPI_RATE_LIMITS: &[BinanceRateLimitQuota] = &[
153    BinanceRateLimitQuota {
154        rate_limit_type: BinanceRateLimitType::RequestWeight,
155        interval: BinanceRateLimitInterval::Minute,
156        interval_num: 1,
157        limit: 2_400,
158    },
159    BinanceRateLimitQuota {
160        rate_limit_type: BinanceRateLimitType::Orders,
161        interval: BinanceRateLimitInterval::Second,
162        interval_num: 1,
163        limit: 50,
164    },
165    BinanceRateLimitQuota {
166        rate_limit_type: BinanceRateLimitType::Orders,
167        interval: BinanceRateLimitInterval::Minute,
168        interval_num: 1,
169        limit: 1_200,
170    },
171];
172
173/// COIN-M Futures REST limits (default IP weights).
174///
175/// References:
176/// - <https://developers.binance.com/docs/derivatives/coin-margined-futures/general-info#limits>
177pub const BINANCE_DAPI_RATE_LIMITS: &[BinanceRateLimitQuota] = &[
178    BinanceRateLimitQuota {
179        rate_limit_type: BinanceRateLimitType::RequestWeight,
180        interval: BinanceRateLimitInterval::Minute,
181        interval_num: 1,
182        limit: 1_200,
183    },
184    BinanceRateLimitQuota {
185        rate_limit_type: BinanceRateLimitType::Orders,
186        interval: BinanceRateLimitInterval::Second,
187        interval_num: 1,
188        limit: 20,
189    },
190    BinanceRateLimitQuota {
191        rate_limit_type: BinanceRateLimitType::Orders,
192        interval: BinanceRateLimitInterval::Minute,
193        interval_num: 1,
194        limit: 1_200,
195    },
196];
197
198/// Options REST limits (default IP weights).
199///
200/// References:
201/// - <https://developers.binance.com/docs/derivatives/european-options/general-info#limits>
202pub const BINANCE_EAPI_RATE_LIMITS: &[BinanceRateLimitQuota] = &[
203    BinanceRateLimitQuota {
204        rate_limit_type: BinanceRateLimitType::RequestWeight,
205        interval: BinanceRateLimitInterval::Minute,
206        interval_num: 1,
207        limit: 3_000,
208    },
209    BinanceRateLimitQuota {
210        rate_limit_type: BinanceRateLimitType::Orders,
211        interval: BinanceRateLimitInterval::Second,
212        interval_num: 1,
213        limit: 5,
214    },
215    BinanceRateLimitQuota {
216        rate_limit_type: BinanceRateLimitType::Orders,
217        interval: BinanceRateLimitInterval::Minute,
218        interval_num: 1,
219        limit: 200,
220    },
221];
222
223/// WebSocket subscription rate limit: 5 messages per second.
224///
225/// Binance limits incoming WebSocket messages (subscribe/unsubscribe) to 5 per second.
226pub static BINANCE_WS_SUBSCRIPTION_QUOTA: LazyLock<Quota> =
227    LazyLock::new(|| Quota::per_second(NonZeroU32::new(5).expect("5 > 0")));
228
229/// WebSocket connection rate limit: 1 per second (conservative).
230///
231/// Binance limits connections to 300 per 5 minutes per IP. This conservative quota
232/// of 1 per second helps avoid hitting the connection limit during reconnection storms.
233pub static BINANCE_WS_CONNECTION_QUOTA: LazyLock<Quota> =
234    LazyLock::new(|| Quota::per_second(NonZeroU32::new(1).expect("1 > 0")));
235
236/// Pre-interned rate limit key for WebSocket subscription operations.
237pub static BINANCE_RATE_LIMIT_KEY_SUBSCRIPTION: LazyLock<[Ustr; 1]> =
238    LazyLock::new(|| [Ustr::from("subscription")]);
239
240/// Valid order book depth levels for Binance.
241pub const BINANCE_BOOK_DEPTHS: [u32; 7] = [5, 10, 20, 50, 100, 500, 1000];