nautilus_hyperliquid/common/
consts.rs1use std::{sync::LazyLock, time::Duration};
17
18use nautilus_model::{enums::OrderType, identifiers::Venue};
19use ustr::Ustr;
20
21use super::enums::HyperliquidEnvironment;
22
23pub const HYPERLIQUID: &str = "HYPERLIQUID";
24pub static HYPERLIQUID_VENUE: LazyLock<Venue> =
25 LazyLock::new(|| Venue::new(Ustr::from(HYPERLIQUID)));
26
27pub const HYPERLIQUID_WS_URL: &str = "wss://api.hyperliquid.xyz/ws";
28pub const HYPERLIQUID_INFO_URL: &str = "https://api.hyperliquid.xyz/info";
29pub const HYPERLIQUID_EXCHANGE_URL: &str = "https://api.hyperliquid.xyz/exchange";
30
31pub 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 NAUTILUS_BUILDER_ADDRESS: &str = "0x0c8d970c462726e014ad36f6c5a63e99db48a8e7";
38
39pub const HYPERLIQUID_CHAIN_ID: u64 = 421614;
41
42pub const HYPERLIQUID_POST_ONLY_WOULD_MATCH: &str =
44 "Post only order would have immediately matched";
45
46pub const HYPERLIQUID_SUPPORTED_ORDER_TYPES: &[OrderType] = &[
61 OrderType::Market, OrderType::Limit, OrderType::StopMarket, OrderType::StopLimit, OrderType::MarketIfTouched, OrderType::LimitIfTouched, ];
68
69pub const HYPERLIQUID_CONDITIONAL_ORDER_TYPES: &[OrderType] = &[
74 OrderType::StopMarket,
75 OrderType::StopLimit,
76 OrderType::MarketIfTouched,
77 OrderType::LimitIfTouched,
78];
79
80pub fn ws_url(environment: HyperliquidEnvironment) -> &'static str {
82 match environment {
83 HyperliquidEnvironment::Testnet => HYPERLIQUID_TESTNET_WS_URL,
84 HyperliquidEnvironment::Mainnet => HYPERLIQUID_WS_URL,
85 }
86}
87
88pub fn info_url(environment: HyperliquidEnvironment) -> &'static str {
90 match environment {
91 HyperliquidEnvironment::Testnet => HYPERLIQUID_TESTNET_INFO_URL,
92 HyperliquidEnvironment::Mainnet => HYPERLIQUID_INFO_URL,
93 }
94}
95
96pub fn exchange_url(environment: HyperliquidEnvironment) -> &'static str {
98 match environment {
99 HyperliquidEnvironment::Testnet => HYPERLIQUID_TESTNET_EXCHANGE_URL,
100 HyperliquidEnvironment::Mainnet => HYPERLIQUID_EXCHANGE_URL,
101 }
102}
103
104pub const HEARTBEAT_INTERVAL: Duration = Duration::from_secs(30);
107pub const RECONNECT_BASE_BACKOFF: Duration = Duration::from_millis(250);
108pub const RECONNECT_MAX_BACKOFF: Duration = Duration::from_secs(30);
109pub const HTTP_TIMEOUT: Duration = Duration::from_secs(10);
110pub const INFLIGHT_MAX: usize = 100;
112pub const QUEUE_MAX: usize = 1000;
113
114#[cfg(test)]
115mod tests {
116 use rstest::rstest;
117
118 use super::*;
119
120 #[rstest]
121 fn test_ws_url() {
122 assert_eq!(ws_url(HyperliquidEnvironment::Mainnet), HYPERLIQUID_WS_URL);
123 assert_eq!(
124 ws_url(HyperliquidEnvironment::Testnet),
125 HYPERLIQUID_TESTNET_WS_URL
126 );
127 }
128
129 #[rstest]
130 fn test_info_url() {
131 assert_eq!(
132 info_url(HyperliquidEnvironment::Mainnet),
133 HYPERLIQUID_INFO_URL
134 );
135 assert_eq!(
136 info_url(HyperliquidEnvironment::Testnet),
137 HYPERLIQUID_TESTNET_INFO_URL
138 );
139 }
140
141 #[rstest]
142 fn test_exchange_url() {
143 assert_eq!(
144 exchange_url(HyperliquidEnvironment::Mainnet),
145 HYPERLIQUID_EXCHANGE_URL
146 );
147 assert_eq!(
148 exchange_url(HyperliquidEnvironment::Testnet),
149 HYPERLIQUID_TESTNET_EXCHANGE_URL
150 );
151 }
152
153 #[rstest]
154 fn test_constants_values() {
155 assert_eq!(HEARTBEAT_INTERVAL, Duration::from_secs(30));
156 assert_eq!(RECONNECT_BASE_BACKOFF, Duration::from_millis(250));
157 assert_eq!(RECONNECT_MAX_BACKOFF, Duration::from_secs(30));
158 assert_eq!(HTTP_TIMEOUT, Duration::from_secs(10));
159 assert_eq!(INFLIGHT_MAX, 100);
160 assert_eq!(QUEUE_MAX, 1000);
161 }
162}