hopr_db_entity/conversions/
tickets.rs

1use hopr_crypto_types::prelude::*;
2use hopr_internal_types::prelude::*;
3use hopr_primitive_types::prelude::*;
4use sea_orm::Set;
5
6use crate::{errors::DbEntityError, ticket};
7
8impl TryFrom<&ticket::Model> for AcknowledgedTicket {
9    type Error = DbEntityError;
10
11    fn try_from(value: &ticket::Model) -> Result<Self, Self::Error> {
12        let response = Response::try_from(value.response.as_ref())?;
13
14        let mut ticket = TicketBuilder::default()
15            .channel_id(Hash::from_hex(&value.channel_id)?)
16            .amount(U256::from_be_bytes(&value.amount))
17            .index(U256::from_be_bytes(&value.index).as_u64())
18            .index_offset(value.index_offset as u32)
19            .win_prob(
20                value
21                    .winning_probability
22                    .as_slice()
23                    .try_into()
24                    .map_err(|_| DbEntityError::ConversionError("invalid winning probability".into()))?,
25            )
26            .channel_epoch(U256::from_be_bytes(&value.channel_epoch).as_u32())
27            .challenge(response.to_challenge().to_ethereum_challenge())
28            .signature(
29                value
30                    .signature
31                    .as_slice()
32                    .try_into()
33                    .map_err(|_| DbEntityError::ConversionError("invalid signature format".into()))?,
34            )
35            .build_verified(
36                value
37                    .hash
38                    .as_slice()
39                    .try_into()
40                    .map_err(|_| DbEntityError::ConversionError("invalid ticket hash".into()))?,
41            )
42            .map_err(|e| DbEntityError::ConversionError(format!("invalid ticket in the db: {e}")))?
43            .into_acknowledged(response);
44
45        ticket.status = AcknowledgedTicketStatus::try_from(value.state as u8)
46            .map_err(|_| DbEntityError::ConversionError("invalid ticket state".into()))?;
47
48        Ok(ticket)
49    }
50}
51
52impl TryFrom<ticket::Model> for AcknowledgedTicket {
53    type Error = DbEntityError;
54
55    fn try_from(value: ticket::Model) -> Result<Self, Self::Error> {
56        Self::try_from(&value)
57    }
58}
59
60impl From<AcknowledgedTicket> for ticket::ActiveModel {
61    fn from(value: AcknowledgedTicket) -> Self {
62        ticket::ActiveModel {
63            channel_id: Set(value.verified_ticket().channel_id.to_hex()),
64            amount: Set(value.verified_ticket().amount.amount().to_be_bytes().to_vec()),
65            index: Set(value.verified_ticket().index.to_be_bytes().to_vec()),
66            index_offset: Set(value.verified_ticket().index_offset as i32),
67            winning_probability: Set(value.verified_ticket().encoded_win_prob.to_vec()),
68            channel_epoch: Set(U256::from(value.verified_ticket().channel_epoch).to_be_bytes().to_vec()),
69            signature: Set(value.verified_ticket().signature.unwrap().as_ref().to_vec()),
70            response: Set(value.response.as_ref().to_vec()),
71            state: Set(value.status as i8),
72            hash: Set(value.ticket.verified_hash().as_ref().to_vec()),
73            ..Default::default()
74        }
75    }
76}