Skip to main content

kora_lib/oracle/
utils.rs

1use crate::oracle::{MockPriceOracle, PriceOracle, PriceSource, TokenPrice};
2use rust_decimal::Decimal;
3use rust_decimal_macros::dec;
4use std::{collections::HashMap, sync::Arc};
5
6pub const DEFAULT_MOCKED_PRICE: Decimal = dec!(0.001);
7pub const DEFAULT_MOCKED_USDC_PRICE: Decimal = dec!(0.0001);
8pub const DEFAULT_MOCKED_WSOL_PRICE: Decimal = dec!(1.0);
9
10pub const USDC_DEVNET_MINT: &str = "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU";
11pub const WSOL_DEVNET_MINT: &str = "So11111111111111111111111111111111111111112";
12
13pub struct OracleUtil {}
14
15impl OracleUtil {
16    pub fn get_mock_oracle_price() -> Arc<dyn PriceOracle + Send + Sync> {
17        let mut mock = MockPriceOracle::new();
18        // Set up default mock behavior for devnet tokens
19        mock.expect_get_price()
20            .times(..) // Allow unlimited calls
21            .returning(|_, mint_address| {
22                let price = match mint_address {
23                    USDC_DEVNET_MINT => DEFAULT_MOCKED_USDC_PRICE, // USDC
24                    WSOL_DEVNET_MINT => DEFAULT_MOCKED_WSOL_PRICE, // SOL
25                    _ => DEFAULT_MOCKED_PRICE, // Default price for unknown tokens
26                };
27                Ok(TokenPrice { price, confidence: 1.0, source: PriceSource::Mock })
28            });
29
30        mock.expect_get_prices()
31            .times(..) // Allow unlimited calls
32            .returning(|_, mint_addresses| {
33                let mut result = HashMap::new();
34                for mint_address in mint_addresses {
35                    let price = match mint_address.as_str() {
36                        USDC_DEVNET_MINT => DEFAULT_MOCKED_USDC_PRICE, // USDC
37                        WSOL_DEVNET_MINT => DEFAULT_MOCKED_WSOL_PRICE, // SOL
38                        _ => DEFAULT_MOCKED_PRICE, // Default price for unknown tokens
39                    };
40                    result.insert(
41                        mint_address.clone(),
42                        TokenPrice { price, confidence: 1.0, source: PriceSource::Mock },
43                    );
44                }
45                Ok(result)
46            });
47        Arc::new(mock)
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54    use reqwest::Client;
55
56    #[tokio::test]
57    async fn test_mock_oracle_prices() {
58        let oracle = OracleUtil::get_mock_oracle_price();
59        let client = Client::new();
60
61        // Test USDC price
62        let usdc_price = oracle.get_price(&client, USDC_DEVNET_MINT).await.unwrap();
63        assert_eq!(usdc_price.price, DEFAULT_MOCKED_USDC_PRICE);
64        assert_eq!(usdc_price.confidence, 1.0);
65        assert_eq!(usdc_price.source, PriceSource::Mock);
66
67        // Test SOL price
68        let sol_price = oracle.get_price(&client, WSOL_DEVNET_MINT).await.unwrap();
69        assert_eq!(sol_price.price, DEFAULT_MOCKED_WSOL_PRICE);
70        assert_eq!(sol_price.confidence, 1.0);
71        assert_eq!(sol_price.source, PriceSource::Mock);
72
73        // Test unknown token (should return default price)
74        let unknown_price = oracle.get_price(&client, "unknown_token").await.unwrap();
75        assert_eq!(unknown_price.price, DEFAULT_MOCKED_PRICE);
76        assert_eq!(unknown_price.confidence, 1.0);
77        assert_eq!(unknown_price.source, PriceSource::Mock);
78    }
79}