diff --git a/runtime/common/src/elections.rs b/runtime/common/src/elections.rs index 264df416bb50..87a0a318eb9d 100644 --- a/runtime/common/src/elections.rs +++ b/runtime/common/src/elections.rs @@ -66,33 +66,6 @@ pub type OnOnChainAccuracy = sp_runtime::Perbill; pub type GenesisElectionOf = frame_election_provider_support::onchain::OnChainSequentialPhragmen; -/// Maximum number of iterations for balancing that will be executed in the embedded miner of -/// pallet-election-provider-multi-phase. -pub const MINER_MAX_ITERATIONS: u32 = 10; - -/// A source of random balance for the NPoS Solver, which is meant to be run by the off-chain worker -/// election miner. -pub struct OffchainRandomBalancing; -impl frame_support::pallet_prelude::Get> - for OffchainRandomBalancing -{ - fn get() -> Option<(usize, sp_npos_elections::ExtendedBalance)> { - use sp_runtime::{codec::Decode, traits::TrailingZeroInput}; - let iters = match MINER_MAX_ITERATIONS { - 0 => 0, - max @ _ => { - let seed = sp_io::offchain::random_seed(); - let random = ::decode(&mut TrailingZeroInput::new(&seed)) - .expect("input is padded with zeroes; qed") % - max.saturating_add(1); - random as usize - }, - }; - - Some((iters, 0)) - } -} - /// Implementation of `frame_election_provider_support::SortedListProvider` that updates the /// bags-list but uses [`pallet_staking::Nominators`] for `iter`. This is meant to be a transitionary /// implementation for runtimes to "test" out the bags-list by keeping it up to date, but not yet diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 83a08b0377a9..3b7cfe528c04 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -453,7 +453,7 @@ impl pallet_election_provider_multi_phase::Config for Runtime { type Solver = frame_election_provider_support::SequentialPhragmen< AccountId, pallet_election_provider_multi_phase::SolutionAccuracyOf, - runtime_common::elections::OffchainRandomBalancing, + (), >; type BenchmarkingConfig = runtime_common::elections::BenchmarkConfig; type ForceOrigin = EnsureOneOf< diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 2df03a48787d..baef4169ea37 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -494,7 +494,7 @@ impl pallet_election_provider_multi_phase::Config for Runtime { type Solver = frame_election_provider_support::SequentialPhragmen< AccountId, pallet_election_provider_multi_phase::SolutionAccuracyOf, - runtime_common::elections::OffchainRandomBalancing, + (), >; type BenchmarkingConfig = runtime_common::elections::BenchmarkConfig; type ForceOrigin = EnsureOneOf< diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index db665417a5f5..0fdad6852d6f 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -404,7 +404,7 @@ impl pallet_election_provider_multi_phase::Config for Runtime { type Solver = frame_election_provider_support::SequentialPhragmen< AccountId, pallet_election_provider_multi_phase::SolutionAccuracyOf, - runtime_common::elections::OffchainRandomBalancing, + (), >; type BenchmarkingConfig = runtime_common::elections::BenchmarkConfig; type ForceOrigin = EnsureRoot; diff --git a/utils/staking-miner/src/dry_run.rs b/utils/staking-miner/src/dry_run.rs index 7c11f7ee106e..89814faf3670 100644 --- a/utils/staking-miner/src/dry_run.rs +++ b/utils/staking-miner/src/dry_run.rs @@ -115,13 +115,17 @@ macro_rules! dry_run_cmd_for { ($runtime:ident) => { paste::paste! { signer: Signer, ) -> Result<(), Error<$crate::[<$runtime _runtime_exports>]::Runtime>> { use $crate::[<$runtime _runtime_exports>]::*; - let mut ext = crate::create_election_ext::( - rpc.clone(), - config.at, - vec!["Staking".to_string(), "System".to_string()], - ).await?; - force_create_snapshot::(&mut ext)?; + let pallets = if config.force_snapshot { + vec!["Staking".to_string(), "BagsList".to_string()] + } else { + Default::default() + }; + let mut ext = crate::create_election_ext::(rpc.clone(), config.at, pallets).await?; + if config.force_snapshot { + force_create_snapshot::(&mut ext)?; + }; + log::debug!(target: LOG_TARGET, "solving with {:?}", config.solver); let (raw_solution, witness) = crate::mine_with::(&config.solver, &mut ext, false)?; let nonce = crate::get_account_info::(&rpc, &signer.account, config.at) diff --git a/utils/staking-miner/src/main.rs b/utils/staking-miner/src/main.rs index 045a849eee5e..449a643e22b3 100644 --- a/utils/staking-miner/src/main.rs +++ b/utils/staking-miner/src/main.rs @@ -343,6 +343,10 @@ struct DryRunConfig { /// The solver algorithm to use. #[clap(subcommand)] solver: Solvers, + + /// Force create a new snapshot, else expect one to exist onchain. + #[clap(long)] + force_snapshot: bool, } #[derive(Debug, Clone, Parser)] @@ -351,12 +355,15 @@ struct SharedConfig { #[clap(long, short, default_value = DEFAULT_URI, env = "URI")] uri: String, - /// The seed of a funded account in hex. + /// The path to a file containing the seed of the account. If the file is not found, the seed is + /// used as-is. + /// + /// Can also be provided via the `SEED` environment variable. /// /// WARNING: Don't use an account with a large stash for this. Based on how the bot is /// configured, it might re-try and lose funds through transaction fees/deposits. #[clap(long, short, env = "SEED")] - seed: String, + seed_or_path: String, } #[derive(Debug, Clone, Parser)] @@ -590,7 +597,7 @@ async fn main() { }; let signer_account = any_runtime! { - signer::signer_uri_from_string::(&shared.seed, &rpc) + signer::signer_uri_from_string::(&shared.seed_or_path, &rpc) .await .expect("Provided account is invalid, terminating.") }; diff --git a/utils/staking-miner/src/signer.rs b/utils/staking-miner/src/signer.rs index 6a0e45eabb13..6a8053385971 100644 --- a/utils/staking-miner/src/signer.rs +++ b/utils/staking-miner/src/signer.rs @@ -57,9 +57,15 @@ pub(crate) async fn signer_uri_from_string< Hash = Hash, > + EPM::Config, >( - seed: &str, + mut seed_or_path: &str, client: &SharedRpcClient, ) -> Result> { + seed_or_path = seed_or_path.trim(); + + let seed = match std::fs::read(seed_or_path) { + Ok(s) => String::from_utf8(s).map_err(|_| Error::::AccountDoesNotExists)?, + Err(_) => seed_or_path.to_string(), + }; let seed = seed.trim(); let pair = Pair::from_string(seed, None)?;