nautechsystems/nautilus_trader · error
Proxy target has no unique deployment manifest identity
Error message
Proxy target has no unique deployment manifest identity
What it means
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.
Source
Thrown at crates/adapters/blockchain/src/rpc/verification.rs:1328
Bytes::from_str(&probe.call_data)
.map_err(|_| anyhow::anyhow!("Manifest probe call data is invalid"))?;
Bytes::from_str(&probe.expected_output)
.map_err(|_| anyhow::anyhow!("Manifest probe output is invalid"))?;
}
}
for contract in &manifest.contracts {
let Some(proxy) = &contract.proxy else {
continue;
};
let target =
Address::from_str(&proxy.target_address).expect("validated proxy target address");
let target_contract = manifest
.contracts
.iter()
.find(|candidate| Address::from_str(&candidate.address).ok() == Some(target))
.ok_or_else(|| {
anyhow::anyhow!("Proxy target has no unique deployment manifest identity")
})?;
anyhow::ensure!(
target_contract.role == BlockchainContractRole::Implementation
&& target_contract
.runtime_code_hash
.eq_ignore_ascii_case(&proxy.target_code_hash),
"Proxy target role or code hash conflicts with its deployment identity"
);
}
for required in [
BlockchainContractRole::Router,
BlockchainContractRole::Factory,
BlockchainContractRole::WrappedNative,
BlockchainContractRole::Quote,
BlockchainContractRole::Token,
BlockchainContractRole::Pool,
] {View on GitHub (pinned to 18893faf8b)
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
Example fix
// before
"contracts": [ {"address": "0xproxy...", "proxy": {"target_address": "0xmissing..."}} ]
// after
"contracts": [ {"address": "0xproxy...", "proxy": {"target_address": "0ximpl..."}}, {"address": "0ximpl...", "role": "implementation", "runtime_code_hash": "0x..."} ] Defensive patterns
Strategy: validation
Validate before calling
fn proxy_targets_pinned(manifest: &Manifest) -> bool {
manifest.contracts.iter().filter_map(|c| c.proxy.as_ref()).all(|p| {
let target = Address::from_str(&p.target_address).expect("valid target");
manifest.contracts.iter().any(|c| Address::from_str(&c.address).ok() == Some(target))
})
} Try / catch
match validate_manifest(&config) {
Err(e) if e.to_string().contains("no unique deployment manifest identity") => {
eprintln!("add a contract entry for the proxy target address: {e}");
}
Err(e) => return Err(e),
Ok(v) => v,
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- Proxy target role or code hash conflicts with its deployment
- Chart function must be callable, was {type(f)}
- Chart function must be callable, was {type(func)}
- Chart '{name}' not found.{suggestion_text} Available charts:
- plotly is required for visualization. Install it with: pip i
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/fcb1c0382c28c788.
Report an issue: GitHub.