{"record":{"id":"17b867c00e9619c8","repo":"nautechsystems/nautilus_trader","slug":"missing-dex-name-for-pool-snapshot","errorCode":null,"errorMessage":"Missing dex_name for pool snapshot {}","messagePattern":"Missing dex_name for pool snapshot (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/cache/database.rs","lineNumber":2533,"sourceCode":"                    transaction_index,\n                    log_index,\n                )\n                .await?;\n\n            let ticks = self\n                .load_pool_ticks_for_snapshot(\n                    chain_id,\n                    pool_identifier,\n                    block,\n                    transaction_index,\n                    log_index,\n                )\n                .await?;\n\n            let dex_name = row\n                .try_get::<Option<String>, _>(\"dex_name\")?\n                .ok_or_else(|| {\n                    anyhow::anyhow!(\"Missing dex_name for pool snapshot {}\", pool_identifier)\n                })?;\n            let chain = Chain::from_chain_id(chain_id)\n                .ok_or_else(|| anyhow::anyhow!(\"Unknown chain_id: {chain_id}\"))?;\n\n            let dex_type = DexType::from_dex_name(&dex_name)\n                .ok_or_else(|| anyhow::anyhow!(\"Unknown dex_name: {dex_name}\"))?;\n\n            let dex_extended = crate::exchanges::get_dex_extended(chain.name, &dex_type)\n                .ok_or_else(|| {\n                    anyhow::anyhow!(\"No DEX extended found for {} on {}\", dex_name, chain.name)\n                })?;\n\n            let instrument_id =\n                Pool::create_instrument_id(chain.name, &dex_extended.dex, pool_identifier.as_ref());\n\n            Ok(Some(PoolSnapshot::new(\n                instrument_id,\n                state,","sourceCodeStart":2515,"sourceCodeEnd":2551,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/cache/database.rs#L2515-L2551","documentation":"The snapshot row has a NULL `dex_name` column, but a DEX name is mandatory to resolve the chain's DEX registry entry and build the pool instrument. The library treats a snapshot without a DEX name as corrupt/incomplete and refuses to load it.","triggerScenarios":"Loading a pool snapshot row where `dex_name` is NULL — rows written before the column existed, partially written rows, manual inserts, or a writer path that failed to record the DEX name.","commonSituations":"Pre-migration legacy snapshot rows lacking the newly added `dex_name` column; manual DB seeding during testing; partial writes from an interrupted persistence job.","solutions":["Backfill `dex_name` for existing rows from pool metadata (or delete affected snapshots and re-snapshot).","Add a NOT NULL constraint on `dex_name` so bad rows are rejected at write time.","Ensure the snapshot writer always records `dex_name` before INSERT (unit-test the persist path).","If rows came from an import/ETL job, fix the job to include dex_name and re-run."],"exampleFix":"// schema\n// before: dex_name TEXT\n// after\nALTER TABLE pool_snapshots ALTER COLUMN dex_name SET NOT NULL;","handlingStrategy":"validation","validationCode":"let dex: Option<String> = sqlx::query_scalar(\n    \"SELECT dex_name FROM pool_snapshots WHERE pool_identifier = $1 ORDER BY block DESC LIMIT 1\")\n    .bind(pool_id).fetch_optional(&db).await?;\nif dex.as_deref().unwrap_or_default().is_empty() {\n    return Err(\"snapshot missing dex_name; backfill or re-snapshot\");\n}","typeGuard":null,"tryCatchPattern":"match load_snapshot(...).await {\n    Err(e) if e.to_string().contains(\"Missing dex_name\") => {\n        tracing::warn!(\"corrupt snapshot row, re-snapshotting\");\n        re_snapshot(pool_id).await\n    }\n    other => other,\n}","preventionTips":["Enforce NOT NULL on dex_name at the schema level.","Backfill required columns right after adding them in a migration.","Validate rows after any DB import/ETL before the adapter reads them."],"tags":["database","data-integrity","null-value","snapshot-loading"],"backgroundTag":"null-argument","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"}