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

  1. Set `config.manifest_version` to the exact version string embedded in the deployment manifest (e.g. "v1.2.0").
  2. Ensure the config loader actually reads the version field (check for renamed keys or missing deserialization targets).
  3. 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

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


AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08). Data as JSON: /api/errors/6433d1290c4e43d6. Report an issue: GitHub.