nautilus_hyperliquid/common/
consts.rs1use std::{sync::LazyLock, time::Duration};
17
18use nautilus_model::{enums::OrderType, identifiers::Venue};
19use ustr::Ustr;
20
21pub const HYPERLIQUID: &str = "HYPERLIQUID";
22pub static HYPERLIQUID_VENUE: LazyLock<Venue> =
23 LazyLock::new(|| Venue::new(Ustr::from(HYPERLIQUID)));
24
25pub const HYPERLIQUID_WS_URL: &str = "wss://api.hyperliquid.xyz/ws";
27pub const HYPERLIQUID_INFO_URL: &str = "https://api.hyperliquid.xyz/info";
28pub const HYPERLIQUID_EXCHANGE_URL: &str = "https://api.hyperliquid.xyz/exchange";
29
30pub const HYPERLIQUID_TESTNET_WS_URL: &str = "wss://api.hyperliquid-testnet.xyz/ws";
32pub const HYPERLIQUID_TESTNET_INFO_URL: &str = "https://api.hyperliquid-testnet.xyz/info";
33pub const HYPERLIQUID_TESTNET_EXCHANGE_URL: &str = "https://api.hyperliquid-testnet.xyz/exchange";
34
35pub const HYPERLIQUID_SUPPORTED_ORDER_TYPES: &[OrderType] = &[
50 OrderType::Market, OrderType::Limit, OrderType::StopMarket, OrderType::StopLimit, OrderType::MarketIfTouched, OrderType::LimitIfTouched, ];
57
58pub const HYPERLIQUID_CONDITIONAL_ORDER_TYPES: &[OrderType] = &[
63 OrderType::StopMarket,
64 OrderType::StopLimit,
65 OrderType::MarketIfTouched,
66 OrderType::LimitIfTouched,
67];
68
69pub fn ws_url(is_testnet: bool) -> &'static str {
71 if is_testnet {
72 HYPERLIQUID_TESTNET_WS_URL
73 } else {
74 HYPERLIQUID_WS_URL
75 }
76}
77
78pub fn info_url(is_testnet: bool) -> &'static str {
80 if is_testnet {
81 HYPERLIQUID_TESTNET_INFO_URL
82 } else {
83 HYPERLIQUID_INFO_URL
84 }
85}
86
87pub fn exchange_url(is_testnet: bool) -> &'static str {
89 if is_testnet {
90 HYPERLIQUID_TESTNET_EXCHANGE_URL
91 } else {
92 HYPERLIQUID_EXCHANGE_URL
93 }
94}
95
96pub const HEARTBEAT_INTERVAL: Duration = Duration::from_secs(30);
99pub const RECONNECT_BASE_BACKOFF: Duration = Duration::from_millis(250);
100pub const RECONNECT_MAX_BACKOFF: Duration = Duration::from_secs(30);
101pub const HTTP_TIMEOUT: Duration = Duration::from_secs(10);
102pub const INFLIGHT_MAX: usize = 100;
104pub const QUEUE_MAX: usize = 1000;
105
106#[cfg(test)]
111mod tests {
112 use rstest::rstest;
113
114 use super::*;
115
116 #[rstest]
117 fn test_ws_url() {
118 assert_eq!(ws_url(false), HYPERLIQUID_WS_URL);
119 assert_eq!(ws_url(true), HYPERLIQUID_TESTNET_WS_URL);
120 }
121
122 #[rstest]
123 fn test_info_url() {
124 assert_eq!(info_url(false), HYPERLIQUID_INFO_URL);
125 assert_eq!(info_url(true), HYPERLIQUID_TESTNET_INFO_URL);
126 }
127
128 #[rstest]
129 fn test_exchange_url() {
130 assert_eq!(exchange_url(false), HYPERLIQUID_EXCHANGE_URL);
131 assert_eq!(exchange_url(true), HYPERLIQUID_TESTNET_EXCHANGE_URL);
132 }
133
134 #[rstest]
135 fn test_constants_values() {
136 assert_eq!(HEARTBEAT_INTERVAL, Duration::from_secs(30));
137 assert_eq!(RECONNECT_BASE_BACKOFF, Duration::from_millis(250));
138 assert_eq!(RECONNECT_MAX_BACKOFF, Duration::from_secs(30));
139 assert_eq!(HTTP_TIMEOUT, Duration::from_secs(10));
140 assert_eq!(INFLIGHT_MAX, 100);
141 assert_eq!(QUEUE_MAX, 1000);
142 }
143}