{"record":{"id":"8bbd5fe943b7fd11","repo":"nautechsystems/nautilus_trader","slug":"invalid-chain-id-s","errorCode":null,"errorMessage":"Invalid chain ID: {s}","messagePattern":"Invalid chain ID: (.+?)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/dydx/src/grpc/types.rs","lineNumber":47,"sourceCode":"pub enum ChainId {\n    /// Testnet.\n    #[strum(serialize = \"dydx-testnet-4\")]\n    #[serde(rename = \"dydx-testnet-4\")]\n    Testnet4,\n    /// Mainnet.\n    #[strum(serialize = \"dydx-mainnet-1\")]\n    #[serde(rename = \"dydx-mainnet-1\")]\n    Mainnet1,\n}\n\nimpl FromStr for ChainId {\n    type Err = anyhow::Error;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        match s {\n            \"dydx-testnet-4\" | \"testnet\" => Ok(Self::Testnet4),\n            \"dydx-mainnet-1\" | \"mainnet\" => Ok(Self::Mainnet1),\n            _ => anyhow::bail!(\"Invalid chain ID: {s}\"),\n        }\n    }\n}\n\nimpl TryFrom<ChainId> for Id {\n    type Error = Error;\n\n    fn try_from(chain_id: ChainId) -> Result<Self, Self::Error> {\n        chain_id.as_ref().parse()\n    }\n}\n","sourceCodeStart":29,"sourceCodeEnd":59,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/dydx/src/grpc/types.rs#L29-L59","documentation":"dYdX adapter chain IDs are restricted to a closed set parsed from strings. `DydxCurrency/ChainId::from_str` only accepts `dydx-testnet-4`/`testnet` and `dydx-mainnet-1`/`mainnet`; any other chain identifier string is rejected with this error.","triggerScenarios":"Passing any chain ID string other than the four accepted aliases into `DydxCurrency::from_str` (or config/env code that calls it), e.g. `\"dydx-testnet-3\"`, `\"mainnet-1\"`, or a fully-qualified Cosmos chain name like `\"dydx-mainnet-1\"` with different casing or whitespace.","commonSituations":"Reusing a chain ID from another Cosmos ecosystem (Osmosis, Cosmos Hub) or an older dYdX testnet (v3/v4-testnet variants); trailing spaces or wrong case in config files; hardcoding a chain name copied from dYdX v3 documentation.","solutions":["Use one of the accepted values: `dydx-testnet-4`, `testnet`, `dydx-mainnet-1`, or `mainnet`","Trim whitespace and fix casing of the configured chain ID string","Check the dYdX adapter docs for currently supported networks and update config accordingly"],"exampleFix":"// before\nlet chain = DydxCurrency::from_str(\"dydx-testnet-3\")?;\n// after\nlet chain = DydxCurrency::from_str(\"dydx-testnet-4\")?;","handlingStrategy":"validation","validationCode":"const CHAIN_IDS: [&str; 4] = [\"dydx-testnet-4\", \"testnet\", \"dydx-mainnet-1\", \"mainnet\"];\nfn is_valid_chain_id(s: &str) -> bool { CHAIN_IDS.contains(&s.trim()) }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep network selection in a single enum/config constant rather than free-form strings","Trim and normalize config values before parsing"],"tags":["rust","dydx","config","enum-parsing"],"backgroundTag":"invalid-enum-value","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}