ccxt_exchanges/hyperliquid/
builder.rs1use ccxt_core::{ExchangeConfig, Result};
6
7use super::{HyperLiquid, HyperLiquidAuth, HyperLiquidOptions};
8
9#[derive(Debug, Default)]
24pub struct HyperLiquidBuilder {
25 private_key: Option<String>,
26 testnet: bool,
27 vault_address: Option<String>,
28 default_leverage: u32,
29}
30
31impl HyperLiquidBuilder {
32 pub fn new() -> Self {
34 Self {
35 private_key: None,
36 testnet: false,
37 vault_address: None,
38 default_leverage: 1,
39 }
40 }
41
42 pub fn private_key(mut self, key: &str) -> Self {
60 self.private_key = Some(key.to_string());
61 self
62 }
63
64 pub fn testnet(mut self, enabled: bool) -> Self {
73 self.testnet = enabled;
74 self
75 }
76
77 pub fn vault_address(mut self, address: &str) -> Self {
85 self.vault_address = Some(address.to_string());
86 self
87 }
88
89 pub fn default_leverage(mut self, leverage: u32) -> Self {
97 self.default_leverage = leverage.clamp(1, 50);
98 self
99 }
100
101 pub fn build(self) -> Result<HyperLiquid> {
113 let auth = if let Some(ref key) = self.private_key {
115 Some(HyperLiquidAuth::from_private_key(key)?)
116 } else {
117 None
118 };
119
120 let options = HyperLiquidOptions {
122 testnet: self.testnet,
123 vault_address: self.vault_address,
124 default_leverage: self.default_leverage,
125 };
126
127 let config = ExchangeConfig {
129 id: "hyperliquid".to_string(),
130 name: "HyperLiquid".to_string(),
131 sandbox: self.testnet,
132 ..Default::default()
133 };
134
135 HyperLiquid::new_with_options(config, options, auth)
136 }
137}
138
139#[cfg(test)]
140mod tests {
141 use super::*;
142
143 #[test]
144 fn test_builder_default() {
145 let builder = HyperLiquidBuilder::new();
146 assert!(builder.private_key.is_none());
147 assert!(!builder.testnet);
148 assert!(builder.vault_address.is_none());
149 assert_eq!(builder.default_leverage, 1);
150 }
151
152 #[test]
153 fn test_builder_testnet() {
154 let builder = HyperLiquidBuilder::new().testnet(true);
155 assert!(builder.testnet);
156 }
157
158 #[test]
159 fn test_builder_leverage_clamping() {
160 let builder = HyperLiquidBuilder::new().default_leverage(100);
161 assert_eq!(builder.default_leverage, 50);
162
163 let builder = HyperLiquidBuilder::new().default_leverage(0);
164 assert_eq!(builder.default_leverage, 1);
165 }
166
167 #[test]
168 fn test_builder_vault_address() {
169 let builder =
170 HyperLiquidBuilder::new().vault_address("0x1234567890abcdef1234567890abcdef12345678");
171 assert!(builder.vault_address.is_some());
172 }
173
174 #[test]
175 fn test_build_without_auth() {
176 let exchange = HyperLiquidBuilder::new().testnet(true).build();
177
178 assert!(exchange.is_ok());
179 let exchange = exchange.unwrap();
180 assert_eq!(exchange.id(), "hyperliquid");
181 assert!(exchange.options().testnet);
182 assert!(exchange.auth().is_none());
183 }
184}