-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathhypercore_example.rs
More file actions
145 lines (128 loc) · 6.8 KB
/
hypercore_example.rs
File metadata and controls
145 lines (128 loc) · 6.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
//! HyperCore API Example — Low-level block and trade data via JSON-RPC.
//!
//! This example shows how to query blocks, trades, and orders using the HyperCore API.
//!
//! # Usage
//! ```bash
//! export ENDPOINT="https://your-endpoint.hype-mainnet.quiknode.pro/TOKEN"
//! cargo run --example hypercore_example
//! ```
use hyperliquid_sdk::HyperliquidSDK;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let endpoint = std::env::var("ENDPOINT").unwrap_or_else(|_| {
eprintln!("Error: Set ENDPOINT environment variable");
eprintln!(" export ENDPOINT='https://your-endpoint.hype-mainnet.quiknode.pro/TOKEN'");
std::process::exit(1);
});
println!("Hyperliquid HyperCore API Example");
println!("{}", "=".repeat(50));
println!("Endpoint: {}...", &endpoint[..endpoint.len().min(50)]);
println!();
// Create SDK and get HyperCore client
let sdk = HyperliquidSDK::new().endpoint(&endpoint).build().await?;
let hc = sdk.core();
// ══════════════════════════════════════════════════════════════════════════
// Block Data
// ══════════════════════════════════════════════════════════════════════════
println!("Block Data");
println!("{}", "-".repeat(30));
// Get latest block number
let block_num = hc.latest_block_number(None).await?;
println!("Latest block: {}", block_num);
// Get block by number
let block = hc.get_block(block_num, None).await?;
if let Some(txs) = block.get("transactions").and_then(|t| t.as_array()) {
println!("Block {}:", block_num);
println!(" Transactions: {}", txs.len());
if let Some(ts) = block.get("timestamp") {
println!(" Timestamp: {}", ts);
}
}
println!();
// ══════════════════════════════════════════════════════════════════════════
// Recent Trades
// ══════════════════════════════════════════════════════════════════════════
println!("Recent Trades");
println!("{}", "-".repeat(30));
// Get latest trades (all coins)
let trades = hc.latest_trades(Some(5), None).await?;
if let Some(trades_arr) = trades.as_array() {
println!("Last {} trades:", trades_arr.len());
for trade in trades_arr.iter().take(5) {
let coin = trade.get("coin").and_then(|c| c.as_str()).unwrap_or("?");
let px = trade.get("px").and_then(|p| p.as_str()).unwrap_or("0");
let sz = trade.get("sz").and_then(|s| s.as_str()).unwrap_or("?");
let side = trade.get("side").and_then(|s| s.as_str()).unwrap_or("?");
let price: f64 = px.parse().unwrap_or(0.0);
println!(" {}: {} @ ${:.2} ({})", coin, sz, price, side);
}
}
println!();
// Get trades for specific coin
let btc_trades = hc.latest_trades(Some(3), Some("BTC")).await?;
if let Some(trades_arr) = btc_trades.as_array() {
println!("Last {} BTC trades:", trades_arr.len());
for trade in trades_arr {
let px = trade.get("px").and_then(|p| p.as_str()).unwrap_or("0");
let sz = trade.get("sz").and_then(|s| s.as_str()).unwrap_or("?");
let side = trade.get("side").and_then(|s| s.as_str()).unwrap_or("?");
let price: f64 = px.parse().unwrap_or(0.0);
println!(" {} @ ${:.2} ({})", sz, price, side);
}
}
println!();
// ══════════════════════════════════════════════════════════════════════════
// Recent Orders
// ══════════════════════════════════════════════════════════════════════════
println!("Recent Orders");
println!("{}", "-".repeat(30));
match hc.latest_orders(Some(5)).await {
Ok(orders) => {
if let Some(orders_arr) = orders.as_array() {
println!("Last {} orders:", orders_arr.len());
for order in orders_arr.iter().take(5) {
let coin = order.get("coin").and_then(|c| c.as_str()).unwrap_or("?");
let side = order.get("side").and_then(|s| s.as_str()).unwrap_or("?");
let px = order.get("limitPx").and_then(|p| p.as_str()).unwrap_or("0");
let sz = order.get("sz").and_then(|s| s.as_str()).unwrap_or("?");
let status = order.get("status").and_then(|s| s.as_str()).unwrap_or("?");
let price: f64 = px.parse().unwrap_or(0.0);
println!(" {}: {} {} @ ${:.2} - {}", coin, side, sz, price, status);
}
}
}
Err(e) => {
println!(" Could not fetch orders: {}", e);
}
}
println!();
// ══════════════════════════════════════════════════════════════════════════
// Block Range Query
// ══════════════════════════════════════════════════════════════════════════
println!("Block Range Query");
println!("{}", "-".repeat(30));
let start_block = block_num.saturating_sub(5);
match hc.get_batch_blocks(start_block, block_num, None).await {
Ok(blocks) => {
if let Some(blocks_arr) = blocks.as_array() {
println!("Blocks {} to {}: {} blocks", start_block, block_num, blocks_arr.len());
// Count transactions
let mut total_txs = 0;
for b in blocks_arr {
if let Some(txs) = b.get("transactions").and_then(|t| t.as_array()) {
total_txs += txs.len();
}
}
println!("Total transactions: {}", total_txs);
}
}
Err(e) => {
println!(" Could not fetch blocks: {}", e);
}
}
println!();
println!("{}", "=".repeat(50));
println!("Done!");
Ok(())
}