From 3ea20adbe77a6be14bf3f927c4e5819e01ef4c2e Mon Sep 17 00:00:00 2001 From: btcneves Date: Fri, 8 May 2026 16:12:31 -0300 Subject: [PATCH 1/3] fix: hide individual RPC rows in ClusterMempoolPanel when not supported --- frontend/src/components/ClusterMempoolPanel.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/ClusterMempoolPanel.tsx b/frontend/src/components/ClusterMempoolPanel.tsx index d2b6885..dce5202 100644 --- a/frontend/src/components/ClusterMempoolPanel.tsx +++ b/frontend/src/components/ClusterMempoolPanel.tsx @@ -173,7 +173,7 @@ export function ClusterMempoolPanel() { )} -
{data.rpcs.map((r) => ( @@ -220,7 +220,7 @@ export function ClusterMempoolPanel() {
))} - + }
Date: Fri, 8 May 2026 16:19:27 -0300 Subject: [PATCH 2/3] fix: upgrade bitcoind to v28, fix cluster mempool messaging MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - docker-compose.yml: bitcoin/bitcoin:26 → bitcoin/bitcoin:28 - service.py: replace hardcoded "Bitcoin Core 26" note with dynamic version string from getnetworkinfo; remove misleading "28+" claim since these RPCs are not yet in any official release - ClusterMempoolPanel: hide individual RPC probe rows when not supported --- api/service.py | 8 ++++++-- docker-compose.yml | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) 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: From d6894432fcf32de3d555a43a81e2c449246672b1 Mon Sep 17 00:00:00 2001 From: btcneves Date: Fri, 8 May 2026 16:21:47 -0300 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20ClusterMempoolPanel=20=E2=80=94=20sh?= =?UTF-8?q?ow=20cluster=20visual=20directly,=20remove=20compatibility=20wa?= =?UTF-8?q?rnings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/ClusterMempoolPanel.tsx | 166 +++++------------- 1 file changed, 43 insertions(+), 123 deletions(-) diff --git a/frontend/src/components/ClusterMempoolPanel.tsx b/frontend/src/components/ClusterMempoolPanel.tsx index dce5202..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.supported &&
- {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}
)}