use futures::prelude::*;
use soil_network::common::ExHashT;
use soil_network::MAX_RESPONSE_SIZE;
use std::{collections::HashMap, future::Future, pin::Pin, sync::Arc, time};
use subsoil::runtime::traits::Block as BlockT;
pub(crate) const PROPAGATE_TIMEOUT: time::Duration = time::Duration::from_millis(2900);
pub(crate) const MAX_KNOWN_TRANSACTIONS: usize = 10240;
pub(crate) const MAX_TRANSACTIONS_SIZE: u64 = MAX_RESPONSE_SIZE;
pub(crate) const MAX_PENDING_TRANSACTIONS: usize = 8192;
#[derive(Clone, Copy, Debug)]
pub enum TransactionImport {
KnownGood,
NewGood,
Bad,
None,
}
pub type TransactionImportFuture = Pin<Box<dyn Future<Output = TransactionImport> + Send>>;
pub trait TransactionPool<H: ExHashT, B: BlockT>: Send + Sync {
fn transactions(&self) -> Vec<(H, Arc<B::Extrinsic>)>;
fn hash_of(&self, transaction: &B::Extrinsic) -> H;
fn import(&self, transaction: B::Extrinsic) -> TransactionImportFuture;
fn on_broadcasted(&self, propagations: HashMap<H, Vec<String>>);
fn transaction(&self, hash: &H) -> Option<Arc<B::Extrinsic>>;
}
pub struct EmptyTransactionPool;
impl<H: ExHashT + Default, B: BlockT> TransactionPool<H, B> for EmptyTransactionPool {
fn transactions(&self) -> Vec<(H, Arc<B::Extrinsic>)> {
Vec::new()
}
fn hash_of(&self, _transaction: &B::Extrinsic) -> H {
Default::default()
}
fn import(&self, _transaction: B::Extrinsic) -> TransactionImportFuture {
Box::pin(future::ready(TransactionImport::KnownGood))
}
fn on_broadcasted(&self, _: HashMap<H, Vec<String>>) {}
fn transaction(&self, _h: &H) -> Option<Arc<B::Extrinsic>> {
None
}
}