use std::collections::BTreeSet;
use arrayvec::ArrayVec;
use hypersync_format::{Address, LogArgument};
use hypersync_net_types::block::BlockField;
use hypersync_net_types::log::LogField;
use hypersync_net_types::transaction::TransactionField;
use hypersync_net_types::{
FieldSelection, LogFilter, LogSelection, Query, TransactionFilter, TransactionSelection,
};
pub fn blocks_and_transactions(from_block: u64, to_block: Option<u64>) -> Query {
let all_block_fields = BlockField::all();
let all_tx_fields = TransactionField::all();
Query {
from_block,
to_block,
include_all_blocks: true,
transactions: vec![TransactionSelection::default()],
field_selection: FieldSelection {
block: all_block_fields,
transaction: all_tx_fields,
..Default::default()
},
..Default::default()
}
}
pub fn blocks_and_transaction_hashes(from_block: u64, to_block: Option<u64>) -> Query {
let mut tx_field_selection = BTreeSet::new();
tx_field_selection.insert(TransactionField::BlockHash);
tx_field_selection.insert(TransactionField::BlockNumber);
tx_field_selection.insert(TransactionField::Hash);
let all_block_fields = BlockField::all();
Query {
from_block,
to_block,
include_all_blocks: true,
transactions: vec![TransactionSelection::default()],
field_selection: FieldSelection {
block: all_block_fields,
transaction: tx_field_selection,
..Default::default()
},
..Default::default()
}
}
pub fn logs(from_block: u64, to_block: Option<u64>, contract_address: Address) -> Query {
let all_log_fields = LogField::all();
Query {
from_block,
to_block,
logs: vec![LogSelection::from(LogFilter {
address: vec![contract_address],
..Default::default()
})],
field_selection: FieldSelection {
log: all_log_fields,
..Default::default()
},
..Default::default()
}
}
pub fn logs_of_event(
from_block: u64,
to_block: Option<u64>,
topic0: LogArgument,
contract_address: Address,
) -> Query {
let mut topics = ArrayVec::<Vec<LogArgument>, 4>::new();
topics.insert(0, vec![topic0]);
let all_log_fields = LogField::all();
Query {
from_block,
to_block,
logs: vec![LogSelection::from(LogFilter {
address: vec![contract_address],
topics,
..Default::default()
})],
field_selection: FieldSelection {
log: all_log_fields,
..Default::default()
},
..Default::default()
}
}
pub fn transactions(from_block: u64, to_block: Option<u64>) -> Query {
let all_txn_fields = TransactionField::all();
Query {
from_block,
to_block,
transactions: vec![TransactionSelection::default()],
field_selection: FieldSelection {
transaction: all_txn_fields,
..Default::default()
},
..Default::default()
}
}
pub fn transactions_from_address(
from_block: u64,
to_block: Option<u64>,
address: Address,
) -> Query {
let all_txn_fields = TransactionField::all();
Query {
from_block,
to_block,
transactions: vec![TransactionSelection::from(TransactionFilter {
from: vec![address],
..Default::default()
})],
field_selection: FieldSelection {
transaction: all_txn_fields,
..Default::default()
},
..Default::default()
}
}