1use std::collections::BTreeSet;
2
3fn is_default<T: Default + PartialEq>(t: &T) -> bool {
6 t == &T::default()
7}
8
9use arrayvec::ArrayVec;
10use hypersync_format::{Address, FilterWrapper, FixedSizeData, Hash, LogArgument};
11use serde::{Deserialize, Serialize};
12
13pub type Sighash = FixedSizeData<4>;
14
15#[allow(clippy::all)]
16pub mod hypersync_net_types_capnp {
17 include!(concat!(env!("OUT_DIR"), "/hypersync_net_types_capnp.rs"));
18}
19
20#[derive(Default, Serialize, Deserialize, Clone, Debug, PartialEq)]
21pub struct Selection<T> {
22 #[serde(default, flatten)]
25 pub include: T,
26 #[serde(default, skip_serializing_if = "Option::is_none")]
29 pub exclude: Option<T>,
30}
31
32impl<T> From<T> for Selection<T> {
33 fn from(include: T) -> Self {
34 Self {
35 include,
36 exclude: None,
37 }
38 }
39}
40
41pub type BlockSelection = Selection<BlockFilter>;
42
43#[derive(Default, Serialize, Deserialize, Clone, Debug, PartialEq)]
44pub struct BlockFilter {
45 #[serde(default, skip_serializing_if = "Vec::is_empty")]
48 pub hash: Vec<Hash>,
49 #[serde(default, skip_serializing_if = "Vec::is_empty")]
52 pub miner: Vec<Address>,
53}
54
55pub type LogSelection = Selection<LogFilter>;
56
57#[derive(Default, Serialize, Deserialize, Clone, Debug, PartialEq)]
58pub struct LogFilter {
59 #[serde(default, skip_serializing_if = "Vec::is_empty")]
62 pub address: Vec<Address>,
63 #[serde(default, skip_serializing_if = "Option::is_none")]
64 pub address_filter: Option<FilterWrapper>,
65 #[serde(default, skip_serializing_if = "ArrayVec::is_empty")]
68 pub topics: ArrayVec<Vec<LogArgument>, 4>,
69}
70
71pub type TransactionSelection = Selection<TransactionFilter>;
72
73#[derive(Default, Serialize, Deserialize, Clone, Debug, PartialEq)]
74pub struct TransactionFilter {
75 #[serde(default, skip_serializing_if = "Vec::is_empty")]
79 pub from: Vec<Address>,
80 #[serde(default, skip_serializing_if = "Option::is_none")]
81 pub from_filter: Option<FilterWrapper>,
82 #[serde(default, skip_serializing_if = "Vec::is_empty")]
86 pub to: Vec<Address>,
87 #[serde(default, skip_serializing_if = "Option::is_none")]
88 pub to_filter: Option<FilterWrapper>,
89 #[serde(default, skip_serializing_if = "Vec::is_empty")]
91 pub sighash: Vec<Sighash>,
92 #[serde(skip_serializing_if = "Option::is_none")]
94 pub status: Option<u8>,
95 #[serde(rename = "type")]
97 #[serde(default, skip_serializing_if = "Vec::is_empty")]
98 pub kind: Vec<u8>,
99 #[serde(default, skip_serializing_if = "Vec::is_empty")]
101 pub contract_address: Vec<Address>,
102 #[serde(default, skip_serializing_if = "Option::is_none")]
106 pub contract_address_filter: Option<FilterWrapper>,
107 #[serde(default, skip_serializing_if = "Vec::is_empty")]
110 pub hash: Vec<Hash>,
111
112 #[serde(default, skip_serializing_if = "Vec::is_empty")]
114 pub authorization_list: Vec<AuthorizationSelection>,
115}
116
117#[derive(Default, Serialize, Deserialize, Clone, Debug, PartialEq)]
118pub struct AuthorizationSelection {
119 #[serde(default, skip_serializing_if = "Vec::is_empty")]
121 pub chain_id: Vec<u64>,
122 #[serde(default, skip_serializing_if = "Vec::is_empty")]
124 pub address: Vec<Address>,
125}
126
127pub type TraceSelection = Selection<TraceFilter>;
128
129#[derive(Default, Serialize, Deserialize, Clone, Debug, PartialEq)]
130pub struct TraceFilter {
131 #[serde(default, skip_serializing_if = "Vec::is_empty")]
132 pub from: Vec<Address>,
133 #[serde(default, skip_serializing_if = "Option::is_none")]
134 pub from_filter: Option<FilterWrapper>,
135 #[serde(default, skip_serializing_if = "Vec::is_empty")]
136 pub to: Vec<Address>,
137 #[serde(default, skip_serializing_if = "Option::is_none")]
138 pub to_filter: Option<FilterWrapper>,
139 #[serde(default, skip_serializing_if = "Vec::is_empty")]
140 pub address: Vec<Address>,
141 #[serde(default, skip_serializing_if = "Option::is_none")]
142 pub address_filter: Option<FilterWrapper>,
143 #[serde(default, skip_serializing_if = "Vec::is_empty")]
144 pub call_type: Vec<String>,
145 #[serde(default, skip_serializing_if = "Vec::is_empty")]
146 pub reward_type: Vec<String>,
147 #[serde(default, skip_serializing_if = "Vec::is_empty")]
148 #[serde(rename = "type")]
149 pub kind: Vec<String>,
150 #[serde(default, skip_serializing_if = "Vec::is_empty")]
151 pub sighash: Vec<Sighash>,
152}
153
154#[derive(Default, Serialize, Deserialize, Clone, Debug, PartialEq)]
155pub struct Query {
156 pub from_block: u64,
158 #[serde(skip_serializing_if = "Option::is_none")]
166 pub to_block: Option<u64>,
167 #[serde(default, skip_serializing_if = "Vec::is_empty")]
170 pub logs: Vec<LogSelection>,
171 #[serde(default, skip_serializing_if = "Vec::is_empty")]
173 pub transactions: Vec<TransactionSelection>,
174 #[serde(default, skip_serializing_if = "Vec::is_empty")]
176 pub traces: Vec<TraceSelection>,
177 #[serde(default, skip_serializing_if = "Vec::is_empty")]
179 pub blocks: Vec<BlockSelection>,
180 #[serde(default, skip_serializing_if = "is_default")]
184 pub include_all_blocks: bool,
185 #[serde(default, skip_serializing_if = "is_default")]
188 pub field_selection: FieldSelection,
189 #[serde(default, skip_serializing_if = "Option::is_none")]
192 pub max_num_blocks: Option<usize>,
193 #[serde(default, skip_serializing_if = "Option::is_none")]
196 pub max_num_transactions: Option<usize>,
197 #[serde(default, skip_serializing_if = "Option::is_none")]
200 pub max_num_logs: Option<usize>,
201 #[serde(default, skip_serializing_if = "Option::is_none")]
204 pub max_num_traces: Option<usize>,
205 #[serde(default, skip_serializing_if = "is_default")]
212 pub join_mode: JoinMode,
213}
214
215#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Copy)]
216pub enum JoinMode {
217 Default,
219 JoinAll,
223 JoinNothing,
225}
226
227impl Default for JoinMode {
228 fn default() -> Self {
229 Self::Default
230 }
231}
232
233#[derive(Default, Serialize, Deserialize, Clone, Debug, PartialEq)]
234pub struct FieldSelection {
235 #[serde(default, skip_serializing_if = "BTreeSet::is_empty")]
236 pub block: BTreeSet<String>,
237 #[serde(default, skip_serializing_if = "BTreeSet::is_empty")]
238 pub transaction: BTreeSet<String>,
239 #[serde(default, skip_serializing_if = "BTreeSet::is_empty")]
240 pub log: BTreeSet<String>,
241 #[serde(default, skip_serializing_if = "BTreeSet::is_empty")]
242 pub trace: BTreeSet<String>,
243}
244
245#[derive(Clone, Copy, Deserialize, Serialize, Debug)]
246pub struct ArchiveHeight {
247 pub height: Option<u64>,
248}
249
250#[derive(Clone, Copy, Deserialize, Serialize, Debug)]
251pub struct ChainId {
252 pub chain_id: u64,
253}
254
255#[derive(Debug, Clone, Serialize)]
257pub struct RollbackGuard {
258 pub block_number: u64,
260 pub timestamp: i64,
262 pub hash: Hash,
264 pub first_block_number: u64,
266 pub first_parent_hash: Hash,
268}