hopr_db_entity/conversions/
logs.rs

1use hopr_crypto_types::types::Hash;
2use hopr_primitive_types::prelude::*;
3use sea_orm::Set;
4
5use crate::{errors::DbEntityError, log, log_status};
6
7impl From<SerializableLog> for log::ActiveModel {
8    fn from(value: SerializableLog) -> Self {
9        log::ActiveModel {
10            address: Set(value.address.as_ref().to_vec()),
11            topics: Set(value.topics.into_iter().flatten().collect()),
12            data: Set(value.data),
13            block_number: Set(value.block_number.to_be_bytes().to_vec()),
14            transaction_hash: Set(value.tx_hash.to_vec()),
15            transaction_index: Set(value.tx_index.to_be_bytes().to_vec()),
16            block_hash: Set(value.block_hash.to_vec()),
17            log_index: Set(value.log_index.to_be_bytes().to_vec()),
18            removed: Set(value.removed),
19            ..Default::default()
20        }
21    }
22}
23
24impl TryFrom<log::Model> for SerializableLog {
25    type Error = DbEntityError;
26
27    fn try_from(value: log::Model) -> Result<Self, Self::Error> {
28        let tx_hash: [u8; 32] = value
29            .transaction_hash
30            .try_into()
31            .map_err(|_| DbEntityError::ConversionError("Invalid tx_hash".into()))?;
32        let block_hash: [u8; 32] = value
33            .block_hash
34            .try_into()
35            .map_err(|_| DbEntityError::ConversionError("Invalid block_hash".into()))?;
36        let address = Address::new(value.address.as_ref());
37
38        let mut topics: Vec<[u8; 32]> = Vec::new();
39        for chunk in value.topics.chunks_exact(32) {
40            let mut topic = [0u8; 32];
41            topic.copy_from_slice(chunk);
42            topics.push(topic);
43        }
44
45        let log = SerializableLog {
46            address,
47            topics,
48            data: value.data,
49            block_number: U256::from_be_bytes(value.block_number).as_u64(),
50            tx_hash,
51            tx_index: U256::from_be_bytes(value.transaction_index).as_u64(),
52            block_hash,
53            log_index: U256::from_be_bytes(value.log_index).as_u64(),
54            removed: value.removed,
55            ..Default::default()
56        };
57
58        Ok(log)
59    }
60}
61
62impl From<SerializableLog> for log_status::ActiveModel {
63    fn from(value: SerializableLog) -> Self {
64        let processed = value.processed.unwrap_or(false);
65        let processed_at = value.processed_at.map(|p| p.naive_utc());
66        let checksum = value
67            .checksum
68            .map(|c| Hash::from_hex(&c).expect("Invalid checksum").as_ref().to_vec());
69
70        log_status::ActiveModel {
71            block_number: Set(value.block_number.to_be_bytes().to_vec()),
72            transaction_index: Set(value.tx_index.to_be_bytes().to_vec()),
73            log_index: Set(value.log_index.to_be_bytes().to_vec()),
74            processed: Set(processed),
75            processed_at: Set(processed_at),
76            checksum: Set(checksum),
77        }
78    }
79}