From b84b5ecd9e5ea6c767870ff12fab496e184bc686 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Mon, 2 Dec 2019 14:21:32 +0100 Subject: [PATCH 1/7] Fix phragmen elections. (#4266) CC @kianenigma --- frame/elections-phragmen/src/lib.rs | 75 +++++++++++++++-------------- 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index fe0ecede156e8..31e7cc9397648 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -84,9 +84,8 @@ use rstd::prelude::*; use sp_runtime::{print, traits::{Zero, StaticLookup, Bounded, Convert}}; -use support::weights::SimpleDispatchInfo; use support::{ - decl_storage, decl_event, ensure, decl_module, dispatch, + decl_storage, decl_event, ensure, decl_module, dispatch, weights::SimpleDispatchInfo, traits::{ Currency, Get, LockableCurrency, LockIdentifier, ReservableCurrency, WithdrawReasons, ChangeMembers, OnUnbalanced, WithdrawReason @@ -391,11 +390,11 @@ decl_module! { /// Writes: O(do_phragmen) /// # #[weight = SimpleDispatchInfo::FixedOperational(2_000_000)] - fn remove_member(origin, who: ::Source) { + fn remove_member(origin, who: ::Source) -> dispatch::Result { ensure_root(origin)?; let who = T::Lookup::lookup(who)?; - return Self::remove_and_replace_member(&who).map(|had_replacement| { + Self::remove_and_replace_member(&who).map(|had_replacement| { let (imbalance, _) = T::Currency::slash_reserved(&who, T::CandidacyBond::get()); T::KickedMember::on_unbalanced(imbalance); Self::deposit_event(RawEvent::MemberKicked(who.clone())); @@ -403,8 +402,6 @@ decl_module! { if !had_replacement { Self::do_phragmen(); } - - () }) } @@ -452,37 +449,25 @@ impl Module { if let Ok(index) = members_with_stake.binary_search_by(|(ref m, ref _s)| m.cmp(who)) { members_with_stake.remove(index); - let mut runners_up = Self::runners_up(); - if let Some((replacement, stake)) = runners_up.pop() { - // replace the outgoing with the best runner up. - if let Err(index) = members_with_stake - .binary_search_by(|(ref m, ref _s)| m.cmp(&replacement)) - { - members_with_stake.insert(index, (replacement.clone(), stake)); - ElectionRounds::mutate(|v| *v += 1); - T::ChangeMembers::change_members_sorted( - &[replacement], - &[who.clone()], - &members_with_stake - .iter() - .map(|(m, _)| m.clone()) - .collect::>(), - ); - } - // else it would mean that the runner up was already a member. This cannot - // happen. If it does, not much that we can do about it. - - >::put(members_with_stake); - >::put(runners_up); - - Ok(true) - } else { - // update `Members` storage -- `do_phragmen` adds this to the candidate list. - >::put(members_with_stake); + let next_up = >::mutate(|runners_up| runners_up.pop()); + let maybe_replacement = next_up.and_then(|(replacement, stake)| + members_with_stake.binary_search_by(|(ref m, ref _s)| m.cmp(&replacement)) + .err() + .map(|index| { + members_with_stake.insert(index, (replacement.clone(), stake)); + replacement + }) + ); - // signal caller that no replacement has been found. - Ok(false) + >::put(&members_with_stake); + let members = members_with_stake.into_iter().map(|m| m.0).collect::>(); + let result = Ok(maybe_replacement.is_some()); + let old = [who.clone()]; + match maybe_replacement { + Some(new) => T::ChangeMembers::change_members_sorted(&[new], &old, &members), + None => T::ChangeMembers::change_members_sorted(&[], &old, &members), } + result } else { Err("not a member") } @@ -690,7 +675,7 @@ impl Module { T::ChangeMembers::change_members_sorted( &incoming, &outgoing.clone(), - &Self::members_ids(), + &new_members_ids, ); // outgoing candidates lose their bond. @@ -826,9 +811,25 @@ mod tests { fn get() -> u64 { TERM_DURATION.with(|v| *v.borrow()) } } + thread_local! { + pub static MEMBERS: RefCell> = RefCell::new(vec![]); +} + pub struct TestChangeMembers; impl ChangeMembers for TestChangeMembers { - fn change_members_sorted(_: &[u64], _: &[u64], _: &[u64]) {} + fn change_members_sorted(incoming: &[u64], outgoing: &[u64], new: &[u64]) { + let mut old_plus_incoming = MEMBERS.with(|m| m.borrow().to_vec()); + old_plus_incoming.extend_from_slice(incoming); + old_plus_incoming.sort(); + + let mut new_plus_outgoing = new.to_vec(); + new_plus_outgoing.extend_from_slice(outgoing); + new_plus_outgoing.sort(); + + assert_eq!(old_plus_incoming, new_plus_outgoing); + + MEMBERS.with(|m| *m.borrow_mut() = new.to_vec()); + } } /// Simple structure that exposes how u64 currency can be represented as... u64. From 8091a0e5360c7d26a03c099e703c832c81ee2e4d Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 2 Dec 2019 14:24:49 +0100 Subject: [PATCH 2/7] Whitespace fix from #4266 review. --- frame/elections-phragmen/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index 31e7cc9397648..8a3e5d74b3202 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -812,8 +812,8 @@ mod tests { } thread_local! { - pub static MEMBERS: RefCell> = RefCell::new(vec![]); -} + pub static MEMBERS: RefCell> = RefCell::new(vec![]); + } pub struct TestChangeMembers; impl ChangeMembers for TestChangeMembers { From ee3a1f1413ee2b712613a052848df5da4cfb7d47 Mon Sep 17 00:00:00 2001 From: Denis Pisarev Date: Mon, 2 Dec 2019 17:58:37 +0100 Subject: [PATCH 3/7] interruptible test and build jobs (#4271) --- .gitlab-ci.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 91994487b7617..ede9f2fd7dd39 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -15,6 +15,7 @@ stages: variables: GIT_STRATEGY: fetch + GIT_DEPTH: "3" CARGO_HOME: "/ci-cache/${CI_PROJECT_NAME}/cargo/${CI_JOB_NAME}" SCCACHE_DIR: "/ci-cache/${CI_PROJECT_NAME}/sccache" CARGO_INCREMENTAL: 0 @@ -55,6 +56,8 @@ variables: - runner_system_failure - unknown_failure - api_failure + dependencies: [] + interruptible: true tags: - linux-docker @@ -79,6 +82,7 @@ check-runtime: GITHUB_API_PROJECT: "parity%2Finfrastructure%2Fgithub-api" script: - ./.maintain/gitlab/check_runtime.sh + interruptible: true allow_failure: true @@ -90,6 +94,7 @@ check-line-width: - /^[0-9]+$/ script: - ./.maintain/gitlab/check_line_width.sh + interruptible: true allow_failure: true @@ -351,8 +356,6 @@ check_polkadot: stage: build <<: *docker-env allow_failure: true - dependencies: - - test-linux-stable script: - COMMIT_HASH=$(git rev-parse HEAD) - SUBSTRATE_PATH=$(pwd) From 561457e9be000c2c062ce3d3a76c98af3479ef3b Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Mon, 2 Dec 2019 19:24:25 +0000 Subject: [PATCH 4/7] Fix sp-session typo (#4273) * Fix sp-session typo * Remove erroneous whitespaces * Don't mess with the file, editor --- .maintain/rename-crates-for-2.0.sh | 8 ++++---- Cargo.lock | 12 ++++++------ bin/node-template/runtime/Cargo.toml | 4 ++-- bin/node-template/runtime/src/lib.rs | 2 +- bin/node/runtime/Cargo.toml | 4 ++-- bin/node/runtime/src/lib.rs | 2 +- client/rpc/Cargo.toml | 2 +- client/service/Cargo.toml | 2 +- primitives/session/Cargo.toml | 2 +- test/utils/runtime/Cargo.toml | 2 +- 10 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.maintain/rename-crates-for-2.0.sh b/.maintain/rename-crates-for-2.0.sh index 89bd2f9b33a5d..cd68abac9877f 100644 --- a/.maintain/rename-crates-for-2.0.sh +++ b/.maintain/rename-crates-for-2.0.sh @@ -22,7 +22,7 @@ function rename() { rename_gitlabci $old $new # and it appears, we have the same syntax in rust files rust_rename $old $new - + # but generally we have the snail case syntax in rust files old=$(echo $old | sed s/-/_/g ); new=$(echo $new | sed s/-/_/g ); @@ -57,7 +57,7 @@ TO_RENAME=( "substrate-runtime-interface-proc-macro sp-runtime-interface-proc-macro" "substrate-runtime-interface-test-wasm sp-runtime-interface-test-wasm" "substrate-serializer sp-serializer" - "substrate-session sp-sesssion" + "substrate-session sp-session" "sr-api sp-api" "sr-api-proc-macro sp-api-proc-macro" "sr-api-test sp-api-test" @@ -103,10 +103,10 @@ TO_RENAME=( "substrate-state-db sc-state-db" "substrate-telemetry sc-telemetry" "substrate-tracing sc-tracing" - + ); for rule in "${TO_RENAME[@]}" do rename "$rule"; -done \ No newline at end of file +done diff --git a/Cargo.lock b/Cargo.lock index 4cfd25f917c49..557d1dd1f2997 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3148,7 +3148,7 @@ dependencies = [ "sp-keyring 2.0.0", "sp-offchain 2.0.0", "sp-runtime 2.0.0", - "sp-sesssion 2.0.0", + "sp-session 2.0.0", "sp-staking 2.0.0", "sp-std 2.0.0", "sp-transaction-pool-runtime-api 2.0.0", @@ -3216,7 +3216,7 @@ dependencies = [ "sp-io 2.0.0", "sp-offchain 2.0.0", "sp-runtime 2.0.0", - "sp-sesssion 2.0.0", + "sp-session 2.0.0", "sp-std 2.0.0", "sp-transaction-pool-runtime-api 2.0.0", "sp-version 2.0.0", @@ -5392,7 +5392,7 @@ dependencies = [ "sp-io 2.0.0", "sp-rpc 2.0.0", "sp-runtime 2.0.0", - "sp-sesssion 2.0.0", + "sp-session 2.0.0", "sp-state-machine 2.0.0", "sp-transaction-pool-api 2.0.0", "sp-version 2.0.0", @@ -5487,7 +5487,7 @@ dependencies = [ "sp-finality-granpda 2.0.0", "sp-io 2.0.0", "sp-runtime 2.0.0", - "sp-sesssion 2.0.0", + "sp-session 2.0.0", "sp-transaction-pool-api 2.0.0", "sp-transaction-pool-runtime-api 2.0.0", "substrate-test-runtime-client 2.0.0", @@ -6319,7 +6319,7 @@ dependencies = [ ] [[package]] -name = "sp-sesssion" +name = "sp-session" version = "2.0.0" dependencies = [ "sp-api 2.0.0", @@ -6646,7 +6646,7 @@ dependencies = [ "sp-offchain 2.0.0", "sp-runtime 2.0.0", "sp-runtime-interface 2.0.0", - "sp-sesssion 2.0.0", + "sp-session 2.0.0", "sp-state-machine 2.0.0", "sp-std 2.0.0", "sp-transaction-pool-runtime-api 2.0.0", diff --git a/bin/node-template/runtime/Cargo.toml b/bin/node-template/runtime/Cargo.toml index 1f71c426fe3e4..51f648185e3cb 100644 --- a/bin/node-template/runtime/Cargo.toml +++ b/bin/node-template/runtime/Cargo.toml @@ -23,7 +23,7 @@ safe-mix = { version = "1.0.0", default-features = false } serde = { version = "1.0.101", optional = true, features = ["derive"] } sp-api = { path = "../../../primitives/sr-api", default-features = false } sp-runtime = { path = "../../../primitives/sr-primitives", default-features = false } -sp-sesssion = { path = "../../../primitives/session", default-features = false } +sp-session = { path = "../../../primitives/session", default-features = false } sudo = { package = "pallet-sudo", path = "../../../frame/sudo", default-features = false } support = { package = "frame-support", path = "../../../frame/support", default-features = false } system = { package = "frame-system", path = "../../../frame/system", default-features = false } @@ -56,7 +56,7 @@ std = [ "serde", "sp-api/std", "sp-runtime/std", - "sp-sesssion/std", + "sp-session/std", "sudo/std", "support/std", "system/std", diff --git a/bin/node-template/runtime/src/lib.rs b/bin/node-template/runtime/src/lib.rs index f16018da8fcf4..3d1cf2d519f3a 100644 --- a/bin/node-template/runtime/src/lib.rs +++ b/bin/node-template/runtime/src/lib.rs @@ -350,7 +350,7 @@ impl_runtime_apis! { } } - impl sp_sesssion::SessionKeys for Runtime { + impl sp_session::SessionKeys for Runtime { fn generate_session_keys(seed: Option>) -> Vec { opaque::SessionKeys::generate(seed) } diff --git a/bin/node/runtime/Cargo.toml b/bin/node/runtime/Cargo.toml index 18e307c55b7af..7744fb473742d 100644 --- a/bin/node/runtime/Cargo.toml +++ b/bin/node/runtime/Cargo.toml @@ -26,7 +26,7 @@ sp-api = { path = "../../../primitives/sr-api", default-features = false } sp-runtime = { path = "../../../primitives/sr-primitives", default-features = false } sp-staking = { path = "../../../primitives/sr-staking-primitives", default-features = false } sp-keyring = { path = "../../../primitives/keyring", optional = true } -sp-sesssion = { path = "../../../primitives/session", default-features = false } +sp-session = { path = "../../../primitives/session", default-features = false } txpool-runtime-api = { package = "sp-transaction-pool-runtime-api", path = "../../../primitives/transaction-pool/runtime-api", default-features = false } version = { package = "sp-version", path = "../../../primitives/sr-version", default-features = false } @@ -107,7 +107,7 @@ std = [ "sp-staking/std", "staking/std", "sp-keyring", - "sp-sesssion/std", + "sp-session/std", "sudo/std", "support/std", "system-rpc-runtime-api/std", diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 3cb4912571e84..ca451db15e954 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -711,7 +711,7 @@ impl_runtime_apis! { } } - impl sp_sesssion::SessionKeys for Runtime { + impl sp_session::SessionKeys for Runtime { fn generate_session_keys(seed: Option>) -> Vec { SessionKeys::generate(seed) } diff --git a/client/rpc/Cargo.toml b/client/rpc/Cargo.toml index 5bb947eb0c15d..20214d5796c16 100644 --- a/client/rpc/Cargo.toml +++ b/client/rpc/Cargo.toml @@ -17,7 +17,7 @@ primitives = { package = "sp-core", path = "../../primitives/core" } rpc = { package = "jsonrpc-core", version = "14.0.3" } runtime_version = { package = "sp-version", path = "../../primitives/sr-version" } serde_json = "1.0.41" -session = { package = "sp-sesssion", path = "../../primitives/session" } +session = { package = "sp-session", path = "../../primitives/session" } sp-runtime = { path = "../../primitives/sr-primitives" } rpc-primitives = { package = "sp-rpc", path = "../../primitives/rpc" } state_machine = { package = "sp-state-machine", path = "../../primitives/state-machine" } diff --git a/client/service/Cargo.toml b/client/service/Cargo.toml index 426c3a76dc01c..e03c263b80726 100644 --- a/client/service/Cargo.toml +++ b/client/service/Cargo.toml @@ -33,7 +33,7 @@ sp-io = { path = "../../primitives/sr-io" } sp-runtime = { path = "../../primitives/sr-primitives" } sp-blockchain = { path = "../../primitives/blockchain" } primitives = { package = "sp-core", path = "../../primitives/core" } -session = { package = "sp-sesssion", path = "../../primitives/session" } +session = { package = "sp-session", path = "../../primitives/session" } app-crypto = { package = "sc-application-crypto", path = "../../primitives/application-crypto" } consensus_common = { package = "sp-consensus", path = "../../primitives/consensus/common" } network = { package = "sc-network", path = "../network" } diff --git a/primitives/session/Cargo.toml b/primitives/session/Cargo.toml index 447cf8ad1b8b1..e1fbd3e9a9106 100644 --- a/primitives/session/Cargo.toml +++ b/primitives/session/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "sp-sesssion" +name = "sp-session" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/test/utils/runtime/Cargo.toml b/test/utils/runtime/Cargo.toml index 77224c2ef18cb..ed7d98f0644c1 100644 --- a/test/utils/runtime/Cargo.toml +++ b/test/utils/runtime/Cargo.toml @@ -25,7 +25,7 @@ runtime_io = { package = "sp-io", path = "../../../primitives/sr-io", default-fe runtime_support = { package = "frame-support", path = "../../../frame/support", default-features = false } runtime_version = { package = "sp-version", path = "../../../primitives/sr-version", default-features = false } serde = { version = "1.0.101", optional = true, features = ["derive"] } -session = { package = "sp-sesssion", path = "../../../primitives/session", default-features = false } +session = { package = "sp-session", path = "../../../primitives/session", default-features = false } sp-api = { path = "../../../primitives/sr-api", default-features = false } sp-runtime = { path = "../../../primitives/sr-primitives", default-features = false } pallet-babe = { path = "../../../frame/babe", default-features = false } From 90fc72346ca6f34a0649f508d7a0edab9b32983a Mon Sep 17 00:00:00 2001 From: Max Inden Date: Mon, 2 Dec 2019 20:44:09 +0100 Subject: [PATCH 5/7] docs/CODEOWNERS: Add mxinden to authority discovery modules (#4275) --- docs/CODEOWNERS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index 29f510a55661d..7b67cb30f8f1f 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -66,3 +66,7 @@ # Support crates /frame/support/ @thiolliere @kianenigma + +# Authority discovery +/client/authority-discovery/ @mxinden +/frame/authority-discovery/ @mxinden From c837c8d9216d310a0e6938496c33161680ed2355 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Mon, 2 Dec 2019 21:11:11 +0100 Subject: [PATCH 6/7] Another fix for elections-phragmen (#4276) * Another fix for elections phragmen CC @kianenigma * Test for correct sorting. --- frame/elections-phragmen/src/lib.rs | 45 ++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index 8a3e5d74b3202..df7a223610568 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -611,8 +611,12 @@ impl Module { ); if let Some(phragmen_result) = maybe_phragmen_result { - let old_members = >::take(); - let old_runners = >::take(); + let old_members_ids = >::take().into_iter() + .map(|(m, _)| m) + .collect::>(); + let old_runners_up_ids = >::take().into_iter() + .map(|(r, _)| r) + .collect::>(); // filter out those who had literally no votes at all. // AUDIT/NOTE: the need to do this is because all candidates, even those who have no @@ -645,32 +649,35 @@ impl Module { }) .collect::)>>(); - // split new set into winners and runner ups. + // split new set into winners and runners up. let split_point = desired_seats.min(new_set_with_stake.len()); let mut new_members = (&new_set_with_stake[..split_point]).to_vec(); + + // save the runners up as-is. They are sorted based on desirability. + // sort and save the members. + new_members.sort_by(|i, j| i.0.cmp(&j.0)); + + // new_members_ids is sorted by account id. let new_members_ids = new_members .iter() .map(|(m, _)| m.clone()) .collect::>(); + let new_runners_up = &new_set_with_stake[split_point..] .into_iter() .cloned() .rev() .collect::)>>(); + // new_runners_up remains sorted by desirability. let new_runners_up_ids = new_runners_up .iter() .map(|(r, _)| r.clone()) .collect::>(); - - // save the runners as-is. They are sorted based on desirability. - // sort and save the members. - new_members.sort(); - // report member changes. We compute diff because we need the outgoing list. let (incoming, outgoing) = T::ChangeMembers::compute_members_diff( &new_members_ids, - &old_members.into_iter().map(|(m, _)| m).collect::>(), + &old_members_ids, ); T::ChangeMembers::change_members_sorted( &incoming, @@ -685,7 +692,7 @@ impl Module { { let (_, outgoing) = T::ChangeMembers::compute_members_diff( &new_runners_up_ids, - &old_runners.into_iter().map(|(r, _)| r).collect::>(), + &old_runners_up_ids, ); to_burn_bond.extend(outgoing); } @@ -818,6 +825,24 @@ mod tests { pub struct TestChangeMembers; impl ChangeMembers for TestChangeMembers { fn change_members_sorted(incoming: &[u64], outgoing: &[u64], new: &[u64]) { + // new, incoming, outgoing must be sorted. + let mut new_sorted = new.to_vec(); + new_sorted.sort(); + assert_eq!(new, &new_sorted[..]); + + let mut incoming_sorted = incoming.to_vec(); + incoming_sorted.sort(); + assert_eq!(incoming, &incoming_sorted[..]); + + let mut outgoing_sorted = outgoing.to_vec(); + outgoing_sorted.sort(); + assert_eq!(outgoing, &outgoing_sorted[..]); + + // incoming and outgoing must be disjoint + for x in incoming.iter() { + assert!(outgoing.binary_search(x).is_err()); + } + let mut old_plus_incoming = MEMBERS.with(|m| m.borrow().to_vec()); old_plus_incoming.extend_from_slice(incoming); old_plus_incoming.sort(); From 368318c9b11c07596cde5dc37220258cfa7dfa76 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Tue, 3 Dec 2019 00:49:27 +0100 Subject: [PATCH 7/7] Enumeratable dispatches using unhashed index in key. (#4278) --- bin/node/runtime/src/lib.rs | 2 +- frame/democracy/src/lib.rs | 2 +- primitives/sr-version/src/lib.rs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index ca451db15e954..4ba355e8f36d4 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -78,7 +78,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 197, + spec_version: 198, impl_version: 198, apis: RUNTIME_API_VERSIONS, }; diff --git a/frame/democracy/src/lib.rs b/frame/democracy/src/lib.rs index 54044cd1fa818..33fe6453fc7df 100644 --- a/frame/democracy/src/lib.rs +++ b/frame/democracy/src/lib.rs @@ -283,7 +283,7 @@ decl_storage! { map ReferendumIndex => Option<(ReferendumInfo)>; /// Queue of successful referenda to be dispatched. pub DispatchQueue get(fn dispatch_queue): - map T::BlockNumber => Vec>; + map hasher(twox_64_concat) T::BlockNumber => Vec>; /// Get the voters for the current proposal. pub VotersFor get(fn voters_for): map ReferendumIndex => Vec; diff --git a/primitives/sr-version/src/lib.rs b/primitives/sr-version/src/lib.rs index b567904b16bd4..edb4aa851e7e8 100644 --- a/primitives/sr-version/src/lib.rs +++ b/primitives/sr-version/src/lib.rs @@ -173,8 +173,8 @@ impl NativeVersion { self.runtime_version.spec_name, other.spec_name, )) - } else if (self.runtime_version.authoring_version != other.authoring_version - && !self.can_author_with.contains(&other.authoring_version)) + } else if self.runtime_version.authoring_version != other.authoring_version + && !self.can_author_with.contains(&other.authoring_version) { Err(format!( "`authoring_version` does not match `{version}` vs `{other_version}` and \