kabu_core_blockchain/
blockchain_state.rs

1use kabu_evm_db::DatabaseKabuExt;
2use kabu_types_entities::{BlockHistory, BlockHistoryState};
3use kabu_types_market::MarketState;
4use reth_ethereum_primitives::EthPrimitives;
5use reth_node_types::NodePrimitives;
6use revm::{Database, DatabaseCommit, DatabaseRef};
7use std::sync::Arc;
8use tokio::sync::RwLock;
9
10#[derive(Clone)]
11pub struct BlockchainState<DB: Clone + Send + Sync + 'static, NP: NodePrimitives = EthPrimitives> {
12    market_state: Arc<RwLock<MarketState<DB>>>,
13    block_history_state: Arc<RwLock<BlockHistory<DB, NP>>>,
14}
15
16impl<
17    DB: DatabaseRef + Database + DatabaseCommit + BlockHistoryState<NP> + DatabaseKabuExt + Send + Sync + Clone + Default + 'static,
18    NP: NodePrimitives,
19> Default for BlockchainState<DB, NP>
20{
21    fn default() -> Self {
22        Self::new()
23    }
24}
25
26impl<
27    DB: DatabaseRef + Database + DatabaseCommit + BlockHistoryState<NP> + DatabaseKabuExt + Send + Sync + Clone + Default + 'static,
28    NP: NodePrimitives,
29> BlockchainState<DB, NP>
30{
31    pub fn new() -> Self {
32        BlockchainState {
33            market_state: Arc::new(RwLock::new(MarketState::new(DB::default()))),
34            block_history_state: Arc::new(RwLock::new(BlockHistory::<DB, NP>::new(10))),
35        }
36    }
37
38    pub fn new_with_market_state(market_state: MarketState<DB>) -> Self {
39        Self { market_state: Arc::new(RwLock::new(market_state)), block_history_state: Arc::new(RwLock::new(BlockHistory::new(10))) }
40    }
41
42    pub fn with_market_state(self, market_state: MarketState<DB>) -> BlockchainState<DB, NP> {
43        BlockchainState { market_state: Arc::new(RwLock::new(market_state)), ..self.clone() }
44    }
45}
46
47impl<DB: Clone + Send + Sync, NP: NodePrimitives> BlockchainState<DB, NP> {
48    pub fn market_state_commit(&self) -> Arc<RwLock<MarketState<DB>>> {
49        self.market_state.clone()
50    }
51
52    pub fn market_state(&self) -> Arc<RwLock<MarketState<DB>>> {
53        self.market_state.clone()
54    }
55
56    pub fn block_history(&self) -> Arc<RwLock<BlockHistory<DB, NP>>> {
57        self.block_history_state.clone()
58    }
59}