use crate::{
blocks::Block,
mempool::{
error::MempoolError,
mempool_storage::MempoolStorage,
MempoolConfig,
StateResponse,
StatsResponse,
TxStorageResponse,
},
transactions::{transaction::Transaction, types::Signature},
validation::MempoolTransactionValidation,
};
use std::sync::{Arc, RwLock};
#[derive(Clone)]
pub struct Mempool {
pool_storage: Arc<RwLock<MempoolStorage>>,
}
impl Mempool {
pub fn new(config: MempoolConfig, validator: Arc<dyn MempoolTransactionValidation>) -> Self {
Self {
pool_storage: Arc::new(RwLock::new(MempoolStorage::new(config, validator))),
}
}
pub fn insert(&self, tx: Arc<Transaction>) -> Result<TxStorageResponse, MempoolError> {
self.pool_storage
.write()
.map_err(|e| MempoolError::BackendError(e.to_string()))?
.insert(tx)
}
pub fn process_published_block(&self, published_block: Arc<Block>) -> Result<(), MempoolError> {
self.pool_storage
.write()
.map_err(|e| MempoolError::BackendError(e.to_string()))?
.process_published_block(published_block)
}
pub fn process_reorg(
&self,
removed_blocks: Vec<Arc<Block>>,
new_blocks: Vec<Arc<Block>>,
) -> Result<(), MempoolError>
{
self.pool_storage
.write()
.map_err(|e| MempoolError::BackendError(e.to_string()))?
.process_reorg(removed_blocks, new_blocks)
}
pub fn snapshot(&self) -> Result<Vec<Arc<Transaction>>, MempoolError> {
self.pool_storage
.read()
.map_err(|e| MempoolError::BackendError(e.to_string()))?
.snapshot()
}
pub fn retrieve(&self, total_weight: u64) -> Result<Vec<Arc<Transaction>>, MempoolError> {
self.pool_storage
.read()
.map_err(|e| MempoolError::BackendError(e.to_string()))?
.retrieve(total_weight)
}
pub fn has_tx_with_excess_sig(&self, excess_sig: Signature) -> Result<TxStorageResponse, MempoolError> {
self.pool_storage
.read()
.map_err(|e| MempoolError::BackendError(e.to_string()))?
.has_tx_with_excess_sig(excess_sig)
}
pub fn stats(&self) -> Result<StatsResponse, MempoolError> {
self.pool_storage
.read()
.map_err(|e| MempoolError::BackendError(e.to_string()))?
.stats()
}
pub fn state(&self) -> Result<StateResponse, MempoolError> {
self.pool_storage
.read()
.map_err(|e| MempoolError::BackendError(e.to_string()))?
.state()
}
}