"OR gate" for EnsureOrigin (#6237)

* 'OR gate' for EnsureOrigin.

* Formatting.

* More formatting.

* Add docstring; Update 'Success' type.

* Bump runtime impl_version.

* Fix successful_origin.

* Add either into std feature list.

* Update docs.
This commit is contained in:
Shaopeng Wang
2020-06-10 21:11:26 +12:00
committed by GitHub
parent 2729a48893
commit ccdac645c8
11 changed files with 91 additions and 63 deletions
+7 -19
View File
@@ -28,7 +28,7 @@ use frame_support::{
decl_module, decl_storage, decl_event, decl_error,
traits::{ChangeMembers, InitializeMembers, EnsureOrigin},
};
use frame_system::{self as system, ensure_root, ensure_signed};
use frame_system::{self as system, ensure_signed};
pub trait Trait<I=DefaultInstance>: frame_system::Trait {
/// The overarching event type.
@@ -120,9 +120,7 @@ decl_module! {
/// May only be called from `AddOrigin` or root.
#[weight = 50_000_000]
pub fn add_member(origin, who: T::AccountId) {
T::AddOrigin::try_origin(origin)
.map(|_| ())
.or_else(ensure_root)?;
T::AddOrigin::ensure_origin(origin)?;
let mut members = <Members<T, I>>::get();
let location = members.binary_search(&who).err().ok_or(Error::<T, I>::AlreadyMember)?;
@@ -139,9 +137,7 @@ decl_module! {
/// May only be called from `RemoveOrigin` or root.
#[weight = 50_000_000]
pub fn remove_member(origin, who: T::AccountId) {
T::RemoveOrigin::try_origin(origin)
.map(|_| ())
.or_else(ensure_root)?;
T::RemoveOrigin::ensure_origin(origin)?;
let mut members = <Members<T, I>>::get();
let location = members.binary_search(&who).ok().ok_or(Error::<T, I>::NotMember)?;
@@ -161,9 +157,7 @@ decl_module! {
/// Prime membership is *not* passed from `remove` to `add`, if extant.
#[weight = 50_000_000]
pub fn swap_member(origin, remove: T::AccountId, add: T::AccountId) {
T::SwapOrigin::try_origin(origin)
.map(|_| ())
.or_else(ensure_root)?;
T::SwapOrigin::ensure_origin(origin)?;
if remove == add { return Ok(()) }
@@ -190,9 +184,7 @@ decl_module! {
/// May only be called from `ResetOrigin` or root.
#[weight = 50_000_000]
pub fn reset_members(origin, members: Vec<T::AccountId>) {
T::ResetOrigin::try_origin(origin)
.map(|_| ())
.or_else(ensure_root)?;
T::ResetOrigin::ensure_origin(origin)?;
let mut members = members;
members.sort();
@@ -241,9 +233,7 @@ decl_module! {
/// Set the prime member. Must be a current member.
#[weight = 50_000_000]
pub fn set_prime(origin, who: T::AccountId) {
T::PrimeOrigin::try_origin(origin)
.map(|_| ())
.or_else(ensure_root)?;
T::PrimeOrigin::ensure_origin(origin)?;
Self::members().binary_search(&who).ok().ok_or(Error::<T, I>::NotMember)?;
Prime::<T, I>::put(&who);
T::MembershipChanged::set_prime(Some(who));
@@ -252,9 +242,7 @@ decl_module! {
/// Remove the prime member if it exists.
#[weight = 50_000_000]
pub fn clear_prime(origin) {
T::PrimeOrigin::try_origin(origin)
.map(|_| ())
.or_else(ensure_root)?;
T::PrimeOrigin::ensure_origin(origin)?;
Prime::<T, I>::kill();
T::MembershipChanged::set_prime(None);
}