nautechsystems/nautilus_trader · warning

Unsupported SBE execution type: {et}

Error message

Unsupported SBE execution type: {et}

What it means

map_execution_type converts the decoded SBE execution-type enum into the crate's BinanceSpotExecutionType, and the catch-all arm bails for any variant the adapter does not model. This means Binance's SBE schema contained an execution type (or the null-value/unknown discriminant) that this adapter version does not recognize.

Source

Thrown at crates/adapters/binance/src/spot/websocket/trading/decode_sbe.rs:403

        delta: mantissa_to_decimal_string(free_qty_delta, qty_exponent),
        clear_time: us_to_ms(clear_time_us),
    })
}

fn map_execution_type(
    et: execution_type::ExecutionType,
) -> anyhow::Result<BinanceSpotExecutionType> {
    match et {
        execution_type::ExecutionType::New => Ok(BinanceSpotExecutionType::New),
        execution_type::ExecutionType::Canceled => Ok(BinanceSpotExecutionType::Canceled),
        execution_type::ExecutionType::Replaced => Ok(BinanceSpotExecutionType::Replaced),
        execution_type::ExecutionType::Rejected => Ok(BinanceSpotExecutionType::Rejected),
        execution_type::ExecutionType::Trade => Ok(BinanceSpotExecutionType::Trade),
        execution_type::ExecutionType::Expired => Ok(BinanceSpotExecutionType::Expired),
        execution_type::ExecutionType::TradePrevention => {
            Ok(BinanceSpotExecutionType::TradePrevention)
        }
        _ => anyhow::bail!("Unsupported SBE execution type: {et}"),
    }
}

fn map_order_status(os: order_status::OrderStatus) -> BinanceOrderStatus {
    match os {
        order_status::OrderStatus::New => BinanceOrderStatus::New,
        order_status::OrderStatus::PartiallyFilled => BinanceOrderStatus::PartiallyFilled,
        order_status::OrderStatus::Filled => BinanceOrderStatus::Filled,
        order_status::OrderStatus::Canceled => BinanceOrderStatus::Canceled,
        order_status::OrderStatus::PendingCancel => BinanceOrderStatus::PendingCancel,
        order_status::OrderStatus::Rejected => BinanceOrderStatus::Rejected,
        order_status::OrderStatus::Expired => BinanceOrderStatus::Expired,
        order_status::OrderStatus::ExpiredInMatch => BinanceOrderStatus::ExpiredInMatch,
        _ => BinanceOrderStatus::Unknown,
    }
}

fn map_side(side: order_side::OrderSide) -> anyhow::Result<BinanceSide> {

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Update the adapter (or regenerate SBE codecs) to include the new execution-type variant
  2. Log the raw discriminant value to identify the unknown variant
  3. As a caller, treat the error as skip-and-log for that message rather than fatal
  4. Check the Binance changelog for newly introduced execution types
Defensive patterns

Strategy: try-catch

Try / catch

match decode_execution_report(&payload) {
    Err(e) if e.to_string().starts_with("Unsupported SBE execution type") => {
        log::warn!("unknown execution type; skipping message");
    }
    other => other?,
}

Prevention

When it happens

Trigger: Decoding an execution report whose SBE execution_type is not one of New/Canceled/Rejected/Trade/Expired/TradePrevention, e.g. a newly added variant or the enum's NULL_VALUE sentinel from a zeroed/default field.

Common situations: Binance adds a new execution type in a schema update before the adapter regenerates codecs; decoding frames where optional enum fields default to NULL_VALUE; using an outdated adapter against current streams.

Related errors


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