openzeppelin_monitor/services/filter/filters/
mod.rspub mod evm {
pub mod filter;
pub mod helpers;
}
pub mod stellar {
pub mod filter;
pub mod helpers;
}
use async_trait::async_trait;
use crate::{
models::{BlockType, ContractSpec, Monitor, MonitorMatch, Network},
services::{blockchain::BlockFilterFactory, filter::error::FilterError},
};
pub use evm::filter::EVMBlockFilter;
pub use stellar::filter::StellarBlockFilter;
#[async_trait]
pub trait BlockFilter {
type Client;
async fn filter_block(
&self,
client: &Self::Client,
network: &Network,
block: &BlockType,
monitors: &[Monitor],
contract_specs: Option<&[(String, ContractSpec)]>,
) -> Result<Vec<MonitorMatch>, FilterError>;
}
pub struct FilterService {}
impl FilterService {
pub fn new() -> Self {
FilterService {}
}
}
impl Default for FilterService {
fn default() -> Self {
Self::new()
}
}
impl FilterService {
pub async fn filter_block<T: BlockFilterFactory<T>>(
&self,
client: &T,
network: &Network,
block: &BlockType,
monitors: &[Monitor],
contract_specs: Option<&[(String, ContractSpec)]>,
) -> Result<Vec<MonitorMatch>, FilterError> {
let filter = T::filter();
filter
.filter_block(client, network, block, monitors, contract_specs)
.await
}
}