nautilus_hyperliquid/python/
mod.rs1pub mod enums;
19pub mod http;
20pub mod urls;
21pub mod websocket;
22
23use nautilus_core::python::{to_pyruntime_err, to_pyvalue_err};
24use nautilus_model::identifiers::ClientOrderId;
25use pyo3::prelude::*;
26
27use crate::{
28 common::builder_fee::{
29 BuilderFeeInfo, approve_from_env, revoke_from_env, verify_from_env_or_address,
30 },
31 http::models::Cloid,
32};
33
34#[pyfunction]
39#[pyo3(name = "hyperliquid_cloid_from_client_order_id")]
40fn py_hyperliquid_cloid_from_client_order_id(client_order_id: ClientOrderId) -> String {
41 Cloid::from_client_order_id(client_order_id).to_hex()
42}
43
44#[pyfunction]
50#[pyo3(name = "hyperliquid_product_type_from_symbol")]
51fn py_hyperliquid_product_type_from_symbol(
52 symbol: &str,
53) -> PyResult<crate::common::HyperliquidProductType> {
54 crate::common::HyperliquidProductType::from_symbol(symbol).map_err(to_pyvalue_err)
55}
56
57#[pyfunction]
61#[pyo3(name = "get_hyperliquid_builder_fee_info")]
62fn py_get_hyperliquid_builder_fee_info() -> PyResult<String> {
63 let info = BuilderFeeInfo::new();
64 serde_json::to_string(&info).map_err(to_pyvalue_err)
65}
66
67#[pyfunction]
69#[pyo3(name = "print_hyperliquid_builder_fee_info")]
70fn py_print_hyperliquid_builder_fee_info() {
71 BuilderFeeInfo::new().print();
72}
73
74#[pyfunction]
91#[pyo3(name = "approve_hyperliquid_builder_fee", signature = (non_interactive=false))]
92fn py_approve_hyperliquid_builder_fee(non_interactive: bool) -> PyResult<bool> {
93 std::thread::spawn(move || {
94 let runtime = tokio::runtime::Builder::new_current_thread()
95 .enable_all()
96 .build()
97 .map_err(|e| to_pyruntime_err(format!("Failed to create runtime: {e}")))?;
98
99 Ok(runtime.block_on(approve_from_env(non_interactive)))
100 })
101 .join()
102 .map_err(|_| to_pyruntime_err("Thread panicked"))?
103}
104
105#[pyfunction]
123#[pyo3(name = "revoke_hyperliquid_builder_fee", signature = (non_interactive=false))]
124fn py_revoke_hyperliquid_builder_fee(non_interactive: bool) -> PyResult<bool> {
125 std::thread::spawn(move || {
126 let runtime = tokio::runtime::Builder::new_current_thread()
127 .enable_all()
128 .build()
129 .map_err(|e| to_pyruntime_err(format!("Failed to create runtime: {e}")))?;
130
131 Ok(runtime.block_on(revoke_from_env(non_interactive)))
132 })
133 .join()
134 .map_err(|_| to_pyruntime_err("Thread panicked"))?
135}
136
137#[pyfunction]
153#[pyo3(name = "verify_hyperliquid_builder_fee", signature = (wallet_address=None))]
154fn py_verify_hyperliquid_builder_fee(wallet_address: Option<String>) -> PyResult<bool> {
155 std::thread::spawn(move || {
156 let runtime = tokio::runtime::Builder::new_current_thread()
157 .enable_all()
158 .build()
159 .map_err(|e| to_pyruntime_err(format!("Failed to create runtime: {e}")))?;
160
161 Ok(runtime.block_on(verify_from_env_or_address(wallet_address)))
162 })
163 .join()
164 .map_err(|_| to_pyruntime_err("Thread panicked"))?
165}
166
167#[pymodule]
169pub fn hyperliquid(m: &Bound<'_, PyModule>) -> PyResult<()> {
170 m.add(
171 "HYPERLIQUID_POST_ONLY_WOULD_MATCH",
172 crate::common::consts::HYPERLIQUID_POST_ONLY_WOULD_MATCH,
173 )?;
174 m.add(
175 "HYPERLIQUID_BUILDER_FEE_NOT_APPROVED",
176 crate::common::consts::HYPERLIQUID_BUILDER_FEE_NOT_APPROVED,
177 )?;
178 m.add_class::<crate::http::HyperliquidHttpClient>()?;
179 m.add_class::<crate::websocket::HyperliquidWebSocketClient>()?;
180 m.add_class::<crate::common::enums::HyperliquidProductType>()?;
181 m.add_class::<crate::common::enums::HyperliquidTpSl>()?;
182 m.add_class::<crate::common::enums::HyperliquidConditionalOrderType>()?;
183 m.add_class::<crate::common::enums::HyperliquidTrailingOffsetType>()?;
184 m.add_function(wrap_pyfunction!(urls::py_get_hyperliquid_http_base_url, m)?)?;
185 m.add_function(wrap_pyfunction!(urls::py_get_hyperliquid_ws_url, m)?)?;
186 m.add_function(wrap_pyfunction!(
187 py_hyperliquid_product_type_from_symbol,
188 m
189 )?)?;
190 m.add_function(wrap_pyfunction!(
191 py_hyperliquid_cloid_from_client_order_id,
192 m
193 )?)?;
194 m.add_function(wrap_pyfunction!(py_get_hyperliquid_builder_fee_info, m)?)?;
195 m.add_function(wrap_pyfunction!(py_print_hyperliquid_builder_fee_info, m)?)?;
196 m.add_function(wrap_pyfunction!(py_approve_hyperliquid_builder_fee, m)?)?;
197 m.add_function(wrap_pyfunction!(py_revoke_hyperliquid_builder_fee, m)?)?;
198 m.add_function(wrap_pyfunction!(py_verify_hyperliquid_builder_fee, m)?)?;
199
200 Ok(())
201}