{"record":{"id":"e56490c0482170da","repo":"nautechsystems/nautilus_trader","slug":"invalid-config-type-for-betfairexecutionclientfact-e56490","errorCode":null,"errorMessage":"Invalid config type for BetfairExecutionClientFactory. Expected BetfairExecutionClientConfig, was {config:?}","messagePattern":"Invalid config type for BetfairExecutionClientFactory\\. Expected BetfairExecutionClientConfig, was (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/betfair/src/factories.rs","lineNumber":166,"sourceCode":"impl Default for BetfairExecutionClientFactory {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\nimpl ExecutionClientFactory for BetfairExecutionClientFactory {\n    fn create(\n        &self,\n        trader_id: TraderId,\n        name: &str,\n        config: &dyn ClientConfig,\n        cache: CacheView,\n    ) -> anyhow::Result<Box<dyn ExecutionClient>> {\n        let betfair_config = config\n            .as_any()\n            .downcast_ref::<BetfairExecutionClientConfig>()\n            .ok_or_else(|| {\n                anyhow::anyhow!(\n                    \"Invalid config type for BetfairExecutionClientFactory. Expected BetfairExecutionClientConfig, was {config:?}\",\n                )\n            })?\n            .clone();\n\n        betfair_config.validate()?;\n\n        let credential = betfair_config.credential()?;\n        let stream_config = betfair_config.stream_config();\n        let currency = betfair_config.currency()?;\n\n        let http_client = BetfairHttpClient::new(\n            credential.clone(),\n            None,\n            None,\n            None,\n            betfair_config\n                .proxy_url","sourceCodeStart":148,"sourceCodeEnd":184,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/betfair/src/factories.rs#L148-L184","documentation":"BetfairExecutionClientFactory.create downcasts the incoming ClientConfig to BetfairExecutionClientConfig and errors when the config is any other type. It mirrors the data-client factory check but for execution clients.","triggerScenarios":"Calling BetfairExecutionClientFactory.create with a config that is not BetfairExecutionClientConfig (e.g. BetfairDataClientConfig or another venue's ExecutionClientConfig).","commonSituations":"Swapping data/execution configs when building a trading node; registering the wrong factory for a config class; tests intentionally passing a mismatched config (as in the factory tests).","solutions":["Use BetfairExecutionClientConfig when creating the execution client.","Ensure factories are registered with their matching config types so create() receives the right one.","Validate the concrete config type before invoking create in dynamic wiring code."],"exampleFix":"// before\nconfig = BetfairDataClientConfig(...)\nexec_client = BetfairExecutionClientFactory().create(..., config, ...)\n\n// after\nconfig = BetfairExecutionClientConfig(name=..., venue=..., api_key=..., username=..., password=...)\nexec_client = BetfairExecutionClientFactory().create(..., config, ...)","handlingStrategy":"type-guard","validationCode":"if not isinstance(config, BetfairExecutionClientConfig):\n    raise TypeError(f\"BetfairExecutionClientFactory requires BetfairExecutionClientConfig, got {type(config).__name__}\")","typeGuard":"fn is_betfair_execution_config(config: &dyn ClientConfig) -> bool {\n    config.as_any().downcast_ref::<BetfairExecutionClientConfig>().is_some()\n}","tryCatchPattern":"match factory.create(client_id, None, config, cache) {\n    Ok(client) => client,\n    Err(e) if e.to_string().contains(\"Invalid config type\") => {\n        panic!(\"wiring bug: wrong config for BetfairExecutionClientFactory: {e}\")\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Construct execution clients from BetfairExecutionClientConfig only.","Keep data/execution config construction in separate, clearly named functions.","Assert config types in node bootstrap before create()."],"tags":["factory","config-type","downcast"],"backgroundTag":"config-type-mismatch","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}