{"record":{"id":"07bcdf5d5ecb45f6","repo":"nautechsystems/nautilus_trader","slug":"failed-to-parse-min-sz-for-e","errorCode":null,"errorMessage":"Failed to parse `min_sz` '{}' for {}: {e}","messagePattern":"Failed to parse `min_sz` '(.+?)' for (.+?): (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/okx/src/common/parse.rs","lineNumber":1691,"sourceCode":"    let price_increment = Price::from_str(&definition.tick_sz).map_err(|e| {\n        anyhow::anyhow!(\n            \"Failed to parse `tick_sz` '{}' for {}: {e}\",\n            definition.tick_sz,\n            definition.sprd_id\n        )\n    })?;\n    let size_increment = Quantity::from_str(&definition.lot_sz).map_err(|e| {\n        anyhow::anyhow!(\n            \"Failed to parse `lot_sz` '{}' for {}: {e}\",\n            definition.lot_sz,\n            definition.sprd_id\n        )\n    })?;\n    let min_quantity = if definition.min_sz.is_empty() {\n        None\n    } else {\n        Some(Quantity::from_str(&definition.min_sz).map_err(|e| {\n            anyhow::anyhow!(\n                \"Failed to parse `min_sz` '{}' for {}: {e}\",\n                definition.min_sz,\n                definition.sprd_id\n            )\n        })?)\n    };\n\n    let info = Some(build_spread_info(definition));\n\n    if spread_has_option_leg(definition) {\n        let instrument = CryptoOptionSpread::builder()\n            .instrument_id(instrument_id)\n            .raw_symbol(raw_symbol)\n            .underlying(underlying)\n            .quote_currency(quote_currency)\n            .settlement_currency(settlement_currency)\n            .is_inverse(is_inverse)\n            .strategy_type(Ustr::from(spread_type_literal(definition.sprd_type)))","sourceCodeStart":1673,"sourceCodeEnd":1709,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/okx/src/common/parse.rs#L1673-L1709","documentation":"parse_spread_instrument failed to parse the min_sz field of an OKX spread instrument definition into a Quantity; the venue returned a min-size string that is not a valid decimal number, so the instrument's minimum quantity cannot be represented and parsing is rejected.","triggerScenarios":"Calling parse_spread_instrument with a definition whose min_sz is populated but not a valid decimal (e.g. 'N/A', locale-formatted numbers, whitespace).","commonSituations":"Downstream systems exporting CSV/JSON with placeholder values like '-' or 'N/A'; encoding/locale issues; corrupted cached instrument metadata.","solutions":["Check min_sz in the payload for placeholder or locale-formatted values and sanitize them","Re-fetch the definition from OKX to get the canonical min_sz string","Trim whitespace before parsing; treat placeholder strings as empty to get None","Add a normalization step before Quantity::from_str"],"exampleFix":"// before\nSome(Quantity::from_str(&definition.min_sz).map_err(|e| {\n    anyhow::anyhow!(\"Failed to parse `min_sz` '{}' for {}: {e}\", definition.min_sz, definition.sprd_id)\n})?)\n// after\nlet min_sz = definition.min_sz.trim();\nlet min_quantity = if min_sz.is_empty() {\n    None\n} else {\n    Some(Quantity::from_str(min_sz).map_err(|e| {\n        anyhow::anyhow!(\"Failed to parse `min_sz` '{}' for {}: {e}\", min_sz, definition.sprd_id)\n    })?)\n};","handlingStrategy":"validation","validationCode":"fn min_sz_valid(def: &OKXSpreadInstrument) -> bool {\n    def.min_sz.is_empty() || def.min_sz.trim().parse::<rust_decimal::Decimal>().is_ok()\n}","typeGuard":null,"tryCatchPattern":"match parse_spread_instrument(&definition, ts_init) {\n    Ok(inst) => Some(inst),\n    Err(e) => { tracing::warn!(\"min_sz rejected for {}: {e:#}\", definition.sprd_id); None }\n}","preventionTips":["Sanitize placeholder values ('N/A', '-') to empty before parsing","Trim whitespace on all numeric fields","Reject bad definitions at cache-write time"],"tags":["rust","okx","parsing","quantity"],"backgroundTag":"invalid-argument-format","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"}