{"record":{"id":"6e11b8a4fdd7c919","repo":"nautechsystems/nautilus_trader","slug":"trade-price-must-be-in-0-1","errorCode":null,"errorMessage":"trade price must be in (0, 1)","messagePattern":"trade price must be in \\(0, 1\\)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/polymarket/src/websocket/dispatch.rs","lineNumber":1475,"sourceCode":"    liquidity_side: LiquiditySide,\n    ts_event: UnixNanos,\n    ts_init: UnixNanos,\n) -> anyhow::Result<FillReport> {\n    let venue_order_id = VenueOrderId::from(trade.taker_order_id.as_str());\n    let trade_id = TradeId::from(trade.id.as_str());\n    let order_side = determine_order_side(\n        trade.trader_side,\n        trade.side,\n        trade.asset_id.as_str(),\n        trade.asset_id.as_str(),\n    );\n\n    let size_precision = instrument.size_precision();\n    let price_precision = instrument.price_precision();\n    let size_dec = parse_decimal_exact(&trade.size)?;\n    let price_dec = parse_decimal_exact(&trade.price)?;\n    anyhow::ensure!(size_dec > Decimal::ZERO, \"trade quantity must be positive\");\n    anyhow::ensure!(\n        price_dec > Decimal::ZERO && price_dec < Decimal::ONE,\n        \"trade price must be in (0, 1)\"\n    );\n    let last_qty = Quantity::from_decimal_dp(size_dec, size_precision)?;\n    let last_px = Price::from_decimal_dp(price_dec, price_precision)?;\n\n    let fee_rate = instrument_taker_fee(instrument);\n    let commission_value = compute_commission(\n        fee_rate,\n        instrument_fee_exponent(instrument)?,\n        size_dec,\n        price_dec,\n        liquidity_side,\n    )?;\n    let pusd = crate::execution::get_pusd_currency();\n\n    Ok(FillReport {\n        account_id,","sourceCodeStart":1457,"sourceCodeEnd":1493,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/polymarket/src/websocket/dispatch.rs#L1457-L1493","documentation":"Polymarket markets are probabilistic, so all trade prices must be strictly between 0 and 1. The adapter enforces this invariant before constructing a domain Price, rejecting any payload with a price outside the open unit interval.","triggerScenarios":"Processing a polymarket trade message whose `price` field parses to <= 0 or >= 1 — e.g. \"1.0\", \"0\", \"1.5\", or a price accidentally quoted in cents (e.g. \"54\" instead of \"0.54\").","commonSituations":"A venue feed switching to a different price convention (cents vs probability); settlement trades at exactly 1.0 or 0.0; malformed messages during resolution/market close events.","solutions":["Inspect the raw payload price — if it is quoted in cents (0–100), convert to probability by dividing by 100 before dispatch","Decide whether settlement prices of exactly 0 or 1 are legitimate for your market and relax the bound accordingly","Check for Polymarket schema changes and update the adapter","Filter the message and continue if out-of-range prints are expected at market resolution"],"exampleFix":"// before: strict open-interval check rejects settlement prints\nanyhow::ensure!(\n    price_dec > Decimal::ONE.zero() && price_dec < Decimal::ONE,\n    \"trade price must be in (0, 1)\"\n);\n// after: accept resolved-market extremes\nanyhow::ensure!(\n    price_dec >= Decimal::ZERO && price_dec <= Decimal::ONE,\n    \"trade price must be in [0, 1]\"\n);","handlingStrategy":"validation","validationCode":"let price_dec = parse_decimal_exact(&trade.price)?;\nif price_dec <= Decimal::ZERO || price_dec >= Decimal::ONE {\n    log::warn!(\"skipping trade with out-of-range price {}\", trade.price);\n    return Ok(None);\n}","typeGuard":"fn is_valid_probability_price(raw: &str) -> bool {\n    parse_decimal_exact(raw)\n        .map(|d| d > Decimal::ZERO && d < Decimal::ONE)\n        .unwrap_or(false)\n}","tryCatchPattern":null,"preventionTips":["Remember Polymarket prices are probabilities in (0,1), not cents","Convert cent-quoted feeds (divide by 100) before dispatch","Decide on settlement-price (0/1) handling policy up front"],"tags":["polymarket","websocket","validation","price"],"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"}