nautechsystems/nautilus_trader · critical

Independent Blockchain execution verification is required

Error message

Independent Blockchain execution verification is required

What it means

Thrown by `BlockchainExecutionClient::new` when the provided `BlockchainExecutionClientConfig` has no `verification` section. Independent blockchain execution verification (a verification coordinator with a chain anchor and deployment manifest) is mandatory, so construction fails rather than running unverified.

Source

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

    ///
    /// Returns an error if transaction limits are missing or invalid, independent verification is
    /// missing or conflicts with the configured chain, the deployment manifest or provider
    /// topology is invalid, a configured address or token pair is invalid, the router allowlist is
    /// empty, or the slippage bounds are inconsistent or not below 100%.
    pub fn new(
        core_client: ExecutionClientCore,
        config: BlockchainExecutionClientConfig,
    ) -> anyhow::Result<Self> {
        let transaction_limits = Self::transaction_limits(&config)?;
        let chain = Arc::new(config.chain.clone());
        let cache = BlockchainCache::new(chain.clone());
        let http_rpc_client = Arc::new(BlockchainHttpRpcClient::new(
            config.http_rpc_url.clone().into_inner(),
            config.rpc_requests_per_second,
            None,
        ));
        let verification_config = config.verification.as_ref().ok_or_else(|| {
            anyhow::anyhow!("Independent Blockchain execution verification is required")
        })?;
        anyhow::ensure!(
            verification_config.chain_anchor.chain_id == config.chain.chain_id,
            "Verification chain anchor ID does not match the configured chain"
        );
        anyhow::ensure!(
            verification_config.chain_anchor.chain_name == config.chain.name.to_string(),
            "Verification chain anchor name does not match the configured chain"
        );
        let verification = VerificationCoordinator::new(
            http_rpc_client.clone(),
            config.http_rpc_url.expose_secret(),
            verification_config,
            config.rpc_requests_per_second,
        )?;
        let wallet_address = validate_address(config.wallet_address.as_str())?;
        let erc20_contract = Erc20Contract::new_with_timeout(
            http_rpc_client.clone(),

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Add a `verification` section to the config with `chain_anchor` (chain_id, chain_name) and `deployment_manifest`.
  2. Set `config.verification = Some(VerificationConfig {...})` when constructing the config in code.
  3. Check the config file for a missing or commented-out `[verification]` block.
  4. Verify the config deserialization path actually populates `verification` (field names/serde renames).

Example fix

// before
let config = BlockchainExecutionClientConfig { chain, http_rpc_url, rpc_requests_per_second, verification: None };
// after
let config = BlockchainExecutionClientConfig {
    chain,
    http_rpc_url,
    rpc_requests_per_second,
    verification: Some(VerificationConfig {
        chain_anchor: ChainAnchor { chain_id: chain.chain_id, chain_name: chain.name.to_string() },
        deployment_manifest: load_deployment_manifest()?,
    }),
};
Defensive patterns

Strategy: validation

Validate before calling

// validate before constructing the client
if config.verification.is_none() {
    return Err(anyhow!("config.verification must be provided (chain_anchor + deployment_manifest)"));
}

Type guard

fn verification_configured(config: &BlockchainExecutionClientConfig) -> bool {
    config.verification.as_ref().map(|v| !v.deployment_manifest.contracts.is_empty()).unwrap_or(false)
}

Try / catch

let client = BlockchainExecutionClient::new(config).map_err(|e| {
    if e.to_string().contains("verification is required") {
        anyhow::anyhow!("Config error: add a [verification] section with chain_anchor and deployment_manifest")
    } else { e }
})?;

Prevention

When it happens

Trigger: Constructing a `BlockchainExecutionClient` with a config whose `verification` field is `None` — e.g. loading config from TOML/JSON that omits the `[verification]` table, or programmatically building the config without setting it.

Common situations: Copying an old config file from before verification became required; a config template with the verification section commented out; deserialization silently defaulting verification to None.

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/ce058d4200689ad8. Report an issue: GitHub.