Skip to content

Commit 6a079b4

Browse files
authored
feat: ws active asset ctx (#82)
# Overview This PR adds - - support for `activeAssetCtx` - required structs - example usage Fixes #81
1 parent 6e8df20 commit 6a079b4

File tree

4 files changed

+93
-7
lines changed

4 files changed

+93
-7
lines changed

src/bin/ws_active_asset_ctx.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use hyperliquid_rust_sdk::{BaseUrl, InfoClient, Message, Subscription};
2+
use log::info;
3+
use tokio::{
4+
spawn,
5+
sync::mpsc::unbounded_channel,
6+
time::{sleep, Duration},
7+
};
8+
9+
#[tokio::main]
10+
async fn main() {
11+
env_logger::init();
12+
let mut info_client = InfoClient::new(None, Some(BaseUrl::Testnet)).await.unwrap();
13+
let coin = "BTC".to_string();
14+
15+
let (sender, mut receiver) = unbounded_channel();
16+
let subscription_id = info_client
17+
.subscribe(Subscription::ActiveAssetCtx { coin }, sender)
18+
.await
19+
.unwrap();
20+
21+
spawn(async move {
22+
sleep(Duration::from_secs(30)).await;
23+
info!("Unsubscribing from active asset ctx");
24+
info_client.unsubscribe(subscription_id).await.unwrap()
25+
});
26+
27+
while let Some(Message::ActiveAssetCtx(active_asset_ctx)) = receiver.recv().await {
28+
info!("Received active asset ctx: {active_asset_ctx:?}");
29+
}
30+
}

src/ws/message_types.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,8 @@ pub struct Notification {
5555
pub struct WebData2 {
5656
pub data: WebData2Data,
5757
}
58+
59+
#[derive(Deserialize, Clone, Debug)]
60+
pub struct ActiveAssetCtx {
61+
pub data: ActiveAssetCtxData,
62+
}

src/ws/sub_structs.rs

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use ethers::types::H160;
2-
use serde::Deserialize;
2+
use serde::{Deserialize, Serialize};
33
use std::collections::HashMap;
44

55
#[derive(Deserialize, Clone, Debug)]
@@ -279,3 +279,45 @@ pub struct NotificationData {
279279
pub struct WebData2Data {
280280
pub user: H160,
281281
}
282+
283+
#[derive(Deserialize, Clone, Debug)]
284+
#[serde(rename_all = "camelCase")]
285+
pub struct ActiveAssetCtxData {
286+
pub coin: String,
287+
pub ctx: AssetCtx,
288+
}
289+
290+
#[derive(Deserialize, Serialize, Clone, Debug)]
291+
#[serde(rename_all = "camelCase")]
292+
#[serde(untagged)]
293+
pub enum AssetCtx {
294+
Perps(PerpsAssetCtx),
295+
Spot(SpotAssetCtx),
296+
}
297+
298+
#[derive(Deserialize, Serialize, Clone, Debug)]
299+
#[serde(rename_all = "camelCase")]
300+
pub struct SharedAssetCtx {
301+
pub day_ntl_vlm: String,
302+
pub prev_day_px: String,
303+
pub mark_px: String,
304+
pub mid_px: Option<String>,
305+
}
306+
307+
#[derive(Deserialize, Serialize, Clone, Debug)]
308+
#[serde(rename_all = "camelCase")]
309+
pub struct PerpsAssetCtx {
310+
#[serde(flatten)]
311+
pub shared: SharedAssetCtx,
312+
pub funding: String,
313+
pub open_interest: String,
314+
pub oracle_px: String,
315+
}
316+
317+
#[derive(Deserialize, Serialize, Clone, Debug)]
318+
#[serde(rename_all = "camelCase")]
319+
pub struct SpotAssetCtx {
320+
#[serde(flatten)]
321+
pub shared: SharedAssetCtx,
322+
pub circulating_supply: String,
323+
}

src/ws/ws_manager.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use crate::{
22
prelude::*,
33
ws::message_types::{AllMids, Candle, L2Book, OrderUpdates, Trades, User},
4-
Error, Notification, UserFills, UserFundings, UserNonFundingLedgerUpdates, WebData2,
4+
ActiveAssetCtx, Error, Notification, UserFills, UserFundings, UserNonFundingLedgerUpdates,
5+
WebData2,
56
};
67
use futures_util::{stream::SplitSink, SinkExt, StreamExt};
78
use log::{error, info, warn};
@@ -50,16 +51,17 @@ pub(crate) struct WsManager {
5051
#[serde(rename_all = "camelCase")]
5152
pub enum Subscription {
5253
AllMids,
53-
Trades { coin: String },
54+
Notification { user: H160 },
55+
WebData2 { user: H160 },
56+
Candle { coin: String, interval: String },
5457
L2Book { coin: String },
58+
Trades { coin: String },
59+
OrderUpdates { user: H160 },
5560
UserEvents { user: H160 },
5661
UserFills { user: H160 },
57-
Candle { coin: String, interval: String },
58-
OrderUpdates { user: H160 },
5962
UserFundings { user: H160 },
6063
UserNonFundingLedgerUpdates { user: H160 },
61-
Notification { user: H160 },
62-
WebData2 { user: H160 },
64+
ActiveAssetCtx { coin: String },
6365
}
6466

6567
#[derive(Deserialize, Clone, Debug)]
@@ -80,6 +82,7 @@ pub enum Message {
8082
UserNonFundingLedgerUpdates(UserNonFundingLedgerUpdates),
8183
Notification(Notification),
8284
WebData2(WebData2),
85+
ActiveAssetCtx(ActiveAssetCtx),
8386
Pong,
8487
}
8588

@@ -258,6 +261,12 @@ impl WsManager {
258261
user: web_data2.data.user,
259262
})
260263
.map_err(|e| Error::JsonParse(e.to_string())),
264+
Message::ActiveAssetCtx(active_asset_ctx) => {
265+
serde_json::to_string(&Subscription::ActiveAssetCtx {
266+
coin: active_asset_ctx.data.coin.clone(),
267+
})
268+
.map_err(|e| Error::JsonParse(e.to_string()))
269+
}
261270
Message::SubscriptionResponse | Message::Pong => Ok(String::default()),
262271
Message::NoData => Ok("".to_string()),
263272
Message::HyperliquidError(err) => Ok(format!("hyperliquid error: {err:?}")),

0 commit comments

Comments
 (0)