1use serde::{Deserialize, Serialize};
2
3use crate::entities::{CardanoTransactionsSigningConfig, Epoch, ProtocolParameters};
4use crate::messages::SignerMessagePart;
5
6#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
8pub struct EpochSettingsMessage {
9 pub epoch: Epoch,
11
12 #[deprecated(
14 since = "0.6.27",
15 note = "Will be removed soon. use `mithril-protocol-config` crate instead."
16 )]
17 #[serde(
18 rename = "signer_registration_protocol",
19 skip_serializing_if = "Option::is_none"
20 )]
21 pub signer_registration_protocol_parameters: Option<ProtocolParameters>,
22
23 pub current_signers: Vec<SignerMessagePart>,
25
26 pub next_signers: Vec<SignerMessagePart>,
28
29 #[deprecated(
31 since = "0.6.27",
32 note = "Will be removed soon. use `mithril-protocol-config` crate instead."
33 )]
34 #[serde(skip_serializing_if = "Option::is_none")]
35 pub cardano_transactions_signing_config: Option<CardanoTransactionsSigningConfig>,
36}
37
38#[cfg(test)]
39mod tests {
40 use crate::{crypto_helper::KesEvolutions, entities::BlockNumber};
41
42 use super::*;
43
44 const CURRENT_JSON: &str = r#"{
45 "epoch": 10,
46 "signer_registration_protocol": { "k": 500, "m": 10000, "phi_f": 0.65 },
47 "current_signers":[{
48 "party_id":"123",
49 "verification_key":"key_123",
50 "verification_key_signature":"signature_123",
51 "operational_certificate":"certificate_123",
52 "kes_period":12
53 }],
54 "next_signers": [{
55 "party_id":"456",
56 "verification_key":"key_456",
57 "verification_key_signature":"signature_456",
58 "operational_certificate":"certificate_456",
59 "kes_period":45
60 }],
61 "cardano_transactions_signing_config": {
62 "security_parameter": 70,
63 "step": 20
64 }
65 }"#;
66
67 #[derive(Debug, Serialize, Deserialize, PartialEq)]
68 struct EpochSettingsMessageUntilV0_1_51 {
69 pub epoch: Epoch,
70 #[serde(rename = "signer_registration_protocol")]
71 pub signer_registration_protocol_parameters: ProtocolParameters,
72 pub current_signers: Vec<SignerMessagePart>,
73 pub next_signers: Vec<SignerMessagePart>,
74 #[serde(skip_serializing_if = "Option::is_none")]
75 pub cardano_transactions_signing_config: Option<CardanoTransactionsSigningConfig>,
76 #[serde(skip_serializing_if = "Option::is_none")]
77 pub next_cardano_transactions_signing_config: Option<CardanoTransactionsSigningConfig>,
78 }
79
80 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
81 pub struct EpochSettingsMessageUntilV0_1_55 {
82 pub epoch: Epoch,
83 #[serde(rename = "signer_registration_protocol")]
84 pub signer_registration_protocol_parameters: ProtocolParameters,
85 pub current_signers: Vec<SignerMessagePart>,
86 pub next_signers: Vec<SignerMessagePart>,
87 #[serde(skip_serializing_if = "Option::is_none")]
88 pub cardano_transactions_signing_config: Option<CardanoTransactionsSigningConfig>,
89 }
90
91 fn golden_message_until_open_api_0_1_51() -> EpochSettingsMessageUntilV0_1_51 {
92 EpochSettingsMessageUntilV0_1_51 {
93 epoch: Epoch(10),
94 signer_registration_protocol_parameters: ProtocolParameters {
95 k: 500,
96 m: 10000,
97 phi_f: 0.65,
98 },
99 current_signers: vec![SignerMessagePart {
100 party_id: "123".to_string(),
101 verification_key: "key_123".to_string(),
102 verification_key_signature: Some("signature_123".to_string()),
103 operational_certificate: Some("certificate_123".to_string()),
104 kes_evolutions: Some(KesEvolutions(12)),
105 }],
106 next_signers: vec![SignerMessagePart {
107 party_id: "456".to_string(),
108 verification_key: "key_456".to_string(),
109 verification_key_signature: Some("signature_456".to_string()),
110 operational_certificate: Some("certificate_456".to_string()),
111 kes_evolutions: Some(KesEvolutions(45)),
112 }],
113 cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
114 security_parameter: BlockNumber(70),
115 step: BlockNumber(20),
116 }),
117 next_cardano_transactions_signing_config: None,
118 }
119 }
120
121 fn golden_message_until_open_api_0_1_55() -> EpochSettingsMessageUntilV0_1_55 {
122 EpochSettingsMessageUntilV0_1_55 {
123 epoch: Epoch(10),
124 signer_registration_protocol_parameters: ProtocolParameters {
125 k: 500,
126 m: 10000,
127 phi_f: 0.65,
128 },
129 current_signers: vec![SignerMessagePart {
130 party_id: "123".to_string(),
131 verification_key: "key_123".to_string(),
132 verification_key_signature: Some("signature_123".to_string()),
133 operational_certificate: Some("certificate_123".to_string()),
134 kes_evolutions: Some(KesEvolutions(12)),
135 }],
136 next_signers: vec![SignerMessagePart {
137 party_id: "456".to_string(),
138 verification_key: "key_456".to_string(),
139 verification_key_signature: Some("signature_456".to_string()),
140 operational_certificate: Some("certificate_456".to_string()),
141 kes_evolutions: Some(KesEvolutions(45)),
142 }],
143 cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
144 security_parameter: BlockNumber(70),
145 step: BlockNumber(20),
146 }),
147 }
148 }
149
150 fn golden_current_message() -> EpochSettingsMessage {
151 #[allow(deprecated)]
152 EpochSettingsMessage {
153 epoch: Epoch(10),
154 signer_registration_protocol_parameters: Some(ProtocolParameters {
155 k: 500,
156 m: 10000,
157 phi_f: 0.65,
158 }),
159 current_signers: vec![SignerMessagePart {
160 party_id: "123".to_string(),
161 verification_key: "key_123".to_string(),
162 verification_key_signature: Some("signature_123".to_string()),
163 operational_certificate: Some("certificate_123".to_string()),
164 kes_evolutions: Some(KesEvolutions(12)),
165 }],
166 next_signers: vec![SignerMessagePart {
167 party_id: "456".to_string(),
168 verification_key: "key_456".to_string(),
169 verification_key_signature: Some("signature_456".to_string()),
170 operational_certificate: Some("certificate_456".to_string()),
171 kes_evolutions: Some(KesEvolutions(45)),
172 }],
173 cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
174 security_parameter: BlockNumber(70),
175 step: BlockNumber(20),
176 }),
177 }
178 }
179
180 #[test]
181 fn test_current_json_deserialized_into_message_supported_until_open_api_0_1_51() {
182 let json = CURRENT_JSON;
183 let message: EpochSettingsMessageUntilV0_1_51 = serde_json::from_str(json).unwrap();
184
185 assert_eq!(golden_message_until_open_api_0_1_51(), message);
186 }
187
188 #[test]
189 fn test_current_json_deserialized_into_message_supported_until_open_api_0_1_55() {
190 let json = CURRENT_JSON;
191 let message: EpochSettingsMessageUntilV0_1_55 = serde_json::from_str(json).unwrap();
192
193 assert_eq!(golden_message_until_open_api_0_1_55(), message);
194 }
195
196 #[test]
197 fn test_current_json_deserialized_into_current_message() {
198 let json = CURRENT_JSON;
199 let message: EpochSettingsMessage = serde_json::from_str(json).expect(
200 "This JSON is expected to be successfully parsed into a EpochSettingsMessage instance.",
201 );
202
203 assert_eq!(golden_current_message(), message);
204 }
205}