From 1083047624e1e9560744197ca2082216c6e02653 Mon Sep 17 00:00:00 2001 From: Roland <33993199+rolznz@users.noreply.github.com> Date: Wed, 17 Dec 2025 01:35:32 +0700 Subject: [PATCH 001/344] fix: github docker build runs out of space (#1991) --- .github/workflows/build-docker.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build-docker.yaml b/.github/workflows/build-docker.yaml index ae103bb7..614c6dfc 100644 --- a/.github/workflows/build-docker.yaml +++ b/.github/workflows/build-docker.yaml @@ -9,6 +9,9 @@ jobs: TAG: ${{ github.ref_name }} runs-on: ubuntu-22.04 steps: + # see https://github.com/orgs/community/discussions/25678#discussioncomment-5242449 + - name: Delete huge unnecessary tools folder + run: rm -rf /opt/hostedtoolcache - uses: actions/checkout@v4 name: Check out code - name: Install Go From e80261a545c9cd018a08b6fa3fe0b431c5877ec5 Mon Sep 17 00:00:00 2001 From: Roland <33993199+rolznz@users.noreply.github.com> Date: Mon, 5 Jan 2026 18:11:14 +0700 Subject: [PATCH 002/344] fix: only clear ldk VSS migration config value after successfully starting node (#2000) --- lnclient/ldk/ldk.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lnclient/ldk/ldk.go b/lnclient/ldk/ldk.go index 9e8992d5..a201beb0 100644 --- a/lnclient/ldk/ldk.go +++ b/lnclient/ldk/ldk.go @@ -189,11 +189,9 @@ func NewLDKService(ctx context.Context, cfg config.Config, eventPublisher events builder.SetStorageDirPath(filepath.Join(newpath, "./storage")) migrateStorage, _ := cfg.Get("LdkMigrateStorage", "") + clearMigrateStorageConfigValue := false if migrateStorage == "VSS" { - err = cfg.SetUpdate("LdkMigrateStorage", "", "") - if err != nil { - return nil, err - } + clearMigrateStorageConfigValue = true if vssToken == "" { return nil, errors.New("migration enabled but no vss token found") } @@ -222,13 +220,21 @@ func NewLDKService(ctx context.Context, cfg config.Config, eventPublisher events node, err = builder.Build() } - logger.Logger.WithFields(logrus.Fields{}).Info("LDK node created") - if err != nil { logger.Logger.WithError(err).Error("Failed to create LDK node") return nil, err } + logger.Logger.WithFields(logrus.Fields{}).Info("LDK node created") + + if clearMigrateStorageConfigValue { + err = cfg.SetUpdate("LdkMigrateStorage", "", "") + if err != nil { + logger.Logger.WithError(err).Error("Failed to clear LDK migrate storage config value") + return nil, err + } + } + ldkEventConsumer := make(chan *ldk_node.Event) ldkCtx, cancel := context.WithCancel(ctx) ldkEventBroadcaster := NewLDKEventBroadcaster(ldkCtx, ldkEventConsumer) From 4a9e6868fac746742bf04d502e20a52c9ce50b37 Mon Sep 17 00:00:00 2001 From: Roland <33993199+rolznz@users.noreply.github.com> Date: Tue, 6 Jan 2026 13:12:45 +0700 Subject: [PATCH 003/344] fix: max amount when swapping in from external wallet (#2004) --- frontend/src/screens/wallet/swap/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/screens/wallet/swap/index.tsx b/frontend/src/screens/wallet/swap/index.tsx index a3e610f3..ce62af9f 100644 --- a/frontend/src/screens/wallet/swap/index.tsx +++ b/frontend/src/screens/wallet/swap/index.tsx @@ -162,7 +162,9 @@ function SwapInForm() { min={swapInfo.minAmount} max={Math.min( swapInfo.maxAmount, - spendableOnchainBalanceWithAnchorReserves, + ...(isInternalSwap + ? [spendableOnchainBalanceWithAnchorReserves] + : []), (balances.lightning.totalReceivable / 1000) * 0.99 )} onChange={(e) => setSwapAmount(e.target.value)} From 47b91c445a687e1f0e38459bfe93515b89f7a21b Mon Sep 17 00:00:00 2001 From: Roland <33993199+rolznz@users.noreply.github.com> Date: Tue, 6 Jan 2026 13:33:48 +0700 Subject: [PATCH 004/344] fix: increase vss client timeout (#2002) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f99722ac..a7b328f3 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/btcsuite/btcd v0.24.3-0.20250318170759-4f4ea81776d6 github.com/btcsuite/btcd/btcutil v1.1.6 github.com/elnosh/gonuts v0.4.2 - github.com/getAlby/ldk-node-go v0.0.0-20251204045546-a327ac13549f + github.com/getAlby/ldk-node-go v0.0.0-20260105120609-eaf05d8a8fcd github.com/go-gormigrate/gormigrate/v2 v2.1.5 github.com/labstack/echo/v4 v4.13.4 github.com/mattn/go-sqlite3 v1.14.32 diff --git a/go.sum b/go.sum index 9839f169..5324cdd0 100644 --- a/go.sum +++ b/go.sum @@ -183,8 +183,8 @@ github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/getAlby/ldk-node-go v0.0.0-20251204045546-a327ac13549f h1:wWY9M3QTBI3ycg/GFUM04rkU2ONnJ2wXDlaM6zgGAKg= -github.com/getAlby/ldk-node-go v0.0.0-20251204045546-a327ac13549f/go.mod h1:8BRjtKcz8E0RyYTPEbMS8VIdgredcGSLne8vHDtcRLg= +github.com/getAlby/ldk-node-go v0.0.0-20260105120609-eaf05d8a8fcd h1:irCN8P42eNPARxihk4rxDfP/lGR5XT+9X+Z+/1/A+FQ= +github.com/getAlby/ldk-node-go v0.0.0-20260105120609-eaf05d8a8fcd/go.mod h1:8BRjtKcz8E0RyYTPEbMS8VIdgredcGSLne8vHDtcRLg= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gormigrate/gormigrate/v2 v2.1.5 h1:1OyorA5LtdQw12cyJDEHuTrEV3GiXiIhS4/QTTa/SM8= github.com/go-gormigrate/gormigrate/v2 v2.1.5/go.mod h1:mj9ekk/7CPF3VjopaFvWKN2v7fN3D9d3eEOAXRhi/+M= From 191958570a907c924e29b858bc9774c7dfaa4b74 Mon Sep 17 00:00:00 2001 From: Roland <33993199+rolznz@users.noreply.github.com> Date: Wed, 7 Jan 2026 20:24:22 +0700 Subject: [PATCH 005/344] feat: add alert to node page when user has any large LDK channel monitors (#2007) --- README.md | 1 + config/models.go | 1 + .../channels/LDKChannelMonitorSizeAlert.tsx | 86 +++++++++++++++++++ frontend/src/screens/channels/Channels.tsx | 2 + go.mod | 2 +- go.sum | 4 +- lnclient/ldk/ldk.go | 30 +++++++ 7 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 frontend/src/components/channels/LDKChannelMonitorSizeAlert.tsx diff --git a/README.md b/README.md index d0ba2cdf..747360e3 100644 --- a/README.md +++ b/README.md @@ -230,6 +230,7 @@ _To configure via env, the following parameters must be provided:_ - `LDK_MAX_CHANNEL_SATURATION`: Sets the maximum portion of a channel's total capacity that may be used for sending a payment, expressed as a power of 1/2. See `max_channel_saturation_power_of_half` in [LDK docs](https://docs.rs/lightning/latest/lightning/routing/router/struct.PaymentParameters.html#structfield.max_channel_saturation_power_of_half). - `LDK_MAX_PATH_COUNT`: Maximum number of paths that may be used by MPP payments. - `LDK_LOG_LEVEL`: Log level for the LDK node. Higher is more verbose. Default: 3. This is separate from the main application log level, allowing you to enable more verbose LDK logging (e.g., level 4, 5 or 6) without enabling verbose logging for the entire application. +- `LDK_CHANNEL_MONITOR_WARNING_SIZE_BYTES`: If a channel monitor is larger than this value, a performance warning will be shown on the node page. #### LDK Network Configuration diff --git a/config/models.go b/config/models.go index d890a4c0..d2bbb7d9 100644 --- a/config/models.go +++ b/config/models.go @@ -34,6 +34,7 @@ type AppConfig struct { LDKLogLevel string `envconfig:"LDK_LOG_LEVEL" default:"3"` LDKMaxChannelSaturationPowerOfHalf uint8 `envconfig:"LDK_MAX_CHANNEL_SATURATION" default:"2"` LDKMaxPathCount uint8 `envconfig:"LDK_MAX_PATH_COUNT" default:"5"` + LDKChannelMonitorWarningSizeBytes uint64 `envconfig:"LDK_CHANNEL_MONITOR_WARNING_SIZE_BYTES" default:"5000000"` LDKVssUrl string `envconfig:"LDK_VSS_URL" default:"https://vss.getalbypro.com/vss"` LDKListeningAddresses string `envconfig:"LDK_LISTENING_ADDRESSES" default:"[::]:9735"` LDKAnnouncementAddresses string `envconfig:"LDK_ANNOUNCEMENT_ADDRESSES"` diff --git a/frontend/src/components/channels/LDKChannelMonitorSizeAlert.tsx b/frontend/src/components/channels/LDKChannelMonitorSizeAlert.tsx new file mode 100644 index 00000000..7844b6bc --- /dev/null +++ b/frontend/src/components/channels/LDKChannelMonitorSizeAlert.tsx @@ -0,0 +1,86 @@ +import { AlertTriangleIcon } from "lucide-react"; +import React from "react"; +import { Alert, AlertDescription, AlertTitle } from "src/components/ui/alert"; +import { useInfo } from "src/hooks/useInfo"; +import { useNodeDetails } from "src/hooks/useNodeDetails"; +import { request } from "src/utils/request"; + +export function LDKChannelMonitorSizeAlert() { + const { data: info } = useInfo(); + + if (info?.backendType !== "LDK") { + return null; + } + return ChannelMonitorSizeAlert(); +} + +function ChannelMonitorSizeAlert() { + const [channelMonitorSizes, setChannelMonitorSizes] = + React.useState< + { remotePubkey: string; sizeBytes: number; hasWarning: boolean }[] + >(); + React.useEffect(() => { + (async () => { + try { + const requestOptions: RequestInit = { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ command: "list_channel_monitor_sizes" }), + }; + + const data = await request("/api/command", requestOptions); + + setChannelMonitorSizes(data as typeof channelMonitorSizes); + } catch (error) { + console.error(error); + } + })(); + }, []); + + if (!channelMonitorSizes) { + return null; + } + + const largestChannelMonitor = channelMonitorSizes.find( + (c1) => !channelMonitorSizes.find((c2) => c2.sizeBytes > c1.sizeBytes) + ); + if (!largestChannelMonitor) { + return null; + } + + if (!largestChannelMonitor.hasWarning) { + return; + } + return ( + + ); +} + +function ChannelMonitorSizeAlertForPubkey({ + remotePubkey, + sizeBytes, +}: { + remotePubkey: string; + sizeBytes: number; +}) { + const { data: peerDetails } = useNodeDetails(remotePubkey); + return ( + <> + + + Large channel state detected + + The channel state for your channel with{" "} + {peerDetails?.alias || remotePubkey} is over{" "} + {Math.floor(sizeBytes / 1_000_000)} MB. Consider closing this channel + and opening a new one to improve your node performance. + + + + ); +} diff --git a/frontend/src/screens/channels/Channels.tsx b/frontend/src/screens/channels/Channels.tsx index 43c38124..66cd694e 100644 --- a/frontend/src/screens/channels/Channels.tsx +++ b/frontend/src/screens/channels/Channels.tsx @@ -20,6 +20,7 @@ import AppHeader from "src/components/AppHeader.tsx"; import { ChannelsCards } from "src/components/channels/ChannelsCards.tsx"; import { ChannelsTable } from "src/components/channels/ChannelsTable.tsx"; import { HealthCheckAlert } from "src/components/channels/HealthcheckAlert"; +import { LDKChannelMonitorSizeAlert } from "src/components/channels/LDKChannelMonitorSizeAlert"; import { LDKChannelWithoutPeerAlert } from "src/components/channels/LDKChannelWithoutPeerAlert"; import { OnchainTransactionsTable } from "src/components/channels/OnchainTransactionsTable.tsx"; import EmptyState from "src/components/EmptyState.tsx"; @@ -611,6 +612,7 @@ export default function Channels() { /> )} + = ls.cfg.GetEnv().LDKChannelMonitorWarningSizeBytes, + }) + } + } + } + + return &lnclient.CustomNodeCommandResponse{ + Response: channelMonitorSizesResponse, + }, nil } return nil, lnclient.ErrUnknownCustomNodeCommand From c5b72828651dfd1d9245f45323b18b405987afbe Mon Sep 17 00:00:00 2001 From: Roland <33993199+rolznz@users.noreply.github.com> Date: Wed, 7 Jan 2026 20:34:17 +0700 Subject: [PATCH 006/344] chore: reduce alby oauth permissions (#2008) (custodial alby account is shut down so there is no need to fetch balance or transfer funds now) --- alby/alby_oauth_service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alby/alby_oauth_service.go b/alby/alby_oauth_service.go index 90e338af..60d5ccf1 100644 --- a/alby/alby_oauth_service.go +++ b/alby/alby_oauth_service.go @@ -61,7 +61,7 @@ func NewAlbyOAuthService(db *gorm.DB, cfg config.Config, keys keys.Keys, eventPu conf := &oauth2.Config{ ClientID: cfg.GetEnv().AlbyClientId, ClientSecret: cfg.GetEnv().AlbyClientSecret, - Scopes: []string{"account:read", "balance:read", "payments:send"}, + Scopes: []string{"account:read"}, Endpoint: oauth2.Endpoint{ TokenURL: albyOAuthAPIURL + "/oauth/token", AuthURL: albyOAuthAuthUrl, From 0061e94594e2dbff5fb4b288992d29c007943951 Mon Sep 17 00:00:00 2001 From: HODLmeTight <35168804+TrezorHannes@users.noreply.github.com> Date: Wed, 7 Jan 2026 15:00:36 +0100 Subject: [PATCH 007/344] Add TunnelSats to suggested apps (#2001) --- .../src/assets/suggested-apps/tunnelsats.png | Bin 0 -> 16103 bytes .../connections/SuggestedAppData.tsx | 62 ++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 frontend/src/assets/suggested-apps/tunnelsats.png diff --git a/frontend/src/assets/suggested-apps/tunnelsats.png b/frontend/src/assets/suggested-apps/tunnelsats.png new file mode 100644 index 0000000000000000000000000000000000000000..032a2d5addb652c4d54100ad461798d37023667d GIT binary patch literal 16103 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 literal 0 HcmV?d00001 diff --git a/frontend/src/components/connections/SuggestedAppData.tsx b/frontend/src/components/connections/SuggestedAppData.tsx index 821d7ad5..c0e527c3 100644 --- a/frontend/src/components/connections/SuggestedAppData.tsx +++ b/frontend/src/components/connections/SuggestedAppData.tsx @@ -34,6 +34,7 @@ import snort from "src/assets/suggested-apps/snort.png"; import stackernews from "src/assets/suggested-apps/stacker-news.png"; import takemysats from "src/assets/suggested-apps/takemysats.png"; import tictactoe from "src/assets/suggested-apps/tictactoe.png"; +import tunnelsats from "src/assets/suggested-apps/tunnelsats.png"; import wavespace from "src/assets/suggested-apps/wave-space.png"; import wavlake from "src/assets/suggested-apps/wavlake.png"; import wherostr from "src/assets/suggested-apps/wherostr.png"; @@ -1922,6 +1923,67 @@ export const appStoreApps: AppStoreApp[] = ( ), categories: ["merchant-tools"], }, + { + id: "tunnelsats", + title: "TunnelSats", + description: "Privacy Lightning VPN", + webLink: "https://tunnelsats.com", + logo: tunnelsats, + extendedDescription: + "Secure your lightning node with a dedicated static IP. Automated, non-custodial VPN renewals via Nostr Wallet Connect.", + finalizeGuide: ( + <> +
+

+ Link your Alby Hub to TunnelSats for non-custodial automated + renewals: +

+
    +
  1. + Go to the{" "} + + TunnelSats Dashboard + + . +
  2. +
  3. Sign in with your node or Nostr extension.
  4. +
  5. + Navigate to the Automation{" "} + tab. +
  6. +
  7. + Click{" "} + + Connect Wallet + + . +
  8. +
  9. + Paste the{" "} + + Connection Secret + {" "} + from this Alby Hub. +
  10. +
  11. + Alternatively, use this{" "} + + One-Click Connect + {" "} + link to pre-fill the connection. +
  12. +
+
+ + ), + categories: ["misc"], + }, ] satisfies AppStoreApp[] ).sort((a, b) => (a.title.toUpperCase() > b.title.toUpperCase() ? 1 : -1)); From a5d45cbac02eaeb8637ba575e8e8e1a4d3e3e62f Mon Sep 17 00:00:00 2001 From: Roland <33993199+rolznz@users.noreply.github.com> Date: Wed, 7 Jan 2026 21:26:23 +0700 Subject: [PATCH 008/344] feat: add fountain to the app store (#2009) Also some minor fixes to other apps, and replaced testflight links with app store links --- .../src/assets/suggested-apps/fountain.png | Bin 0 -> 13240 bytes .../connections/SuggestedAppData.tsx | 51 +++++++++++++++--- 2 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 frontend/src/assets/suggested-apps/fountain.png diff --git a/frontend/src/assets/suggested-apps/fountain.png b/frontend/src/assets/suggested-apps/fountain.png new file mode 100644 index 0000000000000000000000000000000000000000..7c6064984437f1d4c0389c67d97184e9d2496b42 GIT binary patch literal 13240 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 literal 0 HcmV?d00001 diff --git a/frontend/src/components/connections/SuggestedAppData.tsx b/frontend/src/components/connections/SuggestedAppData.tsx index c0e527c3..1474f529 100644 --- a/frontend/src/components/connections/SuggestedAppData.tsx +++ b/frontend/src/components/connections/SuggestedAppData.tsx @@ -12,6 +12,7 @@ import clams from "src/assets/suggested-apps/clams.png"; import claude from "src/assets/suggested-apps/claude.png"; import coracle from "src/assets/suggested-apps/coracle.png"; import damus from "src/assets/suggested-apps/damus.png"; +import fountain from "src/assets/suggested-apps/fountain.png"; import goose from "src/assets/suggested-apps/goose.png"; import hablanews from "src/assets/suggested-apps/habla-news.png"; import iris from "src/assets/suggested-apps/iris.png"; @@ -93,8 +94,8 @@ export const appStoreCategories = { title: "Merchant Tools", priority: 10, }, - music: { - title: "Music", + audio: { + title: "Audio", priority: 20, }, blogging: { @@ -792,11 +793,12 @@ export const appStoreApps: AppStoreApp[] = ( { id: "wavlake", title: "Wavlake", - description: "Creators platform", + description: "Turn up the value for your biggest fans", webLink: "https://www.wavlake.com/", playLink: "https://play.google.com/store/apps/details?id=com.wavlake.mobile", - appleLink: "https://testflight.apple.com/join/eWnqECG4", + appleLink: + "https://apps.apple.com/us/app/wavlake-social-music-player/id6463653431", logo: wavlake, extendedDescription: "Support artists by paying to upvote music you enjoy with your Hub", @@ -819,7 +821,44 @@ export const appStoreApps: AppStoreApp[] = ( ), - categories: ["music"], + categories: ["audio"], + }, + { + id: "fountain", + title: "Fountain", + description: + "Discover millions of podcasts and emerging artists worth supporting", + webLink: "https://www.fountain.fm", + playLink: + "https://play.google.com/store/apps/details?id=fm.fountain.apps", + appleLink: + "https://apps.apple.com/us/app/fountain-podcast-player/id1576394424", + logo: fountain, + extendedDescription: + "Discover millions of podcasts and emerging artists worth supporting. Powered by RSS, Lightning and Nostr", + installGuide: ( + <> +

+ Download and open{" "} + Fountain on + your iOS or Android device +

+ + ), + finalizeGuide: ( + <> +
+

In Fountain

+
    +
  • Go to Wallet tab
  • +
  • Click the settings cog
  • +
  • Go to connected accounts {"->"} Nostr Wallet Connect
  • +
  • Scan or paste the connection secret from Alby Hub
  • +
+
+ + ), + categories: ["audio"], }, { id: "wavespace", @@ -1751,7 +1790,7 @@ export const appStoreApps: AppStoreApp[] = ( webLink: "https://bringin.xyz", playLink: "https://play.google.com/store/apps/details?id=xyz.bringin.client", - appleLink: "https://testflight.apple.com/join/HVh6eZsF", + appleLink: "https://apps.apple.com/in/app/bringin/id1579153016", zapStoreLink: "https://zapstore.dev/download/", logo: bringin, extendedDescription: From ceb3a5f490178f898b400834084e5cc3763bb1d8 Mon Sep 17 00:00:00 2001 From: Adithya Vardhan Date: Mon, 12 Jan 2026 09:15:00 +0530 Subject: [PATCH 009/344] fix: conditional query param in swap in status navigation (#2011) --- frontend/src/screens/wallet/swap/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/screens/wallet/swap/index.tsx b/frontend/src/screens/wallet/swap/index.tsx index ce62af9f..750f2973 100644 --- a/frontend/src/screens/wallet/swap/index.tsx +++ b/frontend/src/screens/wallet/swap/index.tsx @@ -113,7 +113,7 @@ function SwapInForm() { throw new Error("Error swapping in"); } navigate( - `/wallet/swap/in/status/${swapInResponse.swapId}${isInternalSwap && `?internal=true`}` + `/wallet/swap/in/status/${swapInResponse.swapId}${isInternalSwap ? "?internal=true" : ""}` ); toast("Initiated swap"); } catch (error) { From 797faa70fb6041ad65b49d7b6d66d0156377d86b Mon Sep 17 00:00:00 2001 From: Keshav <144454324+keshav0479@users.noreply.github.com> Date: Mon, 12 Jan 2026 10:22:26 +0530 Subject: [PATCH 010/344] fix(ui): enable keyboard submission for dialogs #760 (#2005) * fix(ui): enable keyboard submission for dialogs #760 * fix: add global max dialog height * fix: routing fee dialog submit * chore: remove unused code * chore: correct copy for exporting pathfinding scores * fix: return correct error message when refunding swap that is not found --------- Co-authored-by: Roland Bewick --- .../ExecuteCustomNodeCommandDialogContent.tsx | 25 +- .../ResetRoutingDataDialogContent.tsx | 53 ++- .../components/RoutingFeeDialogContent.tsx | 71 +-- frontend/src/index.css | 8 + frontend/src/screens/settings/DebugTools.tsx | 413 +++++++----------- lnclient/ldk/ldk.go | 2 +- swaps/swaps_service.go | 11 +- 7 files changed, 264 insertions(+), 319 deletions(-) diff --git a/frontend/src/components/ExecuteCustomNodeCommandDialogContent.tsx b/frontend/src/components/ExecuteCustomNodeCommandDialogContent.tsx index 9391e7a8..17d85c9b 100644 --- a/frontend/src/components/ExecuteCustomNodeCommandDialogContent.tsx +++ b/frontend/src/components/ExecuteCustomNodeCommandDialogContent.tsx @@ -60,17 +60,24 @@ export function ExecuteCustomNodeCommandDialogContent({ } } + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + executeCommand(); + }; + return ( Execute Custom Node Command -