malus/variants/
dispute_valid_candidates.rs1#![allow(missing_docs)]
24
25use polkadot_cli::{
26 service::{
27 AuxStore, Error, ExtendedOverseerGenArgs, Overseer, OverseerConnector, OverseerGen,
28 OverseerGenArgs, OverseerHandle,
29 },
30 validator_overseer_builder, Cli,
31};
32use polkadot_node_subsystem::SpawnGlue;
33use polkadot_node_subsystem_types::{ChainApiBackend, RuntimeApiSubsystemClient};
34use sp_core::traits::SpawnNamed;
35
36use super::common::{FakeCandidateValidation, FakeCandidateValidationError};
38use crate::{interceptor::*, variants::ReplaceValidationResult};
39
40use std::sync::Arc;
41
42#[derive(Debug, clap::Parser)]
43#[command(rename_all = "kebab-case")]
44#[allow(missing_docs)]
45pub struct DisputeAncestorOptions {
46 #[arg(long, value_enum, ignore_case = true, default_value_t = FakeCandidateValidation::BackingAndApprovalInvalid)]
50 pub fake_validation: FakeCandidateValidation,
51
52 #[arg(long, value_enum, ignore_case = true, default_value_t = FakeCandidateValidationError::InvalidOutputs)]
56 pub fake_validation_error: FakeCandidateValidationError,
57
58 #[clap(short, long, ignore_case = true, default_value_t = 100, value_parser = clap::value_parser!(u8).range(0..=100))]
61 pub percentage: u8,
62
63 #[clap(flatten)]
64 pub cli: Cli,
65}
66
67pub(crate) struct DisputeValidCandidates {
68 pub fake_validation: FakeCandidateValidation,
70 pub fake_validation_error: FakeCandidateValidationError,
72 pub percentage: u8,
74}
75
76impl OverseerGen for DisputeValidCandidates {
77 fn generate<Spawner, RuntimeClient>(
78 &self,
79 connector: OverseerConnector,
80 args: OverseerGenArgs<'_, Spawner, RuntimeClient>,
81 ext_args: Option<ExtendedOverseerGenArgs>,
82 ) -> Result<(Overseer<SpawnGlue<Spawner>, Arc<RuntimeClient>>, OverseerHandle), Error>
83 where
84 RuntimeClient: RuntimeApiSubsystemClient + ChainApiBackend + AuxStore + 'static,
85 Spawner: 'static + SpawnNamed + Clone + Unpin,
86 {
87 let validation_filter = ReplaceValidationResult::new(
88 self.fake_validation,
89 self.fake_validation_error,
90 f64::from(self.percentage),
91 );
92
93 validator_overseer_builder(
94 args,
95 ext_args.expect("Extended arguments required to build validator overseer are provided"),
96 )?
97 .replace_candidate_validation(move |cv_subsystem| {
98 InterceptedSubsystem::new(cv_subsystem, validation_filter)
99 })
100 .build_with_connector(connector)
101 .map_err(|e| e.into())
102 }
103}