{"record":{"id":"c6ecfb258422b8d6","repo":"nautechsystems/nautilus_trader","slug":"retained-signed-intent-has-no-authenticated-cur","errorCode":null,"errorMessage":"Retained signed intent {} has no authenticated current payload","messagePattern":"Retained signed intent (.+?) has no authenticated current payload","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/execution/client.rs","lineNumber":5460,"sourceCode":"                    block_number: None,\n                    block_hash: None,\n                    receipt_success: None,\n                    gas_used: None,\n                    effective_gas_price: None,\n                    recover_prepared: true,\n                    decisions: vec![base_decision],\n                });\n                continue;\n            }\n\n            let nonce = intent.nonce.ok_or_else(|| {\n                anyhow::anyhow!(\"Retained signed intent {} has no nonce\", intent.id)\n            })?;\n            let current = current.ok_or_else(|| {\n                anyhow::anyhow!(\"Retained signed intent {} has no current hash\", intent.id)\n            })?;\n            let raw_transaction = authenticated.get(&current.id).ok_or_else(|| {\n                anyhow::anyhow!(\n                    \"Retained signed intent {} has no authenticated current payload\",\n                    intent.id\n                )\n            })?;\n\n            if intent.active && nonce == next_canonical_nonce {\n                anyhow::ensure!(\n                    !matches!(intent.status.as_str(), \"finalized\" | \"reverted\"),\n                    \"Active terminal intent conflicts with the canonical nonce ledger\"\n                );\n                records.push(ExecutionVerificationMigrationRecord {\n                    intent_id: intent.id,\n                    nonce: Some(nonce),\n                    transaction_hash: Some(current.transaction_hash.clone()),\n                    terminal_status: None,\n                    block_number: None,\n                    block_hash: None,\n                    receipt_success: None,","sourceCodeStart":5442,"sourceCodeEnd":5478,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/execution/client.rs#L5442-L5478","documentation":"During the same execution-verification migration, after an active signed intent is confirmed to have a nonce and a current hash, the client looks up the raw signed payload in the `authenticated` map by the current record's id. This error is thrown when that lookup misses: the intent's current transaction hash exists but the actual signed raw transaction bytes are not retained, so the intent cannot be verified, replayed, or migrated. It is an integrity check ensuring no signed intent is migrated without its authenticated payload.","triggerScenarios":"Raised by `authenticated.get(&current.id).ok_or_else(...)` in the migration loop when: the persistence layer kept the intent's current hash pointer but lost/pruned the signed payload row; state was migrated between stores copying only hashes; a garbage-collection or retention policy deleted authenticated payloads of still-active intents; or a partial/corrupt write stored the pointer but not the payload.","commonSituations":"Pruning signed transactions while intents remain active; restoring a backup that predates the signed payload write; hand-copied or truncated state DBs; version skew where an older version pruned payloads a newer version expects to exist.","solutions":["Restore the missing authenticated payload for the reported current id from a complete state backup, then re-run migration.","If the transaction was never broadcast, rebuild/re-sign the intent from its unsigned preparation (mark it recoverable so the migration re-prepares it).","If the transaction was broadcast and confirmed on-chain, record the receipt/terminal status for the intent so it can be treated as terminal rather than requiring the raw payload.","Check retention/pruning configuration so signed payloads of active intents are never removed before their intents reach a terminal state."],"exampleFix":"// before (pruning active intent payloads)\nprune_authenticated(intent.active)  // deletes payloads of still-active intents\n\n// after (only prune payloads of terminal intents)\nprune_authenticated(!intent.active && matches!(intent.status.as_str(), \"finalized\" | \"reverted\" | \"dropped\"))","handlingStrategy":"validation","validationCode":"fn require_authenticated_payload(intent: &Intent, authenticated: &HashMap<String, SignedTx>) -> Result<(), String> {\n    match (&intent.current, intent.current.as_ref().and_then(|c| authenticated.get(&c.id))) {\n        (Some(c), None) => Err(format!(\"intent {}: payload {} missing\", intent.id, c.id)),\n        _ => Ok(()),\n    }\n}","typeGuard":"fn payload_retained(intent: &Intent, authenticated: &HashMap<String, SignedTx>) -> bool {\n    intent.current.as_ref().map_or(false, |c| authenticated.contains_key(&c.id))\n}","tryCatchPattern":null,"preventionTips":["Configure pruning/retention so signed payloads of active intents are never removed.","Restore state from backups that include the authenticated payload table, not just intent rows.","Monitor for dangling current-hash pointers during maintenance windows.","Re-sign from the unsigned preparation rather than keeping half-deleted payload records."],"tags":["blockchain","state-migration","missing-data","integrity"],"backgroundTag":"record-not-found","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"}