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
- Add a `verification` section to the config with `chain_anchor` (chain_id, chain_name) and `deployment_manifest`.
- Set `config.verification = Some(VerificationConfig {...})` when constructing the config in code.
- Check the config file for a missing or commented-out `[verification]` block.
- 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
- Never omit the [verification] section in deployment configs
- Validate the full config with a schema check before client construction
- Keep config templates up to date when verification becomes mandatory
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
- `router_addresses` must contain at least one router address
- Quote spend limit for {token_in} -> {token_out} is denominat
- Verification chain anchor ID does not match the configured c
- Verification chain anchor name does not match the configured
- Allowed token pair {token_in} -> {token_out} is not fully pi
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/ce058d4200689ad8.
Report an issue: GitHub.