{"record":{"id":"dba10aeb074802dd","repo":"nautechsystems/nautilus_trader","slug":"manifest-probe-call-data-is-invalid","errorCode":null,"errorMessage":"Manifest probe call data is invalid","messagePattern":"Manifest probe call data is invalid","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/rpc/verification.rs","lineNumber":1311,"sourceCode":"            let storage_value = B256::from_str(&proxy.storage_value)\n                .map_err(|_| anyhow::anyhow!(\"Proxy storage value is invalid\"))?;\n            let target = Address::from_str(&proxy.target_address)\n                .map_err(|_| anyhow::anyhow!(\"Proxy target address is invalid\"))?;\n            let target_hash = B256::from_str(&proxy.target_code_hash)\n                .map_err(|_| anyhow::anyhow!(\"Proxy target code hash is invalid\"))?;\n            anyhow::ensure!(\n                target != Address::ZERO\n                    && target != address\n                    && target_hash != B256::ZERO\n                    && storage_value[..12].iter().all(|byte| *byte == 0)\n                    && storage_value[12..] == *target.as_slice(),\n                \"Proxy target binding is invalid\"\n            );\n        }\n\n        for probe in &contract.probes {\n            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            })?;","sourceCodeStart":1293,"sourceCodeEnd":1329,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/rpc/verification.rs#L1293-L1329","documentation":"The manifest validator parses each contract probe's call_data field with alloy's Bytes::from_str, which requires a valid hex byte string (optionally 0x-prefixed, even length). This error means a probe's call_data is not valid hex, so the verifier cannot build the identity probe call it would use to confirm the deployed contract matches the manifest.","triggerScenarios":"Running deployment manifest verification when a contract's probes[] entry has call_data that is empty, odd-length, or contains non-hex characters — e.g. an ABI signature string like 'owner()' pasted instead of its 4-byte selector.","commonSituations":"Writing probe call data by hand instead of encoding with an ABI encoder; pasting a Solidity function signature rather than keccak-derived selector bytes; shell/JSON escaping corrupting the 0x prefix; tools emitting odd-length hex.","solutions":["Set probe.call_data to valid even-length hex (e.g. 0x8da5cb5b for owner())","Encode the intended call with an ABI encoder (cast calldata / ethers) and copy the output verbatim","Re-run manifest generation so call_data is produced programmatically"],"exampleFix":"// before\n{\"call_data\": \"owner()\"}\n// after\n{\"call_data\": \"0x8da5cb5b\"}","handlingStrategy":"validation","validationCode":"fn valid_hex_bytes(s: &str) -> bool {\n    let h = s.strip_prefix(\"0x\").unwrap_or(s);\n    !h.is_empty() && h.len() % 2 == 0 && h.chars().all(|c| c.is_ascii_hexdigit())\n}\nassert!(manifest.contracts.iter().flat_map(|c| &c.probes).all(|p| valid_hex_bytes(&p.call_data)));","typeGuard":null,"tryCatchPattern":"match validate_manifest(&config) {\n    Err(e) if e.to_string().contains(\"probe call data\") => {\n        eprintln!(\"re-encode probe call_data with an ABI encoder: {e}\");\n    }\n    Err(e) => return Err(e),\n    Ok(v) => v,\n}","preventionTips":["Generate call_data with an ABI encoder (cast calldata 'fn()' or ethers Interface), never by hand","Never paste Solidity signatures where hex bytes are expected","Pre-commit script that hex-validates all probe fields","Keep the 0x prefix lowercase and intact through JSON tooling"],"tags":["validation","hex-parsing","manifest"],"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"}