hyperliquid_ws_exec/
ws_exec.rs1use std::{env, time::Duration};
17
18use nautilus_hyperliquid::{common::consts::ws_url, websocket::client::HyperliquidWebSocketClient};
19use tokio::{pin, signal};
20use tracing::level_filters::LevelFilter;
21
22#[tokio::main]
23async fn main() -> Result<(), Box<dyn std::error::Error>> {
24 tracing_subscriber::fmt()
25 .with_max_level(LevelFilter::TRACE)
26 .init();
27
28 let args: Vec<String> = env::args().collect();
29 let testnet = args.get(1).is_some_and(|s| s == "testnet");
30
31 tracing::info!("Starting Hyperliquid WebSocket execution example");
32 tracing::info!("Testnet: {testnet}");
33
34 let ws_url = ws_url(testnet);
35 tracing::info!("WebSocket URL: {ws_url}");
36
37 let client = HyperliquidWebSocketClient::connect(ws_url).await?;
38 tracing::info!("Connected to Hyperliquid WebSocket");
39
40 let user_addr = env::var("HYPERLIQUID_USER_ADDRESS")
42 .unwrap_or_else(|_| "0x0000000000000000000000000000000000000000".to_string());
43
44 client.subscribe_all_user_channels(&user_addr).await?;
46 tracing::info!("Subscribed to all user channels for {}", user_addr);
47
48 tokio::time::sleep(Duration::from_secs(1)).await;
50
51 let sigint = signal::ctrl_c();
53 pin!(sigint);
54
55 loop {
56 tokio::select! {
57 Some(message) = client.next_event() => {
58 tracing::debug!("{message:?}");
59 }
60 _ = &mut sigint => {
61 tracing::info!("Received SIGINT, closing connection...");
62 client.disconnect().await?;
63 break;
64 }
65 else => break,
66 }
67 }
68
69 Ok(())
70}