{"record":{"id":"c8dd78b02a8ca3fb","repo":"nautechsystems/nautilus_trader","slug":"missing-log-index","errorCode":null,"errorMessage":"Missing log index","messagePattern":"Missing log index","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/rpc/log.rs","lineNumber":99,"sourceCode":"/// Returns an error if the transaction index is missing or cannot be parsed.\npub fn extract_transaction_index(log: &RpcLog) -> anyhow::Result<u32> {\n    let hex = log\n        .transaction_index\n        .as_ref()\n        .ok_or_else(|| anyhow::anyhow!(\"Missing transaction index\"))?;\n    parse_hex_u32(hex)\n}\n\n/// Extract log index from RPC log.\n///\n/// # Errors\n///\n/// Returns an error if the log index is missing or cannot be parsed.\npub fn extract_log_index(log: &RpcLog) -> anyhow::Result<u32> {\n    let hex = log\n        .log_index\n        .as_ref()\n        .ok_or_else(|| anyhow::anyhow!(\"Missing log index\"))?;\n    parse_hex_u32(hex)\n}\n\n/// Extract contract address from RPC log.\n///\n/// # Errors\n///\n/// Returns an error if the address is invalid.\npub fn extract_address(log: &RpcLog) -> anyhow::Result<Address> {\n    let bytes = decode_hex(&log.address)?;\n    anyhow::ensure!(\n        bytes.len() == Address::len_bytes(),\n        \"Invalid contract address length: expected {} bytes, was {}\",\n        Address::len_bytes(),\n        bytes.len()\n    );\n    Ok(Address::from_slice(&bytes))\n}","sourceCodeStart":81,"sourceCodeEnd":117,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/rpc/log.rs#L81-L117","documentation":"This error means the RpcLog's log_index field is None when extract_log_index is called. log_index is the position of the log entry within its block; it is absent for pending/unmined logs. Thrown before hex parsing.","triggerScenarios":"Calling extract_log_index on a pending log, a synthetic RpcLog, or deserialized JSON that omitted logIndex.","commonSituations":"Pending log subscriptions, providers that omit logIndex on pending receipts, or minimal test fixtures.","solutions":["Only index logs from confirmed blocks.","Skip or defer logs with no log_index.","Confirm provider response includes logIndex and that deserialization matches its casing.","Populate log_index in constructed test logs."],"exampleFix":"// before\nlet idx = extract_log_index(&log)?;\n// after\nlet idx = match extract_log_index(&log) {\n    Ok(i) => i,\n    Err(_) if log.log_index.is_none() => { defer(&log); return Ok(()); }\n    Err(e) => return Err(e),\n};","handlingStrategy":"validation","validationCode":"if log.log_index.is_none() {\n    // pending or unindexed log — defer\n}","typeGuard":"fn has_log_index(log: &RpcLog) -> bool { log.log_index.is_some() }","tryCatchPattern":"let idx = match extract_log_index(&log) {\n    Ok(i) => i,\n    Err(_) if log.log_index.is_none() => { defer(&log); return Ok(()); }\n    Err(e) => return Err(e),\n};","preventionTips":["Index only logs from confirmed blocks.","Confirm logIndex exists in your provider's payload.","Skip/defer logs without a log_index.","Populate log_index in fixtures."],"tags":["blockchain","rpc","missing-field","ethereum"],"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-14T00:17:10.932Z"}