nautechsystems/nautilus_trader · error

order-list report {} is absent from list {}

Error message

order-list report {} is absent from list {}

What it means

During cancel-all preparation, each order report in an OrderList response must correspond to one of the child orders listed in the same payload. This error fires when a report's orderId is not found among the list's orders, i.e. the exchange returned a report for an order that the list payload never described, breaking the one-to-one report/order pairing invariant.

Source

Thrown at crates/adapters/binance/src/spot/execution.rs:2585

            response.order_list_id,
        );
    }

    for report in response.order_reports {
        anyhow::ensure!(
            report.order_list_id == Some(response.order_list_id),
            "order {} reports order-list ID {:?}, expected {}",
            report.order_id,
            report.order_list_id,
            response.order_list_id,
        );
        let order = list_orders.remove(&report.order_id).with_context(|| {
            format!(
                "order-list report {} is absent from list {}",
                report.order_id, response.order_list_id
            )
        })?;
        anyhow::ensure!(
            report.symbol == response.symbol
                && report.symbol == order.symbol
                && report.orig_client_order_id == order.client_order_id,
            "order-list report {} does not match its order identity",
            report.order_id,
        );
        prepare_cancel_order(&report, true, order_ids, client_order_ids, prepared)?;
    }

    anyhow::ensure!(
        list_orders.is_empty(),
        "order list {} is missing {} child reports",
        response.order_list_id,
        list_orders.len(),
    );
    Ok(())
}

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Update the nautilus_binance adapter to align with the current Binance SBE schema
  2. Log the offending report.order_id and the set of orders[] IDs from the payload and report the inconsistency upstream
  3. Retry the cancel-all request to check whether the mismatch is transient
  4. Inspect for proxies or serialization layers that could corrupt the binary response
Defensive patterns

Strategy: validation

Validate before calling

let order_ids: AHashSet<i64> = response.orders.iter().map(|o| o.order_id).collect();
let unmatched: Vec<_> = response.order_reports.iter().filter(|r| !order_ids.contains(&r.order_id)).collect();
if !unmatched.is_empty() {
    return Err(anyhow!("{} reports unmatched to list orders", unmatched.len()));
}

Type guard

fn reports_match_listed_orders(resp: &BinanceCancelOrderListResponse) -> bool {
    let ids: AHashSet<i64> = resp.orders.iter().map(|o| o.order_id).collect();
    resp.orders.len() == resp.order_reports.len()
        && resp.order_reports.iter().all(|r| ids.contains(&r.order_id))
}

Try / catch

match prepare_cancel_all_orders(...) {
    Ok(p) => handle(p),
    Err(e) if e.to_string().contains("absent from list") => log::error!("unpaired cancel report: {e}"),
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Binance cancel-open-orders OrderList response includes an order_report whose orderId does not match any entry in response.orders — caused by decoding drift, payload truncation/mixing, or a genuine exchange-side inconsistency.

Common situations: SBE schema mismatch after a Binance update shifting field boundaries so order IDs decode incorrectly; partial response assembly; adapter bug in mapping orders[] vs orderReports[].

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08). Data as JSON: /api/errors/608f7e096bb8ed78. Report an issue: GitHub.