{"record":{"id":"a2e7adb87b0a5d3c","repo":"nautechsystems/nautilus_trader","slug":"execution-intent-has-no-signer-nonce","errorCode":null,"errorMessage":"Execution intent {} has no signer nonce","messagePattern":"Execution intent (.+?) has no signer nonce","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/execution/sealing.rs","lineNumber":301,"sourceCode":") -> anyhow::Result<bool> {\n    Ok(intent.chain_id == policy.chain_id\n        && persisted_signer(intent)? == policy.signer\n        && intent.active\n        && hash.current\n        && !matches!(intent.status.as_str(), \"finalized\" | \"reverted\"))\n}\n\nfn authenticate_payload_identity_with_signer(\n    raw_transaction: &[u8],\n    intent: &ExecutionIntentRow,\n    transaction_hash: &str,\n    row_chain_id: u32,\n    durable_signer: Address,\n    policy: PayloadPolicy,\n) -> anyhow::Result<()> {\n    let nonce = intent\n        .nonce\n        .ok_or_else(|| anyhow::anyhow!(\"Execution intent {} has no signer nonce\", intent.id))?;\n    let transaction_hash = B256::from_str(transaction_hash).with_context(|| {\n        format!(\n            \"Execution intent {} has invalid transaction hash {transaction_hash}\",\n            intent.id\n        )\n    })?;\n    let (to, input, value) = persisted_call_fields(intent)?;\n    validate_signed_transaction(\n        raw_transaction,\n        &SignedTransactionIntent {\n            hash: transaction_hash,\n            signer: policy.signer,\n            durable_signer,\n            chain_id: policy.chain_id,\n            intent_chain_id: intent.chain_id,\n            row_chain_id,\n            nonce,\n            to,","sourceCodeStart":283,"sourceCodeEnd":319,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/execution/sealing.rs#L283-L319","documentation":"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.","triggerScenarios":"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.","commonSituations":"Partially completed persistence (intent written before signing), a failed or interrupted `fill_and_persist`, or querying legacy rows created before the nonce field existed.","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"],"exampleFix":"// before\nauthenticate_payload_identity(&row, ...) // row.nonce == None\n// after\nensure!(row.nonce.is_some(), \"intent {} not yet signed\", row.id);\nauthenticate_payload_identity(&row, ...)","handlingStrategy":"validation","validationCode":"if intent_row.nonce.is_none() {\n    return Err(anyhow!(\"intent {} has no signer nonce yet\", intent_row.id));\n}","typeGuard":"fn has_nonce(row: &ExecutionIntentRow) -> bool { row.nonce.is_some() }","tryCatchPattern":"let nonce = match intent.nonce {\n    Some(n) => n,\n    None => return Err(anyhow!(\"intent {} pending signing; retry after signing completes\", intent.id)),\n};","preventionTips":["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"],"tags":["data-integrity","state","validation"],"backgroundTag":"missing-required-argument","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}