nautechsystems/nautilus_trader · error

failed to subscribe to Lighter account channel {channel:?}:

Error message

failed to subscribe to Lighter account channel {channel:?}: {e}

What it means

After setting the execution context, spawn_ws_consumer subscribes to five account-scoped WebSocket channels using an auth token. If subscribe_account fails for any channel, the failure is wrapped with this message naming the channel, aborting connect.

Source

Thrown at crates/adapters/lighter/src/execution.rs:931

                // Subscribe to the five account-scoped streams the consumption
                // loop converts into typed reports. The handler merges
                // `account_all_assets` and `user_stats` into a single
                // AccountState (see websocket/account_state.rs).
                let channels = [
                    LighterWsChannel::AccountAllOrders(account_index),
                    LighterWsChannel::AccountAllTrades(account_index),
                    LighterWsChannel::AccountAllPositions(account_index),
                    LighterWsChannel::AccountAllAssets(account_index),
                    LighterWsChannel::UserStats(account_index),
                ];

                for channel in channels {
                    ws_guard
                        .client_mut()
                        .subscribe_account(channel.clone(), auth_token.clone())
                        .await
                        .map_err(|e| {
                            anyhow::anyhow!(
                                "failed to subscribe to Lighter account channel {channel:?}: {e}",
                            )
                        })?;
                }

                log::debug!("Subscribed to Lighter account streams: account_index={account_index}",);
            } else {
                log::warn!(
                    "Lighter execution client has no credentials: account streams not subscribed; \
                     typed execution reports will not flow"
                );
            }

            Ok::<(), anyhow::Error>(())
        };

        if let Err(e) = post_connect.await {
            log::warn!("Lighter post-connect setup failed, tearing down WS: {e}");

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Read the channel name in the error and the wrapped {e} to find the failing subscription.
  2. Verify credentials so a valid auth token is minted (re-check API key/secret/expiry).
  3. Retry connect if the failure is a transient WS drop.
  4. Confirm the adapter's channel list matches your venue API version (update adapter).
  5. Check account permissions on Lighter for account-scoped streams.
Defensive patterns

Strategy: retry

Validate before calling

// ensure a fresh auth token exists before subscribing
assert!(!auth_token.is_empty(), "auth token required for account channels");

Try / catch

match client.connect().await {
    Err(e) if e.to_string().contains("failed to subscribe to Lighter account channel") => {
        // remint auth token and retry; log failing channel from message
    }
    r => r?,
}

Prevention

When it happens

Trigger: connect() -> spawn_ws_consumer where subscribe_account(channel, auth_token) errors — e.g. expired/invalid auth token, unsupported channel, or WS-level rejection of the subscription for that account.

Common situations: Auth token minted with wrong/insufficient credentials; venue API change to channel names; transient WS disconnect between context setup and subscription; account lacks permissions for a channel.

Understand the failure class

Background: "API error: {status}" and "HTTP 401/403/404/429/5xx" errors: non-2xx HTTP responses explained — this error's family across 27 libraries.

Related errors


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