{"record":{"id":"89bc0bc452af6b88","repo":"FuelLabs/fuel-core","slug":"missing-tx-pointer","errorCode":null,"errorMessage":"Missing tx_pointer","messagePattern":"Missing tx_pointer","errorType":"exception","errorClass":"Error::Serialization","httpStatus":null,"severity":"error","filePath":"crates/services/block_aggregator_api/src/blocks/old_block_source/convertor_adapter/proto_to_fuel_conversions.rs","lineNumber":886,"sourceCode":"                .utxo_id\n                .as_ref()\n                .ok_or_else(|| Error::Serialization(anyhow!(\"Missing utxo_id\")))?;\n            let utxo_id = utxo_id_from_proto(utxo_proto)?;\n            let owner =\n                Address::try_from(proto_coin_signed.owner.as_slice()).map_err(|e| {\n                    Error::Serialization(anyhow!(\n                        \"Could not convert owner to Address: {}\",\n                        e\n                    ))\n                })?;\n            let asset_id = fuel_core_types::fuel_types::AssetId::try_from(\n                proto_coin_signed.asset_id.as_slice(),\n            )\n            .map_err(|e| Error::Serialization(anyhow!(e)))?;\n            let tx_pointer_proto = proto_coin_signed\n                .tx_pointer\n                .as_ref()\n                .ok_or_else(|| Error::Serialization(anyhow!(\"Missing tx_pointer\")))?;\n            let tx_pointer = tx_pointer_from_proto(tx_pointer_proto)?;\n            let witness_index =\n                u16::try_from(proto_coin_signed.witness_index).map_err(|e| {\n                    Error::Serialization(anyhow!(\n                        \"Could not convert witness_index to u16: {}\",\n                        e\n                    ))\n                })?;\n\n            Ok(Input::coin_signed(\n                utxo_id,\n                owner,\n                proto_coin_signed.amount,\n                asset_id,\n                tx_pointer,\n                witness_index,\n            ))\n        }","sourceCodeStart":868,"sourceCodeEnd":904,"githubUrl":"https://github.com/FuelLabs/fuel-core/blob/b9d4d170da3a31c9ace5f963d633b326348e0d42/crates/services/block_aggregator_api/src/blocks/old_block_source/convertor_adapter/proto_to_fuel_conversions.rs#L868-L904","documentation":"CoinSigned inputs embed a tx_pointer submessage used for dependency ordering; it is optional at the proto layer but required by Input::coin_signed. When tx_pointer is None the convertor fails with 'Missing tx_pointer' before tx_pointer_from_proto can run.","triggerScenarios":"A CoinSigned input proto where the nested tx_pointer message was omitted — partial encoder output, legacy schema, or default-constructed structs in tests.","commonSituations":"Producers that treat tx_pointer as optional metadata; schema drift; blocks encoded before tx_pointer was mandatory for coin inputs.","solutions":["Fix the producer to attach tx_pointer (block height + tx index) to every coin input","Pre-validate inputs: CoinSigned requires utxo_id AND tx_pointer submessages","Re-encode legacy data with a zeroed tx_pointer (TxPointer::new(0, 0)) if the chain accepts it, as an explicit migration step","Pin matching proto/fuel-core versions across the pipeline"],"exampleFix":"// before\nlet tx_pointer_proto = proto_coin_signed.tx_pointer.as_ref().ok_or_else(|| Error::Serialization(anyhow!(\"Missing tx_pointer\")))?;\n\n// after (migration shim for legacy data)\nlet tx_pointer = proto_coin_signed\n    .tx_pointer\n    .as_ref()\n    .map(tx_pointer_from_proto)\n    .transpose()?\n    .unwrap_or(fuel_core_types::fuel_tx::TxPointer::new(0, 0));","handlingStrategy":"validation","validationCode":"fn coin_signed_is_complete(c: &ProtoCoinSigned) -> bool {\n    c.utxo_id.is_some() && c.tx_pointer.is_some()\n}","typeGuard":"fn has_tx_pointer(c: &ProtoCoinSigned) -> bool { c.tx_pointer.is_some() }","tryCatchPattern":"let tp = c.tx_pointer.as_ref().ok_or_else(|| anyhow!(\"CoinSigned utxo {:?} missing tx_pointer\", c.utxo_id))?;","preventionTips":["Treat tx_pointer as required metadata for every coin input variant","Shared completeness check per variant: signed and predicate coins need the same submessages","Re-encode historical data with explicit defaults via a reviewed migration"],"tags":["rust","fuel","protobuf","serialization","coin-input","tx-pointer","conversion"],"backgroundTag":null,"analyzedSha":"b9d4d170da3a31c9ace5f963d633b326348e0d42","analyzedAt":"2026-08-16T08:56:42.692Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}