From e978ae682f71ce87c14fb8bea886f90ddd4bf1c3 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Sat, 1 Aug 2026 23:31:24 -0700 Subject: Payment addresses accept Lightning from LNURL-only wallets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit An address only worked for wallets that speak DNS payment instructions or BOLT 12; everything else looks for /.well-known/lnurlp/. The registrar now serves LUD-06/16 (with NIP-57 zap support), preferring the path that touches no funds: if the recipient's wallet published a CLINK offer key, we ask IT for the invoice over nostr and hand the result straight back — the payment never passes through us. Only when nobody answers does our node mint the invoice, and the existing settle forwarder pushes the money on to their address, signing a zap receipt when the payment was a zap. Co-Authored-By: Claude Fable 5 --- src/features/names.js | 3 +++ src/features/nwc.js | 1 + 2 files changed, 4 insertions(+) (limited to 'src') diff --git a/src/features/names.js b/src/features/names.js index 4e4f704..4c0ffaf 100644 --- a/src/features/names.js +++ b/src/features/names.js @@ -66,6 +66,9 @@ export function namesFeature(ctx) { if (!uri) throw new Error(t('namesNeedArk')); const j = await post('/register', 'POST', { name, uri, domain: DOMAIN, + // lets the address take Lightning payments from LNURL-only wallets: + // the registrar asks this key for an invoice before minting its own + ...(hook('nwcOfferPubkey') ? { offerPk: hook('nwcOfferPubkey') } : {}), // when the login identity claims its own npub name, it nominates the // wallet key to keep the record updated afterwards ...(manager ? { manager } : {}), diff --git a/src/features/nwc.js b/src/features/nwc.js index 5c49273..e7511c1 100644 --- a/src/features/nwc.js +++ b/src/features/nwc.js @@ -762,6 +762,7 @@ export function nwcFeature(ctx) { return { id: 'nwc', + nwcOfferPubkey() { return (hook('arkReady') && !wallet.watchOnly) ? offerKeys().pk : null; }, nwcOfferString() { return hook('arkReady') && !wallet.watchOnly ? offerString() : null; }, init() { listen(); startWatchdog(); refreshRegistration(); reconcileBg(); }, stop() { stop(); if (watchdog) { clearInterval(watchdog); watchdog = null; } }, -- cgit v1.2.3