From 5bd8de0b2b0866c1229bb746d0a5a0cdd7a6b519 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Sat, 5 Nov 2022 13:03:47 -0700 Subject: handle bip21 qr codes --- src/components/Numpad.svelte | 7 +-- src/routes/(app)/qr/[text]/+page.server.js | 8 +++ src/routes/(app)/qr/[text]/+page.svelte | 7 +++ src/routes/(app)/scan/+page.svelte | 2 +- src/routes/(app)/send/[...text]/+page.server.js | 51 +++++++++++-------- .../(app)/send/bitcoin/[address]/+page.server.js | 16 ------ .../(app)/send/bitcoin/[address]/+page.svelte | 58 ---------------------- .../bitcoin/[address]/[...amount]/+page.server.js | 16 ++++++ .../bitcoin/[address]/[...amount]/+page.svelte | 58 ++++++++++++++++++++++ 9 files changed, 124 insertions(+), 99 deletions(-) create mode 100644 src/routes/(app)/qr/[text]/+page.server.js create mode 100644 src/routes/(app)/qr/[text]/+page.svelte delete mode 100644 src/routes/(app)/send/bitcoin/[address]/+page.server.js delete mode 100644 src/routes/(app)/send/bitcoin/[address]/+page.svelte create mode 100644 src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js create mode 100644 src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.svelte (limited to 'src') diff --git a/src/components/Numpad.svelte b/src/components/Numpad.svelte index 36fe9f67..4f7026a9 100644 --- a/src/components/Numpad.svelte +++ b/src/components/Numpad.svelte @@ -5,11 +5,12 @@ import { t } from '$lib/translations'; export let amount, - amountFiat = 0, currency, - fiat = true; + fiat = !amount; - let amountSats = 0; + export let amountFiat = amount * ($selectedRate / sats); + + let amountSats = amount; let loading = false; let symbol = diff --git a/src/routes/(app)/qr/[text]/+page.server.js b/src/routes/(app)/qr/[text]/+page.server.js new file mode 100644 index 00000000..9dd2b24d --- /dev/null +++ b/src/routes/(app)/qr/[text]/+page.server.js @@ -0,0 +1,8 @@ +import Qr from 'qrcode-base64'; + +export async function load({ params }) { + let { text } = params; + let src = Qr.drawImg(text, { size: 600 }); + + return { src }; +} diff --git a/src/routes/(app)/qr/[text]/+page.svelte b/src/routes/(app)/qr/[text]/+page.svelte new file mode 100644 index 00000000..555f919c --- /dev/null +++ b/src/routes/(app)/qr/[text]/+page.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/routes/(app)/scan/+page.svelte b/src/routes/(app)/scan/+page.svelte index 10c288dd..4e06e1b5 100644 --- a/src/routes/(app)/scan/+page.svelte +++ b/src/routes/(app)/scan/+page.svelte @@ -7,7 +7,7 @@ let scanner, vid; onMount(() => { - scanner = new QrScanner(vid, ({ data }) => goto(`/send/${data}`), { + scanner = new QrScanner(vid, ({ data }) => goto(`/send/${encodeURI(data)}`), { highlightScanRegion: true, highlightCodeOutline: true }); diff --git a/src/routes/(app)/send/[...text]/+page.server.js b/src/routes/(app)/send/[...text]/+page.server.js index 193e8cbd..283347de 100644 --- a/src/routes/(app)/send/[...text]/+page.server.js +++ b/src/routes/(app)/send/[...text]/+page.server.js @@ -5,20 +5,39 @@ import { invalid, redirect } from '@sveltejs/kit'; let parse = async (t, r) => { if (!t) return; - if (t.includes(':')) t = t.split(':')[1]; - console.log(t) - let user, uuid; + let amount, user, uuid; + + console.log(bip21.decode(t)) + t.startsWith('bitcoin:') && + ({ + address: t, + options: { amount } + } = bip21.decode(t)); + + // ln address + if (t.includes('@') && t.includes('.')) { + let [name, domain] = t.split('@'); + if (domain === r.host) t = name; + else { + try { + t = await get(`/encode?domain=${domain}&name=${name}`); + } catch (e) {} + } + } + + if (t.toLowerCase().startsWith('lnurl')) throw redirect(307, `/lnurl/${t}`); + if (t.includes(':')) t = t.split(':')[1]; // lightning if (t.startsWith('ln')) { try { ({ uuid } = await get(`/invoice/${t}`)); } catch (e) { - throw redirect(303, `/send/lightning/${t}`); + throw redirect(307, `/send/lightning/${t}`); } - if (uuid) throw redirect(303, `/send/${uuid}`); + if (uuid) throw redirect(307, `/send/${uuid}`); } // bitcoin @@ -26,31 +45,21 @@ let parse = async (t, r) => { try { ({ uuid } = await get(`/invoice/${t}`)); } catch (e) { - throw redirect(303, `/send/bitcoin/${t}`); + let r = `/send/bitcoin/${t}`; + if (amount) r += '/' + amount; + console.log("AM", amount) + throw redirect(307, r); } - if (uuid) throw redirect(303, `/send/${uuid}`); - } - - // ln address - if (t.includes('@') && t.includes('.')) { - let [name, domain] = t.split('@'); - if (domain === r.host) t = name; - else { - try { - t = await get(`/encode?domain=${domain}&name=${name}`); - } catch (e) {} - } + if (uuid) throw redirect(307, `/send/${uuid}`); } - if (t.toLowerCase().startsWith('lnurl')) throw redirect(307, `/lnurl/${t}`); - // user try { user = await get(`/users/${t}`); } catch (e) {} - if (user) throw redirect(303, `/send/user/${t}`); + if (user) throw redirect(307, `/send/user/${t}`); }; export async function load({ params, request }) { diff --git a/src/routes/(app)/send/bitcoin/[address]/+page.server.js b/src/routes/(app)/send/bitcoin/[address]/+page.server.js deleted file mode 100644 index 642593ab..00000000 --- a/src/routes/(app)/send/bitcoin/[address]/+page.server.js +++ /dev/null @@ -1,16 +0,0 @@ -import { invalid, redirect } from '@sveltejs/kit'; -import { auth, post } from '$lib/utils'; - -export const actions = { - default: async ({ cookies, request }) => { - try { - let { address, amount, pin } = Object.fromEntries(await request.formData()); - let { tx } = await post('/bitcoin/fee', { address, amount }, auth(cookies)); - await post('/bitcoin/send', { address, pin, tx }, auth(cookies)); - } catch (e) { - return invalid(400, { message: e.message }); - } - - throw redirect(307, '/sent'); - } -}; diff --git a/src/routes/(app)/send/bitcoin/[address]/+page.svelte b/src/routes/(app)/send/bitcoin/[address]/+page.svelte deleted file mode 100644 index 744bfe9d..00000000 --- a/src/routes/(app)/send/bitcoin/[address]/+page.svelte +++ /dev/null @@ -1,58 +0,0 @@ - - - - -{#if form?.message} -
- {form.message} -
-{/if} - -
-
-

Send to

-

{address}

-
- - -
- - - - -
- -
-
-
diff --git a/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js b/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js new file mode 100644 index 00000000..642593ab --- /dev/null +++ b/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js @@ -0,0 +1,16 @@ +import { invalid, redirect } from '@sveltejs/kit'; +import { auth, post } from '$lib/utils'; + +export const actions = { + default: async ({ cookies, request }) => { + try { + let { address, amount, pin } = Object.fromEntries(await request.formData()); + let { tx } = await post('/bitcoin/fee', { address, amount }, auth(cookies)); + await post('/bitcoin/send', { address, pin, tx }, auth(cookies)); + } catch (e) { + return invalid(400, { message: e.message }); + } + + throw redirect(307, '/sent'); + } +}; diff --git a/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.svelte b/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.svelte new file mode 100644 index 00000000..a9382eb7 --- /dev/null +++ b/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.svelte @@ -0,0 +1,58 @@ + + + + +{#if form?.message} +
+ {form.message} +
+{/if} + +
+
+

Send to

+

{address}

+
+ + +
+ + + + +
+ +
+
+
-- cgit v1.2.3