@@ -214,23 +214,24 @@ where
214214 let delayed_round = now - 1 ;
215215 let relayer_sets = <DelayedRelayerSets < T > >:: take ( delayed_round) ;
216216 relayer_sets. into_iter ( ) . for_each ( |r| {
217- Self :: replace_bonded_relayer ( & r. old , & r. new ) . expect ( "Replacement must success" ) ;
218- T :: SocketQueue :: replace_authority ( & r. old , & r. new ) ;
219- T :: RegistrationPool :: replace_authority ( & r. old , & r. new ) ;
220-
221- // replace member of RelayExecutive (only if it's the old member)
222- let mut members = Members :: < T , Instance3 > :: get ( ) ;
223- if let Some ( location) = members. binary_search ( & r. old ) . ok ( ) {
224- if members. binary_search ( & r. new ) . is_err ( ) {
225- members[ location] = r. new . clone ( ) ;
226- members. sort ( ) ;
227-
228- Members :: < T , Instance3 > :: put ( members. clone ( ) ) ;
229- T :: MembershipChanged :: change_members_sorted ( & [ r. new . clone ( ) ] , & [ r. old . clone ( ) ] , & members[ ..] ) ;
230-
231- if Prime :: < T , Instance3 > :: get ( ) == Some ( r. old ) {
232- Prime :: < T , Instance3 > :: put ( & r. new ) ;
233- T :: MembershipChanged :: set_prime ( Some ( r. new ) ) ;
217+ if Self :: replace_bonded_relayer ( & r. old , & r. new ) . expect ( "Replacement must success" ) {
218+ T :: SocketQueue :: replace_authority ( & r. old , & r. new ) ;
219+ T :: RegistrationPool :: replace_authority ( & r. old , & r. new ) ;
220+
221+ // replace member of RelayExecutive (only if it's the old member)
222+ let mut members = Members :: < T , Instance3 > :: get ( ) ;
223+ if let Some ( location) = members. binary_search ( & r. old ) . ok ( ) {
224+ if members. binary_search ( & r. new ) . is_err ( ) {
225+ members[ location] = r. new . clone ( ) ;
226+ members. sort ( ) ;
227+
228+ Members :: < T , Instance3 > :: put ( members. clone ( ) ) ;
229+ T :: MembershipChanged :: change_members_sorted ( & [ r. new . clone ( ) ] , & [ r. old . clone ( ) ] , & members[ ..] ) ;
230+
231+ if Prime :: < T , Instance3 > :: get ( ) == Some ( r. old ) {
232+ Prime :: < T , Instance3 > :: put ( & r. new ) ;
233+ T :: MembershipChanged :: set_prime ( Some ( r. new ) ) ;
234+ }
234235 }
235236 }
236237 }
@@ -277,6 +278,14 @@ impl<T: Config> Pallet<T> {
277278 ) -> Result < ( ) , DispatchError > {
278279 ensure ! ( !Self :: is_relayer( relayer) , Error :: <T >:: RelayerAlreadyJoined ) ;
279280 ensure ! ( !<BondedController <T >>:: contains_key( controller) , Error :: <T >:: RelayerAlreadyBonded ) ;
281+
282+ let round = Round :: < T > :: get ( ) ;
283+ let relayer_sets = DelayedRelayerSets :: < T > :: get ( round) ;
284+ ensure ! (
285+ !relayer_sets. into_iter( ) . any( |r| r. new == * relayer) ,
286+ Error :: <T >:: AlreadyRelayerSetRequested
287+ ) ;
288+
280289 Ok ( ( ) . into ( ) )
281290 }
282291
@@ -316,6 +325,11 @@ impl<T: Config> Pallet<T> {
316325 pub fn add_to_relayer_sets ( old : T :: AccountId , new : T :: AccountId ) -> DispatchResult {
317326 let round = Round :: < T > :: get ( ) ;
318327 <DelayedRelayerSets < T > >:: try_mutate ( round, |relayer_sets| -> DispatchResult {
328+ ensure ! (
329+ !relayer_sets. into_iter( ) . any( |r| r. old == old || r. new == new) ,
330+ Error :: <T >:: AlreadyRelayerSetRequested
331+ ) ;
332+
319333 Ok ( relayer_sets
320334 . try_push ( DelayedRelayerSet :: new ( old, new) )
321335 . map_err ( |_| <Error < T > >:: TooManyDelayedRelayers ) ?)
0 commit comments