diff --git a/frame/bridge/relay-authorities/src/lib.rs b/frame/bridge/relay-authorities/src/lib.rs index 96dfe4323c..6259a74ba1 100644 --- a/frame/bridge/relay-authorities/src/lib.rs +++ b/frame/bridge/relay-authorities/src/lib.rs @@ -516,9 +516,10 @@ decl_module! { signatures.push((old_authority, signature)); - if Perbill::from_rational_approximation(signatures.len() as u32 + 1, old_authorities.len() as _) + if Perbill::from_rational_approximation(signatures.len() as u32, old_authorities.len() as _) >= T::SignThreshold::get() { + Self::wait_target_chain_authorities_change(); Self::deposit_event(RawEvent::AuthoritiesSetSigned( >::get(), >::get() @@ -527,7 +528,6 @@ decl_module! { .collect(), signatures )); - Self::wait_target_chain_authorities_change(); } else { >::put((message, signatures)); } diff --git a/frame/bridge/relay-authorities/src/test.rs b/frame/bridge/relay-authorities/src/test.rs index 4d3356e3f1..b9b7e73b8b 100644 --- a/frame/bridge/relay-authorities/src/test.rs +++ b/frame/bridge/relay-authorities/src/test.rs @@ -270,5 +270,33 @@ fn authorities_set_signed_event_should_work() { vec![(9, [0; 65])] ))] ); + + RelayAuthorities::finish_authorities_change(); + + assert_ok!(request_authority(2)); + assert_ok!(RelayAuthorities::add_authority(Origin::root(), 2)); + + events(); + + assert_ok!(RelayAuthorities::submit_signed_authorities( + Origin::signed(9), + [0; 65] + )); + // Not enough signatures, `1 / 2 < 60%` + assert!(relay_authorities_events().is_empty()); + assert_ok!(RelayAuthorities::submit_signed_authorities( + Origin::signed(1), + [0; 65] + )); + + // Enough signatures, `2 / 2 > 60%` + assert_eq!( + relay_authorities_events(), + vec![Event::relay_authorities(RawEvent::AuthoritiesSetSigned( + 1, + vec![Default::default(), Default::default(), Default::default()], + vec![(9, [0; 65]), (1, [0; 65])] + ))] + ); }); }