diff --git a/cumulus/pallets/collator-selection/src/lib.rs b/cumulus/pallets/collator-selection/src/lib.rs index 53a619442b..fab70a3d0d 100644 --- a/cumulus/pallets/collator-selection/src/lib.rs +++ b/cumulus/pallets/collator-selection/src/lib.rs @@ -368,7 +368,7 @@ pub mod pallet { let current_count = >::try_mutate(|candidates| -> Result { - if candidates.into_iter().any(|candidate| candidate.who == who) { + if candidates.iter().any(|candidate| candidate.who == who) { Err(Error::::AlreadyCandidate)? } else { T::Currency::reserve(&who, deposit)?; @@ -409,6 +409,7 @@ pub mod pallet { pub fn account_id() -> T::AccountId { T::PotId::get().into_account() } + /// Removes a candidate if they exist and sends them back their deposit fn try_remove_candidate(who: &T::AccountId) -> Result { let current_count = @@ -417,8 +418,8 @@ pub mod pallet { .iter() .position(|candidate| candidate.who == *who) .ok_or(Error::::NotCandidate)?; - T::Currency::unreserve(&who, candidates[index].deposit); - candidates.remove(index); + let candidate = candidates.remove(index); + T::Currency::unreserve(who, candidate.deposit); >::remove(who.clone()); Ok(candidates.len()) })?; @@ -431,16 +432,18 @@ pub mod pallet { /// This is done on the fly, as frequent as we are told to do so, as the session manager. pub fn assemble_collators(candidates: Vec) -> Vec { let mut collators = Self::invulnerables(); - collators.extend(candidates.into_iter().collect::>()); + collators.extend(candidates); collators } - /// Kicks out and candidates that did not produce a block in the kick threshold. + + /// Kicks out candidates that did not produce a block in the kick threshold + /// and refund their deposits. pub fn kick_stale_candidates( candidates: Vec>>, ) -> Vec { let now = frame_system::Pallet::::block_number(); let kick_threshold = T::KickThreshold::get(); - let new_candidates = candidates + candidates .into_iter() .filter_map(|c| { let last_block = >::get(c.who.clone()); @@ -458,8 +461,7 @@ pub mod pallet { None } }) - .collect::>(); - new_candidates + .collect() } } @@ -503,9 +505,8 @@ pub mod pallet { let candidates = Self::candidates(); let candidates_len_before = candidates.len(); let active_candidates = Self::kick_stale_candidates(candidates); - let active_candidates_len = active_candidates.len(); + let removed = candidates_len_before - active_candidates.len(); let result = Self::assemble_collators(active_candidates); - let removed = candidates_len_before - active_candidates_len; frame_system::Pallet::::register_extra_weight_unchecked( T::WeightInfo::new_session(candidates_len_before as u32, removed as u32),