mithril_aggregator/database/record/
epoch_settings.rs

1use mithril_common::entities::{
2    CardanoBlocksTransactionsSigningConfig, CardanoTransactionsSigningConfig, Epoch,
3    ProtocolParameters,
4};
5use mithril_persistence::sqlite::{HydrationError, Projection, SqLiteEntity};
6
7use crate::entities::AggregatorEpochSettings;
8
9/// Settings for an epoch, including the protocol parameters.
10#[derive(Debug, PartialEq, Clone)]
11pub struct EpochSettingsRecord {
12    /// Epoch settings id, i.e. the epoch number.
13    pub epoch_settings_id: Epoch,
14
15    /// Protocol parameters.
16    pub protocol_parameters: ProtocolParameters,
17
18    /// Cardano transactions signing configuration.
19    pub cardano_transactions_signing_config: Option<CardanoTransactionsSigningConfig>,
20
21    /// Cardano blocks and transactions signing configuration.
22    pub cardano_blocks_transactions_signing_config: Option<CardanoBlocksTransactionsSigningConfig>,
23}
24
25impl From<EpochSettingsRecord> for AggregatorEpochSettings {
26    fn from(other: EpochSettingsRecord) -> Self {
27        Self {
28            protocol_parameters: other.protocol_parameters,
29            cardano_transactions_signing_config: other.cardano_transactions_signing_config,
30            cardano_blocks_transactions_signing_config: other
31                .cardano_blocks_transactions_signing_config,
32        }
33    }
34}
35
36impl SqLiteEntity for EpochSettingsRecord {
37    fn hydrate(row: sqlite::Row) -> Result<Self, HydrationError>
38    where
39        Self: Sized,
40    {
41        let epoch_settings_id_int = row.read::<i64, _>(0);
42        let protocol_parameters_string = &row.read::<&str, _>(1);
43        let cardano_transactions_signing_config_string = &row.read::<Option<&str>, _>(2);
44        let cardano_blocks_transactions_signing_config_string = &row.read::<Option<&str>, _>(3);
45
46        let epoch_settings_record = Self {
47            epoch_settings_id: Epoch(epoch_settings_id_int.try_into().map_err(|e| {
48                HydrationError::InvalidData(format!(
49                    "Could not cast i64 ({epoch_settings_id_int}) to u64. Error: '{e}'"
50                ))
51            })?),
52            protocol_parameters: serde_json::from_str(protocol_parameters_string).map_err(
53                |e| {
54                    HydrationError::InvalidData(format!(
55                        "Could not turn string '{protocol_parameters_string}' to ProtocolParameters. Error: {e}"
56                    ))
57                },
58            )?,
59            cardano_transactions_signing_config: cardano_transactions_signing_config_string.map(|config| serde_json::from_str(config).map_err(
60                |e| {
61                    HydrationError::InvalidData(format!(
62                        "Could not turn string '{config}' to CardanoTransactionsSigningConfig. Error: {e}"
63                    ))
64                },
65            )).transpose()?,
66            cardano_blocks_transactions_signing_config: cardano_blocks_transactions_signing_config_string.map(|config| serde_json::from_str(config).map_err(
67                |e| {
68                    HydrationError::InvalidData(format!(
69                        "Could not turn string '{config}' to CardanoBlocksTransactionsSigningConfig. Error: {e}"
70                    ))
71                },
72            )).transpose()?,
73
74        };
75
76        Ok(epoch_settings_record)
77    }
78
79    fn get_projection() -> Projection {
80        let mut projection = Projection::default();
81        projection.add_field(
82            "epoch_setting_id",
83            "{:epoch_setting:}.epoch_setting_id",
84            "integer",
85        );
86        projection.add_field(
87            "protocol_parameters",
88            "{:epoch_setting:}.protocol_parameters",
89            "text",
90        );
91        projection.add_field(
92            "cardano_transactions_signing_config",
93            "{:epoch_setting:}.cardano_transactions_signing_config",
94            "text",
95        );
96        projection.add_field(
97            "cardano_blocks_transactions_signing_config",
98            "{:epoch_setting:}.cardano_blocks_transactions_signing_config",
99            "text",
100        );
101
102        projection
103    }
104}