{"record":{"id":"558acdfc49e2e280","repo":"nautechsystems/nautilus_trader","slug":"execution-transaction-has-no-signed-payload","errorCode":null,"errorMessage":"Execution transaction {} has no signed payload","messagePattern":"Execution transaction (.+?) has no signed payload","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/execution/client.rs","lineNumber":3619,"sourceCode":"    let mut current = hashes.iter().filter(|row| row.current);\n    let row = current\n        .next()\n        .ok_or_else(|| anyhow::anyhow!(\"Execution intent {intent_id} has no current hash\"))?;\n    anyhow::ensure!(\n        current.next().is_none(),\n        \"Execution intent {intent_id} has more than one current hash\"\n    );\n    Ok(row)\n}\n\nfn open_execution_payload(\n    keys: &PayloadKeySet,\n    policy: PayloadPolicy,\n    intent: &ExecutionIntentRow,\n    hash: &ExecutionTransactionHashRow,\n    reason: &str,\n) -> anyhow::Result<Vec<u8>> {\n    anyhow::ensure!(\n        hash.payload_expected,\n        \"Execution transaction {} has no signed payload\",\n        hash.transaction_hash\n    );\n    anyhow::ensure!(\n        hash.raw_transaction.is_none(),\n        \"Protected execution transaction {} contains plaintext\",\n        hash.transaction_hash\n    );\n    let envelope = hash.sealed_transaction.as_deref().ok_or_else(|| {\n        anyhow::anyhow!(\n            \"Protected execution transaction {} has no sealed payload\",\n            hash.transaction_hash\n        )\n    })?;\n    let context = payload_context(intent, hash, keys.deployment_id())?;\n    let raw_transaction = keys.unseal(envelope, &context)?;\n    log::info!(","sourceCodeStart":3601,"sourceCodeEnd":3637,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/execution/client.rs#L3601-L3637","documentation":"When preparing a transaction for submission, the code checks that the hash row has `payload_expected = true`, meaning a signed transaction payload must exist. If the flag is set but no signed payload was actually produced/attached, the transaction cannot be encoded and submission aborts. This is a pipeline consistency check between payload production and hash bookkeeping.","triggerScenarios":"Calling the payload-resolution function with a hash row whose `payload_expected` is true but whose signed payload (raw/envelope data) was never persisted — e.g. the signing step failed silently or the row was written before the payload arrived.","commonSituations":"Signer service down or unreachable when the intent was recorded; a crash between writing the hash row and persisting the signed payload; stale rows from a partially completed run; misconfigured payload policy that skips signing while the row still claims a payload is expected.","solutions":["Re-run the signing step for this transaction hash so a signed payload is produced and persisted before submission.","If the transaction legitimately has no signed payload, correct the row's payload_expected flag (or the upstream logic setting it) to match reality.","Check signer/keystore configuration and credentials, since signer failure is the usual root cause of the missing payload.","Replay the pipeline from the intent stage to regenerate the row and payload together."],"exampleFix":"// before: row written before signing completed\nstore.record_hash(row_with_payload_expected_true)?;\n\n// after: persist the signed payload first, or set the flag only when it exists\nlet signed = signer.sign(unsigned_tx)?;\nrow.raw_or_sealed_payload = Some(signed);\nrow.payload_expected = true;\nstore.record_hash(row)?;","handlingStrategy":"validation","validationCode":"if hash.payload_expected && hash.raw_transaction.is_none() && hash.sealed_transaction.is_none() {\n    // re-sign or fail before invoking payload resolution\n    anyhow::bail!(\"tx {} missing signed payload; re-run signing\", hash.transaction_hash);\n}","typeGuard":"fn has_payload(hash: &ExecutionTransactionHashRow) -> bool {\n    !hash.payload_expected || hash.raw_transaction.is_some() || hash.sealed_transaction.is_some()\n}","tryCatchPattern":"match resolve_payload(keys, policy, intent, hash, reason) {\n    Ok(bytes) => submit(bytes),\n    Err(e) if e.to_string().contains(\"no signed payload\") => retry_after_resign(intent, hash),\n    Err(e) => return Err(e),\n}","preventionTips":["Persist the signed payload and the hash row in one transaction so they can't diverge.","Health-check the signer service before recording intents.","Reconcile rows where payload_expected is true but payload columns are NULL."],"tags":["signing","missing-payload","invariant-violation"],"backgroundTag":"empty-required-field","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}