{"record":{"id":"abda0ce795195540","repo":"nautechsystems/nautilus_trader","slug":"missing-block-number-abda0c","errorCode":null,"errorMessage":"Missing block number","messagePattern":"Missing block number","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/rpc/log.rs","lineNumber":62,"sourceCode":"///\n/// # Errors\n///\n/// Returns an error if the hex string cannot be parsed as u32.\npub fn parse_hex_u32(hex: &str) -> anyhow::Result<u32> {\n    u32::from_str_radix(hex.trim_start_matches(\"0x\"), 16)\n        .map_err(|e| anyhow::anyhow!(\"Invalid hex u32: {e}\"))\n}\n\n/// Extract block number from RPC log.\n///\n/// # Errors\n///\n/// Returns an error if the block number is missing or cannot be parsed.\npub fn extract_block_number(log: &RpcLog) -> anyhow::Result<u64> {\n    let hex = log\n        .block_number\n        .as_ref()\n        .ok_or_else(|| anyhow::anyhow!(\"Missing block number\"))?;\n    parse_hex_u64(hex)\n}\n\n/// Extract transaction hash from RPC log.\n///\n/// # Errors\n///\n/// Returns an error if the transaction hash is missing.\npub fn extract_transaction_hash(log: &RpcLog) -> anyhow::Result<String> {\n    log.transaction_hash\n        .clone()\n        .ok_or_else(|| anyhow::anyhow!(\"Missing transaction hash\"))\n}\n\n/// Extract transaction index from RPC log.\n///\n/// # Errors\n///","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/rpc/log.rs#L44-L80","documentation":"This error indicates the RpcLog's block_number field is None when extract_block_number is called. Ethereum RPC logs always carry a block number in confirmed receipts, so a missing value means the log came from a pending/unmined transaction or a partially populated response. It is thrown before any hex parsing occurs.","triggerScenarios":"Calling extract_block_number on a log from a pending transaction receipt (block_number null), on a manually constructed RpcLog, or on deserialized JSON where the field was omitted/null.","commonSituations":"Subscribing to pending logs via newPendingTransactions or newPendingReceipts, provider-specific responses where pending receipts omit block_number, or partial mock/test data.","solutions":["Only process logs once the transaction is confirmed (wait for receipt or block confirmation).","Handle the None case explicitly: skip or queue pending logs instead of unwrapping.","Check your RPC subscription type — switch from pending to confirmed log streams.","If constructing RpcLog manually in tests, populate block_number with a hex quantity like \"0x1\"."],"exampleFix":"// before\nlet block = extract_block_number(&log)?;\n// after\nmatch extract_block_number(&log) {\n    Ok(block) => process(block),\n    Err(_) if log.block_number.is_none() => skip_pending_log(),\n    Err(e) => return Err(e),\n}","handlingStrategy":"try-catch","validationCode":"if log.block_number.is_none() {\n    // pending or synthetic log — defer or skip\n}","typeGuard":"fn has_block_number(log: &RpcLog) -> bool { log.block_number.is_some() }","tryCatchPattern":"match extract_block_number(&log) {\n    Ok(b) => handle(b),\n    Err(e) if log.block_number.is_none() => defer_pending(&log),\n    Err(e) => return Err(e),\n}","preventionTips":["Only process confirmed (mined) logs.","Skip pending-subscription logs lacking block metadata.","Verify serde field mapping for blockNumber in your RpcLog type.","Populate block_number in test 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-14T05:17:10.506Z"}