{"record":{"id":"6433d1290c4e43d6","repo":"nautechsystems/nautilus_trader","slug":"deployment-manifest-version-is-required","errorCode":null,"errorMessage":"Deployment manifest version is required","messagePattern":"Deployment manifest version is required","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/rpc/verification.rs","lineNumber":1230,"sourceCode":"    let anchor = &config.chain_anchor;\n    anyhow::ensure!(anchor.chain_id != 0, \"Chain anchor ID must be nonzero\");\n    anyhow::ensure!(\n        !anchor.chain_name.trim().is_empty(),\n        \"Chain anchor name is required\"\n    );\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\"","sourceCodeStart":1212,"sourceCodeEnd":1248,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/rpc/verification.rs#L1212-L1248","documentation":"The deployment config validator requires a non-empty (after trimming whitespace) `manifest_version` string. This version ties the on-disk/in-code deployment manifest to its configured identity and is later compared against the manifest's own `version` field. An empty or whitespace-only value means the deployment identity is unspecified, so validation stops here.","triggerScenarios":"Running verification with a DeploymentConfig whose `manifest_version` is \"\" or contains only whitespace.","commonSituations":"A new deployment config scaffolded with empty strings and never filled in; a field renamed or dropped during an upgrade so the value no longer lands in the struct; templating that substituted an empty variable.","solutions":["Set `config.manifest_version` to the exact version string embedded in the deployment manifest (e.g. \"v1.2.0\").","Ensure the config loader actually reads the version field (check for renamed keys or missing deserialization targets).","Fix whatever templating/CI step left the variable empty."],"exampleFix":"// before\nlet config = DeploymentConfig { manifest_version: \"\".into(), ..config };\n// after\nlet config = DeploymentConfig { manifest_version: \"v1.2.0\".into(), ..config }; // must equal manifest.version","handlingStrategy":"validation","validationCode":"if config.manifest_version.trim().is_empty() {\n    panic!(\"manifest_version must be set before verification\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Make manifest_version a required, non-defaulted config field so deserialization fails early.","Derive it from the manifest file itself instead of duplicating it by hand.","Check templating/CI variables that feed this field resolve to non-empty strings."],"tags":["validation","config","missing-field"],"backgroundTag":"missing-required-config-field","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"}