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 mock.expect_get_price()
20 .times(..) .returning(|_, mint_address| {
22 let price = match mint_address {
23 USDC_DEVNET_MINT => DEFAULT_MOCKED_USDC_PRICE, WSOL_DEVNET_MINT => DEFAULT_MOCKED_WSOL_PRICE, _ => DEFAULT_MOCKED_PRICE, };
27 Ok(TokenPrice { price, confidence: 1.0, source: PriceSource::Mock, block_id: None })
28 });
29
30 mock.expect_get_prices()
31 .times(..) .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, WSOL_DEVNET_MINT => DEFAULT_MOCKED_WSOL_PRICE, _ => DEFAULT_MOCKED_PRICE, };
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 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 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 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}