nautechsystems/nautilus_trader · error
Deployment manifest version is required
Error message
Deployment manifest version is required
What it means
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.
Source
Thrown at crates/adapters/blockchain/src/rpc/verification.rs:1230
let anchor = &config.chain_anchor;
anyhow::ensure!(anchor.chain_id != 0, "Chain anchor ID must be nonzero");
anyhow::ensure!(
!anchor.chain_name.trim().is_empty(),
"Chain anchor name is required"
);
let checkpoint_hash = B256::from_str(&anchor.checkpoint_hash)
.map_err(|_| anyhow::anyhow!("Chain checkpoint hash must contain 32 hexadecimal bytes"))?;
anyhow::ensure!(
checkpoint_hash != B256::ZERO,
"Chain checkpoint hash must be nonzero"
);
anyhow::ensure!(
anchor.max_head_skew_blocks != 0
&& anchor.max_head_age_secs != 0
&& anchor.max_future_drift_secs != 0,
"Chain head skew, age, and future-drift limits must be nonzero"
);
anyhow::ensure!(
!config.manifest_version.trim().is_empty(),
"Deployment manifest version is required"
);
let manifest_digest = B256::from_str(&config.manifest_digest).map_err(|_| {
anyhow::anyhow!("Deployment manifest digest must contain 32 hexadecimal bytes")
})?;
anyhow::ensure!(
manifest_digest != B256::ZERO,
"Deployment manifest digest must be nonzero"
);
let manifest = &config.deployment_manifest;
anyhow::ensure!(
manifest.version == config.manifest_version,
"Deployment manifest version does not match its configured identity"
);
anyhow::ensure!(
manifest.chain_id == anchor.chain_id && manifest.chain_name == anchor.chain_name,
"Deployment manifest chain identity does not match the chain anchor"View on GitHub (pinned to 18893faf8b)
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.
Example fix
// before
let config = DeploymentConfig { manifest_version: "".into(), ..config };
// after
let config = DeploymentConfig { manifest_version: "v1.2.0".into(), ..config }; // must equal manifest.version Defensive patterns
Strategy: validation
Validate before calling
if config.manifest_version.trim().is_empty() {
panic!("manifest_version must be set before verification");
} Prevention
- 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.
When it happens
Trigger: Running verification with a DeploymentConfig whose `manifest_version` is "" or contains only whitespace.
Common situations: 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.
Understand the failure class
Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.
Related errors
- request_rate_per_second must be greater than zero
- order_request_rate_per_second must be greater than zero
- heartbeat_secs must be positive when set
- heartbeat_timeout_secs must cover at least two server heartb
- DEX {} does not have initialize event set.
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/6433d1290c4e43d6.
Report an issue: GitHub.