From c8b250bc216b190e913fab27d599b40518d7e748 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Tue, 24 Jan 2023 09:53:40 -0800 Subject: lnurl pay --- src/lib/utils.js | 9 +----- src/routes/(app)/+layout.server.js | 4 ++- .../[username]/payments/[...page]/+page.svelte | 2 +- src/routes/(app)/ln/[lnurl]/+page.server.js | 27 ++++++++++------ src/routes/(app)/ln/[lnurl]/+page.svelte | 15 +++++++-- src/routes/(app)/payment/[id]/+page.svelte | 4 +-- src/routes/(app)/send/[...text]/+page.server.js | 15 ++++----- .../bitcoin/[address]/[...amount]/+page.server.js | 8 +++-- .../(app)/send/lightning/[payreq]/+page.server.js | 2 +- .../(app)/send/lightning/[payreq]/+page.svelte | 36 ++++++++++++++-------- 10 files changed, 73 insertions(+), 49 deletions(-) diff --git a/src/lib/utils.js b/src/lib/utils.js index f2d78ee8..179aecc6 100644 --- a/src/lib/utils.js +++ b/src/lib/utils.js @@ -82,14 +82,7 @@ export function reverseFormat(val, locale) { return Number.isNaN(reversedVal) ? 0 : +reversedVal; } -export let protectedRoutes = [ - /customers/, - /dashboard/, - /settings/, - /payments/, - /\/ln\//, - /request/ -]; +export let protectedRoutes = [/customers/, /dashboard/, /settings/, /payments/, /request/]; export const success = (m) => { toast.pop(); diff --git a/src/routes/(app)/+layout.server.js b/src/routes/(app)/+layout.server.js index 63a01df6..0b76c973 100644 --- a/src/routes/(app)/+layout.server.js +++ b/src/routes/(app)/+layout.server.js @@ -15,8 +15,10 @@ export async function load({ cookies, request, url, params }) { } catch (e) {} } - if (user && ['/', '/login', '/register'].includes(pathname) && request.method === 'GET') + if (user && ['/', '/login', '/register'].includes(pathname) && request.method === 'GET') { + console.log('dashboarding', pathname); throw redirect(307, `/${user.username}/dashboard`); + } if ( protectedRoutes.find((p) => pathname.match(p)) && diff --git a/src/routes/(app)/[username]/payments/[...page]/+page.svelte b/src/routes/(app)/[username]/payments/[...page]/+page.svelte index e28ade67..620aec84 100644 --- a/src/routes/(app)/[username]/payments/[...page]/+page.svelte +++ b/src/routes/(app)/[username]/payments/[...page]/+page.svelte @@ -112,7 +112,7 @@
{#each $payments as p} - +
diff --git a/src/routes/(app)/ln/[lnurl]/+page.server.js b/src/routes/(app)/ln/[lnurl]/+page.server.js index bb731e84..ded2e58c 100644 --- a/src/routes/(app)/ln/[lnurl]/+page.server.js +++ b/src/routes/(app)/ln/[lnurl]/+page.server.js @@ -1,23 +1,30 @@ import { auth, get, post } from '$lib/utils'; -import { error, redirect } from '@sveltejs/kit'; +import { error, invalid, redirect } from '@sveltejs/kit'; export async function load({ params }) { try { let { lnurl } = params; - lnurl = await get(`/decode?text=${lnurl}`); - if (lnurl.tag !== 'payRequest') throw error(500, 'We can only handle lnurl pay requests'); - - return lnurl; + let data = await get(`/decode?text=${lnurl}`); + if (data.tag !== 'payRequest') throw error(500, 'We can only handle lnurl pay requests'); + return data; } catch (e) { throw error(500, e.message); } } export const actions = { - default: async ({ cookies, request }) => { - let { callback, ...form } = Object.fromEntries(await request.formData()); - form.params = { callback }; - await post('/pay', form, auth(cookies)); - throw redirect(307, '/sent'); + default: async ({ cookies, fetch, request }) => { + let error; + + let { callback, amount, minSendable, maxSendable } = Object.fromEntries( + await request.formData() + ); + + if (amount < minSendable) error = `Amount must be at least ${minSendable} sats`; + if (amount > maxSendable) error = `Amount must be at most ${maxSendable} sats`; + if (error) return invalid(400, { error }); + + let { pr } = await fetch(`${callback}?amount=${amount}`).then((r) => r.json()); + throw redirect(307, `/send/lightning/${pr}`); } }; diff --git a/src/routes/(app)/ln/[lnurl]/+page.svelte b/src/routes/(app)/ln/[lnurl]/+page.svelte index 15edeaef..297ac35a 100644 --- a/src/routes/(app)/ln/[lnurl]/+page.svelte +++ b/src/routes/(app)/ln/[lnurl]/+page.svelte @@ -4,10 +4,12 @@ import { Numpad, Spinner } from '$comp'; import { pin } from '$lib/store'; - export let data; + export let data, form; let { currency } = data.user; let { minSendable, maxSendable, callback, metadata } = data; - let amount, loading; + + let amount = minSendable, + loading; let submit = () => (loading = true); @@ -24,10 +26,19 @@
{/each}
+ + {#if form?.error} +
+ {form.error} +
+ {/if} +
+ + diff --git a/src/routes/(app)/payment/[id]/+page.svelte b/src/routes/(app)/payment/[id]/+page.svelte index 9c0afaac..5a604d99 100644 --- a/src/routes/(app)/payment/[id]/+page.svelte +++ b/src/routes/(app)/payment/[id]/+page.svelte @@ -8,7 +8,7 @@ export let data; let { user, tx } = data; let { username } = user; - let { id, amount, hash, created, rate, type, preimage, fee, currency } = tx; + let { id, amount, hash, created, rate, type, ref, fee, currency } = tx; fee = fee || 0; let fiat = (Math.abs(amount) * rate) / sats; @@ -43,7 +43,7 @@
{$t('payments.preimage')}
- {preimage} + {ref}
{:else} diff --git a/src/routes/(app)/send/[...text]/+page.server.js b/src/routes/(app)/send/[...text]/+page.server.js index f0c8b892..3cc9f73d 100644 --- a/src/routes/(app)/send/[...text]/+page.server.js +++ b/src/routes/(app)/send/[...text]/+page.server.js @@ -15,20 +15,17 @@ let parse = async (t, host) => { options: { amount } } = bip21.decode(t)); - // ln address if (t.includes('@') && t.includes('.')) { - let [name, domain] = t.split('@'); - if (domain === host) t = name; - else { - try { - t = await get(`/encode?domain=${domain}&name=${name}`); - } catch (e) {} - } + try { + t = await get(`/encode?address=${t}`); + } catch (e) {} } - if (t.includes('/voucher')) throw redirect(307, t.substring(t.indexOf('/voucher'))); + if (t.includes('/pot')) throw redirect(307, t.substring(t.indexOf('/pot'))); + console.log('LNURL?'); if (t.toLowerCase().startsWith('lnurl')) throw redirect(307, `/ln/${t}`); + console.log('NOPE'); if (t.includes(':')) t = t.split(':')[1]; // lightning diff --git a/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js b/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js index 066043e7..901d90a8 100644 --- a/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js +++ b/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js @@ -4,9 +4,13 @@ import { auth, post } from '$lib/utils'; export const actions = { default: async ({ cookies, request }) => { try { - let feeRate, subtract; + let feeRate, subtract; let { address, amount, pin } = Object.fromEntries(await request.formData()); - let { tx } = await post('/bitcoin/fee', { address, amount, feeRate, subtract }, auth(cookies)); + let { tx } = await post( + '/bitcoin/fee', + { address, amount, feeRate, subtract }, + auth(cookies) + ); await post('/bitcoin/send', { pin, tx }, auth(cookies)); } catch (e) { return invalid(400, { message: e.message }); diff --git a/src/routes/(app)/send/lightning/[payreq]/+page.server.js b/src/routes/(app)/send/lightning/[payreq]/+page.server.js index a72e1c07..def7651c 100644 --- a/src/routes/(app)/send/lightning/[payreq]/+page.server.js +++ b/src/routes/(app)/send/lightning/[payreq]/+page.server.js @@ -15,7 +15,7 @@ export const actions = { let body = Object.fromEntries(await request.formData()); let { amount, confirmed } = body; - console.log("AMOUNT", amount); + console.log('AMOUNT', amount); if (!confirmed) { return invalid(403, { amount, confirm: true }); diff --git a/src/routes/(app)/send/lightning/[payreq]/+page.svelte b/src/routes/(app)/send/lightning/[payreq]/+page.svelte index 76ab432f..a88a0aec 100644 --- a/src/routes/(app)/send/lightning/[payreq]/+page.svelte +++ b/src/routes/(app)/send/lightning/[payreq]/+page.svelte @@ -24,6 +24,9 @@ if (form?.message?.includes('pin')) $pin = undefined; loading = false; }; + + let show; + let toggle = () => (show = !show);
+ + {#if show} +
+ + + +
+ ⚡️ +
+
+ {:else} +
+ +
+ {/if} {:else}
-- cgit v1.2.3