{"record":{"id":"25286217c034195c","repo":"nautechsystems/nautilus_trader","slug":"no-dex-extended-found-for-on","errorCode":null,"errorMessage":"No DEX extended found for {} on {}","messagePattern":"No DEX extended found for (.+?) on (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/cache/database.rs","lineNumber":2543,"sourceCode":"                    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,\n                positions,\n                ticks,\n                analytics,\n                block_position,\n                timestamp, // ts_event\n                timestamp, // ts_init (same block timestamp)\n            )))\n        } else {\n            Ok(None)\n        }","sourceCodeStart":2525,"sourceCodeEnd":2561,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/cache/database.rs#L2525-L2561","documentation":"The chain and DexType were resolved, but `get_dex_extended` found no extended DEX metadata entry for that (chain, dex) combination. The extended record supplies the canonical DEX identity used to build the pool's instrument ID, so loading cannot continue without it. This is a registry-consistency error, not a data corruption error.","triggerScenarios":"A DEX type is valid in `DexType` but has no registered `DexExtended` for the specific chain — e.g. a DEX not deployed on that chain (Sushi on a chain it doesn't serve), or the chain-specific registry table was not extended when the snapshot was written.","commonSituations":"New chain support added to DexType but not to the per-chain DexExtended registry; snapshots copied between chain databases; custom integrations missing the registry entry.","solutions":["Add the missing (chain, dex) entry to the `get_dex_extended` registry / exchanges module.","Verify the DEX actually exists on that chain; delete snapshots for invalid chain/DEX combos.","Check whether the snapshot row's chain_id and dex_name were crossed (row written with the wrong chain).","Add a write-time validation that get_dex_extended(chain, dex) resolves before persisting a snapshot."],"exampleFix":"// exchanges registry\n// before: entry missing for new chain\n// after\nDexExtended::new(Chain::Base, DexType::UniswapV3, \"uniswap_v3:base\"), // add missing entry","handlingStrategy":"validation","validationCode":"// pre-check the registry before relying on cached snapshots\nfn dex_supported_on(chain: Chain, dex: DexType) -> bool {\n    crate::exchanges::get_dex_extended(chain, dex).is_some()\n}","typeGuard":null,"tryCatchPattern":"match load_snapshot(...).await {\n    Err(e) if e.to_string().contains(\"No DEX extended found\") => {\n        tracing::error!(\"registry gap for (chain, dex); add DexExtended entry or drop snapshots\");\n        Err(e)\n    }\n    other => other,\n}","preventionTips":["Whenever a DexType is added, register DexExtended for every supported chain in the same change.","Validate get_dex_extended(chain, dex) resolves at snapshot write time.","Avoid copying snapshot rows between chain databases."],"tags":["registry","configuration","dex-registry","snapshot-loading"],"backgroundTag":"resource-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"}