mithril_common/messages/
epoch_settings.rs

1use crate::entities::{CardanoTransactionsSigningConfig, Epoch, ProtocolParameters};
2use crate::messages::SignerMessagePart;
3use serde::{Deserialize, Serialize};
4
5/// EpochSettings represents the settings of an epoch
6#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
7pub struct EpochSettingsMessage {
8    /// Current Epoch
9    pub epoch: Epoch,
10
11    /// Signer Registration Protocol parameters
12    #[serde(rename = "signer_registration_protocol")]
13    pub signer_registration_protocol_parameters: ProtocolParameters,
14
15    /// Current Signers
16    pub current_signers: Vec<SignerMessagePart>,
17
18    /// Signers that will be able to sign on the next epoch
19    pub next_signers: Vec<SignerMessagePart>,
20
21    /// Cardano transactions signing configuration for the current epoch
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub cardano_transactions_signing_config: Option<CardanoTransactionsSigningConfig>,
24}
25
26#[cfg(test)]
27mod tests {
28
29    use crate::entities::BlockNumber;
30
31    use super::*;
32
33    const CURRENT_JSON: &str = r#"{
34        "epoch": 10,
35        "signer_registration_protocol":  { "k": 500, "m": 10000, "phi_f": 0.65 },
36        "current_signers":[{
37            "party_id":"123",
38            "verification_key":"key_123",
39            "verification_key_signature":"signature_123",
40            "operational_certificate":"certificate_123",
41            "kes_period":12
42        }],
43        "next_signers": [{
44            "party_id":"456",
45            "verification_key":"key_456",
46            "verification_key_signature":"signature_456",
47            "operational_certificate":"certificate_456",
48            "kes_period":45
49        }],
50        "cardano_transactions_signing_config": {
51            "security_parameter": 70,
52            "step": 20
53        }
54    }"#;
55
56    #[derive(Debug, Serialize, Deserialize, PartialEq)]
57    struct EpochSettingsMessageUntilV0_1_51 {
58        pub epoch: Epoch,
59
60        #[serde(rename = "signer_registration_protocol")]
61        pub signer_registration_protocol_parameters: ProtocolParameters,
62
63        pub current_signers: Vec<SignerMessagePart>,
64
65        pub next_signers: Vec<SignerMessagePart>,
66
67        #[serde(skip_serializing_if = "Option::is_none")]
68        pub cardano_transactions_signing_config: Option<CardanoTransactionsSigningConfig>,
69
70        #[serde(skip_serializing_if = "Option::is_none")]
71        pub next_cardano_transactions_signing_config: Option<CardanoTransactionsSigningConfig>,
72    }
73
74    fn golden_message_until_open_api_0_1_51() -> EpochSettingsMessageUntilV0_1_51 {
75        EpochSettingsMessageUntilV0_1_51 {
76            epoch: Epoch(10),
77            signer_registration_protocol_parameters: ProtocolParameters {
78                k: 500,
79                m: 10000,
80                phi_f: 0.65,
81            },
82            current_signers: vec![SignerMessagePart {
83                party_id: "123".to_string(),
84                verification_key: "key_123".to_string(),
85                verification_key_signature: Some("signature_123".to_string()),
86                operational_certificate: Some("certificate_123".to_string()),
87                kes_period: Some(12),
88            }],
89            next_signers: vec![SignerMessagePart {
90                party_id: "456".to_string(),
91                verification_key: "key_456".to_string(),
92                verification_key_signature: Some("signature_456".to_string()),
93                operational_certificate: Some("certificate_456".to_string()),
94                kes_period: Some(45),
95            }],
96            cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
97                security_parameter: BlockNumber(70),
98                step: BlockNumber(20),
99            }),
100            next_cardano_transactions_signing_config: None,
101        }
102    }
103
104    fn golden_current_message() -> EpochSettingsMessage {
105        EpochSettingsMessage {
106            epoch: Epoch(10),
107            signer_registration_protocol_parameters: ProtocolParameters {
108                k: 500,
109                m: 10000,
110                phi_f: 0.65,
111            },
112            current_signers: vec![SignerMessagePart {
113                party_id: "123".to_string(),
114                verification_key: "key_123".to_string(),
115                verification_key_signature: Some("signature_123".to_string()),
116                operational_certificate: Some("certificate_123".to_string()),
117                kes_period: Some(12),
118            }],
119            next_signers: vec![SignerMessagePart {
120                party_id: "456".to_string(),
121                verification_key: "key_456".to_string(),
122                verification_key_signature: Some("signature_456".to_string()),
123                operational_certificate: Some("certificate_456".to_string()),
124                kes_period: Some(45),
125            }],
126            cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
127                security_parameter: BlockNumber(70),
128                step: BlockNumber(20),
129            }),
130        }
131    }
132
133    #[test]
134    fn test_current_json_deserialized_into_message_supported_until_open_api_0_1_51() {
135        let json = CURRENT_JSON;
136        let message: EpochSettingsMessageUntilV0_1_51 = serde_json::from_str(json).unwrap();
137
138        assert_eq!(golden_message_until_open_api_0_1_51(), message);
139    }
140
141    #[test]
142    fn test_current_json_deserialized_into_current_message() {
143        let json = CURRENT_JSON;
144        let message: EpochSettingsMessage = serde_json::from_str(json).expect(
145            "This JSON is expected to be successfully parsed into a EpochSettingsMessage instance.",
146        );
147
148        assert_eq!(golden_current_message(), message);
149    }
150}