{"record":{"id":"27ab511016bd2941","repo":"nautechsystems/nautilus_trader","slug":"missing-data-in-burn-event-log","errorCode":null,"errorMessage":"Missing data in burn event log","messagePattern":"Missing data in burn event log","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/exchanges/parsing/uniswap_v3/burn.rs","lineNumber":114,"sourceCode":"                .as_ref(),\n        );\n        let pool_identifier = PoolIdentifier::Address(Ustr::from(&pool_address.to_string()));\n        Ok(BurnEvent::new(\n            dex,\n            pool_identifier,\n            extract_block_number(log)?,\n            extract_transaction_hash(log)?,\n            extract_transaction_index(log)?,\n            extract_log_index(log)?,\n            owner,\n            tick_lower,\n            tick_upper,\n            decoded.amount,\n            decoded.amount0,\n            decoded.amount1,\n        ))\n    } else {\n        Err(anyhow::anyhow!(\"Missing data in burn event log\"))\n    }\n}\n\n/// Parses a burn event from an RPC log.\n///\n/// # Errors\n///\n/// Returns an error if the log parsing fails or if the event data is invalid.\npub fn parse_burn_event_rpc(dex: SharedDex, log: &RpcLog) -> anyhow::Result<BurnEvent> {\n    rpc_log::validate_event_signature(log, BURN_EVENT_SIGNATURE_HASH, \"Burn\")?;\n\n    let owner = rpc_log::extract_address_from_topic(log, 1, \"owner\")?;\n\n    // Extract int24 tickLower from topic2 (stored as a 32-byte padded value)\n    let tick_lower_bytes = rpc_log::extract_topic_bytes(log, 2)?;\n    let tick_lower = i32::from_be_bytes(tick_lower_bytes[28..32].try_into()?);\n\n    // Extract int24 tickUpper from topic3 (stored as a 32-byte padded value)","sourceCodeStart":96,"sourceCodeEnd":132,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/exchanges/parsing/uniswap_v3/burn.rs#L96-L132","documentation":"parse_burn_event_hypersync in the blockchain adapter's uniswap_v3 parsing module throws this when the Hypersync-decoded Burn event data is absent (the decoded payload is None), so the mandatory fields (amount, amount0, amount1, ticks) cannot be constructed. The library treats a burn log without decodable data as unusable rather than emitting a partial event. It is a data-integrity guard on the on-chain log ingestion path.","triggerScenarios":"Calling parse_burn_event_hypersync with a Hypersync log whose decoded data field is None — e.g. the log's topic0 matched the Burn signature but the data section was absent, truncated, or Hypersync failed to decode it into the expected Burn struct.","commonSituations":"Ingesting logs from a malformed or non-standard contract that emits a Burn-shaped topic0 without conforming data; Hypersync ABI registration drift after a Uniswap V3 contract upgrade; querying a block range that includes partially indexed logs; copy-pasting a log from another DEX into a test fixture.","solutions":["Check that the log actually comes from a canonical Uniswap V3 pool and has a non-empty data field (data.len() >= expected 32-byte words for the Burn event).","Verify the Hypersync query/ABI registration for the Burn event so the decoder produces Some(decoded); re-sync or re-fetch the log if decoding failed.","Inspect the raw log: if topic0 is the Burn signature but data is empty, the source contract is non-conforming — filter it out upstream.","Update the adapter/Hypersync client versions if decoding regressed after a dependency bump, then re-run the ingestion."],"exampleFix":"// before\nlet decoded = decode_burn(log); // may be None\n// after\nif log.data.is_empty() {\n    tracing::warn!(tx = ?log.transaction_hash, \"skipping burn log with empty data\");\n    return Ok(None); // or filter before calling parse_burn_event_hypersync\n}\nlet event = parse_burn_event_hypersync(&log)?;","handlingStrategy":"validation","validationCode":"fn can_parse_burn(log: &Log) -> bool {\n    log.data.len() >= 96 // amount, amount0, amount1 words\n}","typeGuard":"fn has_decoded_burn(decoded: &Option<BurnDecoded>) -> bool {\n    decoded.is_some()\n}","tryCatchPattern":"match parse_burn_event_hypersync(&log) {\n    Ok(event) => handle(event),\n    Err(e) if e.to_string().contains(\"Missing data in burn event log\") => {\n        tracing::warn!(\"skipping malformed burn log\");\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Filter logs with empty/short data sections before batch parsing.","Keep the Hypersync ABI registration for Burn in sync with adapter versions.","Only ingest logs from canonical Uniswap V3 pool addresses.","Log skipped/malformed events with tx hash for later investigation."],"tags":["blockchain","uniswap-v3","log-parsing","hypersync"],"backgroundTag":"missing-required-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"}