pub use apibara_dna_protocol::starknet::*;
#[derive(Debug, Clone)]
pub struct FilterBuilder {
inner: Filter,
}
#[derive(Debug, Clone)]
pub struct TransactionFilterBuilder {
inner: TransactionFilter,
}
#[derive(Debug, Clone)]
pub struct EventFilterBuilder {
inner: EventFilter,
}
#[derive(Debug, Clone)]
pub struct MessageToL1FilterBuilder {
inner: MessageToL1Filter,
}
#[derive(Debug, Clone)]
pub struct StorageDiffFilterBuilder {
inner: StorageDiffFilter,
}
#[derive(Debug, Clone)]
pub struct ContractChangeFilterBuilder {
inner: ContractChangeFilter,
}
#[derive(Debug, Clone)]
pub struct NonceUpdateFilterBuilder {
inner: NonceUpdateFilter,
}
impl FilterBuilder {
pub fn new() -> Self {
let inner = Filter {
header: HeaderFilter::OnDataOrOnNewBlock as i32,
..Default::default()
};
Self { inner }
}
pub fn with_header(mut self, header: HeaderFilter) -> Self {
self.inner.header = header as i32;
self
}
pub fn add_transaction(mut self, transaction: TransactionFilter) -> Self {
self.inner.transactions.push(transaction);
self
}
pub fn add_event(mut self, event: EventFilter) -> Self {
self.inner.events.push(event);
self
}
pub fn add_message(mut self, message: MessageToL1Filter) -> Self {
self.inner.messages.push(message);
self
}
pub fn add_storage_diff(mut self, storage_diff: StorageDiffFilter) -> Self {
self.inner.storage_diffs.push(storage_diff);
self
}
pub fn add_contract_change(mut self, contract_change: ContractChangeFilter) -> Self {
self.inner.contract_changes.push(contract_change);
self
}
pub fn add_nonce_update(mut self, nonce_update: NonceUpdateFilter) -> Self {
self.inner.nonce_updates.push(nonce_update);
self
}
pub fn build(self) -> Filter {
self.inner
}
}
impl Default for FilterBuilder {
fn default() -> Self {
Self::new()
}
}
impl TransactionFilterBuilder {
pub fn all_transaction_types() -> Self {
let inner = TransactionFilter {
inner: None,
..Default::default()
};
Self { inner }
}
pub fn only_invoke_v0() -> Self {
use transaction_filter::Inner;
let inner = TransactionFilter {
inner: Some(Inner::InvokeV0(InvokeTransactionV0Filter::default())),
..Default::default()
};
Self { inner }
}
pub fn only_invoke_v1() -> Self {
use transaction_filter::Inner;
let inner = TransactionFilter {
inner: Some(Inner::InvokeV1(InvokeTransactionV1Filter::default())),
..Default::default()
};
Self { inner }
}
pub fn only_invoke_v3() -> Self {
use transaction_filter::Inner;
let inner = TransactionFilter {
inner: Some(Inner::InvokeV3(InvokeTransactionV3Filter::default())),
..Default::default()
};
Self { inner }
}
pub fn only_deploy() -> Self {
use transaction_filter::Inner;
let inner = TransactionFilter {
inner: Some(Inner::Deploy(DeployTransactionFilter::default())),
..Default::default()
};
Self { inner }
}
pub fn only_declare_v0() -> Self {
use transaction_filter::Inner;
let inner = TransactionFilter {
inner: Some(Inner::DeclareV0(DeclareV0TransactionFilter::default())),
..Default::default()
};
Self { inner }
}
pub fn only_declare_v1() -> Self {
use transaction_filter::Inner;
let inner = TransactionFilter {
inner: Some(Inner::DeclareV1(DeclareV1TransactionFilter::default())),
..Default::default()
};
Self { inner }
}
pub fn only_declare_v2() -> Self {
use transaction_filter::Inner;
let inner = TransactionFilter {
inner: Some(Inner::DeclareV2(DeclareV2TransactionFilter::default())),
..Default::default()
};
Self { inner }
}
pub fn only_declare_v3() -> Self {
use transaction_filter::Inner;
let inner = TransactionFilter {
inner: Some(Inner::DeclareV3(DeclareV3TransactionFilter::default())),
..Default::default()
};
Self { inner }
}
pub fn only_l1_handler() -> Self {
use transaction_filter::Inner;
let inner = TransactionFilter {
inner: Some(Inner::L1Handler(L1HandlerTransactionFilter::default())),
..Default::default()
};
Self { inner }
}
pub fn only_deploy_account_v1() -> Self {
use transaction_filter::Inner;
let inner = TransactionFilter {
inner: Some(Inner::DeployAccountV1(
DeployAccountV1TransactionFilter::default(),
)),
..Default::default()
};
Self { inner }
}
pub fn only_deploy_account_v3() -> Self {
use transaction_filter::Inner;
let inner = TransactionFilter {
inner: Some(Inner::DeployAccountV3(
DeployAccountV3TransactionFilter::default(),
)),
..Default::default()
};
Self { inner }
}
pub fn with_id(mut self, id: u32) -> Self {
self.inner.id = id;
self
}
pub fn with_transaction_status(mut self, status: TransactionStatusFilter) -> Self {
self.inner.set_transaction_status(status);
self
}
pub fn with_receipt(mut self) -> Self {
self.inner.include_receipt = Some(true);
self
}
pub fn with_events(mut self) -> Self {
self.inner.include_events = Some(true);
self
}
pub fn with_messages(mut self) -> Self {
self.inner.include_messages = Some(true);
self
}
pub fn with_trace(mut self) -> Self {
self.inner.include_trace = Some(true);
self
}
pub fn build(self) -> TransactionFilter {
self.inner
}
}
impl EventFilterBuilder {
pub fn all_contracts_and_events() -> Self {
let inner = EventFilter::default();
Self { inner }
}
pub fn single_contract(address: FieldElement) -> Self {
let inner = EventFilter {
address: Some(address),
..Default::default()
};
Self { inner }
}
pub fn with_address(mut self, address: FieldElement) -> Self {
self.inner.address = Some(address);
self
}
pub fn with_keys(
mut self,
strict: bool,
keys: impl IntoIterator<Item = Option<FieldElement>>,
) -> Self {
self.inner.keys = keys.into_iter().map(|key| Key { value: key }).collect();
self.inner.strict = Some(strict);
self
}
pub fn with_id(mut self, id: u32) -> Self {
self.inner.id = id;
self
}
pub fn with_transaction_status(mut self, status: TransactionStatusFilter) -> Self {
self.inner.set_transaction_status(status);
self
}
pub fn with_transaction(mut self) -> Self {
self.inner.include_transaction = Some(true);
self
}
pub fn with_receipt(mut self) -> Self {
self.inner.include_receipt = Some(true);
self
}
pub fn with_siblings(mut self) -> Self {
self.inner.include_siblings = Some(true);
self
}
pub fn with_messages(mut self) -> Self {
self.inner.include_messages = Some(true);
self
}
pub fn with_transaction_trace(mut self) -> Self {
self.inner.include_transaction_trace = Some(true);
self
}
pub fn build(self) -> EventFilter {
self.inner
}
}
impl MessageToL1FilterBuilder {
pub fn all_messages() -> Self {
let inner = MessageToL1Filter::default();
Self { inner }
}
pub fn with_from_address(mut self, from_address: FieldElement) -> Self {
self.inner.from_address = Some(from_address);
self
}
pub fn with_to_address(mut self, to_address: FieldElement) -> Self {
self.inner.to_address = Some(to_address);
self
}
pub fn with_id(mut self, id: u32) -> Self {
self.inner.id = id;
self
}
pub fn with_transaction_status(mut self, status: TransactionStatusFilter) -> Self {
self.inner.set_transaction_status(status);
self
}
pub fn with_receipt(mut self) -> Self {
self.inner.include_receipt = Some(true);
self
}
pub fn with_siblings(mut self) -> Self {
self.inner.include_siblings = Some(true);
self
}
pub fn with_events(mut self) -> Self {
self.inner.include_events = Some(true);
self
}
pub fn with_transaction_trace(mut self) -> Self {
self.inner.include_transaction_trace = Some(true);
self
}
pub fn build(self) -> MessageToL1Filter {
self.inner
}
}
impl StorageDiffFilterBuilder {
pub fn all_contracts() -> Self {
let inner = StorageDiffFilter::default();
Self { inner }
}
pub fn single_contract(address: FieldElement) -> Self {
let inner = StorageDiffFilter {
contract_address: Some(address),
..Default::default()
};
Self { inner }
}
pub fn with_address(mut self, address: FieldElement) -> Self {
self.inner.contract_address = Some(address);
self
}
pub fn with_id(mut self, id: u32) -> Self {
self.inner.id = id;
self
}
pub fn build(self) -> StorageDiffFilter {
self.inner
}
}
impl ContractChangeFilterBuilder {
pub fn all_changes() -> Self {
let inner = ContractChangeFilter::default();
Self { inner }
}
pub fn declared_class() -> Self {
use contract_change_filter::Change;
let inner = ContractChangeFilter {
change: Some(Change::DeclaredClass(DeclaredClassFilter::default())),
..Default::default()
};
Self { inner }
}
pub fn replaced_class() -> Self {
use contract_change_filter::Change;
let inner = ContractChangeFilter {
change: Some(Change::ReplacedClass(ReplacedClassFilter::default())),
..Default::default()
};
Self { inner }
}
pub fn deployed_contract() -> Self {
use contract_change_filter::Change;
let inner = ContractChangeFilter {
change: Some(Change::DeployedContract(DeployedContractFilter::default())),
..Default::default()
};
Self { inner }
}
pub fn with_id(mut self, id: u32) -> Self {
self.inner.id = id;
self
}
pub fn build(self) -> ContractChangeFilter {
self.inner
}
}
impl NonceUpdateFilterBuilder {
pub fn all_contracts() -> Self {
let inner = NonceUpdateFilter::default();
Self { inner }
}
pub fn single_contract(address: FieldElement) -> Self {
let inner = NonceUpdateFilter {
contract_address: Some(address),
..Default::default()
};
Self { inner }
}
pub fn with_address(mut self, address: FieldElement) -> Self {
self.inner.contract_address = Some(address);
self
}
pub fn with_id(mut self, id: u32) -> Self {
self.inner.id = id;
self
}
pub fn build(self) -> NonceUpdateFilter {
self.inner
}
}