{"record":{"id":"3db2a9bb7ba5fc2d","repo":"FuelLabs/fuel-core","slug":"tendermint-rpc-response-uses-unsupported-json-rpc","errorCode":null,"errorMessage":"Tendermint RPC response uses unsupported JSON-RPC version {}","messagePattern":"Tendermint RPC response uses unsupported JSON-RPC version (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/services/shared-sequencer/src/http_api.rs","lineNumber":139,"sourceCode":"    let request = RpcRequest {\n        jsonrpc: \"2.0\",\n        id: 1,\n        method,\n        params,\n    };\n    let response = http.post(api_url).json(&request).send().await?;\n    if response.status() != reqwest::StatusCode::OK {\n        anyhow::bail!(\n            \"Tendermint RPC request failed with HTTP status {}\",\n            response.status()\n        );\n    }\n    let text = response.text().await?;\n    let response: api_types::RpcResponse<T> =\n        serde_json::from_str(&text).with_context(|| format!(\"response text {text}\"))?;\n\n    if response.jsonrpc != request.jsonrpc {\n        anyhow::bail!(\n            \"Tendermint RPC response uses unsupported JSON-RPC version {}\",\n            response.jsonrpc\n        );\n    }\n    if response.id != request.id {\n        anyhow::bail!(\n            \"Tendermint RPC response ID {} does not match request ID {}\",\n            response.id,\n            request.id\n        );\n    }\n\n    if let Some(error) = response.error {\n        anyhow::bail!(\"Tendermint RPC error: {error}\");\n    }\n\n    response\n        .result","sourceCodeStart":121,"sourceCodeEnd":157,"githubUrl":"https://github.com/FuelLabs/fuel-core/blob/add100d30d21498e8528c46be8567fbd2ea019af/crates/services/shared-sequencer/src/http_api.rs#L121-L157","documentation":"Strict response-validation guard in the shared-sequencer rpc() helper: the JSON body parsed fine, but its \"jsonrpc\" field does not equal the \"2.0\" value sent in the request. This means the endpoint replied with a different JSON-RPC dialect (or a non-RPC payload like an HTML error page that still parsed). It signals a protocol/version mismatch with whatever answered at api_url, not a network failure.","triggerScenarios":"Thrown at crates/services/shared-sequencer/src/http_api.rs:139 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Confirm api_url actually points at a Tendermint/CometBFT JSON-RPC endpoint speaking JSON-RPC 2.0","Capture the raw response text (the code attaches it via context on parse) to identify what really answered","If the remote legitimately uses another JSON-RPC version, add an explicit allowlist rather than reusing the equality check against the request version"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"add100d30d21498e8528c46be8567fbd2ea019af","analyzedAt":"2026-09-05T18:46:12.018Z","contentChangedAt":"2026-09-05T18:46:12.018Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}