{"record":{"id":"b9b632237ae75e36","repo":"nautechsystems/nautilus_trader","slug":"swap-event-data-is-too-short-b9b632","errorCode":null,"errorMessage":"Swap event data is too short","messagePattern":"Swap event data is too short","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/exchanges/parsing/uniswap_v3/swap.rs","lineNumber":68,"sourceCode":"/// # Errors\n///\n/// Returns an error if the log parsing fails or if the event data is invalid.\n///\n/// # Panics\n///\n/// Panics if the contract address is not set in the log.\npub fn parse_swap_event_hypersync(dex: SharedDex, log: &HypersyncLog) -> anyhow::Result<SwapEvent> {\n    validate_event_signature_hash(\"SwapEvent\", SWAP_EVENT_SIGNATURE_HASH, log)?;\n\n    let sender = extract_address_from_topic(log, 1, \"sender\")?;\n    let recipient = extract_address_from_topic(log, 2, \"recipient\")?;\n\n    if let Some(data) = &log.data {\n        let data_bytes = data.as_ref();\n\n        // Validate if data contains 5 parameters of 32 bytes each\n        if data_bytes.len() < 5 * 32 {\n            anyhow::bail!(\"Swap event data is too short\");\n        }\n\n        // Decode the data using the SwapEventData struct\n        let decoded = match <SwapEventData as SolType>::abi_decode(data_bytes) {\n            Ok(decoded) => decoded,\n            Err(e) => anyhow::bail!(\"Failed to decode swap event data: {e}\"),\n        };\n        let _ = decoded.amount0;\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(SwapEvent::new(\n            dex,\n            pool_identifier,","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/exchanges/parsing/uniswap_v3/swap.rs#L50-L86","documentation":"parse_swap_event_hypersync validates that the log's data holds at least 5 words of 32 bytes (amount0, amount1, sqrtPriceX96, liquidity, tick) before decoding a Uniswap V3 SwapEventData. Shorter data means the log cannot be a V3 Swap event, so the parser bails immediately.","triggerScenarios":"Calling parse_swap_event_hypersync with a log whose data is under 160 bytes — e.g. the subscription matched a V2 Swap (data holds only amounts), a non-V3 contract, or a truncated payload.","commonSituations":"Backfilling across a hard fork or chain where Swap layout differs; mixing V2 and V3 pool logs in one subscription; hypersync returning partial data for very old blocks.","solutions":["Ensure the query filters by the exact V3 Swap topic0 signature","Check data length >= 160 in the caller before calling the parser and skip short logs","Verify you are decoding V3 pool logs, not V2/fork contracts","Inspect the raw log data length returned by hypersync for the affected blocks"],"exampleFix":"// before\nif data_bytes.len() < 5 * 32 {\n    anyhow::bail!(\"Swap event data is too short\");\n}\n// after\nif data_bytes.len() < 5 * 32 {\n    tracing::debug!(len = data_bytes.len(), \"skipping non-V3 swap log (data too short)\");\n    return Ok(None); // or continue\n}","handlingStrategy":"validation","validationCode":"fn is_v3_swap_data_len(log: &Log) -> bool {\n    log.data.as_ref().map(|d| d.as_ref().len() >= 160).unwrap_or(false)\n}\nif !is_v3_swap_data_len(&log) { skip_or_log(); }","typeGuard":null,"tryCatchPattern":"match parse_swap_event_hypersync(&dex, &log) {\n    Ok(ev) => handle(ev),\n    Err(e) => { tracing::warn!(%e, \"swap log skipped\"); continue; }\n}","preventionTips":["Filter by the canonical V3 Swap topic0","Pre-check data length >= 160 bytes before parsing","Separate V2 and V3 log pipelines","Audit hypersync queries for overly broad topic filters"],"tags":["blockchain","abi-decode","uniswap-v3","event-parsing"],"backgroundTag":"payload-too-large","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"}