hopr_db_entity/conversions/
tickets.rs1use 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}