use tari_common_types::types::{CompressedSignature, HashOutput};
use tari_service_framework::{Service, reply_channel::TrySenderService};
use tari_transaction_components::{rpc::models::FeePerGramStat, transaction_components::Transaction};
use crate::mempool::{
MempoolServiceError,
StateResponse,
StatsResponse,
TxStorageResponse,
service::{MempoolRequest, MempoolResponse},
};
#[derive(Clone)]
pub struct MempoolHandle {
inner: TrySenderService<MempoolRequest, MempoolResponse, MempoolServiceError>,
}
impl MempoolHandle {
pub(crate) fn new(request_sender: TrySenderService<MempoolRequest, MempoolResponse, MempoolServiceError>) -> Self {
Self { inner: request_sender }
}
pub async fn get_stats(&mut self) -> Result<StatsResponse, MempoolServiceError> {
match self.inner.call(MempoolRequest::GetStats).await?? {
MempoolResponse::Stats(response) => Ok(response),
_ => Err(MempoolServiceError::InvalidResponse("Incorrect response".to_string())),
}
}
pub async fn get_state(&mut self) -> Result<StateResponse, MempoolServiceError> {
match self.inner.call(MempoolRequest::GetState).await?? {
MempoolResponse::State(response) => Ok(response),
_ => Err(MempoolServiceError::InvalidResponse("Incorrect response".to_string())),
}
}
pub async fn get_tx_state_by_excess_sig(
&mut self,
sig: CompressedSignature,
) -> Result<TxStorageResponse, MempoolServiceError> {
match self.inner.call(MempoolRequest::GetTxStateByExcessSig(sig)).await?? {
MempoolResponse::TxStorage(response) => Ok(response),
_ => Err(MempoolServiceError::InvalidResponse("Incorrect response".to_string())),
}
}
pub async fn submit_transaction(
&mut self,
transaction: Transaction,
) -> Result<TxStorageResponse, MempoolServiceError> {
match self
.inner
.call(MempoolRequest::SubmitTransaction(transaction))
.await??
{
MempoolResponse::TxStorage(response) => Ok(response),
_ => Err(MempoolServiceError::InvalidResponse("Incorrect response".to_string())),
}
}
pub async fn get_fee_per_gram_stats(
&mut self,
count: usize,
tip_height: u64,
) -> Result<Vec<FeePerGramStat>, MempoolServiceError> {
match self
.inner
.call(MempoolRequest::GetFeePerGramStats { count, tip_height })
.await??
{
MempoolResponse::FeePerGramStats { response } => Ok(response),
_ => Err(MempoolServiceError::InvalidResponse("Incorrect response".to_string())),
}
}
pub async fn filter_outputs_in_mempool(
&mut self,
output_hashes: Vec<HashOutput>,
) -> Result<Vec<HashOutput>, MempoolServiceError> {
match self
.inner
.call(MempoolRequest::FilterOutputsInMempool(output_hashes))
.await??
{
MempoolResponse::FilteredOutputs(response) => Ok(response),
_ => Err(MempoolServiceError::InvalidResponse("Incorrect response".to_string())),
}
}
}