{"record":{"id":"aebca7085f109688","repo":"nautechsystems/nautilus_trader","slug":"validated-manifest-probe-output","errorCode":null,"errorMessage":"validated manifest probe output","messagePattern":"validated manifest probe output","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/rpc/verification.rs","lineNumber":710,"sourceCode":"                        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);\n                    }\n                    VerificationOutcome::Retryable(failure) => {","sourceCodeStart":692,"sourceCodeEnd":728,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/rpc/verification.rs#L692-L728","documentation":"Same guard as the probe call data, but for probe.expected_output: the expected eth_call response bytes must be valid hex for the comparison in verify_call to run. The expect asserts the manifest was pre-validated; hitting it means malformed expected_output slipped through.","triggerScenarios":"verify_deployment_manifest with a probe whose expected_output is empty, odd-length, or contains non-hex characters.","commonSituations":"Recording a probe's expected output by hand from a logs viewer that strips 0x or inserts spaces; truncating output during copy/paste; a manifest producer emitting a textual description instead of bytes.","solutions":["Confirm probe.expected_output is a complete even-length hex string (0x... optional)","Re-capture the expected output from a real eth_call via the manifest tooling","Pre-validate expected_output with Bytes::from_str in a CI check on the manifest","File a bug if the official validator accepts malformed output"],"exampleFix":"// before\nlet expected = Bytes::from_str(&probe.expected_output)\n    .expect(\"validated manifest probe output\");\n// after\nlet expected = Bytes::from_str(&probe.expected_output)\n    .map_err(|e| ManifestError::InvalidProbeOutput(probe_index, e))?;","handlingStrategy":"validation","validationCode":"fn validate_probe_output(probe: &Probe) -> Result<(), String> {\n    Bytes::from_str(&probe.expected_output)\n        .map(|_| ())\n        .map_err(|e| format!(\"invalid expected_output '{}': {e}\", probe.expected_output))\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":["Capture expected outputs via tooling that emits canonical hex","Lint manifests for even-length hex strings","Round-trip manifests through serde before use"],"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"}