{"record":{"id":"f238ae22c2c7fe08","repo":"nautechsystems/nautilus_trader","slug":"failed-to-get-dex-extended","errorCode":null,"errorMessage":"Failed to get dex extended","messagePattern":"Failed to get dex extended","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/data/client.rs","lineNumber":407,"sourceCode":"                            log::error!(\"Error processing pool swap event: {e}\");\n                            None\n                        }\n                    },\n                    Err(e) => {\n                        log::error!(\n                            \"Failed to get pool {} with error {:?}\",\n                            swap_event.pool_identifier,\n                            e\n                        );\n                        None\n                    }\n                }\n            }\n            BlockchainMessage::BurnEvent(burn_event) => {\n                match core_client.get_pool(&burn_event.pool_identifier) {\n                    Ok(pool) => {\n                        let dex_extended = get_dex_extended(core_client.chain.name, &pool.dex.name)\n                            .expect(\"Failed to get dex extended\");\n\n                        match core_client.process_pool_burn_event(&burn_event, pool, dex_extended) {\n                            Ok(update) => {\n                                Some(DataEvent::DeFi(DefiData::PoolLiquidityUpdate(update)))\n                            }\n                            Err(e) => {\n                                log::error!(\"Error processing pool burn event: {e}\");\n                                None\n                            }\n                        }\n                    }\n                    Err(e) => {\n                        log::error!(\n                            \"Failed to get pool {} with error {:?}\",\n                            burn_event.pool_identifier,\n                            e\n                        );\n                        None","sourceCodeStart":389,"sourceCodeEnd":425,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/data/client.rs#L389-L425","documentation":"When converting a blockchain BurnEvent into a data event, the client looks up the pool's DEX via `get_dex_extended(chain, dex)` which returns `Option` — it panics with \"Failed to get dex extended\" when the DEX is not registered for the chain. Only Ethereum, Base, Arbitrum, and BSC have DEX extended maps, and only registered DEX types resolve.","triggerScenarios":"Processing a `BlockchainMessage::BurnEvent` whose pool's DEX is absent from the chain's DEX_EXTENDED_MAP, or whose chain is not one of the four DEX-supported chains (e.g. Polygon), or the DEX type exists but has no extended registration.","commonSituations":"Subscribing to pool events on an unsupported chain; a newly deployed/unknown DEX (e.g. a new Uniswap fork) not yet added to the DEX maps; event streams replayed for chains whose DEX data was never synced via `sync-dex`.","solutions":["Restrict the event stream to DEX_SUPPORTED_CHAINS (Ethereum, Base, Arbitrum, BSC).","Run the DEX sync (`sync-dex`) for the chain so DEX registrations exist before consuming events.","Register/patch the missing DEX type in the chain's DEX_EXTENDED_MAP, or upgrade to a version that includes it.","Guard the call: skip or log-and-continue when `get_dex_extended` returns `None` instead of panicking."],"exampleFix":"// before\nlet dex_extended = get_dex_extended(core_client.chain.name, &pool.dex.name)\n    .expect(\"Failed to get dex extended\");\n// after\nlet Some(dex_extended) = get_dex_extended(core_client.chain.name, &pool.dex.name) else {\n    log::warn!(\"unregistered dex {:?} on {:?}, skipping burn event\", pool.dex.name, core_client.chain.name);\n    return None;\n};","handlingStrategy":"type-guard","validationCode":"if !DEX_SUPPORTED_CHAINS.contains(&core_client.chain.name)\n    || get_dex_extended(core_client.chain.name, &pool.dex.name).is_none() {\n    // skip or log: burn event cannot be processed for this dex/chain\n}","typeGuard":"fn dex_known(chain: Blockchain, dex: &DexType) -> bool {\n    get_dex_extended(chain, dex).is_some()\n}","tryCatchPattern":"// Rust: avoid expect; handle Option explicitly\nmatch get_dex_extended(core_client.chain.name, &pool.dex.name) {\n    Some(dex_extended) => { /* process burn event */ }\n    None => log::warn!(\"skipping burn event: dex {:?} not registered on {:?}\", pool.dex.name, core_client.chain.name),\n}","preventionTips":["Only subscribe to event streams on chains in DEX_SUPPORTED_CHAINS.","Run `sync-dex` for a chain before consuming its pool events.","Upgrade the adapter so newly deployed DEXes are registered before replaying events.","Filter incoming events by known DEX types before processing."],"tags":["blockchain","dex","panic","unsupported-chain"],"backgroundTag":"entity-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"}