nautechsystems/nautilus_trader · critical

Execution intent {} has no persisted signed transaction byte

Error message

Execution intent {} has no persisted signed transaction bytes

What it means

During reconciliation of unresolved executions at connect time, the adapter asserts that a debug-level invariant holds: any execution intent being reconciled must have its signed transaction bytes persisted. A missing payload means the persistence layer lost or never wrote the signed tx before the intent was left unresolved, so reconnect recovery cannot proceed safely.

Source

Thrown at crates/adapters/blockchain/src/execution/client.rs:1258

                    .insert(authenticated_hash, raw_transaction.clone())
                    .is_none(),
                "Execution intent {} has duplicate authenticated transaction hash {}",
                intent.id,
                hash.transaction_hash
            );

            if hash.id == current.id {
                current_payload = Some(raw_transaction);
            }
        }
        anyhow::ensure!(
            !authenticated_payloads.is_empty(),
            "Execution intent {} has no persisted signed transaction bytes",
            intent.id
        );

        if intent.status == "broadcast" {
            anyhow::ensure!(
                current_payload.is_some(),
                "Broadcast execution intent {} has no persisted signed transaction bytes",
                intent.id
            );
        }

        if intent.status == "signed" {
            anyhow::bail!(
                "Execution intent {} has a signed transaction {} that was not authorized for broadcast; its nonce remains reserved pending explicit recovery",
                intent.id,
                tx_hash
            );
        }

        *self.in_flight.lock() = Some(InFlightSlot::AwaitingFinality(InFlightTransaction {
            intent_id: intent.id,
            nonce,
            tx_hash,

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Re-derive the intent from the chain/exchange or discard the stale unresolved intent so reconciliation can skip it
  2. Check the persistence layer (DB/store) to find why signed tx bytes were not written when the intent was created
  3. Restore the persisted payload record from backup or re-sign the unsigned intent and persist before connecting
  4. Run in release mode only after fixing the underlying persistence gap — do not use debug-assert bypass as a fix

Example fix

// before: intent left unresolved with no payload after a crash
// after: persist payload at sign time before marking intent unresolved
store.persist_signed_payload(&intent.id, &signed_tx)?;
reconcile_unresolved_execution(&mut intent).await?;
Defensive patterns

Strategy: try-catch

Validate before calling

let payloads = store.load_payloads(&intent.id)?;
assert!(!payloads.is_empty(), "intent {} missing signed payload before connect", intent.id);

Type guard

fn has_signed_payload(intent: &ExecutionIntent) -> bool {
    !intent.authenticated_payloads.is_empty()
}

Try / catch

match connect().await {
    Err(e) if e.to_string().contains("no persisted signed transaction bytes") => {
        // drop/repair the stale intent, then reconnect
        store.discard_unresolved_intent(&intent.id)?;
        connect().await
    }
    r => r,
}

Prevention

When it happens

Trigger: `connect()` calls `reconcile_unresolved_execution()` for an intent whose persisted signed-transaction payloads list is empty (or whose current payload is missing while status == "broadcast"). The assertion `!authenticated_payloads.is_empty()` fails in debug builds.

Common situations: Database/state store wiped or truncated between runs while intent rows survived; crash between signing and persisting; manually edited or partially migrated persistence records; running a debug build after manually clearing payloads.

Understand the failure class

Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.

Related errors


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