{"record":{"id":"fcb1c0382c28c788","repo":"nautechsystems/nautilus_trader","slug":"proxy-target-has-no-unique-deployment-manifest-ide","errorCode":null,"errorMessage":"Proxy target has no unique deployment manifest identity","messagePattern":"Proxy target has no unique deployment manifest identity","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/rpc/verification.rs","lineNumber":1328,"sourceCode":"            Bytes::from_str(&probe.call_data)\n                .map_err(|_| anyhow::anyhow!(\"Manifest probe call data is invalid\"))?;\n            Bytes::from_str(&probe.expected_output)\n                .map_err(|_| anyhow::anyhow!(\"Manifest probe output is invalid\"))?;\n        }\n    }\n\n    for contract in &manifest.contracts {\n        let Some(proxy) = &contract.proxy else {\n            continue;\n        };\n        let target =\n            Address::from_str(&proxy.target_address).expect(\"validated proxy target address\");\n        let target_contract = manifest\n            .contracts\n            .iter()\n            .find(|candidate| Address::from_str(&candidate.address).ok() == Some(target))\n            .ok_or_else(|| {\n                anyhow::anyhow!(\"Proxy target has no unique deployment manifest identity\")\n            })?;\n        anyhow::ensure!(\n            target_contract.role == BlockchainContractRole::Implementation\n                && target_contract\n                    .runtime_code_hash\n                    .eq_ignore_ascii_case(&proxy.target_code_hash),\n            \"Proxy target role or code hash conflicts with its deployment identity\"\n        );\n    }\n\n    for required in [\n        BlockchainContractRole::Router,\n        BlockchainContractRole::Factory,\n        BlockchainContractRole::WrappedNative,\n        BlockchainContractRole::Quote,\n        BlockchainContractRole::Token,\n        BlockchainContractRole::Pool,\n    ] {","sourceCodeStart":1310,"sourceCodeEnd":1346,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/rpc/verification.rs#L1310-L1346","documentation":"After validating each proxy's fields, the verifier re-scans manifest.contracts for an entry whose address equals the proxy's target_address. This error means no manifest contract entry matches the proxy target, so the proxy's implementation has no pinned identity (address + role + runtime code hash) inside the manifest.","triggerScenarios":"Manifest verification where contract A has a proxy whose target_address is not listed among the addresses of manifest.contracts — e.g. the implementation contract was omitted from the manifest, or its address was mistyped/changed after an upgrade.","commonSituations":"Deploying a new implementation and upgrading the proxy without regenerating the manifest; the implementation living outside the verified contract set; lowercase-vs-checksummed or mistyped hex preventing the address match.","solutions":["Add a manifest contract entry for the proxy target address with its correct role and runtime_code_hash","Update proxy.target_address to an implementation that is already pinned in the manifest","Regenerate the full manifest after the upgrade so the new implementation is included and the manifest digest is recomputed"],"exampleFix":"// before\n\"contracts\": [ {\"address\": \"0xproxy...\", \"proxy\": {\"target_address\": \"0xmissing...\"}} ]\n// after\n\"contracts\": [ {\"address\": \"0xproxy...\", \"proxy\": {\"target_address\": \"0ximpl...\"}}, {\"address\": \"0ximpl...\", \"role\": \"implementation\", \"runtime_code_hash\": \"0x...\"} ]","handlingStrategy":"validation","validationCode":"fn proxy_targets_pinned(manifest: &Manifest) -> bool {\n    manifest.contracts.iter().filter_map(|c| c.proxy.as_ref()).all(|p| {\n        let target = Address::from_str(&p.target_address).expect(\"valid target\");\n        manifest.contracts.iter().any(|c| Address::from_str(&c.address).ok() == Some(target))\n    })\n}","typeGuard":null,"tryCatchPattern":"match validate_manifest(&config) {\n    Err(e) if e.to_string().contains(\"no unique deployment manifest identity\") => {\n        eprintln!(\"add a contract entry for the proxy target address: {e}\");\n    }\n    Err(e) => return Err(e),\n    Ok(v) => v,\n}","preventionTips":["Always include implementation contracts as pinned entries whenever any proxy references them","Regenerate the whole manifest after every proxy upgrade","Normalize addresses to lowercase hex when comparing or writing manifest fields"],"tags":["validation","manifest","proxy","consistency"],"backgroundTag":"resource-not-found","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"}