1use alloy_network::Ethereum;
2use alloy_provider::Provider;
3use kabu_core_actors::SharedState;
4use kabu_defi_address_book::{
5 CurveMetapoolAddress, CurvePoolAddress, PancakeV2PoolAddress, PancakeV3PoolAddress, TokenAddressEth, UniswapV2PoolAddress,
6 UniswapV3PoolAddress,
7};
8use kabu_defi_market::fetch_and_add_pool_by_pool_id;
9use kabu_defi_pools::PoolLoadersBuilder;
10use kabu_node_debug_provider::DebugProviderExt;
11use kabu_types_blockchain::KabuDataTypesEthereum;
12use kabu_types_entities::pool_config::PoolsLoadingConfig;
13use kabu_types_entities::{Market, MarketState, PoolClass, Token};
14use revm::{Database, DatabaseCommit, DatabaseRef};
15use std::sync::Arc;
16
17pub async fn preload_pools<P, DB>(client: P, market: SharedState<Market>, market_state: SharedState<MarketState<DB>>) -> eyre::Result<()>
18where
19 P: Provider<Ethereum> + DebugProviderExt<Ethereum> + Send + Sync + Clone + 'static,
20 DB: DatabaseRef + DatabaseCommit + Database + Send + Sync + Clone + 'static,
21{
22 let mut market_instance = market.write().await;
23
24 market_instance.add_token(Token::new_with_data(TokenAddressEth::WETH, Some("WETH".to_string()), None, Some(18), true, false));
25 market_instance.add_token(Token::new_with_data(TokenAddressEth::USDC, Some("USDC".to_string()), None, Some(6), true, false));
26 market_instance.add_token(Token::new_with_data(TokenAddressEth::USDT, Some("USDT".to_string()), None, Some(6), true, false));
27 market_instance.add_token(Token::new_with_data(TokenAddressEth::DAI, Some("DAI".to_string()), None, Some(18), true, false));
28 market_instance.add_token(Token::new_with_data(TokenAddressEth::WBTC, Some("WBTC".to_string()), None, Some(8), true, false));
29 market_instance.add_token(Token::new_with_data(TokenAddressEth::THREECRV, Some("3Crv".to_string()), None, Some(18), false, true));
30 market_instance.add_token(Token::new_with_data(TokenAddressEth::CRV, Some("Crv".to_string()), None, Some(18), false, false));
31 market_instance.add_token(Token::new_with_data(TokenAddressEth::LUSD, Some("LUSD".to_string()), None, Some(18), false, false));
32
33 drop(market_instance);
34
35 let pool_loaders = Arc::new(PoolLoadersBuilder::<P, Ethereum, KabuDataTypesEthereum>::default_pool_loaders(
36 client.clone(),
37 PoolsLoadingConfig::default(),
38 ));
39
40 fetch_and_add_pool_by_pool_id(
41 client.clone(),
42 market.clone(),
43 market_state.clone(),
44 pool_loaders.clone(),
45 CurvePoolAddress::ETH_BTC_USD.into(),
46 PoolClass::Curve,
47 )
48 .await?;
49
50 fetch_and_add_pool_by_pool_id(
51 client.clone(),
52 market.clone(),
53 market_state.clone(),
54 pool_loaders.clone(),
55 CurvePoolAddress::USDT_BTC_ETH.into(),
56 PoolClass::Curve,
57 )
58 .await?;
59
60 fetch_and_add_pool_by_pool_id(
61 client.clone(),
62 market.clone(),
63 market_state.clone(),
64 pool_loaders.clone(),
65 CurvePoolAddress::DAI_USDC_USDT.into(),
66 PoolClass::Curve,
67 )
68 .await?;
69
70 fetch_and_add_pool_by_pool_id(
71 client.clone(),
72 market.clone(),
73 market_state.clone(),
74 pool_loaders.clone(),
75 CurveMetapoolAddress::LUSD.into(),
76 PoolClass::Curve,
77 )
78 .await?;
79
80 fetch_and_add_pool_by_pool_id(
81 client.clone(),
82 market.clone(),
83 market_state.clone(),
84 pool_loaders.clone(),
85 UniswapV3PoolAddress::WETH_USDT_3000.into(),
86 PoolClass::UniswapV3,
87 )
88 .await?;
89
90 fetch_and_add_pool_by_pool_id(
91 client.clone(),
92 market.clone(),
93 market_state.clone(),
94 pool_loaders.clone(),
95 PancakeV2PoolAddress::WETH_USDT.into(),
96 PoolClass::UniswapV2,
97 )
98 .await?;
99 fetch_and_add_pool_by_pool_id(
100 client.clone(),
101 market.clone(),
102 market_state.clone(),
103 pool_loaders.clone(),
104 UniswapV2PoolAddress::WETH_USDT.into(),
105 PoolClass::UniswapV2,
106 )
107 .await?;
108 fetch_and_add_pool_by_pool_id(
109 client.clone(),
110 market.clone(),
111 market_state.clone(),
112 pool_loaders.clone(),
113 PancakeV3PoolAddress::USDC_USDT_100.into(),
114 PoolClass::UniswapV3,
115 )
116 .await?;
117
118 fetch_and_add_pool_by_pool_id(
119 client.clone(),
120 market.clone(),
121 market_state.clone(),
122 pool_loaders.clone(),
123 UniswapV3PoolAddress::USDC_WETH_3000.into(),
124 PoolClass::UniswapV3,
125 )
126 .await?;
127 fetch_and_add_pool_by_pool_id(
128 client.clone(),
129 market.clone(),
130 market_state.clone(),
131 pool_loaders.clone(),
132 UniswapV3PoolAddress::USDC_WETH_500.into(),
133 PoolClass::UniswapV3,
134 )
135 .await?;
136 fetch_and_add_pool_by_pool_id(
137 client.clone(),
138 market.clone(),
139 market_state.clone(),
140 pool_loaders.clone(),
141 UniswapV3PoolAddress::WBTC_USDT_3000.into(),
142 PoolClass::UniswapV3,
143 )
144 .await?;
145 fetch_and_add_pool_by_pool_id(
146 client.clone(),
147 market.clone(),
148 market_state.clone(),
149 pool_loaders.clone(),
150 UniswapV3PoolAddress::USDC_USDT_100.into(),
151 PoolClass::UniswapV3,
152 )
153 .await?;
154
155 fetch_and_add_pool_by_pool_id(
156 client.clone(),
157 market.clone(),
158 market_state.clone(),
159 pool_loaders.clone(),
160 UniswapV2PoolAddress::LUSD_WETH.into(),
161 PoolClass::UniswapV2,
162 )
163 .await?;
164
165 Ok(())
166}