{"record":{"id":"3cb4c2e0d2639e14","repo":"nautechsystems/nautilus_trader","slug":"router-addresses-must-contain-at-least-one-route","errorCode":null,"errorMessage":"`router_addresses` must contain at least one router address","messagePattern":"`router_addresses` must contain at least one router address","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/execution/client.rs","lineNumber":210,"sourceCode":"            http_rpc_client.clone(),\n            config.http_rpc_url.expose_secret(),\n            verification_config,\n            config.rpc_requests_per_second,\n        )?;\n        let wallet_address = validate_address(config.wallet_address.as_str())?;\n        let erc20_contract = Erc20Contract::new_with_timeout(\n            http_rpc_client.clone(),\n            Some(EXECUTION_RPC_TIMEOUT_SECS),\n            true,\n        );\n\n        let router_addresses = config\n            .router_addresses\n            .iter()\n            .map(|address| validate_address(address.as_str()))\n            .collect::<anyhow::Result<Vec<_>>>()?;\n        if router_addresses.is_empty() {\n            anyhow::bail!(\"`router_addresses` must contain at least one router address\");\n        }\n        let weth_address = validate_address(config.weth_address.as_str())?;\n        Self::validate_manifest_contracts(&config, &router_addresses, weth_address)?;\n\n        let mut token_universe = HashSet::new();\n\n        if let Some(specified_tokens) = &config.tokens {\n            for token in specified_tokens {\n                let token_address = validate_address(token.as_str())?;\n                token_universe.insert(token_address);\n            }\n        }\n        let wallet_balance = WalletBalance::new(token_universe);\n        let emitter = ExecutionEventEmitter::new(\n            get_atomic_clock_realtime(),\n            core_client.trader_id,\n            core_client.account_id,\n            core_client.account_type,","sourceCodeStart":192,"sourceCodeEnd":228,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/execution/client.rs#L192-L228","documentation":"BlockchainExecutionClient::new validates the router_addresses list from the config before constructing the client. The library throws this when the configured router address collection is empty, because an execution client cannot route swaps without at least one Uniswap-style router contract. Fail-fast happens at construction rather than at first transaction.","triggerScenarios":"Calling BlockchainExecutionClient::new (public) with a config whose router_addresses vec/field is empty or omitted, e.g. an unset TOML/env config mapping to Vec::new().","commonSituations":"Config file missing the router_addresses section; a defaults-loading layer skipping empty lists; operator forgetting to set router addresses per-chain when switching networks.","solutions":["Add at least one valid router address to config.router_addresses for the target chain","Verify the config loader is actually populating router_addresses (no silent default to empty vec)","Confirm the addresses belong to the connected network and are checksummed/parseable by validate_address"],"exampleFix":"// before\nrouter_addresses = []\n// after\nrouter_addresses = [\"0xE592427A0AEce92De3Edee1F18E0157C05861564\"]","handlingStrategy":"validation","validationCode":"if config.router_addresses.is_empty() {\n    return Err(\"router_addresses must contain at least one address before constructing the client\".into());\n}\nfor a in &config.router_addresses {\n    Address::from_str(a)?; // also fails fast on malformed addresses\n}","typeGuard":"fn has_router_addresses(cfg: &ExecutionClientConfig) -> bool {\n    !cfg.router_addresses.is_empty()\n}","tryCatchPattern":null,"preventionTips":["Template the per-chain config with a non-empty router_addresses default","Validate the full config with a dry-run constructor or unit test in CI","Keep router addresses keyed by chain id in one shared config module"],"tags":["config","validation","blockchain"],"backgroundTag":"empty-required-field","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"}