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(&current.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

  1. Restore the missing authenticated payload for the reported current id from a complete state backup, then re-run migration.
  2. If the transaction was never broadcast, rebuild/re-sign the intent from its unsigned preparation (mark it recoverable so the migration re-prepares it).
  3. 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.
  4. 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

When it happens

Trigger: 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.

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.

Related errors


AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08). Data as JSON: /api/errors/c6ecfb258422b8d6. Report an issue: GitHub.