{"record":{"id":"29ee667f058e928b","repo":"nautechsystems/nautilus_trader","slug":"deployment-manifest-pool-factory-is-invalid","errorCode":null,"errorMessage":"Deployment manifest pool factory is invalid","messagePattern":"Deployment manifest pool factory is invalid","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/execution/client.rs","lineNumber":468,"sourceCode":"                \"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\n            .get_balance_with_timeout(&self.wallet_address, None, Some(EXECUTION_RPC_TIMEOUT_SECS))\n            .await?;","sourceCodeStart":450,"sourceCodeEnd":486,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/execution/client.rs#L450-L486","documentation":"Deployment manifest validation in validate_manifest_contracts: a pool contract address from the manifest failed hex/Checksum address parsing, so the manifest references an unparseable pool factory and execution setup is aborted.","triggerScenarios":"Calling preflight/validate_manifest_contracts where a manifest.pools[].factory string fails Address::from_str.","commonSituations":"Hand-edited manifest with a malformed factory address; template placeholder never replaced; chain migration left an old/malformed value.","solutions":["Fix the pool.factory string in the deployment manifest to a valid hex address","Populate from the canonical Uniswap V3 factory address for the chain","Run address validation before deploying the manifest"],"exampleFix":"// before\nfactory = \"factory-placeholder\"\n// after\nfactory = \"0x1F98431c8aD98523631AE4a59f267346ea31F984\"","handlingStrategy":"validation","validationCode":"assert!(is_valid_address(&pool.factory), \"invalid factory address in manifest\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use templates with pre-filled canonical factory addresses per chain","Run address linting on the manifest before deploy","Keep factory addresses in one canonical registry"],"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-14T05:17:10.506Z"}