nautechsystems/nautilus_trader · error
TxBroadcaster not initialized - call connect() first
Error message
TxBroadcaster not initialized - call connect() first
What it means
Like the TransactionManager, the TxBroadcaster (which submits signed transactions to dYdX) is stored in an Option populated by connect(). get_execution_components() requires it before any order/cancel call; if it is None the client throws this error. It indicates the client was used before connection established all its components.
Source
Thrown at crates/adapters/dydx/src/execution/mod.rs:838
fn get_execution_components(
&self,
) -> anyhow::Result<(
Arc<TransactionManager>,
Arc<TxBroadcaster>,
Arc<OrderMessageBuilder>,
)> {
let tx_manager = self
.tx_manager
.as_ref()
.ok_or_else(|| {
anyhow::anyhow!("TransactionManager not initialized - call connect() first")
})?
.clone();
let broadcaster = self
.broadcaster
.as_ref()
.ok_or_else(|| anyhow::anyhow!("TxBroadcaster not initialized - call connect() first"))?
.clone();
let order_builder = self
.order_builder
.as_ref()
.ok_or_else(|| {
anyhow::anyhow!("OrderMessageBuilder not initialized - call connect() first")
})?
.clone();
Ok((tx_manager, broadcaster, order_builder))
}
fn spawn_task<F>(&self, label: &'static str, fut: F)
where
F: Future<Output = anyhow::Result<()>> + Send + 'static,
{
let future = async move {
if let Err(e) = fut.await {
log::error!("{label}: {e:?}");View on GitHub (pinned to 18893faf8b)
Solutions
- Await connect() to completion before any trading calls
- Investigate why connect() stopped between initializing tx_manager and broadcaster (check RPC endpoint health, logs)
- Reconnect or recreate the client to re-run full component initialization
Example fix
// before client.connect().await; // not awaited/checked client.cancel_all_orders(instrument_id)?; // after client.connect().await?; // propagate failure client.cancel_all_orders(instrument_id)?;
Defensive patterns
Strategy: try-catch
Validate before calling
if !client.is_connected() {
client.connect().await?;
} Try / catch
if let Err(e) = client.cancel_all_orders(instrument_id).await {
if e.to_string().contains("TxBroadcaster not initialized") {
client.connect().await?;
// retry cancel after reconnection
}
} Prevention
- Gate all trading calls behind a successful, awaited connect()
- Avoid fire-and-forget tasks that may run before connection completes
- Monitor connect() partial failures (RPC/websocket health) so components never end up half-initialized
When it happens
Trigger: submit_order, submit_order_list, cancel_order, cancel_all_orders, or batch_cancel_orders invoked before connect() succeeded; note that this error only appears once tx_manager was already initialized, so connect() failed partway through component setup (between tx_manager and broadcaster assignment).
Common situations: connect() raced with a submit call from another thread/task; connect() partially failed (tx_manager set, broadcaster not) due to an RPC or websocket error; missing await on connect before trading.
Understand the failure class
Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.
Related errors
- TransactionManager not initialized - call connect() first
- OrderMessageBuilder not initialized - call connect() first
- Active execution intent {intent_id} was not found
- DataActor {} must be registered before calling `clock_mut()`
- DataActor {} must be registered before calling `clock()` - t
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/f2ef3990b9f26567.
Report an issue: GitHub.