{
  "schema": "datachain.erpc.fleet-status/v1",
  "generated_at": 1786828895,
  "generated_at_iso": "2026-08-15T21:21:35Z",
  "writer": {
    "id": "blue",
    "rpc": "http://127.0.0.1:8545",
    "public_edge": "https://erpc.datachain.network",
    "status": "starting",
    "block_hex": null
  },
  "edge": {
    "public_url": "https://erpc.datachain.network",
    "status": "healthy",
    "sample_ok": 10,
    "sample_n": 10,
    "sample_fail": 0,
    "fail_ratio": 0.0,
    "fail_ratio_threshold": 0.4,
    "resolved_a": [
      "92.243.26.189"
    ],
    "degraded_since": null,
    "degraded_for_secs": 0,
    "external_probes": {
      "enabled": false,
      "reason": "no_ingest_file",
      "path": "/var/lib/datachain-rope/fleet/external-probes.ndjson",
      "peers": [],
      "degraded_since": null,
      "degraded_for_secs": 0,
      "sustain_secs": 180,
      "fail_ratio_threshold": 0.1,
      "min_peers_for_escalation": 2,
      "window_secs": 900,
      "generated_at": 1786828895,
      "degraded_peer_count": 0,
      "degraded_peer_ids": [],
      "escalate": false
    },
    "note": "Peers must AND writer.status with edge.status - local writer healthy can coexist with public HTTPS 502s (nginx/DNS settle). edge.external_probes carries the multi-vantage-point view fed by cerber-* peers (spec: docs/EDGE_EXTERNAL_PROBES_INGEST_SPEC_v1.md)."
  },
  "readers": [
    {
      "url": "http://92.243.25.119:8545",
      "role": "reader"
    },
    {
      "url": "http://157.230.18.45:8545",
      "role": "reader"
    },
    {
      "url": "http://167.172.106.174:8545",
      "role": "reader"
    }
  ],
  "public_read_rpc_urls": [
    "https://erpc.datachain.network/v1/read"
  ],
  "unhealthy": [],
  "peer_sample_block_hex": null,
  "self_heal": {
    "unhealthy_since": null,
    "unhealthy_for_secs": 0,
    "deadline_secs": 900,
    "escalate_to_cerber": false,
    "escalate_reason_external_probes": false,
    "writer_restart_typical_secs": 420,
    "startup_grace_secs": 300,
    "writer_service_age_secs": 104,
    "estimated_recovery_secs": 196,
    "estimated_recovery_at": 1786829091,
    "recommended_deadline_padding_secs": 226,
    "note": "CERBER pages when escalate_to_cerber is true (writer/edge non-healthy past deadline_secs, currently 900s). Swap clients MUST pad from recommended_deadline_padding_secs / estimated_recovery_at instead: writer=starting|healing still has pad>0 while escalate stays false. public_read_rpc_urls is the attester-only HTTPS reader (no BLUE) for FallbackProvider."
  },
  "last_heal": {
    "reason": "startup_grace",
    "restarts_last_hour": 9
  },
  "ghost_reclaim": {
    "enabled": true,
    "reclaimed_total": 3457,
    "last_reclaim_at": 1786828216,
    "last_reclaim_count": 3,
    "last_reclaim_hashes": [],
    "last_scan_ghosts_found": 0,
    "last_scan_error": "none",
    "note": "Every HA tick diffs attester txpools vs BLUE; ghost raw txs are eth_sendRawTransaction'd into the sealer (2026-07-29)."
  },
  "notes": [
    "eth_* reads fail over via nginx rpc_read_failover when BLUE times out",
    "eth_sendRawTransaction and all rope_* stay pinned to BLUE (no dual-writer)",
    "txpool_* is primary-only so public pending matches the sealer mempool",
    "ghost_reclaim injects attester-only mempool txs into BLUE automatically",
    "sick BLUE self-heals via systemctl restart datachain-rope.service",
    "edge.* is sampled every HA tick against the public HTTPS URL (not loopback)",
    "users must never edit MetaMask RPC - wallets pull https://dcscan.io/api/v1/network/config",
    "https://erpc.datachain.network/v1/read is attester-only (GREEN/DO); never send writes there"
  ]
}
