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.0075);
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, block_id: None })
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 {
43                            price,
44                            confidence: 1.0,
45                            source: PriceSource::Mock,
46                            block_id: None,
47                        },
48                    );
49                }
50                Ok(result)
51            });
52        Arc::new(mock)
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use super::*;
59    use reqwest::Client;
60
61    #[tokio::test]
62    async fn test_mock_oracle_prices() {
63        let oracle = OracleUtil::get_mock_oracle_price();
64        let client = Client::new();
65
66        // Test USDC price
67        let usdc_price = oracle.get_price(&client, USDC_DEVNET_MINT).await.unwrap();
68        assert_eq!(usdc_price.price, DEFAULT_MOCKED_USDC_PRICE);
69        assert_eq!(usdc_price.confidence, 1.0);
70        assert_eq!(usdc_price.source, PriceSource::Mock);
71
72        // Test SOL price
73        let sol_price = oracle.get_price(&client, WSOL_DEVNET_MINT).await.unwrap();
74        assert_eq!(sol_price.price, DEFAULT_MOCKED_WSOL_PRICE);
75        assert_eq!(sol_price.confidence, 1.0);
76        assert_eq!(sol_price.source, PriceSource::Mock);
77
78        // Test unknown token (should return default price)
79        let unknown_price = oracle.get_price(&client, "unknown_token").await.unwrap();
80        assert_eq!(unknown_price.price, DEFAULT_MOCKED_PRICE);
81        assert_eq!(unknown_price.confidence, 1.0);
82        assert_eq!(unknown_price.source, PriceSource::Mock);
83    }
84}