mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 01:11:10 +00:00
Fix Collective <-> Elections initialization. (#5454)
* A patch * Fix * Better approach. * Fix grumbles
This commit is contained in:
Generated
+49
-60
@@ -99,9 +99,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.27"
|
||||
version = "1.0.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "013a6e0a2cbe3d20f9c60b65458f7a7f7a5e636c5d0f45a5a6aee5d4b1f01785"
|
||||
checksum = "d9a60d744a80c30fcb657dfe2c1b22bcb3e814c1a1e3674f32bf5820b570fbff"
|
||||
|
||||
[[package]]
|
||||
name = "app_dirs"
|
||||
@@ -178,12 +178,11 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "assert_cmd"
|
||||
version = "1.0.0"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "36101401a715c232f2c63a534a4b639415064b79d128d2a60d35678f8fb45204"
|
||||
checksum = "c88b9ca26f9c16ec830350d309397e74ee9abdfd8eb1f71cb6ecc71a3fc818da"
|
||||
dependencies = [
|
||||
"doc-comment",
|
||||
"escargot",
|
||||
"predicates",
|
||||
"predicates-core",
|
||||
"predicates-tree",
|
||||
@@ -1055,9 +1054,9 @@ checksum = "11c0346158a19b3627234e15596f5e465c360fcdb97d817bcb255e0510f5a788"
|
||||
|
||||
[[package]]
|
||||
name = "derive_more"
|
||||
version = "0.99.3"
|
||||
version = "0.99.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a806e96c59a76a5ba6e18735b6cf833344671e61e7863f2edb5c518ea2cac95c"
|
||||
checksum = "e2323f3f47db9a0e77ce7a300605d8d2098597fc451ed1a97bb1f6411bb550a7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1189,18 +1188,18 @@ checksum = "516aa8d7a71cb00a1c4146f0798549b93d083d4f189b3ced8f3de6b8f11ee6c4"
|
||||
|
||||
[[package]]
|
||||
name = "erased-serde"
|
||||
version = "0.3.10"
|
||||
version = "0.3.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cd7d80305c9bd8cd78e3c753eb9fb110f83621e5211f1a3afffcc812b104daf9"
|
||||
checksum = "d88b6d1705e16a4d62e05ea61cc0496c2bd190f4fa8e5c1f11ce747be6bcf3d1"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "errno"
|
||||
version = "0.2.4"
|
||||
version = "0.2.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c2a071601ed01b988f896ab14b95e67335d1eeb50190932a1320f7fe3cadc84e"
|
||||
checksum = "b480f641ccf0faf324e20c1d3e53d81b7484c698b42ea677f6907ae4db195371"
|
||||
dependencies = [
|
||||
"errno-dragonfly",
|
||||
"libc",
|
||||
@@ -1217,18 +1216,6 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "escargot"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "74cf96bec282dcdb07099f7e31d9fed323bca9435a09aba7b6d99b7617bca96d"
|
||||
dependencies = [
|
||||
"lazy_static",
|
||||
"log 0.4.8",
|
||||
"serde",
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ethbloom"
|
||||
version = "0.9.0"
|
||||
@@ -1976,9 +1963,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "h2"
|
||||
version = "0.2.3"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7938e6aa2a31df4e21f224dc84704bd31c089a6d1355c535b03667371cccc843"
|
||||
checksum = "377038bf3c89d18d6ca1431e7a5027194fbd724ca10592b9487ede5e8e144f42"
|
||||
dependencies = [
|
||||
"bytes 0.5.4",
|
||||
"fnv",
|
||||
@@ -2029,9 +2016,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "hermit-abi"
|
||||
version = "0.1.8"
|
||||
version = "0.1.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1010591b26bbfe835e9faeabeb11866061cc7dcebffd56ad7d0942d0e61aefd8"
|
||||
checksum = "725cf19794cf90aa94e65050cb4191ff5d8fa87a498383774c47b332e3af952e"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
@@ -2211,7 +2198,7 @@ dependencies = [
|
||||
"futures-channel",
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"h2 0.2.3",
|
||||
"h2 0.2.4",
|
||||
"http 0.2.1",
|
||||
"http-body 0.3.1",
|
||||
"httparse",
|
||||
@@ -3343,9 +3330,9 @@ checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238"
|
||||
|
||||
[[package]]
|
||||
name = "multimap"
|
||||
version = "0.8.0"
|
||||
version = "0.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a97fbd5d00e0e37bfb10f433af8f5aaf631e739368dc9fc28286ca81ca4948dc"
|
||||
checksum = "d8883adfde9756c1d30b0f519c9b8c502a94b41ac62f696453c37c7fc0a958ce"
|
||||
|
||||
[[package]]
|
||||
name = "multistream-select"
|
||||
@@ -4861,9 +4848,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "paste"
|
||||
version = "0.1.8"
|
||||
version = "0.1.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8292c1e1e81ddb552c4c90c36af201a0ce7e34995f55f0480f01052f242811c9"
|
||||
checksum = "092d791bf7847f70bbd49085489fba25fc2c193571752bff9e36e74e72403932"
|
||||
dependencies = [
|
||||
"paste-impl",
|
||||
"proc-macro-hack",
|
||||
@@ -4871,9 +4858,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "paste-impl"
|
||||
version = "0.1.8"
|
||||
version = "0.1.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5e9c43f2645f06ee452544ad032886a75f3d1797b9487dcadcae9100ba58a51c"
|
||||
checksum = "406c23fb4c45cc6f68a9bbabb8ec7bd6f8cfcbd17e9e8f72c2460282f8325729"
|
||||
dependencies = [
|
||||
"proc-macro-hack",
|
||||
"proc-macro2",
|
||||
@@ -5087,9 +5074,9 @@ checksum = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.9"
|
||||
version = "1.0.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6c09721c6781493a2a492a96b5a5bf19b65917fe6728884e7c44dd0c60ca3435"
|
||||
checksum = "df246d292ff63439fea9bc8c0a270bed0e390d5ebd4db4ba15aba81111b5abe3"
|
||||
dependencies = [
|
||||
"unicode-xid",
|
||||
]
|
||||
@@ -5161,9 +5148,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "protobuf"
|
||||
version = "2.11.0"
|
||||
version = "2.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fc1b4a8efc42cf150049e8a490f618c7c60e82332405065f202a7e33aa5a1f06"
|
||||
checksum = "71964f34fd51cf04882d7ae3325fa0794d4cad66a03d0003f38d8ae4f63ba126"
|
||||
|
||||
[[package]]
|
||||
name = "pwasm-utils"
|
||||
@@ -5531,9 +5518,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ring"
|
||||
version = "0.16.11"
|
||||
version = "0.16.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "741ba1704ae21999c00942f9f5944f801e977f54302af346b596287599ad1862"
|
||||
checksum = "1ba5a8ec64ee89a76c98c549af81ff14813df09c3e6dc4766c3856da48597a0c"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"lazy_static",
|
||||
@@ -6793,21 +6780,22 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "security-framework"
|
||||
version = "0.4.1"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "97bbedbe81904398b6ebb054b3e912f99d55807125790f3198ac990d98def5b0"
|
||||
checksum = "572dfa3a0785509e7a44b5b4bebcf94d41ba34e9ed9eb9df722545c3b3c4144a"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"core-foundation",
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
"security-framework-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "security-framework-sys"
|
||||
version = "0.4.1"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "06fd2f23e31ef68dd2328cc383bd493142e46107a3a0e24f7d734e3f3b80fe4c"
|
||||
checksum = "8ddb15a5fec93b7021b8a9e96009c5d8d51c15673569f7c0f6b7204e5b7b404f"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
@@ -6878,9 +6866,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.48"
|
||||
version = "1.0.50"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9371ade75d4c2d6cb154141b9752cf3781ec9c05e0e5cf35060e1e70ee7b9c25"
|
||||
checksum = "78a7a12c167809363ec3bd7329fc0a3369056996de43c4b37ef3cd54a6ce4867"
|
||||
dependencies = [
|
||||
"itoa",
|
||||
"ryu",
|
||||
@@ -8228,18 +8216,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "1.0.13"
|
||||
version = "1.0.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e3711fd1c4e75b3eff12ba5c40dba762b6b65c5476e8174c1a664772060c49bf"
|
||||
checksum = "f0570dc61221295909abdb95c739f2e74325e14293b2026b0a7e195091ec54ae"
|
||||
dependencies = [
|
||||
"thiserror-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "1.0.13"
|
||||
version = "1.0.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ae2b85ba4c9aa32dd3343bd80eb8d22e9b54b7688c17ea3907f236885353b233"
|
||||
checksum = "227362df41d566be41a28f64401e07a043157c21c14b9785a0d8e256f940a8fd"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -8277,9 +8265,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tiny-bip39"
|
||||
version = "0.7.2"
|
||||
version = "0.7.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e255ec4f7d4aaccbede17dffcfb2e71434d17f5c921d5a06823b8e58a2bcd468"
|
||||
checksum = "b0165e045cc2ae1660270ca65e1676dbaab60feb0f91b10f7d0665e9b47e31f2"
|
||||
dependencies = [
|
||||
"failure",
|
||||
"hmac",
|
||||
@@ -8351,6 +8339,7 @@ checksum = "0fa5e81d6bc4e67fe889d5783bd2a128ab2e0cfa487e0be16b6a8d177b101616"
|
||||
dependencies = [
|
||||
"bytes 0.5.4",
|
||||
"fnv",
|
||||
"futures-core",
|
||||
"iovec",
|
||||
"lazy_static",
|
||||
"libc",
|
||||
@@ -8592,9 +8581,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tokio-util"
|
||||
version = "0.2.0"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930"
|
||||
checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499"
|
||||
dependencies = [
|
||||
"bytes 0.5.4",
|
||||
"futures-core",
|
||||
@@ -9169,18 +9158,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wast"
|
||||
version = "11.0.0"
|
||||
version = "12.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "df4d67ba9266f4fcaf2e8a1afadc5e2a959e51aecc07b1ecbdf85a6ddaf08bde"
|
||||
checksum = "0615ba420811bcda39cf80e8a1bd75997aec09222bda35165920a07ef15cc695"
|
||||
dependencies = [
|
||||
"leb128",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wat"
|
||||
version = "1.0.12"
|
||||
version = "1.0.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a9400dc1c8512087b2d974b1b9b0a6c4e6e26e7e8acf629e3e351165a1ed301"
|
||||
checksum = "095f615fbfcae695e3a4cea7d9f02f70561c81274c0142f45a12bf1e154d08bd"
|
||||
dependencies = [
|
||||
"wast",
|
||||
]
|
||||
@@ -9303,9 +9292,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||
|
||||
[[package]]
|
||||
name = "winapi-util"
|
||||
version = "0.1.3"
|
||||
version = "0.1.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4ccfbf554c6ad11084fb7517daca16cfdcaccbdadba4fc336f032a8b12c2ad80"
|
||||
checksum = "fa515c5163a99cc82bab70fd3bfdd36d827be85de63737b40fcef2ce084a436e"
|
||||
dependencies = [
|
||||
"winapi 0.3.8",
|
||||
]
|
||||
|
||||
@@ -20,9 +20,10 @@ use sc_chain_spec::ChainSpecExtension;
|
||||
use sp_core::{Pair, Public, crypto::UncheckedInto, sr25519};
|
||||
use serde::{Serialize, Deserialize};
|
||||
use node_runtime::{
|
||||
AuthorityDiscoveryConfig, BabeConfig, BalancesConfig, ContractsConfig, CouncilConfig, DemocracyConfig,
|
||||
GrandpaConfig, ImOnlineConfig, SessionConfig, SessionKeys, StakerStatus, StakingConfig,
|
||||
IndicesConfig, SocietyConfig, SudoConfig, SystemConfig, TechnicalCommitteeConfig, WASM_BINARY,
|
||||
AuthorityDiscoveryConfig, BabeConfig, BalancesConfig, ContractsConfig, CouncilConfig,
|
||||
DemocracyConfig,GrandpaConfig, ImOnlineConfig, SessionConfig, SessionKeys, StakerStatus,
|
||||
StakingConfig, ElectionsConfig, IndicesConfig, SocietyConfig, SudoConfig, SystemConfig,
|
||||
TechnicalCommitteeConfig, WASM_BINARY,
|
||||
};
|
||||
use node_runtime::Block;
|
||||
use node_runtime::constants::currency::*;
|
||||
@@ -270,13 +271,14 @@ pub fn testnet_genesis(
|
||||
.. Default::default()
|
||||
}),
|
||||
pallet_democracy: Some(DemocracyConfig::default()),
|
||||
pallet_collective_Instance1: Some(CouncilConfig {
|
||||
pallet_elections_phragmen: Some(ElectionsConfig {
|
||||
members: endowed_accounts.iter()
|
||||
.take((num_endowed_accounts + 1) / 2)
|
||||
.cloned()
|
||||
.map(|member| (member, STASH))
|
||||
.collect(),
|
||||
phantom: Default::default(),
|
||||
}),
|
||||
pallet_collective_Instance1: Some(CouncilConfig::default()),
|
||||
pallet_collective_Instance2: Some(TechnicalCommitteeConfig {
|
||||
members: endowed_accounts.iter()
|
||||
.take((num_endowed_accounts + 1) / 2)
|
||||
|
||||
@@ -418,6 +418,9 @@ impl pallet_elections_phragmen::Trait for Runtime {
|
||||
type Event = Event;
|
||||
type Currency = Balances;
|
||||
type ChangeMembers = Council;
|
||||
// NOTE: this implies that council's genesis members cannot be set directly and must come from
|
||||
// this module.
|
||||
type InitializeMembers = Council;
|
||||
type CurrencyToVote = CurrencyToVoteHandler;
|
||||
type CandidacyBond = CandidacyBond;
|
||||
type VotingBond = VotingBond;
|
||||
@@ -652,7 +655,7 @@ construct_runtime!(
|
||||
Democracy: pallet_democracy::{Module, Call, Storage, Config, Event<T>},
|
||||
Council: pallet_collective::<Instance1>::{Module, Call, Storage, Origin<T>, Event<T>, Config<T>},
|
||||
TechnicalCommittee: pallet_collective::<Instance2>::{Module, Call, Storage, Origin<T>, Event<T>, Config<T>},
|
||||
Elections: pallet_elections_phragmen::{Module, Call, Storage, Event<T>},
|
||||
Elections: pallet_elections_phragmen::{Module, Call, Storage, Event<T>, Config<T>},
|
||||
TechnicalMembership: pallet_membership::<Instance1>::{Module, Call, Storage, Event<T>, Config<T>},
|
||||
FinalityTracker: pallet_finality_tracker::{Module, Call, Inherent},
|
||||
Grandpa: pallet_grandpa::{Module, Call, Storage, Config, Event},
|
||||
|
||||
@@ -109,6 +109,7 @@ pub fn config_endowed(
|
||||
pallet_collective_Instance1: Some(Default::default()),
|
||||
pallet_collective_Instance2: Some(Default::default()),
|
||||
pallet_membership_Instance1: Some(Default::default()),
|
||||
pallet_elections_phragmen: Some(Default::default()),
|
||||
pallet_sudo: Some(Default::default()),
|
||||
pallet_treasury: Some(Default::default()),
|
||||
pallet_society: Some(SocietyConfig {
|
||||
|
||||
@@ -10,6 +10,7 @@ description = "FRAME election pallet for PHRAGMEN"
|
||||
|
||||
[dependencies]
|
||||
codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] }
|
||||
serde = { version = "1.0.101", optional = true }
|
||||
sp-runtime = { version = "2.0.0-alpha.5", default-features = false, path = "../../primitives/runtime" }
|
||||
sp-phragmen = { version = "2.0.0-alpha.5", default-features = false, path = "../../primitives/phragmen" }
|
||||
frame-support = { version = "2.0.0-alpha.5", default-features = false, path = "../support" }
|
||||
@@ -22,11 +23,11 @@ hex-literal = "0.2.1"
|
||||
pallet-balances = { version = "2.0.0-alpha.5", path = "../balances" }
|
||||
sp-core = { version = "2.0.0-alpha.5", path = "../../primitives/core" }
|
||||
substrate-test-utils = { version = "2.0.0-alpha.5", path = "../../test-utils" }
|
||||
serde = { version = "1.0.101" }
|
||||
|
||||
[features]
|
||||
default = ["std"]
|
||||
std = [
|
||||
"serde",
|
||||
"codec/std",
|
||||
"frame-support/std",
|
||||
"sp-runtime/std",
|
||||
|
||||
@@ -91,7 +91,7 @@ use frame_support::{
|
||||
weights::{SimpleDispatchInfo, Weight, WeighData}, storage::{StorageMap, IterableStorageMap},
|
||||
traits::{
|
||||
Currency, Get, LockableCurrency, LockIdentifier, ReservableCurrency, WithdrawReasons,
|
||||
ChangeMembers, OnUnbalanced, WithdrawReason, Contains, BalanceStatus
|
||||
ChangeMembers, OnUnbalanced, WithdrawReason, Contains, BalanceStatus, InitializeMembers,
|
||||
}
|
||||
};
|
||||
use sp_phragmen::{build_support_map, ExtendedBalance};
|
||||
@@ -118,6 +118,9 @@ pub trait Trait: frame_system::Trait {
|
||||
/// What to do when the members change.
|
||||
type ChangeMembers: ChangeMembers<Self::AccountId>;
|
||||
|
||||
/// What to do with genesis members
|
||||
type InitializeMembers: InitializeMembers<Self::AccountId>;
|
||||
|
||||
/// Convert a balance into a number used for election calculation.
|
||||
/// This must fit into a `u64` but is allowed to be sensibly lossy.
|
||||
type CurrencyToVote: Convert<BalanceOf<Self>, u64> + Convert<u128, BalanceOf<Self>>;
|
||||
@@ -160,11 +163,44 @@ decl_storage! {
|
||||
pub ElectionRounds get(fn election_rounds): u32 = Zero::zero();
|
||||
|
||||
/// Votes and locked stake of a particular voter.
|
||||
pub Voting: map hasher(twox_64_concat) T::AccountId => (BalanceOf<T>, Vec<T::AccountId>);
|
||||
pub Voting get(fn voting): map hasher(twox_64_concat) T::AccountId => (BalanceOf<T>, Vec<T::AccountId>);
|
||||
|
||||
/// The present candidate list. Sorted based on account-id. A current member or runner-up
|
||||
/// can never enter this vector and is always implicitly assumed to be a candidate.
|
||||
pub Candidates get(fn candidates): Vec<T::AccountId>;
|
||||
} add_extra_genesis {
|
||||
config(members): Vec<(T::AccountId, BalanceOf<T>)>;
|
||||
build(|config: &GenesisConfig<T>| {
|
||||
let members = config.members.iter().map(|(ref member, ref stake)| {
|
||||
// make sure they have enough stake
|
||||
assert!(
|
||||
T::Currency::free_balance(member) >= *stake,
|
||||
"Genesis member does not have enough stake",
|
||||
);
|
||||
|
||||
// reserve candidacy bond and set as members.
|
||||
T::Currency::reserve(&member, T::CandidacyBond::get())
|
||||
.expect("Genesis member does not have enough balance to be a candidate");
|
||||
|
||||
// Note: all members will only vote for themselves, hence they must be given exactly
|
||||
// their own stake as total backing. Any sane election should behave as such.
|
||||
// Nonetheless, stakes will be updated for term 1 onwards according to the election.
|
||||
<Members<T>>::append(&[(member.clone(), *stake)])
|
||||
.expect("Failed to append genesis members.");
|
||||
|
||||
// set self-votes to make persistent.
|
||||
<Module<T>>::vote(
|
||||
T::Origin::from(Some(member.clone()).into()),
|
||||
vec![member.clone()],
|
||||
*stake,
|
||||
).expect("Genesis member could not vote.");
|
||||
|
||||
member.clone()
|
||||
}).collect::<Vec<T::AccountId>>();
|
||||
|
||||
// report genesis members to upstream, if any.
|
||||
T::InitializeMembers::initialize_members(&members);
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -844,7 +880,7 @@ mod tests {
|
||||
Perbill, testing::Header, BuildStorage,
|
||||
traits::{BlakeTwo256, IdentityLookup, Block as BlockT},
|
||||
};
|
||||
use crate as elections;
|
||||
use crate as elections_phragmen;
|
||||
use frame_system as system;
|
||||
|
||||
parameter_types! {
|
||||
@@ -980,6 +1016,7 @@ mod tests {
|
||||
type Currency = Balances;
|
||||
type CurrencyToVote = CurrencyToVoteHandler;
|
||||
type ChangeMembers = TestChangeMembers;
|
||||
type InitializeMembers = ();
|
||||
type CandidacyBond = CandidacyBond;
|
||||
type VotingBond = VotingBond;
|
||||
type TermDuration = TermDuration;
|
||||
@@ -1001,11 +1038,12 @@ mod tests {
|
||||
{
|
||||
System: system::{Module, Call, Event<T>},
|
||||
Balances: pallet_balances::{Module, Call, Event<T>, Config<T>},
|
||||
Elections: elections::{Module, Call, Event<T>},
|
||||
Elections: elections_phragmen::{Module, Call, Event<T>, Config<T>},
|
||||
}
|
||||
);
|
||||
|
||||
pub struct ExtBuilder {
|
||||
genesis_members: Vec<(u64, u64)>,
|
||||
balance_factor: u64,
|
||||
voter_bond: u64,
|
||||
term_duration: u64,
|
||||
@@ -1015,6 +1053,7 @@ mod tests {
|
||||
impl Default for ExtBuilder {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
genesis_members: vec![],
|
||||
balance_factor: 1,
|
||||
voter_bond: 2,
|
||||
desired_runners_up: 0,
|
||||
@@ -1036,10 +1075,15 @@ mod tests {
|
||||
self.term_duration = duration;
|
||||
self
|
||||
}
|
||||
pub fn genesis_members(mut self, members: Vec<(u64, u64)>) -> Self {
|
||||
self.genesis_members = members;
|
||||
self
|
||||
}
|
||||
pub fn build(self) -> sp_io::TestExternalities {
|
||||
VOTING_BOND.with(|v| *v.borrow_mut() = self.voter_bond);
|
||||
TERM_DURATION.with(|v| *v.borrow_mut() = self.term_duration);
|
||||
DESIRED_RUNNERS_UP.with(|v| *v.borrow_mut() = self.desired_runners_up);
|
||||
MEMBERS.with(|m| *m.borrow_mut() = self.genesis_members.iter().map(|(m, _)| m.clone()).collect::<Vec<_>>());
|
||||
let mut ext: sp_io::TestExternalities = GenesisConfig {
|
||||
pallet_balances: Some(pallet_balances::GenesisConfig::<Test>{
|
||||
balances: vec![
|
||||
@@ -1051,6 +1095,9 @@ mod tests {
|
||||
(6, 60 * self.balance_factor)
|
||||
],
|
||||
}),
|
||||
elections_phragmen: Some(elections_phragmen::GenesisConfig::<Test> {
|
||||
members: self.genesis_members
|
||||
}),
|
||||
}.build_storage().unwrap().into();
|
||||
ext.execute_with(|| System::set_block_number(1));
|
||||
ext
|
||||
@@ -1090,6 +1137,37 @@ mod tests {
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn genesis_members_should_work() {
|
||||
ExtBuilder::default().genesis_members(vec![(1, 10), (2, 20)]).build().execute_with(|| {
|
||||
System::set_block_number(1);
|
||||
assert_eq!(Elections::members(), vec![(1, 10), (2, 20)]);
|
||||
|
||||
assert_eq!(Elections::voting(1), (10, vec![1]));
|
||||
assert_eq!(Elections::voting(2), (20, vec![2]));
|
||||
|
||||
// they will persist since they have self vote.
|
||||
System::set_block_number(5);
|
||||
assert_ok!(Elections::end_block(System::block_number()));
|
||||
|
||||
assert_eq!(Elections::members_ids(), vec![1, 2]);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic = "Genesis member does not have enough stake"]
|
||||
fn genesis_members_cannot_over_stake_0() {
|
||||
// 10 cannot lock 20 as their stake and extra genesis will panic.
|
||||
ExtBuilder::default().genesis_members(vec![(1, 20), (2, 20)]).build();
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn genesis_members_cannot_over_stake_1() {
|
||||
// 10 cannot reserve 20 as voting bond and extra genesis will panic.
|
||||
ExtBuilder::default().voter_bond(20).genesis_members(vec![(1, 10), (2, 20)]).build();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn term_duration_zero_is_passive() {
|
||||
ExtBuilder::default()
|
||||
@@ -1538,7 +1616,7 @@ mod tests {
|
||||
|
||||
assert_ok!(Elections::report_defunct_voter(Origin::signed(5), 3));
|
||||
assert!(System::events().iter().any(|event| {
|
||||
event.event == Event::elections(RawEvent::VoterReported(3, 5, true))
|
||||
event.event == Event::elections_phragmen(RawEvent::VoterReported(3, 5, true))
|
||||
}));
|
||||
|
||||
assert_eq!(balances(&3), (28, 0));
|
||||
@@ -1566,7 +1644,7 @@ mod tests {
|
||||
|
||||
assert_ok!(Elections::report_defunct_voter(Origin::signed(5), 4));
|
||||
assert!(System::events().iter().any(|event| {
|
||||
event.event == Event::elections(RawEvent::VoterReported(4, 5, false))
|
||||
event.event == Event::elections_phragmen(RawEvent::VoterReported(4, 5, false))
|
||||
}));
|
||||
|
||||
assert_eq!(balances(&4), (35, 5));
|
||||
@@ -1976,7 +2054,7 @@ mod tests {
|
||||
assert_eq!(balances(&5), (45, 2));
|
||||
|
||||
assert!(System::events().iter().any(|event| {
|
||||
event.event == Event::elections(RawEvent::NewTerm(vec![(4, 40), (5, 50)]))
|
||||
event.event == Event::elections_phragmen(RawEvent::NewTerm(vec![(4, 40), (5, 50)]))
|
||||
}));
|
||||
})
|
||||
}
|
||||
|
||||
@@ -201,7 +201,7 @@ pub trait PerThing:
|
||||
|
||||
/// The rounding method to use.
|
||||
///
|
||||
/// `Perthing`s are unsigned so `Up` means towards infinity and `Down` means towards zero.
|
||||
/// `PerThing`s are unsigned so `Up` means towards infinity and `Down` means towards zero.
|
||||
/// `Nearest` will round an exact half down.
|
||||
enum Rounding {
|
||||
Up,
|
||||
|
||||
Reference in New Issue
Block a user