nautechsystems/nautilus_trader · error
Retained signed intent {} has no authenticated current paylo
Error message
Retained signed intent {} has no authenticated current payload What it means
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.
Source
Thrown at crates/adapters/blockchain/src/execution/client.rs:5460
block_number: None,
block_hash: None,
receipt_success: None,
gas_used: None,
effective_gas_price: None,
recover_prepared: true,
decisions: vec![base_decision],
});
continue;
}
let nonce = intent.nonce.ok_or_else(|| {
anyhow::anyhow!("Retained signed intent {} has no nonce", intent.id)
})?;
let current = current.ok_or_else(|| {
anyhow::anyhow!("Retained signed intent {} has no current hash", intent.id)
})?;
let raw_transaction = authenticated.get(¤t.id).ok_or_else(|| {
anyhow::anyhow!(
"Retained signed intent {} has no authenticated current payload",
intent.id
)
})?;
if intent.active && nonce == next_canonical_nonce {
anyhow::ensure!(
!matches!(intent.status.as_str(), "finalized" | "reverted"),
"Active terminal intent conflicts with the canonical nonce ledger"
);
records.push(ExecutionVerificationMigrationRecord {
intent_id: intent.id,
nonce: Some(nonce),
transaction_hash: Some(current.transaction_hash.clone()),
terminal_status: None,
block_number: None,
block_hash: None,
receipt_success: None,View on GitHub (pinned to 18893faf8b)
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.
Example fix
// before (pruning active intent payloads) prune_authenticated(intent.active) // deletes payloads of still-active intents // after (only prune payloads of terminal intents) prune_authenticated(!intent.active && matches!(intent.status.as_str(), "finalized" | "reverted" | "dropped"))
Defensive patterns
Strategy: validation
Validate before calling
fn require_authenticated_payload(intent: &Intent, authenticated: &HashMap<String, SignedTx>) -> Result<(), String> {
match (&intent.current, intent.current.as_ref().and_then(|c| authenticated.get(&c.id))) {
(Some(c), None) => Err(format!("intent {}: payload {} missing", intent.id, c.id)),
_ => Ok(()),
}
} Type guard
fn payload_retained(intent: &Intent, authenticated: &HashMap<String, SignedTx>) -> bool {
intent.current.as_ref().map_or(false, |c| authenticated.contains_key(&c.id))
} Prevention
- 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.
When it happens
Trigger: Raised by `authenticated.get(¤t.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.
Common situations: 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.
Understand the failure class
Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.
- Authentication and authorization failures — expired tokens, bad credentials, and missing scopes.
Related errors
- Retained signed intent {} has no current hash
- Missing data in CollectProtocol event log
- Missing data in SetFeeProtocol event log
- Missing data in flash event log
- Finalized checkpoint ledger conflicts with the trusted chain
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/c6ecfb258422b8d6.
Report an issue: GitHub.