nautechsystems/nautilus_trader · error

Venue execution reports are not supported on the blockchain

Error message

Venue execution reports are not supported on the blockchain execution client

What it means

The ExecutionClient trait's generate_order_status_report asks a venue to report a single order's state. The blockchain execution client has no such venue API: on-chain state is read directly and recovery is done by durable intent reconciliation at connect(), so the method unconditionally bails with VENUE_EXECUTION_REPORTS_UNSUPPORTED (defined at client.rs:102).

Source

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

            self.chain.name
        );
        Ok(())
    }

    async fn disconnect(&mut self) -> anyhow::Result<()> {
        // Task handles stay registered so a later `connect` can prove their termination
        // before releasing any stale pre-signature slot claim
        self.pending_tasks.abort_all_retained();
        self.signer = None;
        self.core.set_disconnected();
        Ok(())
    }

    async fn generate_order_status_report(
        &self,
        _cmd: &GenerateOrderStatusReport,
    ) -> anyhow::Result<Option<OrderStatusReport>> {
        anyhow::bail!("{VENUE_EXECUTION_REPORTS_UNSUPPORTED}");
    }

    async fn generate_order_status_reports(
        &self,
        _cmd: &GenerateOrderStatusReports,
    ) -> anyhow::Result<Vec<OrderStatusReport>> {
        anyhow::bail!("{VENUE_EXECUTION_REPORTS_UNSUPPORTED}");
    }

    async fn generate_fill_reports(
        &self,
        _cmd: GenerateFillReports,
    ) -> anyhow::Result<Vec<FillReport>> {
        anyhow::bail!("{VENUE_EXECUTION_REPORTS_UNSUPPORTED}");
    }

    async fn generate_position_status_reports(
        &self,

View on GitHub (pinned to d1527c24af)

Solutions

  1. Do not request venue order status reports from the blockchain client; rely on its connect-time reconciliation of unresolved execution intents
  2. Read on-chain/durable state instead: query the client's transaction cache or the chain directly for the order's intent and receipt
  3. If writing generic multi-venue code, feature-gate report generation so it is skipped for blockchain-backed clients

Example fix

// before: assumes every client supports venue reports
if let Some(report) = client.generate_order_status_report(&cmd).await? { ... }

// after: skip report-driven recovery for blockchain clients
match client.client_type() {
    ClientType::Blockchain => { /* rely on connect() reconciliation */ }
    _ => { if let Some(report) = client.generate_order_status_report(&cmd).await? { ... } }
}
Defensive patterns

Strategy: try-catch

Try / catch

// Treat as an unsupported-operation marker, not a runtime fault
match client.generate_order_status_report(cmd).await {
    Err(e) if e.to_string().contains("not supported") => {
        log::debug!("venue reports unsupported for blockchain client; relying on connect reconciliation");
        Ok(None)
    }
    other => other,
}

Prevention

When it happens

Trigger: Invoking generate_order_status_report on a BlockchainExecutionClient, directly or through LiveNode/generic reconciliation code that calls the trait method for every execution venue.

Common situations: Generic node wiring or tooling ported from a CEX adapter that polls order status; user code calling mass-report helpers that fan out to per-order status queries; framework routines that assume venue reconciliation is available on all clients.

Related errors


AI-assisted analysis of nautechsystems/nautilus_trader@d1527c24af (2026-08-21). Data as JSON: /api/errors/55359bea1941e371. Report an issue: GitHub.