eventify_primitives/networks/linea/
block.rs

1use std::{fmt::Debug, hash::Hash};
2
3use alloy_primitives::U256;
4use eyre::Result;
5use redis::AsyncCommands;
6use sqlx::FromRow;
7use utoipa::ToSchema;
8
9use crate::{
10    networks::{core::CoreBlock, NetworkKind, ResourceKind},
11    traits::{Block, Emit, Insert, Stream},
12    PropagateError,
13};
14
15#[derive(
16    Clone,
17    Debug,
18    Default,
19    serde::Deserialize,
20    serde::Serialize,
21    PartialEq,
22    Eq,
23    Hash,
24    FromRow,
25    ToSchema,
26)]
27pub struct LineaBlock {
28    #[serde(flatten)]
29    core: CoreBlock,
30
31    #[serde(rename = "baseFeePerGas")]
32    pub base_fee: Option<U256>,
33    #[serde(rename = "totalDifficulty")]
34    pub total_difficulty: Option<U256>,
35}
36
37impl Block for LineaBlock {
38    fn core(&self) -> &CoreBlock {
39        &self.core
40    }
41}
42
43impl Insert for LineaBlock {
44    async fn insert(
45        &self,
46        pool: &sqlx::PgPool,
47        _: &Option<alloy_primitives::B256>,
48    ) -> Result<(), sqlx::Error> {
49        self.core.insert(pool, NetworkKind::Linea).await
50    }
51}
52
53impl Emit for LineaBlock {
54    async fn emit(
55        &self,
56        queue: &redis::Client,
57        network: &NetworkKind,
58    ) -> Result<(), PropagateError> {
59        let mut con = queue.get_async_connection().await?;
60
61        let channel = format!("{}:{}", network, ResourceKind::Block);
62        con.lpush(channel, serde_json::to_string(self)?).await?;
63
64        Ok(())
65    }
66}
67
68impl Stream for LineaBlock {
69    async fn stream(
70        &self,
71        queue: &redis::Client,
72        network: &NetworkKind,
73    ) -> Result<(), PropagateError> {
74        self.core().stream(queue, network).await
75    }
76}