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