From 6ea542c0f738878f2ad6fdab0018575d577f6b97 Mon Sep 17 00:00:00 2001 From: Qinxuan Chen Date: Thu, 10 Jun 2021 17:13:06 +0800 Subject: [PATCH] improve some code (#22) Signed-off-by: koushiro --- frame/alliance/Cargo.toml | 12 +- frame/alliance/src/lib.rs | 338 ++++++++++++++++++++++-------------- frame/alliance/src/tests.rs | 10 +- 3 files changed, 220 insertions(+), 140 deletions(-) diff --git a/frame/alliance/Cargo.toml b/frame/alliance/Cargo.toml index b1cbe917115e7..28bb93cf78aad 100644 --- a/frame/alliance/Cargo.toml +++ b/frame/alliance/Cargo.toml @@ -15,14 +15,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] cid = { version = "0.7.0", default-features = false, features = ["scale-codec"]} codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false, features = ["derive"] } +log = { version = "0.4.14", default-features = false } + sp-core = { version = "3.0.0", default-features = false, path = "../../primitives/core" } -sp-std = { version = "3.0.0", default-features = false, path = "../../primitives/std" } sp-io = { version = "3.0.0", default-features = false, path = "../../primitives/io" } sp-runtime = { version = "3.0.0", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "3.0.0", default-features = false, path = "../../primitives/std" } + frame-benchmarking = { version = "3.1.0", default-features = false, path = "../benchmarking", optional = true } frame-support = { version = "3.0.0", default-features = false, path = "../support" } frame-system = { version = "3.0.0", default-features = false, path = "../system" } -log = { version = "0.4.14", default-features = false } [dev-dependencies] multihash = "0.14.0" @@ -34,13 +36,13 @@ default = ["std"] std = [ "cid/std", "codec/std", + "log/std", "sp-core/std", - "sp-std/std", "sp-io/std", - "frame-support/std", "sp-runtime/std", + "sp-std/std", + "frame-support/std", "frame-system/std", - "log/std", ] runtime-benchmarks = [ "frame-benchmarking", diff --git a/frame/alliance/src/lib.rs b/frame/alliance/src/lib.rs index c02a59bba28cb..d4b7bd948c404 100644 --- a/frame/alliance/src/lib.rs +++ b/frame/alliance/src/lib.rs @@ -17,6 +17,17 @@ #![cfg_attr(not(feature = "std"), no_std)] +#[cfg(test)] +pub mod mock; +#[cfg(test)] +mod tests; + +use sp_runtime::{ + traits::{Hash, StaticLookup, Zero}, + RuntimeDebug, +}; +use sp_std::prelude::*; + use frame_support::{ codec::{Decode, Encode}, dispatch::{DispatchError, DispatchResult, Dispatchable, GetDispatchInfo, PostDispatchInfo}, @@ -27,21 +38,11 @@ use frame_support::{ weights::{Pays, Weight}, }; pub use pallet::*; -use sp_runtime::{ - traits::{Hash, StaticLookup, Zero}, - RuntimeDebug, -}; -use sp_std::prelude::*; - -#[cfg(test)] -pub mod mock; -#[cfg(test)] -mod tests; /// Simple index type for proposal counting. pub type ProposalIndex = u32; -type URL = Vec; +type Url = Vec; type BalanceOf = <>::Currency as Currency<::AccountId>>::Balance; @@ -63,7 +64,7 @@ pub enum MemberRole { #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)] pub enum UserIdentity { - Website(URL), + Website(Url), AccountId(AccountId), } @@ -120,39 +121,39 @@ pub mod pallet { #[pallet::error] pub enum Error { + FoundersAlreadyInitialized, AlreadyCandidate, - AlreadyMember, - AlreadyElevated, - AlreadyBlacklist, NotCandidate, + AlreadyMember, + NotMember, NotAlly, NotFounder, - NotMember, - NotFounderOrFellow, + NotVotableMember, + AlreadyElevated, + AlreadyInBlacklist, + NotInBlacklist, KickingMember, InsufficientCandidateFunds, - NotBlacklist, NoIdentity, - ProposalMissing, - ProposalNotVetoable, - FoundersAlreadyInitialized, + MissingProposalHash, + NotVetoableProposal, } #[pallet::event] #[pallet::generate_deposit(pub (super) fn deposit_event)] #[pallet::metadata(T::AccountId = "AccountId", T::Balance = "Balance")] pub enum Event, I: 'static = ()> { - RuleSet(cid::Cid), - FoundersInit(Vec), + NewRule(cid::Cid), + NewAnnouncement(cid::Cid), + FoundersInitialized(Vec), CandidateAdded(T::AccountId, Option, Option>), CandidateApproved(T::AccountId), CandidateRejected(T::AccountId), AllyElevated(T::AccountId), - MemberRetire(T::AccountId), + MemberRetired(T::AccountId), MemberKicked(T::AccountId), BlacklistAdded(UserIdentity), BlacklistRemoved(UserIdentity), - NewAnnouncement(cid::Cid), } /// A ipfs cid of the rules of this alliance concerning membership. @@ -204,7 +205,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn website_blacklist)] pub type WebsiteBlacklist, I: 'static = ()> = - StorageValue<_, Vec, ValueQuery>; + StorageValue<_, Vec, ValueQuery>; #[pallet::call] impl, I: 'static> Pallet { @@ -216,16 +217,20 @@ pub mod pallet { origin: OriginFor, proposal: Box<>::Proposal>, ) -> DispatchResult { - let who = ensure_signed(origin)?; - ensure!(Self::is_founder_or_fellow(&who), Error::::NotFounderOrFellow); + let proposor = ensure_signed(origin)?; + ensure!( + Self::is_votable_member(&proposor), + Error::::NotVotableMember + ); let proposal_hash = T::Hashing::hash_of(&proposal); if let Some(Call::kick_member(ref strike)) = proposal.is_sub_type() { let strike = T::Lookup::lookup(strike.clone())?; >::insert(strike, true); } - let threshold = 2 * Self::voteable_member_count() / 3 + 1; - T::ProposalProvider::propose_proposal(who, threshold, *proposal, proposal_hash)?; + + let threshold = 2 * Self::votable_member_count() / 3 + 1; + T::ProposalProvider::propose_proposal(proposor, threshold, *proposal, proposal_hash)?; Ok(()) } @@ -234,21 +239,18 @@ pub mod pallet { /// Must be called by the founders. #[pallet::weight(0)] pub(super) fn veto(origin: OriginFor, proposal_hash: T::Hash) -> DispatchResult { - let who = ensure_signed(origin)?; - ensure!( - Self::is_member(&who, Some(MemberRole::Founder)).is_some(), - Error::::NotFounder - ); + let proposor = ensure_signed(origin)?; + ensure!(Self::is_founder(&proposor), Error::::NotFounder); + let proposal = T::ProposalProvider::proposal_of(proposal_hash); - ensure!(proposal.is_some(), Error::::ProposalMissing); - let veto_rights = match proposal.unwrap().is_sub_type() { - Some(Call::set_rule(..)) | Some(Call::elevate_ally(..)) => true, - _ => false, - }; - ensure!(veto_rights, Error::::ProposalNotVetoable); - - T::ProposalProvider::veto_proposal(proposal_hash); - Ok(()) + ensure!(proposal.is_some(), Error::::MissingProposalHash); + match proposal.expect("proposal must be exist; qed").is_sub_type() { + Some(Call::set_rule(..)) | Some(Call::elevate_ally(..)) => { + T::ProposalProvider::veto_proposal(proposal_hash); + Ok(()) + } + _ => Err(Error::::NotVetoableProposal.into()), + } } #[pallet::weight(0)] @@ -259,10 +261,14 @@ pub mod pallet { proposal_weight_bound: Weight, length_bound: u32, ) -> DispatchResult { - let _ = ensure_signed(origin)?; + let proposor = ensure_signed(origin)?; + ensure!( + Self::is_votable_member(&proposor), + Error::::NotVotableMember + ); let proposal = T::ProposalProvider::proposal_of(proposal_hash); - ensure!(proposal.is_some(), Error::::ProposalMissing); + ensure!(proposal.is_some(), Error::::MissingProposalHash); let (_, pays) = T::ProposalProvider::close_proposal( proposal_hash, @@ -271,7 +277,9 @@ pub mod pallet { length_bound, )?; if Pays::No == pays { - if let Some(Call::kick_member(ref strike)) = proposal.unwrap().is_sub_type() { + if let Some(Call::kick_member(ref strike)) = + proposal.expect("proposal must be exist; qed").is_sub_type() + { let strike = T::Lookup::lookup(strike.clone())?; >::remove(strike); } @@ -287,18 +295,19 @@ pub mod pallet { ) -> DispatchResult { ensure_root(origin)?; ensure!( - >::get(MemberRole::Founder).is_empty(), + !Self::has_member(MemberRole::Founder), Error::::FoundersAlreadyInitialized ); - for founder in founders.iter() { - ensure!(Self::verify_identity(founder), Error::::NoIdentity); + for founder in &founders { + ensure!(Self::has_identity(founder), Error::::NoIdentity); } let mut founders = founders; founders.sort(); T::InitializeMembers::initialize_members(&founders); Members::::insert(&MemberRole::Founder, founders.clone()); - Self::deposit_event(Event::FoundersInit(founders)); + + Self::deposit_event(Event::FoundersInitialized(founders)); Ok(()) } @@ -308,7 +317,8 @@ pub mod pallet { T::SuperMajorityOrigin::ensure_origin(origin)?; Rule::::put(&rule); - Self::deposit_event(Event::RuleSet(rule)); + + Self::deposit_event(Event::NewRule(rule)); Ok(()) } @@ -319,7 +329,8 @@ pub mod pallet { pub(super) fn announce(origin: OriginFor, announcement: cid::Cid) -> DispatchResult { T::SuperMajorityOrigin::ensure_origin(origin)?; - >::get().push(announcement.clone()); + >::get().push(announcement); + Self::deposit_event(Event::NewAnnouncement(announcement)); Ok(()) } @@ -330,17 +341,22 @@ pub mod pallet { #[pallet::weight(0)] pub(super) fn submit_candidacy(origin: OriginFor) -> DispatchResult { let who = ensure_signed(origin)?; - ensure!(!Self::is_account_blacklist(&who), Error::::AlreadyBlacklist); - ensure!(Self::is_member(&who, None).is_none(), Error::::AlreadyMember); + ensure!( + !Self::is_account_blacklist(&who), + Error::::AlreadyInBlacklist + ); ensure!(!Self::is_candidate(&who), Error::::AlreadyCandidate); + ensure!(!Self::is_member(&who), Error::::AlreadyMember); // check user self or parent should has verified identity to reuse display name and website. - ensure!(Self::verify_identity(&who), Error::::NoIdentity); + ensure!(Self::has_identity(&who), Error::::NoIdentity); let deposit = T::CandidateDeposit::get(); T::Currency::reserve(&who, deposit) .map_err(|_| Error::::InsufficientCandidateFunds)?; >::insert(&who, deposit); + Self::add_candidate(&who)?; + Self::deposit_event(Event::CandidateAdded(who, None, Some(deposit))); Ok(()) } @@ -353,22 +369,30 @@ pub mod pallet { #[pallet::weight(0)] pub(super) fn nominate_candidacy( origin: OriginFor, - who: T::AccountId, + who: ::Source, ) -> DispatchResult { let nominator = ensure_signed(origin)?; - ensure!(Self::is_founder_or_fellow(&nominator), Error::::NotFounderOrFellow); - ensure!(!Self::is_account_blacklist(&who), Error::::AlreadyBlacklist); - ensure!(Self::is_member(&who, None).is_none(), Error::::AlreadyMember); + ensure!( + Self::is_votable_member(&nominator), + Error::::NotVotableMember + ); + let who = T::Lookup::lookup(who)?; + ensure!( + !Self::is_account_blacklist(&who), + Error::::AlreadyInBlacklist + ); ensure!(!Self::is_candidate(&who), Error::::AlreadyCandidate); + ensure!(!Self::is_member(&who), Error::::AlreadyMember); // check user self or parent should has verified identity to reuse display name and website. - ensure!(Self::verify_identity(&who), Error::::NoIdentity); + ensure!(Self::has_identity(&who), Error::::NoIdentity); Self::add_candidate(&who)?; + Self::deposit_event(Event::CandidateAdded(who, Some(nominator), None)); Ok(()) } - /// vote a candidate to ally. + /// Approve a `Candidate` to be a `Ally`. #[pallet::weight(0)] pub(super) fn approve_candidate( origin: OriginFor, @@ -376,11 +400,12 @@ pub mod pallet { ) -> DispatchResult { T::SuperMajorityOrigin::ensure_origin(origin)?; let candidate = T::Lookup::lookup(candidate)?; - ensure!(Self::is_member(&candidate, None).is_none(), Error::::AlreadyMember); ensure!(Self::is_candidate(&candidate), Error::::NotCandidate); + ensure!(!Self::is_member(&candidate), Error::::AlreadyMember); Self::remove_candidate(&candidate)?; Self::add_member(&candidate, MemberRole::Ally)?; + Self::deposit_event(Event::CandidateApproved(candidate)); Ok(()) } @@ -394,13 +419,14 @@ pub mod pallet { ) -> DispatchResult { T::SuperMajorityOrigin::ensure_origin(origin)?; let candidate = T::Lookup::lookup(candidate)?; - ensure!(Self::is_member(&candidate, None).is_none(), Error::::AlreadyMember); ensure!(Self::is_candidate(&candidate), Error::::NotCandidate); + ensure!(!Self::is_member(&candidate), Error::::AlreadyMember); Self::remove_candidate(&candidate)?; if let Some(deposit) = DepositOf::::take(&candidate) { T::Slashed::on_unbalanced(T::Currency::slash_reserved(&candidate, deposit).0); } + Self::deposit_event(Event::CandidateRejected(candidate)); Ok(()) } @@ -415,14 +441,15 @@ pub mod pallet { ) -> DispatchResult { T::SuperMajorityOrigin::ensure_origin(origin)?; let ally = T::Lookup::lookup(ally)?; + ensure!(Self::is_ally(&ally), Error::::NotAlly); ensure!( - Self::is_member(&ally, Some(MemberRole::Ally)).is_some(), - Error::::NotAlly + !Self::is_votable_member(&ally), + Error::::AlreadyElevated ); - ensure!(!Self::is_founder_or_fellow(&ally), Error::::AlreadyElevated); Self::remove_member(&ally, MemberRole::Ally)?; Self::add_member(&ally, MemberRole::Fellow)?; + Self::deposit_event(Event::AllyElevated(ally)); Ok(()) } @@ -431,17 +458,19 @@ pub mod pallet { #[pallet::weight(0)] pub(super) fn retire(origin: OriginFor) -> DispatchResult { let who = ensure_signed(origin)?; - let role = Self::is_member(&who, None); - ensure!(role.is_some(), Error::::NotMember); - ensure!(!>::contains_key(&who), Error::::KickingMember); - - Self::remove_member(&who, role.unwrap())?; - if let Some(deposit) = DepositOf::::take(&who) { - let err_amount = T::Currency::unreserve(&who, deposit); - debug_assert!(err_amount.is_zero()); + ensure!(!Self::is_kicking(&who), Error::::KickingMember); + + if let Some(role) = Self::member_role_of(&who) { + Self::remove_member(&who, role)?; + if let Some(deposit) = DepositOf::::take(&who) { + let err_amount = T::Currency::unreserve(&who, deposit); + debug_assert!(err_amount.is_zero()); + } + Self::deposit_event(Event::MemberRetired(who)); + Ok(()) + } else { + Err(Error::::NotMember.into()) } - Self::deposit_event(Event::MemberRetire(who)); - Ok(()) } /// Kick a member to outsider with its deposit slashed. @@ -452,15 +481,18 @@ pub mod pallet { ) -> DispatchResult { T::SuperMajorityOrigin::ensure_origin(origin)?; let member = T::Lookup::lookup(who)?; - let role = Self::is_member(&member, None); - ensure!(role.is_some(), Error::::NotMember); + ensure!(!Self::is_kicking(&member), Error::::KickingMember); - Self::remove_member(&member, role.unwrap())?; - if let Some(deposit) = DepositOf::::take(member.clone()) { - T::Slashed::on_unbalanced(T::Currency::slash_reserved(&member, deposit).0); + if let Some(role) = Self::member_role_of(&member) { + Self::remove_member(&member, role)?; + if let Some(deposit) = DepositOf::::take(member.clone()) { + T::Slashed::on_unbalanced(T::Currency::slash_reserved(&member, deposit).0); + } + Self::deposit_event(Event::MemberKicked(member)); + Ok(()) + } else { + Err(Error::::NotMember.into()) } - Self::deposit_event(Event::MemberKicked(member)); - Ok(()) } /// Add websites or addresses into blacklist. @@ -470,9 +502,11 @@ pub mod pallet { infos: Vec>, ) -> DispatchResult { T::SuperMajorityOrigin::ensure_origin(origin)?; - for info in infos { - ensure!(!Self::is_blacklist(&info), Error::::AlreadyBlacklist); + ensure!( + !Self::is_blacklist(&info), + Error::::AlreadyInBlacklist + ); Self::do_add_blacklist(&info)?; Self::deposit_event(Event::BlacklistAdded(info)); } @@ -487,7 +521,7 @@ pub mod pallet { ) -> DispatchResult { T::SuperMajorityOrigin::ensure_origin(origin)?; for info in infos { - ensure!(Self::is_blacklist(&info), Error::::NotBlacklist); + ensure!(Self::is_blacklist(&info), Error::::NotInBlacklist); Self::do_remove_blacklist(&info)?; Self::deposit_event(Event::BlacklistRemoved(info)); } @@ -505,9 +539,11 @@ impl, I: 'static> Pallet { /// Add a candidate to the sorted candidate list. fn add_candidate(who: &T::AccountId) -> DispatchResult { let mut candidates = >::get(); - let insert_position = - candidates.binary_search(who).err().ok_or(Error::::AlreadyCandidate)?; - candidates.insert(insert_position, who.clone()); + let pos = candidates + .binary_search(who) + .err() + .ok_or(Error::::AlreadyCandidate)?; + candidates.insert(pos, who.clone()); Candidates::::put(candidates); Ok(()) } @@ -515,42 +551,67 @@ impl, I: 'static> Pallet { /// Remove a candidate from the candidates list. fn remove_candidate(who: &T::AccountId) -> DispatchResult { let mut candidates = >::get(); - let position = candidates.binary_search(who).ok().ok_or(Error::::NotCandidate)?; - candidates.remove(position); + let pos = candidates + .binary_search(who) + .ok() + .ok_or(Error::::NotCandidate)?; + candidates.remove(pos); Candidates::::put(candidates); Ok(()) } - fn voteable_member_count() -> u32 { - let founders = Members::::get(MemberRole::Founder); - let fellows = Members::::get(MemberRole::Fellow); - (founders.len() + fellows.len()) as u32 + fn has_member(role: MemberRole) -> bool { + !Members::::get(role).is_empty() + } + + fn member_role_of(who: &T::AccountId) -> Option { + Members::::iter() + .find_map(|(r, members)| if members.contains(who) { Some(r) } else { None }) } /// Check if a user is a alliance member. - fn is_member(who: &T::AccountId, role: Option) -> Option { - if let Some(r) = role { - if Members::::get(r).contains(&who) { - role - } else { - None - } - } else { - Members::::iter().find_map(|(r, a)| if a.contains(who) { Some(r) } else { None }) - } + fn is_member(who: &T::AccountId) -> bool { + Self::member_role_of(who).is_some() + } + + fn is_member_of(who: &T::AccountId, role: MemberRole) -> bool { + Members::::get(role).contains(&who) + } + + fn is_founder(who: &T::AccountId) -> bool { + Self::is_member_of(who, MemberRole::Founder) + } + + fn is_fellow(who: &T::AccountId) -> bool { + Self::is_member_of(who, MemberRole::Fellow) + } + + fn is_ally(who: &T::AccountId) -> bool { + Self::is_member_of(who, MemberRole::Ally) } - fn is_founder_or_fellow(who: &T::AccountId) -> bool { - Self::is_member(who, Some(MemberRole::Founder)).is_some() || - Self::is_member(who, Some(MemberRole::Fellow)).is_some() + fn is_votable_member(who: &T::AccountId) -> bool { + Self::is_founder(who) || Self::is_fellow(who) + } + + fn votable_member_count() -> u32 { + let founders = Members::::get(MemberRole::Founder); + let fellows = Members::::get(MemberRole::Fellow); + (founders.len() + fellows.len()) as u32 + } + + fn is_kicking(who: &T::AccountId) -> bool { + >::contains_key(&who) } /// Add a user to the sorted alliance member set. fn add_member(who: &T::AccountId, role: MemberRole) -> DispatchResult { >::mutate(role, |members| -> DispatchResult { - let insert_position = - members.binary_search(&who).err().ok_or(Error::::AlreadyMember)?; - members.insert(insert_position, who.clone()); + let pos = members + .binary_search(&who) + .err() + .ok_or(Error::::AlreadyMember)?; + members.insert(pos, who.clone()); if role == MemberRole::Founder || role == MemberRole::Fellow { T::MembershipChanged::change_members_sorted(&[who.clone()], &[], members); } @@ -561,8 +622,11 @@ impl, I: 'static> Pallet { /// Remove a user from the alliance member set. fn remove_member(who: &T::AccountId, role: MemberRole) -> DispatchResult { >::mutate(role, |members| -> DispatchResult { - let position = members.binary_search(who).ok().ok_or(Error::::NotMember)?; - members.remove(position); + let pos = members + .binary_search(who) + .ok() + .ok_or(Error::::NotMember)?; + members.remove(pos); if role == MemberRole::Founder || role == MemberRole::Fellow { T::MembershipChanged::change_members_sorted(&[], &[who.clone()], members); } @@ -588,18 +652,22 @@ impl, I: 'static> Pallet { match info { UserIdentity::Website(url) => { let mut webs = >::get(); - let insert_position = - webs.binary_search(url).err().ok_or(Error::::AlreadyBlacklist)?; - webs.insert(insert_position, url.to_vec()); + let pos = webs + .binary_search(url) + .err() + .ok_or(Error::::AlreadyInBlacklist)?; + webs.insert(pos, url.to_vec()); WebsiteBlacklist::::put(webs); - }, + } UserIdentity::AccountId(who) => { let mut users = >::get(); - let insert_position = - users.binary_search(who).err().ok_or(Error::::AlreadyBlacklist)?; - users.insert(insert_position, who.clone()); + let pos = users + .binary_search(who) + .err() + .ok_or(Error::::AlreadyInBlacklist)?; + users.insert(pos, who.clone()); AccountBlacklist::::put(users); - }, + } } Ok(()) } @@ -609,25 +677,29 @@ impl, I: 'static> Pallet { match info { UserIdentity::Website(url) => { let mut webs = >::get(); - let insert_position = - webs.binary_search(url).ok().ok_or(Error::::NotBlacklist)?; - webs.remove(insert_position); + let pos = webs + .binary_search(url) + .ok() + .ok_or(Error::::NotInBlacklist)?; + webs.remove(pos); WebsiteBlacklist::::put(webs); - }, + } UserIdentity::AccountId(who) => { let mut users = >::get(); - let insert_position = - users.binary_search(who).ok().ok_or(Error::::NotBlacklist)?; - users.remove(insert_position); + let pos = users + .binary_search(who) + .ok() + .ok_or(Error::::NotInBlacklist)?; + users.remove(pos); AccountBlacklist::::put(users); - }, + } } Ok(()) } - fn verify_identity(who: &T::AccountId) -> bool { - T::IdentityVerifier::verify_identity(who, IDENTITY_FIELD_DISPLAY) && - T::IdentityVerifier::verify_identity(who, IDENTITY_FIELD_WEB) + fn has_identity(who: &T::AccountId) -> bool { + T::IdentityVerifier::verify_identity(who, IDENTITY_FIELD_DISPLAY) + && T::IdentityVerifier::verify_identity(who, IDENTITY_FIELD_WEB) } } diff --git a/frame/alliance/src/tests.rs b/frame/alliance/src/tests.rs index 6f956cde7d3d2..b24ee0e593c61 100644 --- a/frame/alliance/src/tests.rs +++ b/frame/alliance/src/tests.rs @@ -13,7 +13,10 @@ fn propose_works() { let proposal_len: u32 = proposal.using_encoded(|p| p.len() as u32); let hash = BlakeTwo256::hash_of(&proposal); let end = 4; - assert_ok!(Alliance::propose(Origin::signed(1), Box::new(proposal.clone()))); + assert_ok!(Alliance::propose( + Origin::signed(1), + Box::new(proposal.clone()) + )); assert_eq!(*AllianceMotion::proposals(), vec![hash]); assert_eq!(AllianceMotion::proposal_of(&hash), Some(proposal)); }); @@ -26,7 +29,10 @@ fn propose_set_rule_works() { let proposal_len: u32 = proposal.using_encoded(|p| p.len() as u32); let hash: H256 = proposal.blake2_256().into(); let end = 4; - assert_ok!(Alliance::propose(Origin::signed(1), Box::new(proposal.clone()))); + assert_ok!(Alliance::propose( + Origin::signed(1), + Box::new(proposal.clone()) + )); assert_eq!(*AllianceMotion::proposals(), vec![hash]); assert_eq!(AllianceMotion::proposal_of(&hash), Some(proposal)); });