hopr_db_entity/conversions/
tickets.rs

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