{"record":{"id":"8b66609f0b60563f","repo":"nautechsystems/nautilus_trader","slug":"cannot-submit-order-list-execution-client-not-con","errorCode":null,"errorMessage":"Cannot submit order list: execution client not connected","messagePattern":"Cannot submit order list: execution client not connected","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/dydx/src/execution/mod.rs","lineNumber":1580,"sourceCode":"                        .await?;\n                }\n                log::debug!(\"Successfully submitted {order_type_str} order: {client_order_id}\");\n\n                Ok(())\n            },\n        );\n\n        Ok(())\n    }\n\n    fn submit_order_list(&self, cmd: SubmitOrderList) -> anyhow::Result<()> {\n        let orders = self.core.get_orders_for_list(&cmd.order_list)?;\n        let order_count = orders.len();\n\n        if !self.is_connected() {\n            let reason = \"Cannot submit order list: execution client not connected\";\n            log::error!(\"{reason}\");\n            anyhow::bail!(reason);\n        }\n\n        // Pre-submission TIF gate: deny FOK and DAY before doing any further\n        // work, mirroring `submit_order`'s gate. Done up front so the strategy\n        // sees an immediate `OrderDenied` even when the rest of the pipeline\n        // (block height, TX manager) is not yet ready.\n        let unsupported_tif_reason = |order: &OrderAny| match order.time_in_force() {\n            TimeInForce::Fok => Some(\n                \"Fill-or-kill (FOK) orders are deprecated by dYdX v4 (chain rejects with code=48)\",\n            ),\n            TimeInForce::Day => Some(\"DAY time-in-force is not supported by dYdX v4\"),\n            _ => None,\n        };\n\n        if orders\n            .iter()\n            .any(|order| unsupported_tif_reason(order).is_some())\n        {","sourceCodeStart":1562,"sourceCodeEnd":1598,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/dydx/src/execution/mod.rs#L1562-L1598","documentation":"`submit_order_list` rejects the entire order list up front if the execution client is not connected. It mirrors the `submit_order` gate and fires before any TIF validation, block-height checks, or TX building so strategies get an immediate denial.","triggerScenarios":"Calling `submit_order_list` while `is_connected()` returns false — before connection is established, after a disconnect, or during reconnection.","commonSituations":"Bulk order submission at strategy startup before the adapter link is live; network interruption between connect and submit; failover windows.","solutions":["Ensure the client is connected before issuing an order list (await connection event)","Check network and dYdX endpoint availability","Reconnect or restart the adapter, then resubmit the list"],"exampleFix":"// before\nclient.submit_order_list(list_cmd)?;\n// after\nif !client.is_connected() {\n    client.connect().await?;\n}\nclient.submit_order_list(list_cmd)?;","handlingStrategy":"validation","validationCode":"if !client.is_connected() { return Err(anyhow!(\"client not connected\")); }","typeGuard":null,"tryCatchPattern":"if let Err(e) = client.submit_order_list(cmd) {\n    if e.to_string().contains(\"not connected\") { client.connect().await?; /* resubmit */ }\n}","preventionTips":["Await the connection event before submitting order lists","Handle reconnects with a queue for deferred submissions","Monitor WebSocket/gRPC health in the strategy loop"],"tags":["dydx","connectivity","order-list","order-submission"],"backgroundTag":"connection-refused","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}