nautechsystems/nautilus_trader · error

Failed to get dex extended

Error message

Failed to get dex extended

What it means

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.

Source

Thrown at crates/adapters/blockchain/src/data/client.rs:407

                            log::error!("Error processing pool swap event: {e}");
                            None
                        }
                    },
                    Err(e) => {
                        log::error!(
                            "Failed to get pool {} with error {:?}",
                            swap_event.pool_identifier,
                            e
                        );
                        None
                    }
                }
            }
            BlockchainMessage::BurnEvent(burn_event) => {
                match core_client.get_pool(&burn_event.pool_identifier) {
                    Ok(pool) => {
                        let dex_extended = get_dex_extended(core_client.chain.name, &pool.dex.name)
                            .expect("Failed to get dex extended");

                        match core_client.process_pool_burn_event(&burn_event, pool, dex_extended) {
                            Ok(update) => {
                                Some(DataEvent::DeFi(DefiData::PoolLiquidityUpdate(update)))
                            }
                            Err(e) => {
                                log::error!("Error processing pool burn event: {e}");
                                None
                            }
                        }
                    }
                    Err(e) => {
                        log::error!(
                            "Failed to get pool {} with error {:?}",
                            burn_event.pool_identifier,
                            e
                        );
                        None

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Restrict the event stream to DEX_SUPPORTED_CHAINS (Ethereum, Base, Arbitrum, BSC).
  2. Run the DEX sync (`sync-dex`) for the chain so DEX registrations exist before consuming events.
  3. Register/patch the missing DEX type in the chain's DEX_EXTENDED_MAP, or upgrade to a version that includes it.
  4. Guard the call: skip or log-and-continue when `get_dex_extended` returns `None` instead of panicking.

Example fix

// before
let dex_extended = get_dex_extended(core_client.chain.name, &pool.dex.name)
    .expect("Failed to get dex extended");
// after
let Some(dex_extended) = get_dex_extended(core_client.chain.name, &pool.dex.name) else {
    log::warn!("unregistered dex {:?} on {:?}, skipping burn event", pool.dex.name, core_client.chain.name);
    return None;
};
Defensive patterns

Strategy: type-guard

Validate before calling

if !DEX_SUPPORTED_CHAINS.contains(&core_client.chain.name)
    || get_dex_extended(core_client.chain.name, &pool.dex.name).is_none() {
    // skip or log: burn event cannot be processed for this dex/chain
}

Type guard

fn dex_known(chain: Blockchain, dex: &DexType) -> bool {
    get_dex_extended(chain, dex).is_some()
}

Try / catch

// Rust: avoid expect; handle Option explicitly
match get_dex_extended(core_client.chain.name, &pool.dex.name) {
    Some(dex_extended) => { /* process burn event */ }
    None => log::warn!("skipping burn event: dex {:?} not registered on {:?}", pool.dex.name, core_client.chain.name),
}

Prevention

When it happens

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

Common situations: 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`.

Understand the failure class

Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.

Related errors


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