From 1464b1b24df56f21afbc985820e90da498f55653 Mon Sep 17 00:00:00 2001 From: archipelago Date: Tue, 1 Sep 2026 11:40:25 -0400 Subject: [PATCH] fix(wallet): the Lightning funding gate states the node's real channel state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "LND thinks I do not have a channel" while the wallet showed plenty of liquidity (framework-pt, 2026-09-01): the send gate sums outbound over FULLY-OPEN channels only, which is correct — a just-opened channel sits in LND's pending list until it has ~3 confirmations, and an open channel can have all its balance on the far side — but the modal then claimed the node had NO channel at all, in every one of those states, and pointed the user at opening another one. The gate already fetched the full channel list; it now records WHY liquidity is zero and the modal says the truth per state: - pending channels -> "your new channel is waiting for on-chain confirmations, it unlocks automatically, nothing is needed from you" (and no "Open a channel" button — that would send the user to fix a problem they don't have, possibly opening a second channel) - open channels, zero on the needed side -> "balance is on the far side — you can receive but there's nothing to send right now" - payment refused with a routing/liquidity error -> says so, instead of claiming no channels - only a genuinely channel-less node keeps the open-one guidance Eleven unit tests pin the state machine, including the regression case (pending-only -> 'pending', not 'none') and fail-open on RPC errors. --- CHANGELOG.md | 2 + .../src/components/LightningRequiredModal.vue | 67 ++++++++++++--- .../__tests__/useLightningRequired.test.ts | 85 +++++++++++++++++++ .../src/composables/useLightningRequired.ts | 41 ++++++++- .../src/views/settings/AccountInfoSection.vue | 1 + 5 files changed, 182 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b58cd470..de9d3f82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ - **Portainer's first-run token is in the app page, not buried in "server logs."** New Portainer versions mint a one-time setup token on a fresh install and print it only to the container logs — on an appliance that meant telling the user to go read a server log to get into their own app. The token now appears in the same launch interstitial as app login credentials (with a copy button), only while first-run setup is actually pending; once the admin account exists the card disappears on its own. +- **The Lightning wallet states the node's real funding state instead of "you have no channel."** Trying to send while a freshly opened channel was still waiting for on-chain confirmations — or when all its balance sits on the far side — raised a modal that claimed the node had no channel at all (the outbound sum is legitimately zero in both states). The funding gate now reads the channel list it already fetched: a confirming channel gets "it unlocks automatically once confirmed, nothing is needed from you", a far-side balance gets "you can receive, but there's nothing to send right now", a routing/liquidity payment failure says so instead of pointing at channel setup, and only a genuinely channel-less node is sent to open one. + ## v1.8.8-alpha (2026-09-01) - **SSH over the mesh is now a first-class setting.** Settings gains an "SSH over mesh" card: off by default, and when you allow it the node's mesh firewall opens port 22 — either to every mesh peer (behind an explicit "I understand" confirmation, because that's a real exposure) or only to the mesh addresses you list. The rule is owned by the node (the `90-ssh.nft` drop-in), so it survives upgrades and daemon reinstalls, and the card tells you up front whether sshd is running, whether it listens on IPv6 (the mesh is IPv6-only — this is what a broken attempt looks like before it happens), and whether password login is on (keys-only is the recommended pairing). From Termux on your phone, `fipssh @` connects once the toggle is on — the npub is the durable address, and the command is shown with a copy button on the card. diff --git a/neode-ui/src/components/LightningRequiredModal.vue b/neode-ui/src/components/LightningRequiredModal.vue index 831bac89..4669f10d 100644 --- a/neode-ui/src/components/LightningRequiredModal.vue +++ b/neode-ui/src/components/LightningRequiredModal.vue @@ -10,7 +10,32 @@ z-index="z-[3600]" @close="onClose" > -

+

+ Your new channel is waiting for its on-chain confirmations — + that's why the network doesn't see it yet. It unlocks automatically once + confirmed (usually within about half an hour); nothing is needed from + you. This screen will work as soon as it lands. +

+

+ + +

+

+ LND couldn't route this payment — most often there's + not enough outbound for this amount, or no + route to the recipient at the fees offered. Smaller amounts sometimes + get through; check the channels screen to see what's actually spendable. +

+

Your Lightning node is running, but it has no payment channel yet.