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
- Regenerate the deployment manifest so it includes the deployed contract entries
- Point the adapter at the correct full deployment manifest that contains the probe contract
- Complete or re-run the contract deployment so addresses are recorded in the manifest
- 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
- Generate the manifest only after contract deployment completes so addresses are recorded
- Validate the manifest (non-empty contracts, parseable addresses) at load time
- Avoid sharing/exporting stripped manifests for verification workloads
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
- Wallet token {address} does not have exactly one deployment
- Lighter transaction lookup did not match acknowledged create
- Failed to load active execution intent: {e}
- Failed to start replacement transaction persistence: {e}
- Failed to lock active execution intent {intent_id}: {e}
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/d2d0669c0fd3f3bc.
Report an issue: GitHub.