diff options
| author | Adam Soltys <[email protected]> | 2026-07-30 08:43:47 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-07-30 08:43:47 -0700 |
| commit | 6713f8d4e55db8d5344684b08b062cc9129ef6b0 (patch) | |
| tree | 2e547aedcef6b4c7f8de8e82a561a62c6781ce54 /src/features/ark.js | |
| parent | 962223b0628133ebcd27ff6c89d6aa616a936142 (diff) | |
| download | coinosv3-6713f8d4e55db8d5344684b08b062cc9129ef6b0.tar.gz coinosv3-6713f8d4e55db8d5344684b08b062cc9129ef6b0.zip | |
Add NIP-57 Lightning zaps (npub / lightning address / lnurl)
Send a Lightning zap to a nostr npub, a lightning address (name@domain),
or an lnurl. New src/lnurl.js does the resolution half — target → LNURL-pay
params → signed kind-9734 zap request → callback → bolt11 — and the new
zaps feature (src/features/zaps.js) drives the amount/comment UI, then hands
the invoice to the existing Boltz submarine-swap flow via a new
swaps.startLnPay hook, so there's one tested pay/review/confirm/success path.
Routing: a bolt11 is still caught by swaps; an npub still prefers an instant
free Ark zap when Ark can serve it, and only falls through to a Lightning
zap otherwise — ark's "no Ark address" screen also offers an explicit
"Zap over Lightning" fallback (gated on the zaps feature's canLnZap). A real
zap receipt is attributed only when the server advertises allowsNostr and we
know the recipient's pubkey; otherwise it degrades to a plain LNURL-pay.
Nostr seam gains nostrSign (finalize without publishing), nostrProfile
(kind-0 with lud16/lud06), and nostrRelays. Lightning addresses are
debounced in matchSendText since their regex matches mid-typing.
Verified: unit tests for parse/encode/zap-request; a live resolve→signed
9734→payable mainnet bolt11 against coinos; and an in-browser DOM smoke
(zap form + LNURL params over CORS + allowsNostr hint + handoff).
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Diffstat (limited to 'src/features/ark.js')
| -rw-r--r-- | src/features/ark.js | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/src/features/ark.js b/src/features/ark.js index f22d7be..08e44de 100644 --- a/src/features/ark.js +++ b/src/features/ark.js @@ -547,6 +547,11 @@ export function arkFeature(ctx) { h('div', { class: 'small muted', style: 'word-break:break-all' }, z.npub), z.status === 'lookup' ? h('div', { class: 'row gap6', style: 'align-items:center' }, h('span', { class: 'spinner sm' }), h('span', { class: 'small muted' }, t('arkZapLookup'))) : null, z.status === 'noark' ? h('div', { class: 'notice err' }, t('arkZapNoArk')) : null, + // No Ark address, but they may still take a Lightning zap — hand off to + // the zaps feature (present alongside swaps). + (z.status === 'noark' || z.status === 'wrongnet') && ctx.hook('canLnZap') + ? h('button', { class: 'btn-primary btn-block', onClick: () => { ctx.hook('lnZapNpub', z.pk, z.npub); } }, '⚡ ' + t('lnZapFallback')) + : null, z.status === 'wrongnet' ? h('div', { class: 'notice err' }, t('arkGiftWrongNet', { net: z.net })) : null, z.status === 'ready' ? h('div', { class: 'col gap6' }, |
