nautechsystems/nautilus_trader · error

Execution intent {} signed transaction {} failed authenticat

Error message

Execution intent {} signed transaction {} failed authentication: {e}

What it means

During recovery, a persisted signed transaction failed the authentication policy check (signature/payload validation). The stored signed bytes are not trustworthy for replay, so reconciliation aborts with the underlying cause embedded.

Source

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

            if !hash.payload_expected {
                anyhow::ensure!(
                    hash.raw_transaction.is_none() && hash.sealed_transaction.is_none(),
                    "Replacement transaction {} unexpectedly retains signed bytes",
                    hash.transaction_hash
                );
                continue;
            }
            let raw_transaction = open_execution_payload(
                self.payload_keys
                    .as_deref()
                    .expect("payload keys checked above"),
                policy,
                &intent,
                hash,
                "recovery",
            )
            .map_err(|e| {
                anyhow::anyhow!(
                    "Execution intent {} signed transaction {} failed authentication: {e}",
                    intent.id,
                    hash.transaction_hash
                )
            })?;
            let authenticated_hash = B256::from_str(&hash.transaction_hash).with_context(|| {
                format!(
                    "Execution intent {} has invalid transaction hash {}",
                    intent.id, hash.transaction_hash
                )
            })?;
            anyhow::ensure!(
                authenticated_payloads
                    .insert(authenticated_hash, raw_transaction.clone())
                    .is_none(),
                "Execution intent {} has duplicate authenticated transaction hash {}",
                intent.id,
                hash.transaction_hash

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Inspect the nested cause (the {e}) to identify whether signature, policy, or payload failed
  2. Discard the failing transaction row and re-sign the intent through the recovery flow
  3. Verify the signer/policy configuration matches what was used when the transaction was signed
  4. Confirm the database rows were not modified or copied across environments
Defensive patterns

Strategy: try-catch

Try / catch

match client.connect().await {
    Err(e) if e.to_string().contains("failed authentication") => {
        // read the inner cause, discard/re-sign the failing transaction, retry recovery
    }
    other => other?,
}

Prevention

When it happens

Trigger: connect() -> reconcile_unresolved_execution(): the authenticate step for (policy, intent, hash, "recovery") returns Err and is mapped into this error.

Common situations: Signed bytes tampered with or truncated in storage; policy/config changed since signing (different signer, chain, expiry); rows copied from another environment.

Understand the failure class

Related errors


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