eventify_primitives/networks/ethereum/
log.rs1use eyre::Result;
2
3use sqlx::{prelude::FromRow, Error as SqlError};
4use utoipa::ToSchema;
5
6use crate::{
7 networks::{core::CoreLog, NetworkKind},
8 traits::{Emit, Insert, Log, Stream},
9 PropagateError,
10};
11
12#[derive(
13 Clone,
14 Debug,
15 Default,
16 serde::Deserialize,
17 serde::Serialize,
18 PartialEq,
19 Eq,
20 Hash,
21 FromRow,
22 ToSchema,
23)]
24pub struct EthLog {
25 #[serde(flatten)]
26 core: CoreLog,
27}
28
29impl Log for EthLog {
30 fn core(&self) -> &CoreLog {
31 &self.core
32 }
33}
34
35impl Insert for EthLog {
36 async fn insert(
37 &self,
38 pool: &sqlx::PgPool,
39 _: &Option<alloy_primitives::B256>,
40 ) -> Result<(), SqlError> {
41 self.core.insert(pool, NetworkKind::Ethereum).await
42 }
43}
44
45impl Emit for EthLog {
46 async fn emit(
47 &self,
48 queue: &redis::Client,
49 network: &crate::networks::NetworkKind,
50 ) -> eyre::Result<(), PropagateError> {
51 self.core.emit(queue, network).await
52 }
53}
54
55impl Stream for EthLog {
56 async fn stream(
57 &self,
58 queue: &redis::Client,
59 network: &crate::networks::NetworkKind,
60 ) -> eyre::Result<(), PropagateError> {
61 self.core.stream(queue, network).await
62 }
63}
64
65#[cfg(test)]
66mod tests {
67 use super::*;
68
69 #[test]
70 fn test_deserialize_eth_log() {
71 let json = serde_json::json!(
72 {
73 "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
74 "topics": [
75 "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
76 "0x000000000000000000000000a7ca2c8673bcfa5a26d8ceec2887f2cc2b0db22a",
77 "0x00000000000000000000000006da0fd433c1a5d7a4faa01111c044910a184553"
78 ],
79 "data": "0x000000000000000000000000000000000000000000000000007c585087238000",
80 "block_hash": "0x6624f87d3435cc938de6442db45e06f23582a7eeddb5ac15126d440db03e75f4",
81 "block_number": 18692253,
82 "transaction_hash": "0x933c80c2a18cbf64ec28662991186bd340519eb6974f3d301195b82064329fc8",
83 "transaction_index": 213,
84 "log_index": 512,
85 "transaction_log_index": null,
86 "log_type": null,
87 "removed": false
88 }
89 );
90
91 assert!(serde_json::from_value::<EthLog>(json).is_ok());
92 }
93
94 #[test]
95 fn test_deserialize_empty_eth_log() {
96 let json = serde_json::json!({});
97
98 assert!(serde_json::from_value::<EthLog>(json).is_err());
99 }
100}