Skip to main content

k256_sdk/types/
pool.rs

1//! Pool and pool update types.
2
3use serde::{Deserialize, Serialize};
4
5/// Order book level with price and size.
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
7pub struct OrderLevel {
8    /// Price in base units (u64)
9    pub price: u64,
10    /// Size in base units (u64)
11    pub size: u64,
12}
13
14/// Real-time pool state update from K256 WebSocket.
15#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
16pub struct PoolUpdate {
17    /// Global sequence number for ordering
18    pub sequence: u64,
19    /// Solana slot number
20    pub slot: u64,
21    /// Write version within slot
22    pub write_version: u64,
23    /// DEX protocol name (e.g., "RaydiumClmm", "Whirlpool")
24    pub protocol_name: String,
25    /// Base58-encoded pool address
26    pub pool_address: String,
27    /// List of token mint addresses
28    pub token_mints: Vec<String>,
29    /// List of token balances (same order as mints)
30    pub token_balances: Vec<u64>,
31    /// List of token decimals (same order as mints)
32    pub token_decimals: Vec<i32>,
33    /// Best bid order level, if available
34    pub best_bid: Option<OrderLevel>,
35    /// Best ask order level, if available
36    pub best_ask: Option<OrderLevel>,
37    /// Opaque pool state bytes
38    #[serde(with = "serde_bytes")]
39    pub serialized_state: Vec<u8>,
40}
41
42/// DEX pool metadata.
43#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
44pub struct Pool {
45    /// Base58-encoded pool address
46    pub address: String,
47    /// DEX protocol name
48    pub protocol: String,
49    /// First token mint address
50    pub token_a_mint: String,
51    /// Second token mint address
52    pub token_b_mint: String,
53    /// First token vault address
54    pub token_a_vault: String,
55    /// Second token vault address
56    pub token_b_vault: String,
57    /// Fee rate in basis points
58    pub fee_rate: u32,
59}
60
61mod serde_bytes {
62    use serde::{Deserialize, Deserializer, Serializer};
63
64    pub fn serialize<S>(bytes: &Vec<u8>, serializer: S) -> Result<S::Ok, S::Error>
65    where
66        S: Serializer,
67    {
68        serializer.serialize_bytes(bytes)
69    }
70
71    pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
72    where
73        D: Deserializer<'de>,
74    {
75        let bytes: &[u8] = Deserialize::deserialize(deserializer)?;
76        Ok(bytes.to_vec())
77    }
78}