fix(infonet): reject non-finite dispute numerics

This commit is contained in:
Sylvester Kaczmarek committed 2026-08-14 10:01:27 +01:00
1 parent b6516a21bf
commit 7cb315dbb0
1 file changed
+14 -10
+14 -10
View File
@@ -28,6 +28,7 @@ Two effects:
from __future__ import annotations from __future__ import annotations
from dataclasses import dataclass, field from dataclasses import dataclass, field
from math import isfinite
from typing import Any, Iterable from typing import Any, Iterable
from services.infonet.config import CONFIG from services.infonet.config import CONFIG
@@ -38,6 +39,15 @@ def _payload(event: dict[str, Any]) -> dict[str, Any]:
return p if isinstance(p, dict) else {} return p if isinstance(p, dict) else {}
def _finite_float(value: Any, default: float = 0.0) -> float:
"""Parse a chain numeric without allowing NaN/inf to poison views."""
try:
parsed = float(value or default)
except (TypeError, ValueError):
return float(default)
return parsed if isfinite(parsed) else float(default)
@dataclass @dataclass
class DisputeView: class DisputeView:
"""Chain-derived view of a single dispute.""" """Chain-derived view of a single dispute."""
@@ -94,11 +104,8 @@ def collect_disputes(
p = _payload(ev) p = _payload(ev)
did = _dispute_id(ev) did = _dispute_id(ev)
challenger = ev.get("node_id") or "" challenger = ev.get("node_id") or ""
try: cstake = _finite_float(p.get("challenger_stake"))
cstake = float(p.get("challenger_stake") or 0.0) opened_at = _finite_float(ev.get("timestamp"))
except (TypeError, ValueError):
cstake = 0.0
opened_at = float(ev.get("timestamp") or 0.0)
disputes[did] = DisputeView( disputes[did] = DisputeView(
dispute_id=did, market_id=str(market_id), dispute_id=did, market_id=str(market_id),
challenger_id=str(challenger), challenger_stake=cstake, challenger_id=str(challenger), challenger_stake=cstake,
@@ -120,10 +127,7 @@ def collect_disputes(
rep_type = p.get("rep_type") rep_type = p.get("rep_type")
if rep_type not in ("oracle", "common"): if rep_type not in ("oracle", "common"):
continue continue
try: amount = _finite_float(p.get("amount"))
amount = float(p.get("amount") or 0.0)
except (TypeError, ValueError):
continue
if amount <= 0: if amount <= 0:
continue continue
record = { record = {
@@ -146,7 +150,7 @@ def collect_disputes(
if outcome not in ("upheld", "reversed", "tie"): if outcome not in ("upheld", "reversed", "tie"):
continue continue
disputes[did].resolved_outcome = outcome disputes[did].resolved_outcome = outcome
disputes[did].resolved_at = float(ev.get("timestamp") or 0.0) disputes[did].resolved_at = _finite_float(ev.get("timestamp"))
return sorted(disputes.values(), key=lambda d: (d.opened_at, d.dispute_id)) return sorted(disputes.values(), key=lambda d: (d.opened_at, d.dispute_id))