{"record":{"id":"b5b0cdb3f3cae6ae","repo":"nautechsystems/nautilus_trader","slug":"burn-event-data-is-too-short","errorCode":null,"errorMessage":"Burn event data is too short","messagePattern":"Burn event data is too short","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/exchanges/parsing/uniswap_v3/burn.rs","lineNumber":83,"sourceCode":"        }\n        None => anyhow::bail!(\"Missing tickLower in topic2 when parsing burn event\"),\n    };\n\n    // Extract int24 tickUpper from topic3 (stored as a 32-byte padded value)\n    let tick_upper = match log.topics.get(3).and_then(|t| t.as_ref()) {\n        Some(topic) => {\n            let tick_upper_bytes: [u8; 32] = topic.as_ref().try_into()?;\n            i32::from_be_bytes(tick_upper_bytes[28..32].try_into()?)\n        }\n        None => anyhow::bail!(\"Missing tickUpper in topic3 when parsing burn event\"),\n    };\n\n    if let Some(data) = &log.data {\n        let data_bytes = data.as_ref();\n\n        // Validate if data contains 3 parameters of 32 bytes each\n        if data_bytes.len() < 3 * 32 {\n            anyhow::bail!(\"Burn event data is too short\");\n        }\n\n        // Decode the data using the BurnEventData struct\n        let decoded = match <BurnEventData as SolType>::abi_decode(data_bytes) {\n            Ok(decoded) => decoded,\n            Err(e) => anyhow::bail!(\"Failed to decode burn event data: {e}\"),\n        };\n\n        let pool_address = Address::from_slice(\n            log.address\n                .clone()\n                .expect(\"Contract address should be set in logs\")\n                .as_ref(),\n        );\n        let pool_identifier = PoolIdentifier::Address(Ustr::from(&pool_address.to_string()));\n        Ok(BurnEvent::new(\n            dex,\n            pool_identifier,","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/exchanges/parsing/uniswap_v3/burn.rs#L65-L101","documentation":"Raised by parse_burn_event_hypersync when the Burn event's data section contains fewer than 96 bytes (3 x 32). A Uniswap V3 Burn event encodes amount, txgBalance0 and txgBalance1 (amount0, amount1) as three 32-byte words in data. If the data is shorter the ABI layout cannot be honored, so the parser rejects the log rather than decoding garbage.","triggerScenarios":"Calling parse_burn_event_hypersync with a HyperSync log whose data field is missing, empty, or truncated to fewer than 96 bytes — e.g. a non-Burn event matched by a loose topic0 filter, or a fixture with partial data.","commonSituations":"Broad subscription filters capturing other events with 4 topics; malformed/truncated log payloads from a HyperSync response; test fixtures with hex data strings that are too short (e.g. only one 32-byte word); an empty string data field decoded to zero bytes.","solutions":["Confirm the topic0 filter targets exactly the Uniswap V3 Burn event signature so only genuine Burn logs reach the parser","Pre-validate log.data length before calling the parser and skip/log logs with fewer than 96 data bytes","Inspect the raw log (data hex length) for the failing transaction on a block explorer to see what event was actually emitted","Fix the test fixture so the data hex string encodes three full 32-byte words (64+96 hex chars / 0x + 192 hex chars)"],"exampleFix":"// before\nif let Some(data) = &log.data {\n    let data_bytes = data.as_ref();\n    if data_bytes.len() < 3 * 32 { anyhow::bail!(\"Burn event data is too short\"); }\n// after (caller-side)\nif log.data.as_ref().map(|d| d.len()).unwrap_or(0) < 96 {\n    tracing::warn!(\"skipping log with insufficient Burn event data\");\n    return Ok(None);\n}\nparse_burn_event_hypersync(log)?;","handlingStrategy":"validation","validationCode":"fn burn_data_ok(log: &HyperSyncLog) -> bool {\n    log.data.as_ref().map(|d| d.len() >= 96).unwrap_or(false)\n}\n// call parse_burn_event_hypersync only if burn_data_ok(&log)","typeGuard":null,"tryCatchPattern":"match parse_burn_event_hypersync(&log) {\n    Ok(ev) => handle(ev),\n    Err(e) if e.to_string().contains(\"Burn event data is too short\") => {\n        tracing::warn!(\"short burn data; skipping log\");\n    }\n    Err(e) => return Err(e.into()),\n}","preventionTips":["Use the exact Burn topic0 filter so foreign events never reach the parser","Validate log.data length >= 96 bytes before decoding","Assert fixtures contain 0x + 192 hex chars for Burn data","Monitor provider responses for truncation when using bulk HyperSync queries"],"tags":["blockchain","uniswap-v3","abi-parsing","events"],"backgroundTag":"schema-validation-failed","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}