nautechsystems/nautilus_trader · error

Deployment manifest has no capability probe target

Error message

Deployment manifest has no capability probe target

What it means

The capability-probe verification routine picks the first contract in the deployment manifest as the target for storage verification probes. This error is thrown when `manifest.contracts` is empty, so there is no contract address to probe against and verification cannot proceed.

Source

Thrown at crates/adapters/blockchain/src/execution/client.rs:4954

    let balances = wallet_balance.replace_balances(native_balance, token_balances)?;
    Ok(VerifiedWalletRefresh {
        wallet_balance,
        balances,
        decisions,
    })
}

async fn verify_connect_capabilities(
    verification: &VerificationCoordinator,
    manifest: &BlockchainDeploymentManifest,
    wallet: Address,
    weth: Address,
    block: u64,
) -> anyhow::Result<Vec<ExecutionVerificationDecision>> {
    let contract = manifest
        .contracts
        .first()
        .ok_or_else(|| anyhow::anyhow!("Deployment manifest has no capability probe target"))?;
    let contract_address = Address::from_str(&contract.address)
        .with_context(|| "Deployment manifest capability probe target is invalid")?;
    let storage = required_verification(
        verification
            .verify_storage(&contract_address, &B256::ZERO, block)
            .await,
        "Blockchain explicit-height storage capability",
    )?;

    let balance_call = ERC20::balanceOfCall { account: wallet }.abi_encode();
    let gas = required_verification(
        verification
            .verify_gas_estimate(&wallet, &weth, U256::ZERO, &balance_call, block)
            .await,
        "Blockchain explicit-height gas capability",
    )?;

    let mut decisions = vec![

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Regenerate the deployment manifest so it includes the deployed contract entries
  2. Point the adapter at the correct full deployment manifest that contains the probe contract
  3. Complete or re-run the contract deployment so addresses are recorded in the manifest
  4. Verify `manifest.contracts` is populated before invoking verification

Example fix

// before: token-only manifest
{"chain": "base", "tokens": ["0x..."], "contracts": []}
// after: include the probe target
{"chain": "base", "tokens": ["0x..."], "contracts": [{"address": "0xDeployment...", "name": "router"}]}
Defensive patterns

Strategy: validation

Validate before calling

// before running capability verification
ensure!(!manifest.contracts.is_empty(), "deployment manifest must list at least one contract for probing");

Type guard

fn has_probe_target(manifest: &DeploymentManifest) -> bool {
    manifest.contracts.first()
        .map(|c| Address::from_str(&c.address).is_ok())
        .unwrap_or(false)
}

Try / catch

match run_capability_verification(&manifest, weth, block).await {
    Ok(decisions) => { /* use decisions */ }
    Err(e) if e.to_string().contains("no capability probe target") => {
        log::error!("manifest has no contracts; regenerate or point at the full deployment manifest");
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Calling the verification/decision function with a deployment manifest whose `contracts` array is empty — typically a minimal or auto-generated manifest that lists tokens but no deployed contract addresses, used where a probe target is required.

Common situations: Manifest generated before contracts were deployed; contract list stripped when exporting/sharing the manifest; pointing the adapter at the wrong manifest file (token-only manifest instead of the full deployment manifest); a deployment that produced no contracts due to an earlier failed deploy.

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


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