@@ -11,6 +11,7 @@ use mithril_common::{
11
11
} ,
12
12
entities:: { Epoch , Signer , SignerWithStake , StakeDistribution } ,
13
13
store:: StoreError ,
14
+ StdError ,
14
15
} ;
15
16
16
17
#[ cfg( test) ]
@@ -42,6 +43,10 @@ pub enum SignerRegistrationError {
42
43
/// Signer registration failed.
43
44
#[ error( "signer registration failed" ) ]
44
45
FailedSignerRegistration ( #[ from] ProtocolRegistrationError ) ,
46
+
47
+ /// Signer recorder failed.
48
+ #[ error( "signer recorder failed: '{0}'" ) ]
49
+ FailedSignerRecorder ( String ) ,
45
50
}
46
51
47
52
/// Represents the information needed to handle a signer registration round
@@ -87,6 +92,21 @@ pub trait SignerRegistrationRoundOpener: Sync + Send {
87
92
async fn close_registration_round ( & self ) -> Result < ( ) , SignerRegistrationError > ;
88
93
}
89
94
95
+ /// Signer recorder trait
96
+ #[ cfg_attr( test, automock) ]
97
+ #[ async_trait]
98
+ pub trait SignerRecorder : Sync + Send {
99
+ /// Record signer_id
100
+ async fn record_signer_id ( & self , signer_id : String ) -> Result < ( ) , StdError > ;
101
+
102
+ /// Record pool ticker by id
103
+ async fn record_signer_pool_ticker (
104
+ & self ,
105
+ signer_id : String ,
106
+ pool_ticker : Option < String > ,
107
+ ) -> Result < ( ) , StdError > ;
108
+ }
109
+
90
110
/// Implementation of a [SignerRegisterer]
91
111
pub struct MithrilSignerRegisterer {
92
112
/// Current signer registration round
@@ -97,18 +117,23 @@ pub struct MithrilSignerRegisterer {
97
117
98
118
/// Verification key store
99
119
verification_key_store : Arc < VerificationKeyStore > ,
120
+
121
+ /// Signer recorder
122
+ signer_recorder : Arc < dyn SignerRecorder > ,
100
123
}
101
124
102
125
impl MithrilSignerRegisterer {
103
126
/// MithrilSignerRegisterer factory
104
127
pub fn new (
105
128
chain_observer : Arc < dyn ChainObserver > ,
106
129
verification_key_store : Arc < VerificationKeyStore > ,
130
+ signer_recorder : Arc < dyn SignerRecorder > ,
107
131
) -> Self {
108
132
Self {
109
133
current_round : RwLock :: new ( None ) ,
110
134
chain_observer,
111
135
verification_key_store,
136
+ signer_recorder,
112
137
}
113
138
}
114
139
@@ -204,7 +229,12 @@ impl SignerRegisterer for MithrilSignerRegisterer {
204
229
. get ( & party_id_save)
205
230
. unwrap ( ) ,
206
231
) ;
207
- signer_save. party_id = party_id_save;
232
+ signer_save. party_id = party_id_save. clone ( ) ;
233
+
234
+ self . signer_recorder
235
+ . record_signer_id ( party_id_save)
236
+ . await
237
+ . map_err ( |e| SignerRegistrationError :: FailedSignerRecorder ( e. to_string ( ) ) ) ?;
208
238
209
239
match self
210
240
. verification_key_store
@@ -233,15 +263,25 @@ mod tests {
233
263
VerificationKeyStore , VerificationKeyStorer ,
234
264
} ;
235
265
266
+ use super :: MockSignerRecorder ;
267
+
236
268
#[ tokio:: test]
237
269
async fn can_register_signer_if_registration_round_is_opened_with_operational_certificate ( ) {
238
270
let chain_observer = FakeObserver :: default ( ) ;
239
271
let verification_key_store = Arc :: new ( VerificationKeyStore :: new (
240
272
Box :: new ( MemoryAdapter :: < Epoch , HashMap < PartyId , SignerWithStake > > :: new ( None ) . unwrap ( ) ) ,
241
273
None ,
242
274
) ) ;
243
- let signer_registerer =
244
- MithrilSignerRegisterer :: new ( Arc :: new ( chain_observer) , verification_key_store. clone ( ) ) ;
275
+ let mut signer_recorder = MockSignerRecorder :: new ( ) ;
276
+ signer_recorder
277
+ . expect_record_signer_id ( )
278
+ . returning ( |_| Ok ( ( ) ) )
279
+ . once ( ) ;
280
+ let signer_registerer = MithrilSignerRegisterer :: new (
281
+ Arc :: new ( chain_observer) ,
282
+ verification_key_store. clone ( ) ,
283
+ Arc :: new ( signer_recorder) ,
284
+ ) ;
245
285
let registration_epoch = Epoch ( 1 ) ;
246
286
let fixture = MithrilFixtureBuilder :: default ( ) . with_signers ( 5 ) . build ( ) ;
247
287
let signer_to_register: Signer = fixture. signers ( ) [ 0 ] . to_owned ( ) ;
@@ -278,8 +318,16 @@ mod tests {
278
318
Box :: new ( MemoryAdapter :: < Epoch , HashMap < PartyId , SignerWithStake > > :: new ( None ) . unwrap ( ) ) ,
279
319
None ,
280
320
) ) ;
281
- let signer_registerer =
282
- MithrilSignerRegisterer :: new ( Arc :: new ( chain_observer) , verification_key_store. clone ( ) ) ;
321
+ let mut signer_recorder = MockSignerRecorder :: new ( ) ;
322
+ signer_recorder
323
+ . expect_record_signer_id ( )
324
+ . returning ( |_| Ok ( ( ) ) )
325
+ . once ( ) ;
326
+ let signer_registerer = MithrilSignerRegisterer :: new (
327
+ Arc :: new ( chain_observer) ,
328
+ verification_key_store. clone ( ) ,
329
+ Arc :: new ( signer_recorder) ,
330
+ ) ;
283
331
let registration_epoch = Epoch ( 1 ) ;
284
332
let fixture = MithrilFixtureBuilder :: default ( )
285
333
. with_signers ( 5 )
@@ -319,8 +367,12 @@ mod tests {
319
367
Box :: new ( MemoryAdapter :: < Epoch , HashMap < PartyId , SignerWithStake > > :: new ( None ) . unwrap ( ) ) ,
320
368
None ,
321
369
) ) ;
322
- let signer_registerer =
323
- MithrilSignerRegisterer :: new ( Arc :: new ( chain_observer) , verification_key_store. clone ( ) ) ;
370
+ let signer_recorder = MockSignerRecorder :: new ( ) ;
371
+ let signer_registerer = MithrilSignerRegisterer :: new (
372
+ Arc :: new ( chain_observer) ,
373
+ verification_key_store. clone ( ) ,
374
+ Arc :: new ( signer_recorder) ,
375
+ ) ;
324
376
let fixture = MithrilFixtureBuilder :: default ( ) . with_signers ( 5 ) . build ( ) ;
325
377
let signer_to_register: Signer = fixture. signers ( ) [ 0 ] . to_owned ( ) ;
326
378
0 commit comments