eventify_primitives/networks/ethereum/
log.rs

1use 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}