From 875a6a92971b1f2610d257bbd6bc495d03543251 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 4 Jun 2026 18:52:28 +0000 Subject: [PATCH] Retire deprecated bip110 flake input; collapse Bitcoin node tiles to two --- README.md | 5 +- app/sovran_systemsos_web/server.py | 51 +++++-------------- .../static/js/features.js | 6 +-- .../static/js/service-detail.js | 2 +- flake.nix | 4 +- modules/bip110.nix | 23 --------- modules/core/role-logic.nix | 3 +- modules/core/roles.nix | 1 - modules/core/sovran-hub.nix | 5 +- modules/modules.nix | 1 - 10 files changed, 20 insertions(+), 81 deletions(-) delete mode 100755 modules/bip110.nix diff --git a/README.md b/README.md index 7b1c1fb..df93ef6 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ The control center is the **Hub** — a built-in panel that lets the operator la │ flake.nix │ │ inputs: nixpkgs, │ │ nix-bitcoin, nixvim, │ - │ btc-clients, bip110 │ + │ btc-clients │ └───────────┬─────────────┘ │ nixosModules.Sovran_SystemsOS ▼ @@ -78,10 +78,9 @@ Defaults follow the import order in `modules/modules.nix`. Toggles live in `cust | `bitcoinecosystem.nix` | **on** | bitcoind/electrs/LND/RTL/BTCPay (over Tor) | | `wallet-autoconnect.nix` | **on** | Sparrow/Bisq ↔ node handshake | | `haven.nix` | off | Nostr relay | -| `bip110.nix` | off | Bitcoin Knots BIP-110 | | `element-calling.nix` | off | LiveKit + JWT for E2E calling | | `mempool.nix` | off | Mempool.space dashboard | -| `bitcoin-core.nix` | off | Standalone bitcoind | +| `bitcoin-core.nix` | off | Switch node to Bitcoin Core (replaces default Bitcoin Knots + BIP110) | | `rdp.nix` | off | xrdp remote desktop | | `sshd.nix` | off | Public-facing OpenSSH | diff --git a/app/sovran_systemsos_web/server.py b/app/sovran_systemsos_web/server.py index 778da52..f5a8d5e 100644 --- a/app/sovran_systemsos_web/server.py +++ b/app/sovran_systemsos_web/server.py @@ -222,28 +222,16 @@ FEATURE_REGISTRY = [ "conflicts_with": [], "port_requirements": [], }, - { - "id": "bip110", - "name": "Bitcoin Knots + BIP110", - "description": "Only one Bitcoin node implementation can be active at a time: Bitcoin Knots (default), Bitcoin Knots + BIP110, or Bitcoin Core. Enabling this option replaces the default Bitcoin Knots with Bitcoin Knots + BIP110 consensus changes. It will disable the currently active alternative.", - "category": "bitcoin", - "needs_domain": False, - "domain_name": None, - "needs_ddns": False, - "extra_fields": [], - "conflicts_with": ["bitcoin-core"], - "port_requirements": [], - }, { "id": "bitcoin-core", "name": "Bitcoin Core", - "description": "Only one Bitcoin node implementation can be active at a time: Bitcoin Knots (default), Bitcoin Knots + BIP110, or Bitcoin Core. Enabling this option replaces the default Bitcoin Knots with Bitcoin Core. It will disable the currently active alternative.", + "description": "Only one Bitcoin node implementation can be active: Bitcoin Knots + BIP110 (default) or Bitcoin Core. Enabling this replaces Knots + BIP110 with Bitcoin Core. Your timechain data is preserved.", "category": "bitcoin", "needs_domain": False, "domain_name": None, "needs_ddns": False, "extra_fields": [], - "conflicts_with": ["bip110"], + "conflicts_with": [], "port_requirements": [], }, { @@ -283,7 +271,6 @@ FEATURE_SERVICE_MAP = { "haven": "haven-relay.service", "element-calling": "livekit.service", "mempool": "mempool.service", - "bip110": None, "bitcoin-core": None, "btcpay-web": "btcpayserver.service", "sshd": "sshd.service", @@ -331,7 +318,6 @@ SERVICE_DOMAIN_MAP: dict[str, str] = { # For features that share a unit, disambiguate by icon field FEATURE_ICON_MAP = { - "bip110": "bip110", "bitcoin-core": "bitcoin-core", } @@ -352,7 +338,7 @@ ROLE_CATEGORIES: dict[str, set[str] | None] = { ROLE_FEATURES: dict[str, set[str] | None] = { "server_plus_desktop": None, "desktop": {"rdp", "sshd"}, - "node": {"rdp", "bip110", "bitcoin-core", "mempool", "btcpay-web", "sshd"}, + "node": {"rdp", "bitcoin-core", "mempool", "btcpay-web", "sshd"}, } SERVICE_DESCRIPTIONS: dict[str, str] = { @@ -1606,7 +1592,7 @@ def _is_feature_enabled_in_config(feature_id: str) -> bool | None: return False # Default off in Node role; only on via explicit hub toggle unit = FEATURE_SERVICE_MAP.get(feature_id) if unit is None: - return None # bip110, bitcoin-core — can't determine from config + return None # bitcoin-core — can't determine from config cfg = load_config() for svc in cfg.get("services", []): if svc.get("unit") == unit: @@ -2343,8 +2329,8 @@ def _get_bitcoind_version() -> str | None: """Run ``bitcoind --version`` and return the raw version string, or None on error. Parses the first output line to extract the token after "version ". - For example: "Bitcoin Knots daemon version v29.3.knots20260210+bip110-v0.4.1" - returns "v29.3.knots20260210+bip110-v0.4.1". + For example: "Bitcoin Knots daemon version v29.3.knots20260508" + returns "v29.3.knots20260508". Works regardless of whether the RPC server is ready (IBD, warmup, etc.). Results are cached for 60 seconds (_BTC_VERSION_CACHE_TTL). @@ -2379,26 +2365,13 @@ def _get_bitcoind_version() -> str | None: def _format_bitcoin_version(raw_version: str, icon: str = "") -> str: """Format a raw version string from ``bitcoind --version`` for tile display. - Strips the ``+bip110-vX.Y.Z`` patch suffix so the base version is shown - cleanly (e.g. "v29.3.knots20260210+bip110-v0.4.1" → "v29.3.knots20260210"). - For the BIP110 tile (icon == "bip110") a " (bip110 vX.Y.Z)" tag is appended - including the patch version. + For the BIP110 tile (icon == "bip110") a " (bip110)" tag is appended, + since mainline Bitcoin Knots (29.3.knots20260508+) now includes BIP-110 + and no longer carries a separate ``+bip110-vX.Y.Z`` suffix. """ - # Extract the BIP110 patch version before stripping the suffix - bip110_ver = "" - bip_match = re.search(r"\+bip110-v(\S+)", raw_version) - if bip_match: - bip110_ver = bip_match.group(1) - - # Strip the +bip110... suffix for the base Knots version - display = re.sub(r"\+bip110\S*", "", raw_version) - - # For BIP110 tile, append both the tag and the patch version - if icon == "bip110": - if bip110_ver: - display += f" (bip110 v{bip110_ver})" - elif "(bip110)" not in display.lower(): - display += " (bip110)" + display = raw_version + if icon == "bip110" and "(bip110)" not in display.lower(): + display += " (bip110)" return display diff --git a/app/sovran_systemsos_web/static/js/features.js b/app/sovran_systemsos_web/static/js/features.js index fee6ede..e575cce 100644 --- a/app/sovran_systemsos_web/static/js/features.js +++ b/app/sovran_systemsos_web/static/js/features.js @@ -415,10 +415,8 @@ function handleFeatureToggle(feat, newEnabled) { if (conflictNames.length > 0) { var confirmMsg; - if (feat.id === "bip110") { - confirmMsg = "Only one Bitcoin node implementation can be active. Enabling Bitcoin Knots + BIP110 will disable Bitcoin Core (if active). Your timechain data will be preserved — you will not need to re-download the timechain. Continue?"; - } else if (feat.id === "bitcoin-core") { - confirmMsg = "Only one Bitcoin node implementation can be active. Enabling Bitcoin Core will disable Bitcoin Knots + BIP110 (if active). Your timechain data will be preserved — you will not need to re-download the timechain. Continue?"; + if (feat.id === "bitcoin-core") { + confirmMsg = "Only one Bitcoin node implementation can be active. Enabling Bitcoin Core will replace Bitcoin Knots + BIP110. Your timechain data will be preserved — you will not need to re-download the timechain. Continue?"; } else { confirmMsg = "This will disable " + conflictNames.join(", ") + ". Continue?"; } diff --git a/app/sovran_systemsos_web/static/js/service-detail.js b/app/sovran_systemsos_web/static/js/service-detail.js index 4f8711c..29e1531 100644 --- a/app/sovran_systemsos_web/static/js/service-detail.js +++ b/app/sovran_systemsos_web/static/js/service-detail.js @@ -242,7 +242,7 @@ async function openServiceDetailModal(unit, name, icon) { var addonBtnCls = feat.enabled ? "btn btn-close-modal" : "btn btn-primary"; // Section title: use a more specific label for mutually-exclusive Bitcoin node features - var addonSectionTitle = (feat.id === "bip110" || feat.id === "bitcoin-core") + var addonSectionTitle = (feat.id === "bitcoin-core") ? "\u20BF Bitcoin Node Selection" : "\uD83D\uDD27 Addon Feature"; diff --git a/flake.nix b/flake.nix index f8c07fa..1b6b366 100755 --- a/flake.nix +++ b/flake.nix @@ -7,10 +7,9 @@ nixvim.url = "github:nix-community/nixvim"; btc-clients.url = "github:emmanuelrosa/btc-clients-nix"; nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-24.11"; - bip110.url = "github:emmanuelrosa/bitcoin-knots-bip-110-nix"; }; - outputs = { self, nixpkgs, nix-bitcoin, nixvim, btc-clients, nixpkgs-stable, bip110, ... }: + outputs = { self, nixpkgs, nix-bitcoin, nixvim, btc-clients, nixpkgs-stable, ... }: let overlay-stable = final: prev: { @@ -56,7 +55,6 @@ btc-clients.packages.${pkgs.system}.bisq2 btc-clients.packages.${pkgs.system}.sparrow ]; - sovran_systemsOS.packages.bip110 = bip110.packages.${pkgs.system}.bitcoind-knots-bip-110; }; }; }; diff --git a/modules/bip110.nix b/modules/bip110.nix deleted file mode 100755 index e229a80..0000000 --- a/modules/bip110.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sovran_systemsOS; -in -{ - options.sovran_systemsOS.packages.bip110 = lib.mkOption { - type = lib.types.nullOr lib.types.package; - default = null; - description = "BIP110 Bitcoin package"; - }; - - config = lib.mkIf ( - cfg.features.bip110 && - cfg.packages.bip110 != null - ) { - services.bitcoind.package = lib.mkForce cfg.packages.bip110; - - environment.systemPackages = [ - cfg.packages.bip110 - ]; - }; -} diff --git a/modules/core/role-logic.nix b/modules/core/role-logic.nix index 0a09f14..fafb030 100755 --- a/modules/core/role-logic.nix +++ b/modules/core/role-logic.nix @@ -24,7 +24,7 @@ }) # ── Bitcoin Node Only Role ──────────────────────────────── - # Bitcoin ecosystem + mempool + bip110, BTCPay runs but not exposed via Caddy + # Bitcoin ecosystem + mempool, BTCPay runs but not exposed via Caddy (lib.mkIf config.sovran_systemsOS.roles.node { sovran_systemsOS.services = { bitcoin = lib.mkDefault true; @@ -36,7 +36,6 @@ sovran_systemsOS.features = { mempool = lib.mkDefault true; - bip110 = lib.mkDefault true; }; sovran_systemsOS.web.btcpayserver = lib.mkDefault false; diff --git a/modules/core/roles.nix b/modules/core/roles.nix index 45e9483..48f6972 100755 --- a/modules/core/roles.nix +++ b/modules/core/roles.nix @@ -43,7 +43,6 @@ # ── Features (default OFF — user can enable in custom.nix) ── features = { haven = lib.mkEnableOption "Haven NOSTR relay"; - bip110 = lib.mkEnableOption "BIP-110 Bitcoin Better Money"; mempool = lib.mkEnableOption "Bitcoin Mempool Explorer"; element-calling = lib.mkEnableOption "Element Video and Audio Calling"; bitcoin-core = lib.mkEnableOption "Bitcoin Core"; diff --git a/modules/core/sovran-hub.nix b/modules/core/sovran-hub.nix index bf34456..ac119a8 100644 --- a/modules/core/sovran-hub.nix +++ b/modules/core/sovran-hub.nix @@ -29,10 +29,7 @@ let ] # ── Bitcoin Base (node implementations) ──────────────────── ++ lib.optionals cfg.services.bitcoin [ - { name = "Bitcoin Knots + BIP110"; unit = "bitcoind.service"; type = "system"; icon = "bip110"; enabled = cfg.features.bip110; category = "bitcoin-base"; credentials = [ - { label = "Tor Address — Access from anywhere via Tor Browser"; file = "/var/lib/tor/onion/bitcoind/hostname"; prefix = "http://"; } - ]; } - { name = "Bitcoin Knots"; unit = "bitcoind.service"; type = "system"; icon = "bitcoind"; enabled = cfg.services.bitcoin && !cfg.features.bitcoin-core && !cfg.features.bip110; category = "bitcoin-base"; credentials = [ + { name = "Bitcoin Knots + BIP110"; unit = "bitcoind.service"; type = "system"; icon = "bip110"; enabled = cfg.services.bitcoin && !cfg.features.bitcoin-core; category = "bitcoin-base"; credentials = [ { label = "Tor Address — Access from anywhere via Tor Browser"; file = "/var/lib/tor/onion/bitcoind/hostname"; prefix = "http://"; } ]; } { name = "Bitcoin Core"; unit = "bitcoind.service"; type = "system"; icon = "bitcoin-core"; enabled = cfg.features.bitcoin-core; category = "bitcoin-base"; credentials = [ diff --git a/modules/modules.nix b/modules/modules.nix index 09ef561..aecd688 100755 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -31,7 +31,6 @@ # ── Features (default OFF — enable in custom.nix) ───────── ./haven.nix - ./bip110.nix ./element-calling.nix ./mempool.nix ./bitcoin-core.nix