{"record":{"id":"80f6e80137c81480","repo":"nautechsystems/nautilus_trader","slug":"no-rpc-swap-decoder-for","errorCode":null,"errorMessage":"No RPC Swap decoder for {}:{}","messagePattern":"No RPC Swap decoder for (.+?):(.+?)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/execution/client.rs","lineNumber":4762,"sourceCode":"    let log_block_hash = log\n        .block_hash\n        .as_deref()\n        .ok_or_else(|| anyhow::anyhow!(\"Finalized Swap log has no block hash\"))?;\n    anyhow::ensure!(\n        log_transaction_hash == included.tx_hash\n            && rpc_log::extract_block_number(log)? == included.block_number\n            && u64::from(rpc_log::extract_transaction_index(log)?)\n                == included.receipt.transaction_index\n            && B256::from_str(log_block_hash)\n                .with_context(|| \"Invalid finalized Swap log block hash\")?\n                == included.receipt.block_hash,\n        \"Finalized Swap log position does not match transaction {}\",\n        included.tx_hash\n    );\n\n    let dex = crate::exchanges::get_dex_extended(plan.pool.chain.name, &plan.pool.dex.name)\n        .ok_or_else(|| {\n            anyhow::anyhow!(\n                \"No RPC Swap decoder for {}:{}\",\n                plan.pool.chain.name,\n                plan.pool.dex.name\n            )\n        })?;\n    let event = dex.parse_swap_event_rpc(log)?;\n    let (base_amount, quote_amount) =\n        if plan.pool.get_base_token().address == plan.pool.token0.address {\n            (event.amount0, event.amount1)\n        } else {\n            (event.amount1, event.amount0)\n        };\n    let last_qty = match plan.order.order_side() {\n        OrderSide::Sell => {\n            anyhow::ensure!(\n                base_amount.is_positive() && base_amount.unsigned_abs() == plan.amount_in,\n                \"Finalized Swap input {base_amount} does not match the persisted amount {}\",\n                plan.amount_in","sourceCodeStart":4744,"sourceCodeEnd":4780,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/execution/client.rs#L4744-L4780","documentation":"To decode the raw Swap log into a domain swap event, the library looks up a registered DEX decoder via get_dex_extended(chain_name, dex_name). If no decoder is registered for the plan's chain/DEX pair, the log cannot be parsed and verification aborts.","triggerScenarios":"Executing a swap plan on a chain/DEX combination that was never registered in the exchanges registry — e.g. a new DEX added to configuration but not wired into get_dex_extended, or a typo/renamed dex.name in pool metadata.","commonSituations":"Adding support for a new DEX without implementing parse_swap_event_rpc; pool metadata seeded from an external source with a DEX name that differs in casing/spacing from the registry key; running on a testnet chain that has no registered decoder.","solutions":["Register the DEX in the exchanges registry so get_dex_extended(chain, dex) returns a decoder implementing parse_swap_event_rpc","Fix the pool's chain.name/dex.name to exactly match the registered registry keys (case-sensitive)","Implement the RPC Swap decoder for the missing DEX if it does not exist yet","Filter tradable pools at startup to only chain/DEX pairs with registered decoders"],"exampleFix":"// before\n// dex not registered -> runtime error\n// after\nexchanges::register_dex_extended(\"base\", \"newdex\", NewDexDecoder::default());","handlingStrategy":"fallback","validationCode":"if crate::exchanges::get_dex_extended(pool.chain.name, pool.dex.name).is_none() {\n    return Err(anyhow!(\"DEX {}:{} not registered\", pool.chain.name, pool.dex.name));\n}","typeGuard":null,"tryCatchPattern":"let dex = get_dex_extended(chain, dex)\n    .ok_or_else(|| anyhow!(\"No RPC Swap decoder for {}: {}\", chain, dex))?;","preventionTips":["Validate at startup that every tradable pool's chain/DEX has a registered decoder","Keep pool metadata DEX names in sync with registry keys (exact case)","Implement parse_swap_event_rpc when onboarding a new DEX","Gate pool selection on decoder availability"],"tags":["blockchain","decoder","registry","unsupported-dex"],"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"}