{"record":{"id":"bf9af7c02265da55","repo":"nautechsystems/nautilus_trader","slug":"validated-manifest-probe-data","errorCode":null,"errorMessage":"validated manifest probe data","messagePattern":"validated manifest probe data","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/rpc/verification.rs","lineNumber":708,"sourceCode":"                    }\n                    VerificationOutcome::Disagreement(failure) => {\n                        return VerificationOutcome::Disagreement(failure);\n                    }\n                    VerificationOutcome::Unavailable(failure) => {\n                        return VerificationOutcome::Unavailable(failure);\n                    }\n                    VerificationOutcome::Retryable(failure) => {\n                        return VerificationOutcome::Retryable(failure);\n                    }\n                    VerificationOutcome::LocallyInvalid(failure) => {\n                        return VerificationOutcome::LocallyInvalid(failure);\n                    }\n                }\n            }\n\n            for probe in &contract.probes {\n                let call_data =\n                    Bytes::from_str(&probe.call_data).expect(\"validated manifest probe data\");\n                let expected = Bytes::from_str(&probe.expected_output)\n                    .expect(\"validated manifest probe output\");\n\n                match self\n                    .verify_call(None, &address, U256::ZERO, &call_data, block)\n                    .await\n                {\n                    VerificationOutcome::Verified(verified) if verified.value == expected => {}\n                    VerificationOutcome::Verified(_) => {\n                        return VerificationOutcome::Disagreement(\n                            self.failure(VerificationRead::DeploymentIdentity),\n                        );\n                    }\n                    VerificationOutcome::Disagreement(failure) => {\n                        return VerificationOutcome::Disagreement(failure);\n                    }\n                    VerificationOutcome::Unavailable(failure) => {\n                        return VerificationOutcome::Unavailable(failure);","sourceCodeStart":690,"sourceCodeEnd":726,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/rpc/verification.rs#L690-L726","documentation":"This panic fires when probe.call_data cannot be parsed as alloy Bytes during manifest verification. Call data is expected to be validated hex (e.g. 0x-prefixed) before verification runs, so a parse failure means the manifest invariant was broken upstream. The expect is an internal guard protecting verify_call from malformed input.","triggerScenarios":"verify_deployment_manifest called with a contract.probes entry whose call_data is not valid hex (odd length, non-hex chars, or empty).","commonSituations":"Hand-edited manifest probe entries; copying ABI selector/calldata without the 0x prefix in a form the parser rejects; a generator bug emitting truncated calldata.","solutions":["Validate probe.call_data with Bytes::from_str before invoking verification","Regenerate the manifest from tooling so call data is emitted as canonical hex","Check each probe entry in the manifest JSON for malformed hex strings","Report a validator gap if validation passes but parsing fails"],"exampleFix":"// before\nBytes::from_str(&probe.call_data).expect(\"validated manifest probe data\");\n// after\nlet call_data = Bytes::from_str(&probe.call_data)\n    .map_err(|e| ManifestError::InvalidProbeData(probe_index, e))?;","handlingStrategy":"validation","validationCode":"fn validate_probe(probe: &Probe) -> Result<(), String> {\n    Bytes::from_str(&probe.call_data)\n        .map(|_| ())\n        .map_err(|e| format!(\"invalid probe call_data '{}': {e}\", probe.call_data))\n}","typeGuard":"fn is_valid_hex_bytes(s: &str) -> bool {\n    let h = s.trim_start_matches(\"0x\");\n    !h.is_empty() && h.len() % 2 == 0 && h.chars().all(|c| c.is_ascii_hexdigit())\n}","tryCatchPattern":null,"preventionTips":["Validate all manifest probe fields at load time before verification","Generate probes programmatically so hex encoding is never manual","Reject manifests with empty call_data or expected_output early"],"tags":["panic","invariant","manifest","hex-parsing"],"backgroundTag":"internal-invariant-violation","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"}