diff --git a/api/service.py b/api/service.py index bb261c5..c53b7f5 100644 --- a/api/service.py +++ b/api/service.py @@ -802,12 +802,16 @@ def get_cluster_compatibility() -> dict: if any_supported else "Cluster mempool RPCs are not available in this Bitcoin Core build. " "NodeScope detects support automatically and uses an honest fallback when unavailable. " - "These RPCs are expected only in newer Bitcoin Core versions (28+)." + "These RPCs are not yet included in any official Bitcoin Core release." ), "note": ( None if any_supported - else "Bitcoin Core 26 does not include getmempoolcluster or getmempoolfeeratediagram." + else ( + f"{version_str} does not include getmempoolcluster or getmempoolfeeratediagram." + if version_str + else "This build does not include getmempoolcluster or getmempoolfeeratediagram." + ) ), } diff --git a/docker-compose.yml b/docker-compose.yml index 68e27dc..460f1d5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,7 +8,7 @@ x-logging: &default-logging services: nodescope-bitcoind: - image: bitcoin/bitcoin:26 + image: bitcoin/bitcoin:28 container_name: nodescope-bitcoind restart: unless-stopped command: diff --git a/frontend/src/components/ClusterMempoolPanel.tsx b/frontend/src/components/ClusterMempoolPanel.tsx index d2b6885..f0dd0d0 100644 --- a/frontend/src/components/ClusterMempoolPanel.tsx +++ b/frontend/src/components/ClusterMempoolPanel.tsx @@ -93,9 +93,9 @@ export function ClusterMempoolPanel() { )} - {data && ( + {clusters && ( <> - {data.bitcoin_core_version && ( + {data?.bitcoin_core_version && (
)} -
- {data.supported ? `✓ ${t.cluster.supported}` : `— ${t.cluster.notSupported}`} -
- - {clusters && ( -
-
- {clusters.cluster_count} clusters · {clusters.total_tx_count} tx +
+
+ {clusters.cluster_count} clusters · {clusters.total_tx_count} tx +
+ {!clusters.rpc_ok && clusters.error && ( +
+ {clusters.error}
- {!clusters.rpc_ok && ( -
- {clusters.error} -
- )} - {clusters.rpc_ok && clusters.clusters.length === 0 && ( -
- {t.cluster.fallback} -
- )} -
- {clusters.clusters.flatMap((cluster) => - cluster.txs.map((tx) => { - const fee = tx.fee_rate_sat_vb - const bg = fee >= 20 ? '#14532d' : fee >= 5 ? '#78350f' : '#7f1d1d' - const size = Math.max(40, Math.min(160, tx.vsize / 2)) - return ( -
-
{fee} sat/vB
-
{tx.txid.slice(0, 10)}…
-
- ) - }) - )} + )} + {clusters.clusters.length === 0 && ( +
+ {t.cluster.fallback}
-
- )} - -
- {data.rpcs.map((r) => ( -
- - {r.supported ? '✓' : '✗'} - -
-
{r.rpc}
- {r.reason && ( -
- {r.reason} + )} +
+ {clusters.clusters.flatMap((cluster) => + cluster.txs.map((tx) => { + const fee = tx.fee_rate_sat_vb + const bg = fee >= 20 ? '#14532d' : fee >= 5 ? '#78350f' : '#7f1d1d' + const size = Math.max(40, Math.min(160, tx.vsize / 2)) + return ( +
+
{fee} sat/vB
+
{tx.txid.slice(0, 10)}…
- )} -
- - {r.supported ? t.status.ok : t.status.unavailable} - -
- ))} -
- -
- {data.message} - {data.note &&
{data.note}
} + ) + }) + )} +
{t.learn.cluster} )} - {loading && !data && ( + {loading && !clusters && (
{t.cluster.checking}
)}