Skip to content

Commit 0bfeb0a

Browse files
authored
Merge pull request #161 from bifrost-platform/hotfix-04
hotfix
2 parents 0cda88b + f5e9911 commit 0bfeb0a

File tree

5 files changed

+53
-24
lines changed

5 files changed

+53
-24
lines changed

pallets/bfc-staking/src/lib.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,12 @@ impl<
739739
self.commission = commission;
740740
}
741741

742-
pub fn reset_commission<T: Config>(&mut self) {
742+
pub fn reset_commission<T: Config>(&mut self, who: &T::AccountId) {
743+
let round = <Round<T>>::get();
744+
let mut commission_sets = <DelayedCommissionSets<T>>::get(round.current_round_index);
745+
commission_sets.retain(|c| c.who != *who);
746+
<DelayedCommissionSets<T>>::insert(round.current_round_index, commission_sets);
747+
743748
if self.tier == TierType::Full {
744749
self.commission = <DefaultFullValidatorCommission<T>>::get();
745750
} else {

pallets/bfc-staking/src/pallet/impls.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,8 @@ impl<T: Config> Pallet<T> {
444444
// replace `SelectedCandidates`
445445
if candidate.is_selected {
446446
Self::replace_from_selected_candidates(&c.old, &c.new, candidate.tier);
447+
}
448+
if candidate.tier == TierType::Full {
447449
T::RelayManager::replace_bonded_controller(c.old.clone(), c.new.clone());
448450
}
449451
// replace `TopNominations`
@@ -465,8 +467,10 @@ impl<T: Config> Pallet<T> {
465467
<BottomNominations<T>>::insert(&c.new, bottom_nominations);
466468
}
467469
// replace `AwardedPts`
468-
let points = <AwardedPts<T>>::take(now, &c.old);
469-
<AwardedPts<T>>::insert(now, &c.new, points);
470+
let current_points = <AwardedPts<T>>::take(now, &c.old);
471+
<AwardedPts<T>>::insert(now, &c.new, current_points);
472+
let previous_points = <AwardedPts<T>>::take(delayed_round, &c.old);
473+
<AwardedPts<T>>::insert(delayed_round, &c.new, previous_points);
470474
// replace `AtStake`
471475
let at_stake = <AtStake<T>>::take(now, &c.old);
472476
<AtStake<T>>::insert(now, &c.new, at_stake);
@@ -951,9 +955,10 @@ impl<T: Config> Pallet<T> {
951955
// snapshot total stake and storage state
952956
<Staked<T>>::insert(now, Total::<T>::get());
953957
<TotalAtStake<T>>::remove(now - 1);
958+
// handle delayed commission update requests
959+
Self::handle_delayed_commission_sets(now);
954960
// handle delayed controller update requests
955961
Self::handle_delayed_controller_sets(now);
956-
Self::handle_delayed_commission_sets(now);
957962

958963
Self::deposit_event(Event::NewRound {
959964
starting_block: round.first_round_block,

pallets/bfc-staking/src/pallet/mod.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1085,7 +1085,7 @@ pub mod pallet {
10851085
T::RelayManager::leave_relayers(&controller);
10861086
}
10871087
state.tier = new;
1088-
state.reset_commission::<T>();
1088+
state.reset_commission::<T>(&controller);
10891089
<CandidateInfo<T>>::insert(&controller, state.clone());
10901090
Self::update_active(&controller, state.voting_power)?;
10911091
Ok(().into())
@@ -1167,6 +1167,14 @@ pub mod pallet {
11671167
ensure!(!<BondedStash<T>>::contains_key(&stash), Error::<T>::AlreadyBonded);
11681168
ensure!(!<CandidateInfo<T>>::contains_key(&controller), Error::<T>::AlreadyPaired);
11691169

1170+
// check if the controller account is already scheduled for update
1171+
let round = Round::<T>::get();
1172+
let controller_sets = DelayedControllerSets::<T>::get(round.current_round_index);
1173+
ensure!(
1174+
!controller_sets.into_iter().any(|c| c.new == controller),
1175+
Error::<T>::AlreadyControllerSetRequested
1176+
);
1177+
11701178
ensure!(!Self::is_nominator(&controller), Error::<T>::NominatorExists);
11711179
let mut candidates = <CandidatePool<T>>::get();
11721180
let old_count = candidates.len() as u32;

pallets/btc-socket-queue/src/pallet/impls.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,15 @@ impl<T: Config> SocketQueueManager<T::AccountId> for Pallet<T> {
106106

107107
fn replace_authority(old: &T::AccountId, new: &T::AccountId) {
108108
// replace authority in pending requests
109-
<PendingRequests<T>>::iter().for_each(|(_, mut request)| {
109+
<PendingRequests<T>>::iter().for_each(|(txid, mut request)| {
110110
request.replace_authority(old, new);
111+
<PendingRequests<T>>::insert(&txid, request);
111112
});
112113
// replace authority in rollback requests (if not approved yet)
113-
<RollbackRequests<T>>::iter().for_each(|(_, mut request)| {
114+
<RollbackRequests<T>>::iter().for_each(|(txid, mut request)| {
114115
if !request.is_approved {
115116
request.replace_authority(old, new);
117+
<RollbackRequests<T>>::insert(&txid, request);
116118
}
117119
});
118120
}

pallets/relay-manager/src/pallet/impls.rs

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

0 commit comments

Comments
 (0)