eventify_primitives/networks/avalanche/
block.rs1use 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 AvalancheBlock {
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 AvalancheBlock {
38 fn core(&self) -> &CoreBlock {
39 &self.core
40 }
41}
42
43impl Insert for AvalancheBlock {
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::Avalanche).await
50 }
51}
52
53impl Emit for AvalancheBlock {
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 AvalancheBlock {
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}