@@ -4,7 +4,7 @@ use crate::{
4
4
key_decode_hex, EraMarkersSigner , EraMarkersVerifier , EraMarkersVerifierSignature ,
5
5
EraMarkersVerifierVerificationKey ,
6
6
} ,
7
- entities:: HexEncodedEraMarkersSignature ,
7
+ entities:: { Epoch , HexEncodedEraMarkersSignature } ,
8
8
era:: { EraMarker , EraReaderAdapter } ,
9
9
} ;
10
10
use async_trait:: async_trait;
@@ -40,11 +40,45 @@ pub enum EraMarkersPayloadError {
40
40
CreateSignature ( GeneralError ) ,
41
41
}
42
42
43
+ /// Era marker item
44
+ /// Value object that represents a tag of Era change.
45
+ #[ derive( Debug , Clone , PartialEq , Eq , Serialize , Deserialize ) ]
46
+ pub struct EraMarkerItem {
47
+ /// Era name
48
+ #[ serde( rename = "n" ) ]
49
+ pub name : String ,
50
+
51
+ /// Eventual information that advertises the Epoch of transition.
52
+ #[ serde( rename = "e" ) ]
53
+ pub epoch : Option < Epoch > ,
54
+ }
55
+
56
+ impl EraMarkerItem {
57
+ /// Instantiate a new [EraMarkerItem].
58
+ pub fn new ( name : & str , epoch : Option < Epoch > ) -> Self {
59
+ let name = name. to_string ( ) ;
60
+
61
+ Self { name, epoch }
62
+ }
63
+ }
64
+
65
+ impl From < EraMarker > for EraMarkerItem {
66
+ fn from ( other : EraMarker ) -> EraMarkerItem {
67
+ EraMarkerItem :: new ( & other. name , other. epoch )
68
+ }
69
+ }
70
+
71
+ impl From < EraMarkerItem > for EraMarker {
72
+ fn from ( other : EraMarkerItem ) -> EraMarker {
73
+ EraMarker :: new ( & other. name , other. epoch )
74
+ }
75
+ }
76
+
43
77
/// Era markers payload
44
78
#[ derive( Debug , Clone , PartialEq , Eq , Serialize , Deserialize ) ]
45
79
pub struct EraMarkersPayload {
46
80
/// List of Era markers
47
- pub markers : Vec < EraMarker > ,
81
+ pub markers : Vec < EraMarkerItem > ,
48
82
49
83
/// Era markers signature
50
84
pub signature : Option < HexEncodedEraMarkersSignature > ,
@@ -129,17 +163,26 @@ impl EraReaderAdapter for CardanoChainAdapter {
129
163
let markers_list = tx_datums
130
164
. into_iter ( )
131
165
. filter_map ( |datum| {
132
- datum
133
- . get_nth_field_by_type ( & TxDatumFieldTypeName :: Bytes , 0 )
134
- . ok ( )
135
- } )
136
- . filter_map ( |field_value| field_value. as_str ( ) . map ( |s| s. to_string ( ) ) )
137
- . filter_map ( |field_value_str| key_decode_hex ( & field_value_str) . ok ( ) )
138
- . filter_map ( |era_markers_payload : EraMarkersPayload | {
139
- era_markers_payload
140
- . verify_signature ( self . verification_key )
141
- . ok ( )
142
- . map ( |_| era_markers_payload. markers )
166
+ match (
167
+ datum. get_nth_field_by_type ( & TxDatumFieldTypeName :: Bytes , 0 ) ,
168
+ datum. get_nth_field_by_type ( & TxDatumFieldTypeName :: Bytes , 1 ) ,
169
+ ) {
170
+ ( Ok ( markers) , Ok ( signature) ) => {
171
+ let markers = markers. as_str ( ) . map ( |s| s. to_string ( ) ) . unwrap_or_default ( ) ;
172
+ let signature = signature. as_str ( ) . map ( |s| s. to_string ( ) ) ;
173
+ match key_decode_hex :: < Vec < _ > > ( & markers) {
174
+ Ok ( markers) => EraMarkersPayload {
175
+ markers : markers. clone ( ) ,
176
+ signature,
177
+ }
178
+ . verify_signature ( self . verification_key )
179
+ . ok ( )
180
+ . map ( |_| markers. into_iter ( ) . map ( |em| em. into ( ) ) . collect ( ) ) ,
181
+ Err ( _) => None ,
182
+ }
183
+ }
184
+ _ => None ,
185
+ }
143
186
} )
144
187
. collect :: < Vec < Vec < EraMarker > > > ( ) ;
145
188
@@ -160,7 +203,12 @@ mod test {
160
203
. into_iter ( )
161
204
. map ( |payload| {
162
205
TxDatumBuilder :: new ( )
163
- . add_field ( TxDatumFieldValue :: Bytes ( key_encode_hex ( payload) . unwrap ( ) ) )
206
+ . add_field ( TxDatumFieldValue :: Bytes (
207
+ key_encode_hex ( payload. markers ) . unwrap ( ) ,
208
+ ) )
209
+ . add_field ( TxDatumFieldValue :: Bytes (
210
+ payload. signature . unwrap_or_default ( ) ,
211
+ ) )
164
212
. build ( )
165
213
. unwrap ( )
166
214
} )
@@ -173,15 +221,15 @@ mod test {
173
221
let fake_address = "addr_test_123456" . to_string ( ) ;
174
222
let era_marker_payload_1 = EraMarkersPayload {
175
223
markers : vec ! [
176
- EraMarker :: new( "thales" , Some ( Epoch ( 1 ) ) ) ,
177
- EraMarker :: new( "pythagoras" , None ) ,
224
+ EraMarkerItem :: new( "thales" , Some ( Epoch ( 1 ) ) ) ,
225
+ EraMarkerItem :: new( "pythagoras" , None ) ,
178
226
] ,
179
227
signature : None ,
180
228
} ;
181
229
let era_marker_payload_2 = EraMarkersPayload {
182
230
markers : vec ! [
183
- EraMarker :: new( "thales" , Some ( Epoch ( 1 ) ) ) ,
184
- EraMarker :: new( "pythagoras" , Some ( Epoch ( 2 ) ) ) ,
231
+ EraMarkerItem :: new( "thales" , Some ( Epoch ( 1 ) ) ) ,
232
+ EraMarkerItem :: new( "pythagoras" , Some ( Epoch ( 2 ) ) ) ,
185
233
] ,
186
234
signature : None ,
187
235
} ;
@@ -204,7 +252,11 @@ mod test {
204
252
. read ( )
205
253
. await
206
254
. expect ( "CardanoChainAdapter read should not fail" ) ;
207
- let expected_markers = era_marker_payload_2. markers . to_owned ( ) ;
255
+ let expected_markers = era_marker_payload_2
256
+ . markers
257
+ . into_iter ( )
258
+ . map ( |em| em. into ( ) )
259
+ . collect :: < Vec < EraMarker > > ( ) ;
208
260
assert_eq ! ( expected_markers, markers) ;
209
261
}
210
262
}
0 commit comments