{"record":{"id":"69ef826b04584ad0","repo":"nautechsystems/nautilus_trader","slug":"configured-token-address-has-no-deployment-manif","errorCode":null,"errorMessage":"Configured token {address} has no deployment manifest identity","messagePattern":"Configured token (.+?) has no deployment manifest identity","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/execution/client.rs","lineNumber":436,"sourceCode":"        let mut token_decimals = HashMap::new();\n\n        for token in &manifest.tokens {\n            let address = Address::from_str(&token.address)\n                .map_err(|_| anyhow::anyhow!(\"Deployment manifest token address is invalid\"))?;\n            anyhow::ensure!(\n                token_decimals.insert(address, token.decimals).is_none(),\n                \"Deployment manifest contains a duplicate token identity\"\n            );\n        }\n        anyhow::ensure!(\n            token_decimals.contains_key(&weth),\n            \"Deployment manifest has no wrapped native token identity\"\n        );\n\n        if let Some(tokens) = &config.tokens {\n            for token in tokens {\n                let address = validate_address(token)?;\n                anyhow::ensure!(\n                    token_decimals.contains_key(&address),\n                    \"Configured token {address} has no deployment manifest identity\"\n                );\n            }\n        }\n\n        for (token_in, token_out) in config.allowed_token_pairs.as_deref().unwrap_or_default() {\n            let token_in = validate_address(token_in)?;\n            let token_out = validate_address(token_out)?;\n            anyhow::ensure!(\n                token_in != token_out\n                    && 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() {","sourceCodeStart":418,"sourceCodeEnd":454,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/execution/client.rs#L418-L454","documentation":"When `config.tokens` is set, the validator resolves each configured token address and checks it against the manifest's token table with `token_decimals.contains_key(&address)`. This error means a token configured on the client has no corresponding entry in the deployment manifest, so the library cannot know its decimals or identity and refuses to start.","triggerScenarios":"Client initialization with `config.tokens` containing an address (validated by `validate_address`) that is absent from `manifest.tokens` — e.g. a token added to config but not the deployment manifest.","commonSituations":"Adding a newly listed token to the client config without updating the deployment manifest; a config from a different deployment/chain than the manifest; a typo causing the configured address to differ slightly from the manifest entry.","solutions":["Add the missing token (address and decimals) to the deployment manifest's `tokens` array","Remove the token from `config.tokens` if it is not part of this deployment","Regenerate both config and manifest from the same deployment to keep them in sync"],"exampleFix":"// before: config.tokens includes 0xNEW... but manifest.tokens does not\n// after: add to manifest.tokens\n{\"symbol\": \"NEW\", \"address\": \"0xNEW...\", \"decimals\": 18}","handlingStrategy":"validation","validationCode":"let manifest_addrs: HashSet<Address> = manifest.tokens.iter()\n    .filter_map(|t| Address::from_str(&t.address).ok())\n    .collect();\nfor t in config.tokens.iter().flatten() {\n    let a = validate_address(t)?;\n    if !manifest_addrs.contains(&a) { return Err(format!(\"token {a} missing from manifest\")); }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat the manifest as the source of truth; generate config.tokens from it","When adding a token to config, update the manifest in the same change","Validate config-vs-manifest token coverage in CI before deploying"],"tags":["rust","config","ethereum","consistency"],"backgroundTag":"missing-required-config-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"}