{"record":{"id":"41bf06ac1878f7a6","repo":"nautechsystems/nautilus_trader","slug":"price-precision-param-must-be-less-than-or-equ","errorCode":null,"errorMessage":"`{PRICE_PRECISION_PARAM}` must be less than or equal to {u8::MAX}","messagePattern":"`(.+?)` must be less than or equal to (.+?)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/databento/src/data.rs","lineNumber":1404,"sourceCode":"\nfn requested_instrument(\n    instruments: Vec<InstrumentAny>,\n    instrument_id: InstrumentId,\n) -> Option<InstrumentAny> {\n    instruments\n        .into_iter()\n        .rev()\n        .find(|instrument| instrument.id() == instrument_id)\n}\n\nfn price_precision_from_params(params: Option<&Params>) -> anyhow::Result<Option<u8>> {\n    let Some(price_precision) = params.and_then(|params| params.get_u64(PRICE_PRECISION_PARAM))\n    else {\n        return Ok(None);\n    };\n\n    Ok(Some(u8::try_from(price_precision).map_err(|_| {\n        anyhow::anyhow!(\n            \"`{PRICE_PRECISION_PARAM}` must be less than or equal to {}\",\n            u8::MAX\n        )\n    })?))\n}\n\nfn schema_from_params(\n    params: Option<&Params>,\n    default_schema: dbn::Schema,\n    allowed_schemas: &[dbn::Schema],\n) -> anyhow::Result<dbn::Schema> {\n    let schema = if let Some(schema) = params.and_then(|params| params.get_str(SCHEMA_PARAM)) {\n        dbn::Schema::from_str(schema)?\n    } else {\n        default_schema\n    };\n\n    if allowed_schemas.contains(&schema) {","sourceCodeStart":1386,"sourceCodeEnd":1422,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/databento/src/data.rs#L1386-L1422","documentation":"Databento subscription parameters may carry a price precision override via the `PRICE_PRECISION_PARAM` metadata key. Because the adapter stores precision as u8, any value larger than 255 cannot be represented and triggers this error. The raw param is read as u64 then converted with try_from.","triggerScenarios":"Passing a `price_precision` parameter greater than 255 (u8::MAX) to subscribe_quotes, subscribe_trades, request_quotes, request_trades, request_bars, or request_book_depth.","commonSituations":"Copy-pasting large precision values intended for other exchanges (crypto venues with 9-18 decimals are fine, but values like 1000 are invalid), or accidentally passing a price in raw fixed-point integer units instead of a precision count.","solutions":["Pass a price_precision value between 0 and 255","Verify the param is an instrument precision count, not a scaled price","Fix the config/code that computes the precision value (e.g. a double-scaling bug)","Omit the parameter entirely to use the instrument's default precision"],"exampleFix":"// before\nlet params = indexmap! { PRICE_PRECISION_PARAM => 1000_u64.into() }; // > u8::MAX\n// after\nlet params = indexmap! { PRICE_PRECISION_PARAM => 8_u64.into() };","handlingStrategy":"validation","validationCode":"fn validate_precision_param(params: &dyn Params) -> Result<(), String> {\n    match params.get_u64(\"price_precision\") {\n        Some(p) if p > u8::MAX as u64 => Err(format!(\"price_precision {p} exceeds u8::MAX\")),\n        _ => Ok(()),\n    }\n}","typeGuard":"fn valid_precision(v: u64) -> Option<u8> {\n    u8::try_from(v).ok()\n}","tryCatchPattern":"match result {\n    Err(e) if e.to_string().contains(\"must be less than or equal to 255\") => {\n        eprintln!(\"price_precision param too large; use 0-255\");\n    }\n    other => other?,\n}","preventionTips":["Clamp or reject precision values above 255 at config load time","Never pass scaled prices where a precision count is expected","Prefer omitting the param so the instrument's default precision is used"],"tags":["databento","precision","parameters","validation"],"backgroundTag":"value-out-of-range","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"}