{"record":{"id":"7078a6a3ad502ead","repo":"nautechsystems/nautilus_trader","slug":"cryptooption-missing-strike-price-field-for-inst","errorCode":null,"errorMessage":"CryptoOption missing `strike_price` field for instrument: {}","messagePattern":"CryptoOption missing `strike_price` field for instrument: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/tardis/src/http/instruments.rs","lineNumber":242,"sourceCode":"    multiplier: Option<Quantity>,\n    margin_init: Decimal,\n    margin_maint: Decimal,\n    maker_fee: Decimal,\n    taker_fee: Decimal,\n    ts_event: UnixNanos,\n    ts_init: UnixNanos,\n) -> anyhow::Result<InstrumentAny> {\n    let is_inverse = info.inverse.unwrap_or(false);\n\n    let option_type = info.option_type.ok_or_else(|| {\n        anyhow::anyhow!(\n            \"CryptoOption missing `option_type` field for instrument: {}\",\n            info.id\n        )\n    })?;\n\n    let strike_price = info.strike_price.ok_or_else(|| {\n        anyhow::anyhow!(\n            \"CryptoOption missing `strike_price` field for instrument: {}\",\n            info.id\n        )\n    })?;\n\n    Ok(InstrumentAny::CryptoOption(\n        CryptoOption::builder()\n            .instrument_id(instrument_id)\n            .raw_symbol(raw_symbol)\n            .underlying(get_currency(info.base_currency.to_uppercase().as_str()))\n            .quote_currency(get_currency(info.quote_currency.to_uppercase().as_str()))\n            .settlement_currency(get_currency(\n                parse_settlement_currency(info, is_inverse).as_str(),\n            ))\n            .is_inverse(is_inverse)\n            .option_kind(parse_option_kind(option_type))\n            .strike_price(Price::new(strike_price, price_increment.precision))\n            .activation_ns(activation)","sourceCodeStart":224,"sourceCodeEnd":260,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/tardis/src/http/instruments.rs#L224-L260","documentation":"Tardis instrument parsing builds a Nautilus CryptoOption instrument from the exchange's instrument definition. Options must carry a strike price; when the Tardis response has no `strike_price` for an option instrument, create_crypto_option refuses to fabricate one and fails the parse.","triggerScenarios":"Calling parse_option_instrument -> create_crypto_option with a Tardis instrument definition whose `strike_price` field is null/absent (info.strike_price is None after deserialization).","commonSituations":"Tardis API schema changes or partial instrument snapshots; requesting option instruments for venues that omit strike on some records; caching stale/incomplete instrument definitions; deserialization silently dropping unexpected/missing fields.","solutions":["Inspect the raw Tardis instrument payload for that instrument id and confirm strike_price is present; re-fetch the definition if it was truncated.","Update/verify the Tardis deserialization types so strike_price is mapped correctly (field-name or casing mismatch causes None).","Filter out or skip option instruments without strike_price in your data pipeline before parsing.","Pin/upgrade the nautilus_tardis adapter version matching the current Tardis API schema."],"exampleFix":"// before\nlet strike_price = info.strike_price.ok_or_else(|| anyhow::anyhow!(\"CryptoOption missing `strike_price` field for instrument: {}\", info.id))?;\n// after\nlet strike_price = match info.strike_price {\n    Some(sp) => sp,\n    None => {\n        tracing::warn!(\"Skipping option {} with no strike_price\", info.id);\n        return Ok(None); // skip instead of failing the whole parse\n    }\n};","handlingStrategy":"validation","validationCode":"if instrument_info.strike_price.is_none() {\n    eprintln!(\"skipping option {} (no strike_price)\", instrument_info.id);\n}","typeGuard":"fn has_strike(info: &TardisInstrumentInfo) -> bool { info.strike_price.is_some() }","tryCatchPattern":null,"preventionTips":["Validate raw Tardis payloads against the expected option schema before parsing.","Skip and log instruments with missing essential fields rather than failing a whole batch.","Keep the Tardis adapter in sync with the API schema version you query."],"tags":["rust","instrument-parsing","options","tardis","missing-field"],"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"}