{"record":{"id":"c297384dd45abc67","repo":"nautechsystems/nautilus_trader","slug":"deployment-manifest-digest-must-contain-32-hexadec","errorCode":null,"errorMessage":"Deployment manifest digest must contain 32 hexadecimal bytes","messagePattern":"Deployment manifest digest must contain 32 hexadecimal bytes","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/rpc/verification.rs","lineNumber":1235,"sourceCode":"    );\n    let checkpoint_hash = B256::from_str(&anchor.checkpoint_hash)\n        .map_err(|_| anyhow::anyhow!(\"Chain checkpoint hash must contain 32 hexadecimal bytes\"))?;\n    anyhow::ensure!(\n        checkpoint_hash != B256::ZERO,\n        \"Chain checkpoint hash must be nonzero\"\n    );\n    anyhow::ensure!(\n        anchor.max_head_skew_blocks != 0\n            && anchor.max_head_age_secs != 0\n            && anchor.max_future_drift_secs != 0,\n        \"Chain head skew, age, and future-drift limits must be nonzero\"\n    );\n    anyhow::ensure!(\n        !config.manifest_version.trim().is_empty(),\n        \"Deployment manifest version is required\"\n    );\n    let manifest_digest = B256::from_str(&config.manifest_digest).map_err(|_| {\n        anyhow::anyhow!(\"Deployment manifest digest must contain 32 hexadecimal bytes\")\n    })?;\n    anyhow::ensure!(\n        manifest_digest != B256::ZERO,\n        \"Deployment manifest digest must be nonzero\"\n    );\n    let manifest = &config.deployment_manifest;\n    anyhow::ensure!(\n        manifest.version == config.manifest_version,\n        \"Deployment manifest version does not match its configured identity\"\n    );\n    anyhow::ensure!(\n        manifest.chain_id == anchor.chain_id && manifest.chain_name == anchor.chain_name,\n        \"Deployment manifest chain identity does not match the chain anchor\"\n    );\n    let canonical_manifest = serde_json::to_vec(manifest)\n        .map_err(|_| anyhow::anyhow!(\"Failed to serialize the deployment manifest\"))?;\n    anyhow::ensure!(\n        keccak256(canonical_manifest) == manifest_digest,","sourceCodeStart":1217,"sourceCodeEnd":1253,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/rpc/verification.rs#L1217-L1253","documentation":"The configured `manifest_digest` must be a string that parses into a 32-byte B256 (64 hexadecimal characters). Parsing failure aborts validation with this message. The digest is the keccak256 commitment of the canonical manifest bytes and is used for integrity checks, so a malformed value cannot proceed.","triggerScenarios":"Validating a DeploymentConfig whose `manifest_digest` is empty, not hex, has an odd number of hex digits, or is not exactly 32 bytes.","commonSituations":"Digest truncated when copying from logs or CI output; missing 0x handling combined with strict parsing; a placeholder like \"<digest>\" left in a template; uppercase/whitespace artifacts from copy-paste.","solutions":["Recompute the digest as keccak256 over the canonical JSON serialization of the manifest and paste the full 64-hex-character value.","Verify the string is exactly 64 hex characters (optionally 0x-prefixed) with no whitespace.","Regenerate the manifest artifact if the original digest was produced by an older serializer version."],"exampleFix":"// before\nlet config = DeploymentConfig { manifest_digest: \"9f2cab\".into(), ..config }; // truncated\n// after\nlet config = DeploymentConfig { manifest_digest: \"9f2c...ab01\".into(), ..config }; // full 64 hex chars","handlingStrategy":"validation","validationCode":"fn digest_is_b256(s: &str) -> bool {\n    let hex = s.strip_prefix(\"0x\").unwrap_or(s);\n    hex.len() == 64 && hex.chars().all(|c| c.is_ascii_hexdigit())\n}\nassert!(digest_is_b256(&config.manifest_digest));","typeGuard":"fn parse_digest(s: &str) -> Option<B256> {\n    B256::from_str(s).ok()\n}","tryCatchPattern":null,"preventionTips":["Always copy digests in full 0x-prefixed 64-hex form straight from the generator output.","Have the manifest build step emit and stamp the digest automatically rather than humans pasting it.","Trim whitespace and normalize case before storing the digest."],"tags":["validation","hex","format"],"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-14T00:17:10.932Z"}