{"record":{"id":"8065737f6aff8b6f","repo":"nautechsystems/nautilus_trader","slug":"failed-to-parse-outcomes-e","errorCode":null,"errorMessage":"Failed to parse outcomes '{}': {e}","messagePattern":"Failed to parse outcomes '(.+?)': (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/polymarket/src/http/parse.rs","lineNumber":122,"sourceCode":"            .events\n            .as_ref()?\n            .iter()\n            .find_map(|event| event.game_id.clone())\n    });\n\n    let token_ids: Vec<String> = serde_json::from_str(&market.clob_token_ids).map_err(|e| {\n        anyhow::anyhow!(\n            \"Failed to parse clob_token_ids '{}': {e}\",\n            market.clob_token_ids\n        )\n    })?;\n\n    if token_ids.len() != 2 {\n        anyhow::bail!(\"Expected 2 token IDs, received {}\", token_ids.len());\n    }\n\n    let outcomes: Vec<String> = serde_json::from_str(&market.outcomes)\n        .map_err(|e| anyhow::anyhow!(\"Failed to parse outcomes '{}': {e}\", market.outcomes))?;\n\n    if outcomes.len() != 2 {\n        anyhow::bail!(\"Expected 2 outcomes, received {}\", outcomes.len());\n    }\n\n    let tick_size = market\n        .order_price_min_tick_size\n        .unwrap_or(DEFAULT_TICK_SIZE);\n    let price_precision = POLYMARKET_PRICE_PRECISION;\n\n    // Polymarket charges fees using `feeSchedule.rate` on the Gamma market.\n    // Only takers pay; makers are always zero.\n    // Reference: https://docs.polymarket.com/trading/fees\n    let maker_fee: Option<Decimal> = market.fee_schedule.as_ref().map(|_| Decimal::ZERO);\n    let taker_fee: Option<Decimal> = market.fee_schedule.as_ref().map(|fs| fs.rate);\n\n    let min_size = market.order_min_size;\n","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/polymarket/src/http/parse.rs#L104-L140","documentation":"parse_gamma_market parses the market's outcomes field, which Polymarket delivers as a stringified JSON array of strings. This error is thrown when that string cannot be deserialized into Vec<String> — malformed JSON, empty string, or a changed payload shape.","triggerScenarios":"Calling parse_gamma_market (directly or via parse_markets_with_transient / request_instruments) on a market whose outcomes field is empty, invalid JSON, or not a string-encoded array.","commonSituations":"Gamma API schema drift (outcomes arriving as a native array), mocked responses that put real arrays in the field, or partially written/cached market records.","solutions":["Inspect the raw market.outcomes string to confirm the payload shape.","Adapt the GammaMarket deserialization to accept both stringified and native-array forms.","Skip or quarantine markets with unparseable outcomes instead of failing the whole batch."],"exampleFix":"// before\nlet outcomes: Vec<String> = serde_json::from_str(&market.outcomes)\n    .map_err(|e| anyhow::anyhow!(\"Failed to parse outcomes '{}': {e}\", market.outcomes))?;\n// after\nlet outcomes: Vec<String> = serde_json::from_str(&market.outcomes)\n    .or_else(|_| serde_json::from_value(market.outcomes_value.clone()))\n    .map_err(|e| anyhow::anyhow!(\"Failed to parse outcomes '{}': {e}\", market.outcomes))?;","handlingStrategy":"validation","validationCode":"fn has_stringified_outcomes(market: &GammaMarket) -> bool {\n    !market.outcomes.is_empty()\n        && market.outcomes.starts_with('[')\n        && serde_json::from_str::<Vec<String>>(&market.outcomes).is_ok()\n}","typeGuard":"fn parse_outcomes(raw: &str) -> Option<Vec<String>> {\n    serde_json::from_str::<Vec<String>>(raw).ok()\n}","tryCatchPattern":"let outcomes = match serde_json::from_str::<Vec<String>>(&market.outcomes) {\n    Ok(v) => v,\n    Err(e) => { warn!(\"skipping market {}: bad outcomes: {e}\", market.id); return Ok(None); }\n};","preventionTips":["Keep test fixtures matching the real Gamma wire format (stringified arrays).","Add a custom deserializer on GammaMarket fields tolerant of both string and array forms.","Log raw payloads on parse failure to detect upstream schema drift quickly."],"tags":["rust","json","parsing","polymarket"],"backgroundTag":"json-unmarshal-failed","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"}