From 38660e024c055952180bfa3f9067274cf2e0d6ed Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Thu, 21 Nov 2024 16:31:25 -0800 Subject: ecash requests --- bun.lockb | Bin 184530 -> 186623 bytes package.json | 1 + src/lib/nostr.ts | 3 +- src/lib/parse.ts | 29 +++--- src/routes/(app)/ecash/mint/+server.ts | 7 ++ .../(app)/send/ecash/[request]/+page.server.ts | 16 +++ src/routes/(app)/send/ecash/[request]/+page.svelte | 107 +++++++++++++++++++++ 7 files changed, 147 insertions(+), 16 deletions(-) create mode 100644 src/routes/(app)/ecash/mint/+server.ts create mode 100644 src/routes/(app)/send/ecash/[request]/+page.server.ts create mode 100644 src/routes/(app)/send/ecash/[request]/+page.svelte diff --git a/bun.lockb b/bun.lockb index da7f8c2c..f42f489d 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 20ae4021..f152b00f 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "@capacitor/cli": "^6.0.0", "@capacitor/core": "^6.0.0", "@capacitor/ios": "^6.1.2", + "@cashu/cashu-ts": "^1.2.1", "@iconify/iconify": "^3.1.1", "@scure/base": "^1.1.8", "@scure/bip39": "^1.2.1", diff --git a/src/lib/nostr.ts b/src/lib/nostr.ts index 2e3ea142..bba46ef4 100644 --- a/src/lib/nostr.ts +++ b/src/lib/nostr.ts @@ -140,7 +140,8 @@ type SignParams = { }; export const sign = async ({ event, user }: SignParams) => { - event = finalizeEvent(event, await getPrivateKey(user)); + const sk = await getPrivateKey(user); + event = finalizeEvent(event, sk); }; export const send = (event: EventTemplate) => { diff --git a/src/lib/parse.ts b/src/lib/parse.ts index e4bd3497..03d21943 100644 --- a/src/lib/parse.ts +++ b/src/lib/parse.ts @@ -1,26 +1,17 @@ import { PUBLIC_DOMAIN } from "$env/static/public"; -import { get, sats, isLiquid, post } from "$lib/utils"; +import { get, isLiquid, auth, post, sats } from "$lib/utils"; import { redirect } from "@sveltejs/kit"; import bip21 from "bip21"; import { validate } from "bitcoin-address-validation"; export default async (s, host) => { if (!s) return; - let t = s; - - if (t.includes("lightning=")) { - const url = new URL(t); - const params = new URLSearchParams(url.search); - t = params.get("lightning"); - } - - if (t.startsWith("http")) redirect(307, t); - if (t.startsWith(host)) redirect(307, `http://${t}`); - + let t = s.trim(); let amount; let user; - t = t.trim(); + if (t.startsWith("http")) redirect(307, t); + if (t.startsWith(host)) redirect(307, `http://${t}`); if (t.startsWith("lightning:")) t = t.replace("lightning:", ""); if (t.endsWith(`@${PUBLIC_DOMAIN}`)) t = t.split("@")[0]; @@ -30,8 +21,6 @@ export default async (s, host) => { } catch (e) {} } - if (t.includes("/fund")) redirect(307, t.substring(t.indexOf("/fund"))); - // lightning if (t.toLowerCase().startsWith("lightning:")) t = t.toLowerCase().replace("lightning:", ""); @@ -44,6 +33,12 @@ export default async (s, host) => { redirect(307, `/send/lightning/${t}`); } + if (t.includes("lightning=")) { + const url = new URL(t); + const params = new URLSearchParams(url.search); + t = params.get("lightning"); + } + if (t.toLowerCase().startsWith("ln")) { try { await get(`/invoice/${t}`); @@ -70,6 +65,8 @@ export default async (s, host) => { redirect(307, `/ecash/${id}`); } + if (t.startsWith("creq")) redirect(307, `/send/ecash/${t}`); + // user try { user = await get(`/users/${t.split("/")[0]}`); @@ -79,6 +76,8 @@ export default async (s, host) => { if (user) redirect(307, `/pay/${t}`); let fund; + if (t.includes("/fund")) redirect(307, t.substring(t.indexOf("/fund"))); + try { fund = await get(`/fund/${t}`); } catch (e) {} diff --git a/src/routes/(app)/ecash/mint/+server.ts b/src/routes/(app)/ecash/mint/+server.ts new file mode 100644 index 00000000..02170650 --- /dev/null +++ b/src/routes/(app)/ecash/mint/+server.ts @@ -0,0 +1,7 @@ +import { auth, post } from "$lib/utils"; +import { json } from "@sveltejs/kit"; + +export async function POST({ cookies, request }) { + const result = await post("/mint", await request.json(), auth(cookies)); + return json(result); +} diff --git a/src/routes/(app)/send/ecash/[request]/+page.server.ts b/src/routes/(app)/send/ecash/[request]/+page.server.ts new file mode 100644 index 00000000..53a5e013 --- /dev/null +++ b/src/routes/(app)/send/ecash/[request]/+page.server.ts @@ -0,0 +1,16 @@ +import { auth, fd, get, post } from "$lib/utils"; +import { decodePaymentRequest } from "@cashu/cashu-ts"; +import { fail, redirect } from "@sveltejs/kit"; + +export async function load({ params }) { + const req = { ...decodePaymentRequest(params.request) }; + const { target } = req.transport[0]; + const recipient = await get(`/profile/${target}`); + return { req, recipient }; +} + +export const actions = { + setAmount: async ({ request }) => { + return await fd(request); + }, +}; diff --git a/src/routes/(app)/send/ecash/[request]/+page.svelte b/src/routes/(app)/send/ecash/[request]/+page.svelte new file mode 100644 index 00000000..7f2ac7ba --- /dev/null +++ b/src/routes/(app)/send/ecash/[request]/+page.svelte @@ -0,0 +1,107 @@ + + +
+ {#if amount} + {#if form?.message} +
+ {$t(form.message)} +
+ {/if} + +
+

+ {$t("payments.send")} +

+ + +
+ +
+ {$t("payments.to")} + {recipient.name} +
+ +
+ + + + +
+ {:else} +
+ + + + + + + {/if} +
-- cgit v1.2.3