@@ -299,9 +299,23 @@ impl Runner for SignerRunner {
299
299
return Ok ( false ) ;
300
300
}
301
301
302
- if let Some ( signer) =
303
- pending_certificate. get_signer ( self . services . single_signer . get_party_id ( ) )
304
- {
302
+ // TODO XXX How handle errors ? It occurs in test_create_immutable_files_full_single_signature integration test (no signers in epoch 1)
303
+ // TODO XXX Do we warn and return "can not sign" or return an error ?
304
+ let current_signer_with_stake: Option < SignerWithStake > = {
305
+ let epoch_service = self . services . epoch_service . read ( ) . await ;
306
+ let current_signers = epoch_service. current_signers_with_stake ( ) . await ;
307
+ if let Ok ( signers) = current_signers {
308
+ signers
309
+ . iter ( )
310
+ . find ( |s| s. party_id == self . services . single_signer . get_party_id ( ) )
311
+ . cloned ( )
312
+ } else {
313
+ warn ! ( " > could not get current signers with stake, can NOT sign" ) ;
314
+ return Ok ( false ) ;
315
+ }
316
+ } ;
317
+
318
+ if let Some ( signer) = current_signer_with_stake {
305
319
debug ! ( " > got a Signer from pending certificate" ) ;
306
320
307
321
if let Some ( protocol_initializer) = self
@@ -502,7 +516,7 @@ mod tests {
502
516
MKMap , MKMapNode , MKTreeNode , MKTreeStoreInMemory , MKTreeStorer , ProtocolInitializer ,
503
517
} ,
504
518
digesters:: { DumbImmutableDigester , DumbImmutableFileObserver } ,
505
- entities:: { BlockNumber , BlockRange , CardanoDbBeacon , Epoch } ,
519
+ entities:: { BlockNumber , BlockRange , CardanoDbBeacon , Epoch , StakeDistribution } ,
506
520
era:: { adapters:: EraReaderBootstrapAdapter , EraChecker , EraReader } ,
507
521
signable_builder:: {
508
522
BlockRangeRootRetriever , CardanoImmutableFilesFullSignableBuilder ,
@@ -764,16 +778,35 @@ mod tests {
764
778
765
779
#[ tokio:: test]
766
780
async fn test_can_i_sign ( ) {
781
+ let signers_with_stake = fake_data:: signers_with_stakes ( 5 ) ;
782
+ let signers = Signer :: vec_from ( signers_with_stake. to_vec ( ) ) ;
783
+ let stake_distribution = signers_with_stake
784
+ . iter ( )
785
+ . map ( |signer| ( signer. party_id . clone ( ) , signer. stake ) )
786
+ . collect ( ) ;
787
+
788
+ let mut current_signers = signers[ 1 ..3 ] . to_vec ( ) ;
789
+ let next_signers = signers[ 2 ..5 ] . to_vec ( ) ;
790
+
767
791
let mut pending_certificate = fake_data:: certificate_pending ( ) ;
792
+ pending_certificate. signers = vec ! [ ] ;
793
+ pending_certificate. next_signers = vec ! [ ] ;
768
794
let epoch = pending_certificate. epoch ;
769
- let signer = & mut pending_certificate . signers [ 0 ] ;
770
- // All signed entities are available for signing.
795
+ let signer = & mut current_signers [ 0 ] ;
796
+
771
797
let signed_entity_type_lock = Arc :: new ( SignedEntityTypeLock :: new ( ) ) ;
772
798
let mut services = init_services ( ) . await ;
773
799
let protocol_initializer_store = services. protocol_initializer_store . clone ( ) ;
774
800
services. single_signer = Arc :: new ( MithrilSingleSigner :: new ( signer. party_id . to_owned ( ) ) ) ;
775
801
services. signed_entity_type_lock = signed_entity_type_lock. clone ( ) ;
776
- let runner = init_runner ( Some ( services) , None ) . await ;
802
+ services
803
+ . stake_store
804
+ . save_stakes (
805
+ epoch. offset_to_signer_retrieval_epoch ( ) . unwrap ( ) ,
806
+ stake_distribution,
807
+ )
808
+ . await
809
+ . expect ( "save_stakes should not fail" ) ;
777
810
778
811
let protocol_initializer = MithrilProtocolInitializerBuilder :: build (
779
812
& 100 ,
@@ -793,6 +826,16 @@ mod tests {
793
826
. await
794
827
. expect ( "save_protocol_initializer should not fail" ) ;
795
828
829
+ let runner = init_runner ( Some ( services) , None ) . await ;
830
+ // inform epoch settings
831
+ let epoch_settings = EpochSettings {
832
+ epoch,
833
+ current_signers,
834
+ next_signers,
835
+ ..fake_data:: epoch_settings ( ) . clone ( )
836
+ } ;
837
+ runner. inform_epoch_settings ( epoch_settings) . await . unwrap ( ) ;
838
+
796
839
let can_i_sign_result = runner. can_i_sign ( & pending_certificate) . await . unwrap ( ) ;
797
840
assert ! ( can_i_sign_result) ;
798
841
0 commit comments