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
- Ensure the intent is fully signed and persisted (nonce set) before authenticating its payload — re-run the signing/persistence step
- Check the persistence path (`fill_and_persist`) for early returns that store the intent without a nonce
- 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
- Persist the nonce atomically with the signed intent (single transaction)
- Only authenticate payloads for intents whose signing pipeline has completed
- Add a DB constraint or check flagging nonce-less intents as unsigned
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
- Continuous future chain discontinuity for {target_bar_type}:
- Verified finalized headers are not one continuous parent-lin
- Data has been added but not sorted, call `engine.sort_data()
- Unsupported `OrderSide` for Binance: {value:?}
- invalid OrderSide: must be Buy or Sell, was {side}
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/a2e7adb87b0a5d3c.
Report an issue: GitHub.