From ced939c3b163be1494c957229d03b2a30e5b64dc Mon Sep 17 00:00:00 2001 From: naveenkumar29052006 Date: Mon, 26 Jan 2026 22:46:55 +0530 Subject: [PATCH 1/2] feat(webln): support Lightning Addresses in sendPayment --- .../actions/webln/sendPaymentOrPrompt.ts | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/extension/background-script/actions/webln/sendPaymentOrPrompt.ts b/src/extension/background-script/actions/webln/sendPaymentOrPrompt.ts index 42862e5c4a..8bdaa2f3b7 100644 --- a/src/extension/background-script/actions/webln/sendPaymentOrPrompt.ts +++ b/src/extension/background-script/actions/webln/sendPaymentOrPrompt.ts @@ -1,10 +1,13 @@ import lightningPayReq from "bolt11-signet"; +import lnurlLib from "~/common/lib/lnurl"; import utils from "~/common/lib/utils"; import { getHostFromSender } from "~/common/utils/helpers"; +import { isLNURLDetailsError } from "~/common/utils/typeHelpers"; import { Message, Sender } from "~/types"; import db from "../../db"; import sendPayment from "../ln/sendPayment"; +import lnurlPayWithPrompt from "../lnurl/pay"; const sendPaymentOrPrompt = async (message: Message, sender: Sender) => { const host = getHostFromSender(sender); @@ -17,8 +20,40 @@ const sendPaymentOrPrompt = async (message: Message, sender: Sender) => { }; } - const paymentRequestDetails = lightningPayReq.decode(paymentRequest); - if (await checkAllowance(host, paymentRequestDetails.satoshis || 0)) { + if (lnurlLib.isLightningAddress(paymentRequest)) { + try { + const lnurlDetails = await lnurlLib.getDetails(paymentRequest); + if (isLNURLDetailsError(lnurlDetails)) { + return { error: lnurlDetails.reason }; + } + if (lnurlDetails.tag === "payRequest") { + return lnurlPayWithPrompt(message, lnurlDetails); + } + } catch (e) { + console.error(e); + // Fallback to regular flow or return error? + // If it looks like an address but fails resolution, it's safer to return the error + // than to try and decode it as a BOLT11 which will definitely fail. + if (e instanceof Error) { + return { error: e.message }; + } + } + return { error: "Failed to resolve Lightning Address" }; + } + + let paymentRequestDetails; + try { + paymentRequestDetails = lightningPayReq.decode(paymentRequest); + } catch (e) { + if (e instanceof Error) { + return { error: e.message }; + } + } + + if ( + paymentRequestDetails && + (await checkAllowance(host, paymentRequestDetails.satoshis || 0)) + ) { return sendPaymentWithAllowance(message); } else { return payWithPrompt(message); From c08750da1c4ce903ce003eb3dcac7160a7d320a9 Mon Sep 17 00:00:00 2001 From: naveenkumar29052006 Date: Mon, 26 Jan 2026 23:03:32 +0530 Subject: [PATCH 2/2] feat: enhance sendPaymentOrPrompt error handling --- .../background-script/actions/webln/sendPaymentOrPrompt.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/extension/background-script/actions/webln/sendPaymentOrPrompt.ts b/src/extension/background-script/actions/webln/sendPaymentOrPrompt.ts index 8bdaa2f3b7..b868dd07a2 100644 --- a/src/extension/background-script/actions/webln/sendPaymentOrPrompt.ts +++ b/src/extension/background-script/actions/webln/sendPaymentOrPrompt.ts @@ -29,6 +29,7 @@ const sendPaymentOrPrompt = async (message: Message, sender: Sender) => { if (lnurlDetails.tag === "payRequest") { return lnurlPayWithPrompt(message, lnurlDetails); } + return { error: `Unsupported LNURL type: ${lnurlDetails.tag}` }; } catch (e) { console.error(e); // Fallback to regular flow or return error? @@ -37,17 +38,15 @@ const sendPaymentOrPrompt = async (message: Message, sender: Sender) => { if (e instanceof Error) { return { error: e.message }; } + return { error: "Failed to resolve Lightning Address" }; } - return { error: "Failed to resolve Lightning Address" }; } let paymentRequestDetails; try { paymentRequestDetails = lightningPayReq.decode(paymentRequest); } catch (e) { - if (e instanceof Error) { - return { error: e.message }; - } + return { error: e instanceof Error ? e.message : String(e) }; } if (