nautechsystems/nautilus_trader · error

Execution intent {} has no signer nonce

Error message

Execution intent {} has no signer nonce

What it means

Thrown by `authenticate_payload_identity_with_signer` when an `ExecutionIntentRow` lacks a signer nonce (`intent.nonce` is `None`). The nonce is required to reconstruct the payload's authenticated context, so authentication cannot proceed without it.

Source

Thrown at crates/adapters/blockchain/src/execution/sealing.rs:301

) -> anyhow::Result<bool> {
    Ok(intent.chain_id == policy.chain_id
        && persisted_signer(intent)? == policy.signer
        && intent.active
        && hash.current
        && !matches!(intent.status.as_str(), "finalized" | "reverted"))
}

fn authenticate_payload_identity_with_signer(
    raw_transaction: &[u8],
    intent: &ExecutionIntentRow,
    transaction_hash: &str,
    row_chain_id: u32,
    durable_signer: Address,
    policy: PayloadPolicy,
) -> anyhow::Result<()> {
    let nonce = intent
        .nonce
        .ok_or_else(|| anyhow::anyhow!("Execution intent {} has no signer nonce", intent.id))?;
    let transaction_hash = B256::from_str(transaction_hash).with_context(|| {
        format!(
            "Execution intent {} has invalid transaction hash {transaction_hash}",
            intent.id
        )
    })?;
    let (to, input, value) = persisted_call_fields(intent)?;
    validate_signed_transaction(
        raw_transaction,
        &SignedTransactionIntent {
            hash: transaction_hash,
            signer: policy.signer,
            durable_signer,
            chain_id: policy.chain_id,
            intent_chain_id: intent.chain_id,
            row_chain_id,
            nonce,
            to,

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Ensure the intent is fully signed and persisted (nonce set) before authenticating its payload — re-run the signing/persistence step
  2. Check the persistence path (`fill_and_persist`) for early returns that store the intent without a nonce
  3. Migrate legacy rows to backfill nonces, or exclude nonce-less rows from authentication flows

Example fix

// before
authenticate_payload_identity(&row, ...) // row.nonce == None
// after
ensure!(row.nonce.is_some(), "intent {} not yet signed", row.id);
authenticate_payload_identity(&row, ...)
Defensive patterns

Strategy: validation

Validate before calling

if intent_row.nonce.is_none() {
    return Err(anyhow!("intent {} has no signer nonce yet", intent_row.id));
}

Type guard

fn has_nonce(row: &ExecutionIntentRow) -> bool { row.nonce.is_some() }

Try / catch

let nonce = match intent.nonce {
    Some(n) => n,
    None => return Err(anyhow!("intent {} pending signing; retry after signing completes", intent.id)),
};

Prevention

When it happens

Trigger: Calling `authenticate_payload_identity` or `authenticate_retained_payload` with an intent row that was persisted before its nonce was assigned, or whose nonce column is NULL.

Common situations: Partially completed persistence (intent written before signing), a failed or interrupted `fill_and_persist`, or querying legacy rows created before the nonce field existed.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


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