alloy_network_primitives/
traits.rs1use crate::BlockTransactions;
2use alloy_consensus::{BlockHeader, Transaction};
3use alloy_primitives::{Address, BlockHash, TxHash, B256};
4use alloy_serde::WithOtherFields;
5
6pub trait ReceiptResponse {
8 fn contract_address(&self) -> Option<Address>;
10
11 fn status(&self) -> bool;
20
21 fn block_hash(&self) -> Option<BlockHash>;
23
24 fn block_number(&self) -> Option<u64>;
26
27 fn transaction_hash(&self) -> TxHash;
29
30 fn transaction_index(&self) -> Option<u64>;
32
33 fn gas_used(&self) -> u64;
35
36 fn effective_gas_price(&self) -> u128;
38
39 fn blob_gas_used(&self) -> Option<u64>;
41
42 fn blob_gas_price(&self) -> Option<u128>;
44
45 fn from(&self) -> Address;
47
48 fn to(&self) -> Option<Address>;
50
51 fn cumulative_gas_used(&self) -> u64;
53
54 fn state_root(&self) -> Option<B256>;
58}
59
60pub trait TransactionResponse: Transaction {
62 #[doc(alias = "transaction_hash")]
64 fn tx_hash(&self) -> TxHash;
65
66 fn block_hash(&self) -> Option<BlockHash>;
68
69 fn block_number(&self) -> Option<u64>;
71
72 fn transaction_index(&self) -> Option<u64>;
74
75 fn from(&self) -> Address;
77
78 fn gas_price(&self) -> Option<u128> {
80 if self.ty() < 2 {
81 return Some(Transaction::max_fee_per_gas(self));
82 }
83 None
84 }
85
86 fn max_fee_per_gas(&self) -> Option<u128> {
89 if self.ty() < 2 {
90 return None;
91 }
92 Some(Transaction::max_fee_per_gas(self))
93 }
94
95 fn transaction_type(&self) -> Option<u8> {
97 match self.ty() {
98 0 => None,
99 ty => Some(ty),
100 }
101 }
102}
103
104pub trait HeaderResponse: BlockHeader {
106 fn hash(&self) -> BlockHash;
108}
109
110pub trait BlockResponse {
112 type Header;
114 type Transaction: TransactionResponse;
116
117 fn header(&self) -> &Self::Header;
119
120 fn transactions(&self) -> &BlockTransactions<Self::Transaction>;
122
123 fn transactions_mut(&mut self) -> &mut BlockTransactions<Self::Transaction>;
125
126 fn other_fields(&self) -> Option<&alloy_serde::OtherFields> {
128 None
129 }
130}
131
132impl<T: TransactionResponse> TransactionResponse for WithOtherFields<T> {
133 fn tx_hash(&self) -> TxHash {
134 self.inner.tx_hash()
135 }
136
137 fn block_hash(&self) -> Option<BlockHash> {
138 self.inner.block_hash()
139 }
140
141 fn block_number(&self) -> Option<u64> {
142 self.inner.block_number()
143 }
144
145 fn transaction_index(&self) -> Option<u64> {
146 self.inner.transaction_index()
147 }
148
149 fn from(&self) -> Address {
150 self.inner.from()
151 }
152}
153
154impl<T: ReceiptResponse> ReceiptResponse for WithOtherFields<T> {
155 fn contract_address(&self) -> Option<Address> {
156 self.inner.contract_address()
157 }
158
159 fn status(&self) -> bool {
160 self.inner.status()
161 }
162
163 fn block_hash(&self) -> Option<BlockHash> {
164 self.inner.block_hash()
165 }
166
167 fn block_number(&self) -> Option<u64> {
168 self.inner.block_number()
169 }
170
171 fn transaction_hash(&self) -> TxHash {
172 self.inner.transaction_hash()
173 }
174
175 fn transaction_index(&self) -> Option<u64> {
176 self.inner.transaction_index()
177 }
178
179 fn gas_used(&self) -> u64 {
180 self.inner.gas_used()
181 }
182
183 fn effective_gas_price(&self) -> u128 {
184 self.inner.effective_gas_price()
185 }
186
187 fn blob_gas_used(&self) -> Option<u64> {
188 self.inner.blob_gas_used()
189 }
190
191 fn blob_gas_price(&self) -> Option<u128> {
192 self.inner.blob_gas_price()
193 }
194
195 fn from(&self) -> Address {
196 self.inner.from()
197 }
198
199 fn to(&self) -> Option<Address> {
200 self.inner.to()
201 }
202
203 fn cumulative_gas_used(&self) -> u64 {
204 self.inner.cumulative_gas_used()
205 }
206
207 fn state_root(&self) -> Option<B256> {
208 self.inner.state_root()
209 }
210}
211
212impl<T: BlockResponse> BlockResponse for WithOtherFields<T> {
213 type Header = T::Header;
214 type Transaction = T::Transaction;
215
216 fn header(&self) -> &Self::Header {
217 self.inner.header()
218 }
219
220 fn transactions(&self) -> &BlockTransactions<Self::Transaction> {
221 self.inner.transactions()
222 }
223
224 fn transactions_mut(&mut self) -> &mut BlockTransactions<Self::Transaction> {
225 self.inner.transactions_mut()
226 }
227
228 fn other_fields(&self) -> Option<&alloy_serde::OtherFields> {
229 Some(&self.other)
230 }
231}
232
233impl<T: HeaderResponse> HeaderResponse for WithOtherFields<T> {
234 fn hash(&self) -> BlockHash {
235 self.inner.hash()
236 }
237}