use nautilus_network::websocket::TransportBackend;
use pyo3::prelude::*;
use crate::{
common::enums::HyperliquidEnvironment,
config::{HyperliquidDataClientConfig, HyperliquidExecClientConfig},
};
#[pymethods]
#[pyo3_stub_gen::derive::gen_stub_pymethods]
impl HyperliquidDataClientConfig {
#[new]
#[pyo3(signature = (
environment = None,
private_key = None,
base_url_ws = None,
base_url_http = None,
proxy_url = None,
http_timeout_secs = None,
ws_timeout_secs = None,
update_instruments_interval_mins = None,
transport_backend = None,
stale_stream_receive_timeout_secs = None,
stream_health_check_interval_secs = None,
stale_stream_warning_cooldown_secs = None,
stale_stream_recovery_enabled = None,
stale_stream_recovery_cooldown_secs = None,
stale_stream_max_targeted_resubscribes = None,
))]
#[expect(clippy::too_many_arguments)]
fn py_new(
environment: Option<HyperliquidEnvironment>,
private_key: Option<String>,
base_url_ws: Option<String>,
base_url_http: Option<String>,
proxy_url: Option<String>,
http_timeout_secs: Option<u64>,
ws_timeout_secs: Option<u64>,
update_instruments_interval_mins: Option<u64>,
transport_backend: Option<TransportBackend>,
stale_stream_receive_timeout_secs: Option<u64>,
stream_health_check_interval_secs: Option<u64>,
stale_stream_warning_cooldown_secs: Option<u64>,
stale_stream_recovery_enabled: Option<bool>,
stale_stream_recovery_cooldown_secs: Option<u64>,
stale_stream_max_targeted_resubscribes: Option<u32>,
) -> Self {
let defaults = Self::default();
Self {
private_key,
base_url_ws,
base_url_http,
proxy_url,
environment: environment.unwrap_or(defaults.environment),
http_timeout_secs: http_timeout_secs.unwrap_or(defaults.http_timeout_secs),
ws_timeout_secs: ws_timeout_secs.unwrap_or(defaults.ws_timeout_secs),
stale_stream_receive_timeout_secs: stale_stream_receive_timeout_secs
.unwrap_or(defaults.stale_stream_receive_timeout_secs),
stream_health_check_interval_secs: stream_health_check_interval_secs
.unwrap_or(defaults.stream_health_check_interval_secs),
stale_stream_warning_cooldown_secs: stale_stream_warning_cooldown_secs
.unwrap_or(defaults.stale_stream_warning_cooldown_secs),
stale_stream_recovery_enabled: stale_stream_recovery_enabled
.unwrap_or(defaults.stale_stream_recovery_enabled),
stale_stream_recovery_cooldown_secs: stale_stream_recovery_cooldown_secs
.unwrap_or(defaults.stale_stream_recovery_cooldown_secs),
stale_stream_max_targeted_resubscribes: stale_stream_max_targeted_resubscribes
.unwrap_or(defaults.stale_stream_max_targeted_resubscribes),
update_instruments_interval_mins: update_instruments_interval_mins
.unwrap_or(defaults.update_instruments_interval_mins),
transport_backend: transport_backend.unwrap_or(defaults.transport_backend),
}
}
#[getter]
const fn has_proxy_url(&self) -> bool {
self.proxy_url.is_some()
}
fn __repr__(&self) -> String {
stringify!(HyperliquidDataClientConfig).to_string()
}
}
#[pymethods]
#[pyo3_stub_gen::derive::gen_stub_pymethods]
impl HyperliquidExecClientConfig {
#[new]
#[pyo3(signature = (
private_key = None,
vault_address = None,
account_address = None,
environment = None,
base_url_ws = None,
base_url_http = None,
base_url_exchange = None,
proxy_url = None,
http_timeout_secs = None,
max_retries = None,
retry_delay_initial_ms = None,
retry_delay_max_ms = None,
normalize_prices = None,
market_order_slippage_bps = None,
include_builder_attribution = None,
ws_post_timeout_secs = None,
transport_backend = None,
))]
#[expect(clippy::too_many_arguments)]
fn py_new(
private_key: Option<String>,
vault_address: Option<String>,
account_address: Option<String>,
environment: Option<HyperliquidEnvironment>,
base_url_ws: Option<String>,
base_url_http: Option<String>,
base_url_exchange: Option<String>,
proxy_url: Option<String>,
http_timeout_secs: Option<u64>,
max_retries: Option<u32>,
retry_delay_initial_ms: Option<u64>,
retry_delay_max_ms: Option<u64>,
normalize_prices: Option<bool>,
market_order_slippage_bps: Option<u32>,
include_builder_attribution: Option<bool>,
ws_post_timeout_secs: Option<u64>,
transport_backend: Option<TransportBackend>,
) -> Self {
let defaults = Self::default();
Self {
private_key,
vault_address,
account_address,
base_url_ws,
base_url_http,
base_url_exchange,
proxy_url,
environment: environment.unwrap_or(defaults.environment),
http_timeout_secs: http_timeout_secs.unwrap_or(defaults.http_timeout_secs),
max_retries: max_retries.unwrap_or(defaults.max_retries),
retry_delay_initial_ms: retry_delay_initial_ms
.unwrap_or(defaults.retry_delay_initial_ms),
retry_delay_max_ms: retry_delay_max_ms.unwrap_or(defaults.retry_delay_max_ms),
normalize_prices: normalize_prices.unwrap_or(defaults.normalize_prices),
market_order_slippage_bps: market_order_slippage_bps
.unwrap_or(defaults.market_order_slippage_bps),
include_builder_attribution: include_builder_attribution
.unwrap_or(defaults.include_builder_attribution),
ws_post_timeout_secs: ws_post_timeout_secs.unwrap_or(defaults.ws_post_timeout_secs),
transport_backend: transport_backend.unwrap_or(defaults.transport_backend),
outcome_settlement_poll_secs: defaults.outcome_settlement_poll_secs,
}
}
#[getter]
const fn has_proxy_url(&self) -> bool {
self.proxy_url.is_some()
}
fn __repr__(&self) -> String {
stringify!(HyperliquidExecClientConfig).to_string()
}
}