More decl_error! migrations (#4427)

* Update assets to `decl_error`

* Update aura to `decl_error`

* Update authority discovery to `decl_error`

* Update collective to `decl_error`

* Update evm to `decl_error!`

* Fix error with replace

* Revert "Update authority discovery to `decl_error`"

This reverts commit 26e8f3c56656963d847e984c6f2c8e1f88014899.

* Revert "Update aura to `decl_error`"

This reverts commit 8f17c44ca8375a4a755710aaab7ad4d9522c4376.

* Update democracy to `decl_error`

* Update finality-tracker to `decl_error`

* Update grandpa to `decl_error`

* `assert` to `ensure` in dispatchable function
This commit is contained in:
Shawn Tabrizi
2019-12-18 10:50:21 +01:00
committed by Gavin Wood
parent 9550c845f3
commit 57c19bcf4e
6 changed files with 323 additions and 194 deletions
+40 -21
View File
@@ -26,12 +26,12 @@
use sp_std::{prelude::*, result};
use sp_core::u32_trait::Value as U32;
use sp_runtime::RuntimeDebug;
use sp_runtime::traits::{Hash, EnsureOrigin};
use sp_runtime::traits::{Hash, EnsureOrigin, ModuleDispatchError};
use frame_support::weights::SimpleDispatchInfo;
use frame_support::{
dispatch::{Dispatchable, Parameter}, codec::{Encode, Decode},
traits::{ChangeMembers, InitializeMembers}, decl_module, decl_event,
decl_storage, ensure,
decl_storage, decl_error, ensure,
};
use frame_system::{self as system, ensure_signed, ensure_root};
@@ -102,7 +102,7 @@ decl_storage! {
}
}
decl_event!(
decl_event! {
pub enum Event<T, I=DefaultInstance> where
<T as frame_system::Trait>::Hash,
<T as frame_system::Trait>::AccountId,
@@ -122,13 +122,32 @@ decl_event!(
/// A single member did some action; `bool` is true if returned without error.
MemberExecuted(Hash, bool),
}
);
}
decl_error! {
pub enum Error {
/// Account is not a member
NotMember,
/// Duplicate proposals not allowed
DuplicateProposal,
/// Proposal must exist
ProposalMissing,
/// Mismatched index
WrongIndex,
/// Duplicate vote ignored
DuplicateVote,
/// Members are already initialized!
AlreadyInitialized,
}
}
// Note: this module is not benchmarked. The weights are obtained based on the similarity of the
// executed logic with other democracy function. Note that councillor operations are assigned to the
// operational class.
decl_module! {
pub struct Module<T: Trait<I>, I: Instance=DefaultInstance> for enum Call where origin: <T as frame_system::Trait>::Origin {
type Error = Error;
fn deposit_event() = default;
/// Set the collective's membership manually to `new_members`. Be nice to the chain and
@@ -137,7 +156,7 @@ decl_module! {
/// Requires root origin.
#[weight = SimpleDispatchInfo::FixedOperational(100_000)]
fn set_members(origin, new_members: Vec<T::AccountId>) {
ensure_root(origin)?;
ensure_root(origin).map_err(|e| e.as_str())?;
let mut new_members = new_members;
new_members.sort();
<Members<T, I>>::mutate(|m| {
@@ -151,8 +170,8 @@ decl_module! {
/// Origin must be a member of the collective.
#[weight = SimpleDispatchInfo::FixedOperational(100_000)]
fn execute(origin, proposal: Box<<T as Trait<I>>::Proposal>) {
let who = ensure_signed(origin)?;
ensure!(Self::is_member(&who), "proposer not a member");
let who = ensure_signed(origin).map_err(|e| e.as_str())?;
ensure!(Self::is_member(&who), Error::NotMember);
let proposal_hash = T::Hashing::hash_of(&proposal);
let ok = proposal.dispatch(RawOrigin::Member(who).into()).is_ok();
@@ -165,12 +184,12 @@ decl_module! {
/// # </weight>
#[weight = SimpleDispatchInfo::FixedOperational(5_000_000)]
fn propose(origin, #[compact] threshold: MemberCount, proposal: Box<<T as Trait<I>>::Proposal>) {
let who = ensure_signed(origin)?;
ensure!(Self::is_member(&who), "proposer not a member");
let who = ensure_signed(origin).map_err(|e| e.as_str())?;
ensure!(Self::is_member(&who), Error::NotMember);
let proposal_hash = T::Hashing::hash_of(&proposal);
ensure!(!<ProposalOf<T, I>>::exists(proposal_hash), "duplicate proposals not allowed");
ensure!(!<ProposalOf<T, I>>::exists(proposal_hash), Error::DuplicateProposal);
if threshold < 2 {
let seats = Self::members().len() as MemberCount;
@@ -194,11 +213,11 @@ decl_module! {
/// # </weight>
#[weight = SimpleDispatchInfo::FixedOperational(200_000)]
fn vote(origin, proposal: T::Hash, #[compact] index: ProposalIndex, approve: bool) {
let who = ensure_signed(origin)?;
ensure!(Self::is_member(&who), "voter not a member");
let who = ensure_signed(origin).map_err(|e| e.as_str())?;
ensure!(Self::is_member(&who), Error::NotMember);
let mut voting = Self::voting(&proposal).ok_or("proposal must exist")?;
ensure!(voting.index == index, "mismatched index");
let mut voting = Self::voting(&proposal).ok_or(Error::ProposalMissing)?;
ensure!(voting.index == index, Error::WrongIndex);
let position_yes = voting.ayes.iter().position(|a| a == &who);
let position_no = voting.nays.iter().position(|a| a == &who);
@@ -207,7 +226,7 @@ decl_module! {
if position_yes.is_none() {
voting.ayes.push(who.clone());
} else {
return Err("duplicate vote ignored")
return Err(Error::DuplicateVote)
}
if let Some(pos) = position_no {
voting.nays.swap_remove(pos);
@@ -216,7 +235,7 @@ decl_module! {
if position_no.is_none() {
voting.nays.push(who.clone());
} else {
return Err("duplicate vote ignored")
return Err(Error::DuplicateVote)
}
if let Some(pos) = position_yes {
voting.ayes.swap_remove(pos);
@@ -565,7 +584,7 @@ mod tests {
let proposal = make_proposal(42);
assert_noop!(
Collective::propose(Origin::signed(42), 3, Box::new(proposal.clone())),
"proposer not a member"
Error::NotMember
);
});
}
@@ -579,7 +598,7 @@ mod tests {
assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone())));
assert_noop!(
Collective::vote(Origin::signed(42), hash.clone(), 0, true),
"voter not a member",
Error::NotMember,
);
});
}
@@ -593,7 +612,7 @@ mod tests {
assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone())));
assert_noop!(
Collective::vote(Origin::signed(2), hash.clone(), 1, true),
"mismatched index",
Error::WrongIndex,
);
});
}
@@ -611,7 +630,7 @@ mod tests {
);
assert_noop!(
Collective::vote(Origin::signed(1), hash.clone(), 0, true),
"duplicate vote ignored",
Error::DuplicateVote,
);
assert_ok!(Collective::vote(Origin::signed(1), hash.clone(), 0, false));
assert_eq!(
@@ -620,7 +639,7 @@ mod tests {
);
assert_noop!(
Collective::vote(Origin::signed(1), hash.clone(), 0, false),
"duplicate vote ignored",
Error::DuplicateVote,
);
assert_eq!(System::events(), vec![