{"record":{"id":"e8ad5df319736bca","repo":"nautechsystems/nautilus_trader","slug":"execution-intent-has-no-persisted-signed-transa","errorCode":null,"errorMessage":"Execution intent {} has no persisted signed transaction bytes","messagePattern":"Execution intent (.+?) has no persisted signed transaction bytes","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"crates/adapters/blockchain/src/execution/client.rs","lineNumber":1258,"sourceCode":"                    .insert(authenticated_hash, raw_transaction.clone())\n                    .is_none(),\n                \"Execution intent {} has duplicate authenticated transaction hash {}\",\n                intent.id,\n                hash.transaction_hash\n            );\n\n            if hash.id == current.id {\n                current_payload = Some(raw_transaction);\n            }\n        }\n        anyhow::ensure!(\n            !authenticated_payloads.is_empty(),\n            \"Execution intent {} has no persisted signed transaction bytes\",\n            intent.id\n        );\n\n        if intent.status == \"broadcast\" {\n            anyhow::ensure!(\n                current_payload.is_some(),\n                \"Broadcast execution intent {} has no persisted signed transaction bytes\",\n                intent.id\n            );\n        }\n\n        if intent.status == \"signed\" {\n            anyhow::bail!(\n                \"Execution intent {} has a signed transaction {} that was not authorized for broadcast; its nonce remains reserved pending explicit recovery\",\n                intent.id,\n                tx_hash\n            );\n        }\n\n        *self.in_flight.lock() = Some(InFlightSlot::AwaitingFinality(InFlightTransaction {\n            intent_id: intent.id,\n            nonce,\n            tx_hash,","sourceCodeStart":1240,"sourceCodeEnd":1276,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/execution/client.rs#L1240-L1276","documentation":"During reconciliation of unresolved executions at connect time, the adapter asserts that a debug-level invariant holds: any execution intent being reconciled must have its signed transaction bytes persisted. A missing payload means the persistence layer lost or never wrote the signed tx before the intent was left unresolved, so reconnect recovery cannot proceed safely.","triggerScenarios":"`connect()` calls `reconcile_unresolved_execution()` for an intent whose persisted signed-transaction payloads list is empty (or whose current payload is missing while status == \"broadcast\"). The assertion `!authenticated_payloads.is_empty()` fails in debug builds.","commonSituations":"Database/state store wiped or truncated between runs while intent rows survived; crash between signing and persisting; manually edited or partially migrated persistence records; running a debug build after manually clearing payloads.","solutions":["Re-derive the intent from the chain/exchange or discard the stale unresolved intent so reconciliation can skip it","Check the persistence layer (DB/store) to find why signed tx bytes were not written when the intent was created","Restore the persisted payload record from backup or re-sign the unsigned intent and persist before connecting","Run in release mode only after fixing the underlying persistence gap — do not use debug-assert bypass as a fix"],"exampleFix":"// before: intent left unresolved with no payload after a crash\n// after: persist payload at sign time before marking intent unresolved\nstore.persist_signed_payload(&intent.id, &signed_tx)?;\nreconcile_unresolved_execution(&mut intent).await?;","handlingStrategy":"try-catch","validationCode":"let payloads = store.load_payloads(&intent.id)?;\nassert!(!payloads.is_empty(), \"intent {} missing signed payload before connect\", intent.id);","typeGuard":"fn has_signed_payload(intent: &ExecutionIntent) -> bool {\n    !intent.authenticated_payloads.is_empty()\n}","tryCatchPattern":"match connect().await {\n    Err(e) if e.to_string().contains(\"no persisted signed transaction bytes\") => {\n        // drop/repair the stale intent, then reconnect\n        store.discard_unresolved_intent(&intent.id)?;\n        connect().await\n    }\n    r => r,\n}","preventionTips":["Persist signed tx bytes atomically with the intent state transition","Back up and validate the persistence store before connect","Never wipe payload records without also clearing dependent intent rows"],"tags":["blockchain","persistence","reconciliation","debug-assert"],"backgroundTag":"internal-invariant-violation","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"}