{"record":{"id":"d2d0669c0fd3f3bc","repo":"nautechsystems/nautilus_trader","slug":"deployment-manifest-has-no-capability-probe-target","errorCode":null,"errorMessage":"Deployment manifest has no capability probe target","messagePattern":"Deployment manifest has no capability probe target","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/execution/client.rs","lineNumber":4954,"sourceCode":"    let balances = wallet_balance.replace_balances(native_balance, token_balances)?;\n    Ok(VerifiedWalletRefresh {\n        wallet_balance,\n        balances,\n        decisions,\n    })\n}\n\nasync fn verify_connect_capabilities(\n    verification: &VerificationCoordinator,\n    manifest: &BlockchainDeploymentManifest,\n    wallet: Address,\n    weth: Address,\n    block: u64,\n) -> anyhow::Result<Vec<ExecutionVerificationDecision>> {\n    let contract = manifest\n        .contracts\n        .first()\n        .ok_or_else(|| anyhow::anyhow!(\"Deployment manifest has no capability probe target\"))?;\n    let contract_address = Address::from_str(&contract.address)\n        .with_context(|| \"Deployment manifest capability probe target is invalid\")?;\n    let storage = required_verification(\n        verification\n            .verify_storage(&contract_address, &B256::ZERO, block)\n            .await,\n        \"Blockchain explicit-height storage capability\",\n    )?;\n\n    let balance_call = ERC20::balanceOfCall { account: wallet }.abi_encode();\n    let gas = required_verification(\n        verification\n            .verify_gas_estimate(&wallet, &weth, U256::ZERO, &balance_call, block)\n            .await,\n        \"Blockchain explicit-height gas capability\",\n    )?;\n\n    let mut decisions = vec![","sourceCodeStart":4936,"sourceCodeEnd":4972,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/execution/client.rs#L4936-L4972","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before: token-only manifest\n{\"chain\": \"base\", \"tokens\": [\"0x...\"], \"contracts\": []}\n// after: include the probe target\n{\"chain\": \"base\", \"tokens\": [\"0x...\"], \"contracts\": [{\"address\": \"0xDeployment...\", \"name\": \"router\"}]}","handlingStrategy":"validation","validationCode":"// before running capability verification\nensure!(!manifest.contracts.is_empty(), \"deployment manifest must list at least one contract for probing\");","typeGuard":"fn has_probe_target(manifest: &DeploymentManifest) -> bool {\n    manifest.contracts.first()\n        .map(|c| Address::from_str(&c.address).is_ok())\n        .unwrap_or(false)\n}","tryCatchPattern":"match run_capability_verification(&manifest, weth, block).await {\n    Ok(decisions) => { /* use decisions */ }\n    Err(e) if e.to_string().contains(\"no capability probe target\") => {\n        log::error!(\"manifest has no contracts; regenerate or point at the full deployment manifest\");\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["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"],"tags":["rust","blockchain","manifest","verification"],"backgroundTag":"empty-required-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"}