From 3d72b519c0b4050f2c8791306537aed0b18c625f Mon Sep 17 00:00:00 2001 From: Elijah Hampton Date: Fri, 19 Dec 2025 13:02:19 -0500 Subject: [PATCH 1/5] Installs clap CLI lib. Sets up CLI with initial info_api interface --- Cargo.lock | 115 ++++++++++++++++++++++++ Cargo.toml | 1 + src/api/info.rs | 4 +- src/bin/cli.rs | 234 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 352 insertions(+), 2 deletions(-) create mode 100644 src/bin/cli.rs diff --git a/Cargo.lock b/Cargo.lock index ba46052..8c0775d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -806,6 +806,56 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.6.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + [[package]] name = "anyhow" version = "1.0.100" @@ -1292,6 +1342,52 @@ dependencies = [ "windows-link", ] +[[package]] +name = "clap" +version = "4.5.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "clap_lex" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + [[package]] name = "const-hex" version = "1.17.0" @@ -2336,6 +2432,12 @@ dependencies = [ "serde", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + [[package]] name = "itertools" version = "0.10.5" @@ -2618,6 +2720,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + [[package]] name = "openssl" version = "0.10.75" @@ -3172,6 +3280,7 @@ dependencies = [ "alloy-primitives 0.8.26", "anyhow", "async-trait", + "clap", "once_cell", "reqwest", "rmp-serde", @@ -4354,6 +4463,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "uuid" version = "1.18.1" diff --git a/Cargo.toml b/Cargo.toml index aafa4dd..09e9bde 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,7 @@ alloy = { version = "1", features = ["full"] } alloy-primitives = { version = "0.8.0", features = ["serde"] } anyhow = "1.0" async-trait = "0.1" +clap = { version = "4.5.53", features = ["derive"] } once_cell = "1.19" reqwest = { version = "=0.12.23", features = ["json", "rustls-tls"] } rmp-serde = "1.3.0" diff --git a/src/api/info.rs b/src/api/info.rs index 8a5cf38..2620276 100644 --- a/src/api/info.rs +++ b/src/api/info.rs @@ -264,8 +264,8 @@ impl<'client> InfoApi<'client> { pub async fn l2_book_snapshot( &self, coin: &str, - n_sig_figs: Option, - mantissa: Option, + n_sig_figs: Option, + mantissa: Option, ) -> Result { let mut payload = json!({ "type": "l2Book", diff --git a/src/bin/cli.rs b/src/bin/cli.rs new file mode 100644 index 0000000..98a1471 --- /dev/null +++ b/src/bin/cli.rs @@ -0,0 +1,234 @@ +use alloy::signers::local::LocalSigner; +use clap::{Parser, Subcommand}; +use rhyperliquid::{init_tracing::init_tracing, types::info::user::CandleSnapshotRequest, HyperliquidClientBuilder}; +use std::env; + +#[derive(Parser)] +struct Cli { + #[arg(short, long)] + network: Option, + + #[arg(short, long)] + allow_signer_key_env: Option, + + #[command(subcommand)] + command: Commands, +} + +#[derive(Subcommand)] +enum Commands { + AllMids { + #[arg(short, long)] + dex: Option, + }, + OpenOrders { + #[arg(short, long)] + user: String, + #[arg(short, long)] + dex: Option, + }, + FrontendOpenOrders { + #[arg(short, long)] + user: String, + #[arg(short, long)] + dex: Option, + }, + UserFills { + #[arg(short, long)] + user: String, + #[arg(short, long)] + aggregate_by_time: Option, + }, + UserFillsByTime { + #[arg(short, long)] + user: String, + #[arg(short, long)] + start_time: u64, + #[arg(short, long)] + end_time: Option, + #[arg(short, long)] + aggregate_by_time: Option, + }, + UserRateLimit { + #[arg(short, long)] + user: String, + }, + OrderStatus { + #[arg(short, long)] + user: String, + #[arg(short, long)] + oid: u64, // Can be u64 or hex string + }, + L2Book { + #[arg(short, long)] + coin: String, + #[arg(short, long)] + n_sig_figs: Option, + #[arg(short, long)] + mantissa: Option, + }, + CandleSnapshot { + #[arg(short, long)] + coin: String, + #[arg(short, long)] + interval: String, + #[arg(short, long)] + start_time: u64, + #[arg(short, long)] + end_time: u64, + }, + HistoricalOrders { + #[arg(short, long)] + user: String, + }, + SubAccounts { + #[arg(short, long)] + user: String, + }, + VaultDetails { + #[arg(short, long)] + vault_address: String, + #[arg(short, long)] + user: Option, + }, + UserVaultEquities { + #[arg(short, long)] + user: String, + }, + UserRole { + #[arg(short, long)] + user: String, + }, + Portfolio { + #[arg(short, long)] + user: String, + }, + Referral { + #[arg(short, long)] + user: String, + }, + UserFees { + #[arg(short, long)] + user: String, + }, +} + +#[tokio::main] +async fn main() -> Result<(), Box> { + init_tracing(); + + let cli = Cli::parse(); + + #[allow(clippy::expect_used)] + let signer = env::var("HL_PRIVATE_KEY").expect("HL_PRIVATE_KEY env var is missing"); + + let mut hyperliquid = &mut HyperliquidClientBuilder::new(); + + // Check if the user provided a network, default to testnet + if let Some(network) = cli.network { + match network.to_lowercase().as_str() { + "testnet" => { + hyperliquid = hyperliquid.testnet(); + }, + "mainnet" => { + hyperliquid = hyperliquid.mainnet(); + }, + _ => hyperliquid = hyperliquid.testnet() + } + } else { + hyperliquid = hyperliquid.testnet(); + } + + // Check if user provides permission to check env var for signer key + if let Some(signer_permission) = cli.allow_signer_key_env { + if signer_permission { + hyperliquid = hyperliquid.with_wallet(LocalSigner::from_slice(signer.as_bytes())?); + } + } + + let client = hyperliquid.build()?; + let info_api = &client.info(); + + match cli.command { + Commands::AllMids{dex}=>{ + let all_mids = info_api.all_mids(dex).await?; + tracing::info!("{:?}", all_mids); + }, + Commands::OpenOrders{user,dex}=>{ + let open_orders = info_api.open_orders(&user, dex.as_deref()).await?; + tracing::info!("{:?}", open_orders); + } + Commands::FrontendOpenOrders { user, dex } => { + let frontend_open_orders = info_api.open_orders_with_additional_info(&user, dex.as_deref()).await?; + tracing::info!("{:?}", frontend_open_orders); + } + Commands::UserFills { user, aggregate_by_time } => { + let user_fills = info_api.fills(&user, aggregate_by_time).await?; + tracing::info!({"{:?}", user_fills}); + } + Commands::UserFillsByTime { user, start_time, end_time, aggregate_by_time } => { + let fills_by_time = info_api.fills_by_time(&user, start_time, end_time, aggregate_by_time).await?; + tracing::info!("{:?}", fills_by_time); + } + Commands::UserRateLimit { user } => { + let user_rate_limit = info_api.rate_limits(&user).await?; + tracing::info!("{:?}", user_rate_limit); + } + Commands::OrderStatus { user, oid } => { + let order_status = info_api.order_status(&user, rhyperliquid::types::info::OrderId::Numeric(oid)).await?; + tracing::info!("{:?}", order_status); + } + Commands::L2Book { coin, n_sig_figs, mantissa } => { + let l2_book = info_api.l2_book_snapshot(&coin, n_sig_figs, mantissa).await?; + tracing::info!("{:?}", l2_book); + } + Commands::CandleSnapshot { coin, interval, start_time, end_time } => { + let snapshot = info_api.candle_snapshot(CandleSnapshotRequest { + coin, + interval, + start_time, + end_time + }).await?; + + tracing::info!("{:?}", snapshot); + } + Commands::HistoricalOrders { user } => { + let historical_orders = info_api.historical_orders(&user).await?; + tracing::info!("{:?}", historical_orders); + } + Commands::SubAccounts { user } => { + let sub_accounts = info_api.subaccounts(&user).await?; + if let Some(accounts) = sub_accounts { + tracing::info!("{:?}", accounts); + } else { + tracing::info!("User {:?} does not have subaccounts.", user); + } + } + Commands::VaultDetails { vault_address, user } => { + let vault_details = info_api.vault_details(&vault_address, user.as_deref()).await?; + tracing::info!("{:?}", vault_details); + } + Commands::UserVaultEquities { user } => { + let equities = info_api.vault_deposits(&user).await?; + tracing::info!("{:?}", equities); + } + Commands::UserRole { user } => { + let role = info_api.role(&user).await?; + tracing::info!("{:?}", role); + } + Commands::Portfolio { user } => { + let portfolio = info_api.portfolio(&user).await?; + tracing::info!("{:?}", portfolio); + } + Commands::Referral { user } => { + let referral = info_api.portfolio(&user).await?; + tracing::info!("{:?}", referral); + } + Commands::UserFees { user } => { + let user_fees = info_api.fees(&user).await?; + tracing::info!("{:?}", user_fees); + } + } + + Ok(()) +} From efaa04d34fadc50416614d9feccc5729207df3ae Mon Sep 17 00:00:00 2001 From: Elijah Hampton Date: Tue, 23 Dec 2025 12:34:19 -0500 Subject: [PATCH 2/5] Adds cli feature, gates CLI structs/enums --- Cargo.toml | 4 ++ src/bin/cli.rs | 116 ++----------------------------------------------- src/cli/mod.rs | 113 +++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 5 +++ 4 files changed, 126 insertions(+), 112 deletions(-) create mode 100644 src/cli/mod.rs diff --git a/Cargo.toml b/Cargo.toml index 09e9bde..792f64f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,10 @@ categories = ["cryptography", "api-bindings"] license = "MIT" rust-version = "1.75" +[features] +default = [] +cli = [] + [badges] maintenance = { status = "actively-developed" } diff --git a/src/bin/cli.rs b/src/bin/cli.rs index 98a1471..2232e05 100644 --- a/src/bin/cli.rs +++ b/src/bin/cli.rs @@ -1,118 +1,10 @@ +#![allow(unused_imports)] use alloy::signers::local::LocalSigner; -use clap::{Parser, Subcommand}; -use rhyperliquid::{init_tracing::init_tracing, types::info::user::CandleSnapshotRequest, HyperliquidClientBuilder}; +use rhyperliquid::{cli::{Cli, Commands}, init_tracing::init_tracing, types::info::user::CandleSnapshotRequest, HyperliquidClientBuilder}; use std::env; +use clap::{Parser, Subcommand}; -#[derive(Parser)] -struct Cli { - #[arg(short, long)] - network: Option, - - #[arg(short, long)] - allow_signer_key_env: Option, - - #[command(subcommand)] - command: Commands, -} - -#[derive(Subcommand)] -enum Commands { - AllMids { - #[arg(short, long)] - dex: Option, - }, - OpenOrders { - #[arg(short, long)] - user: String, - #[arg(short, long)] - dex: Option, - }, - FrontendOpenOrders { - #[arg(short, long)] - user: String, - #[arg(short, long)] - dex: Option, - }, - UserFills { - #[arg(short, long)] - user: String, - #[arg(short, long)] - aggregate_by_time: Option, - }, - UserFillsByTime { - #[arg(short, long)] - user: String, - #[arg(short, long)] - start_time: u64, - #[arg(short, long)] - end_time: Option, - #[arg(short, long)] - aggregate_by_time: Option, - }, - UserRateLimit { - #[arg(short, long)] - user: String, - }, - OrderStatus { - #[arg(short, long)] - user: String, - #[arg(short, long)] - oid: u64, // Can be u64 or hex string - }, - L2Book { - #[arg(short, long)] - coin: String, - #[arg(short, long)] - n_sig_figs: Option, - #[arg(short, long)] - mantissa: Option, - }, - CandleSnapshot { - #[arg(short, long)] - coin: String, - #[arg(short, long)] - interval: String, - #[arg(short, long)] - start_time: u64, - #[arg(short, long)] - end_time: u64, - }, - HistoricalOrders { - #[arg(short, long)] - user: String, - }, - SubAccounts { - #[arg(short, long)] - user: String, - }, - VaultDetails { - #[arg(short, long)] - vault_address: String, - #[arg(short, long)] - user: Option, - }, - UserVaultEquities { - #[arg(short, long)] - user: String, - }, - UserRole { - #[arg(short, long)] - user: String, - }, - Portfolio { - #[arg(short, long)] - user: String, - }, - Referral { - #[arg(short, long)] - user: String, - }, - UserFees { - #[arg(short, long)] - user: String, - }, -} - +#[cfg(feature = "cli")] #[tokio::main] async fn main() -> Result<(), Box> { init_tracing(); diff --git a/src/cli/mod.rs b/src/cli/mod.rs new file mode 100644 index 0000000..acb7d53 --- /dev/null +++ b/src/cli/mod.rs @@ -0,0 +1,113 @@ +use clap::{Parser, Subcommand}; + + +#[derive(Subcommand)] +pub enum Commands { + AllMids { + #[arg(short, long)] + dex: Option, + }, + OpenOrders { + #[arg(short, long)] + user: String, + #[arg(short, long)] + dex: Option, + }, + FrontendOpenOrders { + #[arg(short, long)] + user: String, + #[arg(short, long)] + dex: Option, + }, + UserFills { + #[arg(short, long)] + user: String, + #[arg(short, long)] + aggregate_by_time: Option, + }, + UserFillsByTime { + #[arg(short, long)] + user: String, + #[arg(short, long)] + start_time: u64, + #[arg(short, long)] + end_time: Option, + #[arg(short, long)] + aggregate_by_time: Option, + }, + UserRateLimit { + #[arg(short, long)] + user: String, + }, + OrderStatus { + #[arg(short, long)] + user: String, + #[arg(short, long)] + oid: u64, // Can be u64 or hex string + }, + L2Book { + #[arg(short, long)] + coin: String, + #[arg(short, long)] + n_sig_figs: Option, + #[arg(short, long)] + mantissa: Option, + }, + CandleSnapshot { + #[arg(short, long)] + coin: String, + #[arg(short, long)] + interval: String, + #[arg(short, long)] + start_time: u64, + #[arg(short, long)] + end_time: u64, + }, + HistoricalOrders { + #[arg(short, long)] + user: String, + }, + SubAccounts { + #[arg(short, long)] + user: String, + }, + VaultDetails { + #[arg(short, long)] + vault_address: String, + #[arg(short, long)] + user: Option, + }, + UserVaultEquities { + #[arg(short, long)] + user: String, + }, + UserRole { + #[arg(short, long)] + user: String, + }, + Portfolio { + #[arg(short, long)] + user: String, + }, + Referral { + #[arg(short, long)] + user: String, + }, + UserFees { + #[arg(short, long)] + user: String, + }, +} + + +#[derive(Parser)] +pub struct Cli { + #[arg(short, long)] + pub network: Option, + + #[arg(short, long)] + pub allow_signer_key_env: Option, + + #[command(subcommand)] + pub command: Commands, +} diff --git a/src/lib.rs b/src/lib.rs index 52073c8..07b4deb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,13 +7,18 @@ mod signature; pub use crate::api::response; pub use crate::client::{HyperliquidClient, HyperliquidClientBuilder}; pub use crate::error::{HyperliquidError, Result}; + /// Utilities for examples and testing. /// /// Note: This module is primarily intended for examples and /// may change between versions. #[allow(dead_code)] pub mod example_helpers; + /// Tracing initialization utilities. pub mod init_tracing; pub mod types; pub mod utils; + +#[cfg(feature = "cli")] +pub mod cli; From bcd7df80c5acd874345ada354b97ceb3c76e3a22 Mon Sep 17 00:00:00 2001 From: Elijah Hampton Date: Tue, 23 Dec 2025 17:21:13 -0500 Subject: [PATCH 3/5] Update README --- README.md | 95 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 86 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 7a957cc..8d7f95d 100644 --- a/README.md +++ b/README.md @@ -14,17 +14,19 @@ A Rust SDK for [Hyperliquid](https://hyperliquid.xyz), the high-performance perp - Order placement and cancellation - Position management - Vault operations +- Command-line interface for quick queries ## Project Status - [x] Complete REST Info API (market data) - [x] EIP-712 authentication & message signing - [x] Exchange API (order placement, cancellation) -- [X] WebSocket streaming (real-time data feeds) -- [ ] CLI +- [x] WebSocket streaming (real-time data feeds) +- [x] CLI for market data and account queries ## Quick Start +### Library Usage ```rust use rhyperliquid::HyperliquidClient; @@ -46,6 +48,69 @@ async fn main() -> Result<(), Box> { } ``` +### CLI Usage + +The CLI provides quick access to market data and account information from your terminal. +```bash +# Run CLI commands +cargo run --bin cli --features=cli -- [OPTIONS] + +# Examples: + +# Get all mid prices +cargo run --bin cli --features=cli -- all-mids + +# Get all mid prices on testnet +cargo run --bin cli --features=cli -- --network testnet all-mids + +# Get L2 orderbook for BTC +cargo run --bin cli --features=cli -- l2-book --coin BTC + +# Get user's open orders (requires HL_PRIVATE_KEY env var) +export HL_PRIVATE_KEY=your_private_key_here +cargo run --bin cli --features=cli -- --allow-signer-key-env open-orders --user 0x... + +# Get candle data +cargo run --bin cli --features=cli -- candle-snapshot \ + --coin ETH \ + --interval 1h \ + --start-time 1640000000000 \ + --end-time 1640100000000 + +# Get vault details +cargo run --bin cli --features=cli -- vault-details --vault-address 0x... +``` + +#### CLI Options + +**Global Flags:** +- `--network ` - Network to connect to (default: mainnet) +- `--allow-signer-key-env` - Allow reading private key from `HL_PRIVATE_KEY` environment variable + +**Available Commands:** +- `all-mids` - Get mid prices for all assets +- `open-orders` - Get user's open orders +- `frontend-open-orders` - Get frontend-formatted open orders +- `user-fills` - Get user's fill history +- `user-fills-by-time` - Get fills within time range +- `user-rate-limit` - Check user's rate limit status +- `order-status` - Get status of specific order +- `l2-book` - Get L2 orderbook snapshot +- `candle-snapshot` - Get historical candle data +- `historical-orders` - Get user's historical orders +- `sub-accounts` - Get user's sub-accounts +- `vault-details` - Get vault information +- `user-vault-equities` - Get user's vault equity +- `user-role` - Get user's role information +- `portfolio` - Get user's portfolio +- `referral` - Get user's referral information +- `user-fees` - Get user's fee information + +Use `--help` on any command for detailed parameter information: +```bash +cargo run --bin cli --features=cli -- l2-book --help +``` + ## Trading For order placement and cancellation examples, see [`examples/basic_order.rs`](examples/basic_order.rs). @@ -72,17 +137,28 @@ This crate is under active development. ### As a Library Dependency Add to your `Cargo.toml`: - ```toml [dependencies] rhyperliquid = "0.1" tokio = { version = "1.41", features = ["full"] } ``` +### CLI Installation +```bash +# Install from source with CLI support +cargo install --path . --features=cli --bin cli + +# Or clone and build +git clone https://github.com/elijahhampton/rhyperliquid.git +cd rhyperliquid +cargo build --release --features=cli --bin cli + +# Binary will be at target/release/cli +``` + ### From Source Clone and build the repository: - ```bash # Clone the repository git clone https://github.com/elijahhampton/rhyperliquid.git @@ -91,12 +167,14 @@ cd rhyperliquid # Build the library cargo build --release +# Build with CLI +cargo build --release --features=cli + # Run tests cargo test --all-features # Build documentation cargo doc --open - ``` ## Getting Help @@ -104,17 +182,16 @@ If you have any questions, first see if the answer to your question can be found If the answer is not there: -Open a discussion with your question, or -Open an issue with the bug - +- Open a discussion with your question, or +- Open an issue with the bug ### Minimum Supported Rust Version (MSRV) Rust **1.75.0** or higher is required. - ```bash # Verify your Rust version rustc --version +# Update if needed rustup update stable ``` From 4fdc35556bfca8de326de376ae90c656ad198960 Mon Sep 17 00:00:00 2001 From: Elijah Hampton Date: Tue, 23 Dec 2025 17:27:40 -0500 Subject: [PATCH 4/5] Update CHANGELOG --- CHANGELOG.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c367c2a..d91da4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,15 @@ -# Changelog +## [0.2.0] - 2025-12-13 + +### Added +- WebSocket streaming support for real-time market data +- Subscription APIs for orderbook, trades, candles, and user events +- CLI binary for terminal-based queries (`--features=cli`) +- CLI commands for market data and account management +- Network selection via `--network` flag (mainnet/testnet) +- Environment-based authentication for CLI via `HL_PRIVATE_KEY` + +### Changed +- Project status: WebSocket and CLI marked as complete ## [0.1.0] - 2025-12-10 From d1ad5f20a021ad21ed1fd079f59f51f836b2ce9f Mon Sep 17 00:00:00 2001 From: Elijah Hampton Date: Tue, 23 Dec 2025 17:43:05 -0500 Subject: [PATCH 5/5] Update minor version --- CHANGELOG.md | 4 +++- Cargo.lock | 2 +- Cargo.toml | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d91da4d..b0b8030 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,6 @@ -## [0.2.0] - 2025-12-13 +# Changelog + +## [0.2.0] - 2025-12-XX ### Added - WebSocket streaming support for real-time market data diff --git a/Cargo.lock b/Cargo.lock index 8d1ddf5..bd5179d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3294,7 +3294,7 @@ dependencies = [ [[package]] name = "rhyperliquid" -version = "0.1.0" +version = "0.2.0" dependencies = [ "alloy", "alloy-primitives 0.8.26", diff --git a/Cargo.toml b/Cargo.toml index e2f20f6..e0ce08e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rhyperliquid" -version = "0.1.0" +version = "0.2.0" edition = "2021" authors = ["Elijah Hampton "] description = "Rust SDK and client for the Hyperliquid exchange API"