BREAKING - Try-runtime: Use proper error types (#13993)

* Try-state: DispatchResult as return type

* try_state for the rest of the pallets

* pre_upgrade

* post_upgrade

* try_runtime_upgrade

* fixes

* bags-list fix

* fix

* update test

* warning fix

* ...

* final fixes 🤞

* warning..

* frame-support

* warnings

* Update frame/staking/src/migrations.rs

Co-authored-by: Liam Aharon <liam.aharon@hotmail.com>

* fix

* fix warning

* nit fix

* merge fixes

* small fix

* should be good now

* missed these ones

* introduce TryRuntimeError and TryRuntimeResult

* fixes

* fix

* removed TryRuntimeResult & made some fixes

* fix testsg

* tests passing

* unnecessary imports

* Update frame/assets/src/migration.rs

Co-authored-by: Keith Yeung <kungfukeith11@gmail.com>

---------

Co-authored-by: Liam Aharon <liam.aharon@hotmail.com>
Co-authored-by: Keith Yeung <kungfukeith11@gmail.com>
This commit is contained in:
Sergej Sakac
2023-05-23 08:56:10 +02:00
committed by GitHub
parent 918d1ef80d
commit df87bae1a9
34 changed files with 419 additions and 276 deletions
+19 -14
View File
@@ -115,6 +115,9 @@ use sp_runtime::{
};
use sp_std::{cmp::Ordering, prelude::*};
#[cfg(any(feature = "try-runtime", test))]
use sp_runtime::TryRuntimeError;
mod benchmarking;
pub mod weights;
pub use weights::WeightInfo;
@@ -327,7 +330,7 @@ pub mod pallet {
}
#[cfg(feature = "try-runtime")]
fn try_state(_n: T::BlockNumber) -> Result<(), &'static str> {
fn try_state(_n: T::BlockNumber) -> Result<(), TryRuntimeError> {
Self::do_try_state()
}
}
@@ -1193,7 +1196,7 @@ impl<T: Config> ContainsLengthBound for Pallet<T> {
#[cfg(any(feature = "try-runtime", test))]
impl<T: Config> Pallet<T> {
fn do_try_state() -> Result<(), &'static str> {
fn do_try_state() -> Result<(), TryRuntimeError> {
Self::try_state_members()?;
Self::try_state_runners_up()?;
Self::try_state_candidates()?;
@@ -1204,20 +1207,20 @@ impl<T: Config> Pallet<T> {
/// [`Members`] state checks. Invariants:
/// - Members are always sorted based on account ID.
fn try_state_members() -> Result<(), &'static str> {
fn try_state_members() -> Result<(), TryRuntimeError> {
let mut members = Members::<T>::get().clone();
members.sort_by_key(|m| m.who.clone());
if Members::<T>::get() == members {
Ok(())
} else {
Err("try_state checks: Members must be always sorted by account ID")
Err("try_state checks: Members must be always sorted by account ID".into())
}
}
// [`RunnersUp`] state checks. Invariants:
// - Elements are sorted based on weight (worst to best).
fn try_state_runners_up() -> Result<(), &'static str> {
fn try_state_runners_up() -> Result<(), TryRuntimeError> {
let mut sorted = RunnersUp::<T>::get();
// worst stake first
sorted.sort_by(|a, b| a.stake.cmp(&b.stake));
@@ -1225,27 +1228,28 @@ impl<T: Config> Pallet<T> {
if RunnersUp::<T>::get() == sorted {
Ok(())
} else {
Err("try_state checks: Runners Up must always be sorted by stake (worst to best)")
Err("try_state checks: Runners Up must always be sorted by stake (worst to best)"
.into())
}
}
// [`Candidates`] state checks. Invariants:
// - Always sorted based on account ID.
fn try_state_candidates() -> Result<(), &'static str> {
fn try_state_candidates() -> Result<(), TryRuntimeError> {
let mut candidates = Candidates::<T>::get().clone();
candidates.sort_by_key(|(c, _)| c.clone());
if Candidates::<T>::get() == candidates {
Ok(())
} else {
Err("try_state checks: Candidates must be always sorted by account ID")
Err("try_state checks: Candidates must be always sorted by account ID".into())
}
}
// [`Candidates`] and [`RunnersUp`] state checks. Invariants:
// - Candidates and runners-ups sets are disjoint.
fn try_state_candidates_runners_up_disjoint() -> Result<(), &'static str> {
fn try_state_candidates_runners_up_disjoint() -> Result<(), TryRuntimeError> {
match Self::intersects(&Self::candidates_ids(), &Self::runners_up_ids()) {
true => Err("Candidates and runners up sets should always be disjoint"),
true => Err("Candidates and runners up sets should always be disjoint".into()),
false => Ok(()),
}
}
@@ -1253,11 +1257,12 @@ impl<T: Config> Pallet<T> {
// [`Members`], [`Candidates`] and [`RunnersUp`] state checks. Invariants:
// - Members and candidates sets are disjoint;
// - Members and runners-ups sets are disjoint.
fn try_state_members_disjoint() -> Result<(), &'static str> {
fn try_state_members_disjoint() -> Result<(), TryRuntimeError> {
match Self::intersects(&Pallet::<T>::members_ids(), &Self::candidates_ids()) &&
Self::intersects(&Pallet::<T>::members_ids(), &Self::runners_up_ids())
{
true => Err("Members set should be disjoint from candidates and runners-up sets"),
true =>
Err("Members set should be disjoint from candidates and runners-up sets".into()),
false => Ok(()),
}
}
@@ -1265,14 +1270,14 @@ impl<T: Config> Pallet<T> {
// [`Members`], [`RunnersUp`] and approval stake state checks. Invariants:
// - Selected members should have approval stake;
// - Selected RunnersUp should have approval stake.
fn try_state_members_approval_stake() -> Result<(), &'static str> {
fn try_state_members_approval_stake() -> Result<(), TryRuntimeError> {
match Members::<T>::get()
.iter()
.chain(RunnersUp::<T>::get().iter())
.all(|s| s.stake != BalanceOf::<T>::zero())
{
true => Ok(()),
false => Err("Members and RunnersUp must have approval stake"),
false => Err("Members and RunnersUp must have approval stake".into()),
}
}