nautechsystems/nautilus_trader · error

Persisted transaction row chain ID {} does not match configu

Error message

Persisted transaction row chain ID {} does not match configured chain ID {}

What it means

Reconciliation guard: a persisted transaction row's chain ID differs from the adapter's configured chain, meaning the database holds rows from a different network deployment; reconciliation aborts to prevent cross-chain recovery.

Source

Thrown at crates/adapters/blockchain/src/execution/client.rs:1201

            )
        })?;
        let policy = PayloadPolicy {
            chain_id: self.chain.chain_id,
            signer: self.wallet_address,
            gas_limit: self.config.gas_limit,
            max_fee_per_gas: self.config.max_fee_per_gas_wei,
        };
        let mut authenticated_payloads = HashMap::new();
        let mut current_payload = None;

        for hash in &hashes {
            anyhow::ensure!(
                hash.intent_id == intent.id,
                "Persisted transaction row references intent {}, expected {}",
                hash.intent_id,
                intent.id
            );
            anyhow::ensure!(
                hash.chain_id == self.chain.chain_id,
                "Persisted transaction row chain ID {} does not match configured chain ID {}",
                hash.chain_id,
                self.chain.chain_id
            );

            if !hash.payload_expected {
                anyhow::ensure!(
                    hash.raw_transaction.is_none() && hash.sealed_transaction.is_none(),
                    "Replacement transaction {} unexpectedly retains signed bytes",
                    hash.transaction_hash
                );
                continue;
            }
            let raw_transaction = open_execution_payload(
                self.payload_keys
                    .as_deref()
                    .expect("payload keys checked above"),

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Correct the configured chain_id to match the chain the transactions were signed for
  2. Use a database belonging to the configured chain, or clear stale rows for the other chain
  3. Re-sign the intent on the current chain after discarding the foreign-chain rows
Defensive patterns

Strategy: validation

Validate before calling

let hashes = database.get_execution_transaction_hashes(intent.id).await?;
if hashes.iter().any(|h| h.chain_id != configured_chain.chain_id) {
    // point config at the right chain or clear foreign rows
}

Prevention

When it happens

Trigger: connect() -> reconcile_unresolved_execution(): hash.chain_id != self.chain.chain_id while validating rows from get_execution_transaction_hashes.

Common situations: Pointing the client at a different network (mainnet vs testnet) or wrong chain_id in config while reusing an existing execution database; DB copied between environments.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


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