{"record":{"id":"94ff5df130c0d749","repo":"nautechsystems/nautilus_trader","slug":"deployment-manifest-pool-address-is-invalid","errorCode":null,"errorMessage":"Deployment manifest pool address is invalid","messagePattern":"Deployment manifest pool address is invalid","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/execution/client.rs","lineNumber":466,"sourceCode":"                    && token_decimals.contains_key(&token_in)\n                    && token_decimals.contains_key(&token_out),\n                \"Allowed token pair {token_in} -> {token_out} is not fully pinned by the deployment manifest\"\n            );\n        }\n\n        for limit in config.quote_spend_limits.as_deref().unwrap_or_default() {\n            let spend_token = validate_address(&limit.spend_token)?;\n            anyhow::ensure!(\n                token_decimals.get(&spend_token) == Some(&limit.spend_token_decimals),\n                \"Quote spend limit decimals do not match the deployment manifest\"\n            );\n        }\n\n        let pool_contracts = role_addresses(BlockchainContractRole::Pool)?;\n\n        for pool in &manifest.pools {\n            let pool_address = Address::from_str(&pool.address)\n                .map_err(|_| anyhow::anyhow!(\"Deployment manifest pool address is invalid\"))?;\n            let pool_factory = Address::from_str(&pool.factory)\n                .map_err(|_| anyhow::anyhow!(\"Deployment manifest pool factory is invalid\"))?;\n            let pool_quote = Address::from_str(&pool.quote_contract).map_err(|_| {\n                anyhow::anyhow!(\"Deployment manifest pool quote contract is invalid\")\n            })?;\n            anyhow::ensure!(\n                pool_contracts.contains(&pool_address)\n                    && pool_factory == factory\n                    && pool_quote == quote_contract,\n                \"Deployment manifest pool does not use the pinned pool, factory, and quote identities\"\n            );\n        }\n        Ok(())\n    }\n\n    async fn fetch_native_currency_balance(&self) -> anyhow::Result<Money> {\n        let balance_u256 = self\n            .http_rpc_client","sourceCodeStart":448,"sourceCodeEnd":484,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/execution/client.rs#L448-L484","documentation":"Each pool entry in the deployment manifest carries an address string that must parse as a valid Ethereum address via Address::from_str. If parsing fails (malformed hex, wrong length, invalid characters), validation aborts with this error.","triggerScenarios":"Calling preflight/validate_manifest_contracts where a manifest.pools[].address string fails Address::from_str parsing.","commonSituations":"Typo in the manifest (missing characters, whitespace, non-hex chars); address written with an unsupported prefix or wrong length; hand-edited manifest corruption.","solutions":["Correct the pool.address string in the deployment manifest to a valid 20-byte hex address","Copy the address directly from the deployment artifacts rather than hand-typing","Validate the address offline (checksum tool) before editing the manifest"],"exampleFix":"// before\naddress = \"0x1234\" // too short\n// after\naddress = \"0x1234567890abcdef1234567890abcdef12345678\"","handlingStrategy":"validation","validationCode":"fn is_valid_address(s: &str) -> bool {\n    s.len() == 42 && s.starts_with(\"0x\") && s[2..].chars().all(|c| c.is_ascii_hexdigit())\n}\nassert!(is_valid_address(&pool.address));","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Validate all manifest addresses in CI","Copy addresses from deployment artifacts, never by hand","Checksum-validate addresses when editing manifests"],"tags":["validation","manifest","address"],"backgroundTag":"invalid-argument-format","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"}