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