From d242a387279119cfc6e191eff3b4e2228cbb5a4e Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Sat, 14 Feb 2026 00:09:15 -0800 Subject: handle forwards --- .../bitcoin/[address]/[amount]/[...feeRate]/+page.server.ts | 12 ++++++++++++ .../bitcoin/[address]/[amount]/[...feeRate]/+page.svelte | 11 +++++++++-- .../(app)/send/lightning/[payreq]/[...memo]/+page.server.ts | 9 +++++++++ .../(app)/send/lightning/[payreq]/[...memo]/+page.svelte | 2 +- 4 files changed, 31 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.server.ts b/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.server.ts index c5149a93..717b5a4c 100644 --- a/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.server.ts +++ b/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.server.ts @@ -8,6 +8,16 @@ export async function load({ params: { address, amount, feeRate }, cookies, pare const aid = cookies.get("aid") || user.id; const account = await get(`/account/${aid}`, auth(cookies)); + // Check if this is a forward (e.g. bitcoin vault paying a lightning invoice) + let forward: any = null; + try { + const inv = await get(`/invoice/${address}`); + if (inv?.forward?.startsWith("ln")) { + const parsed = await post("/parse", { payreq: inv.forward }, auth(cookies)); + forward = { alias: parsed.alias, payreq: inv.forward }; + } + } catch {} + if (account.type === "ark") { const serverArkAddress = await get("/ark/address"); return { @@ -16,6 +26,7 @@ export async function load({ params: { address, amount, feeRate }, cookies, pare address, rate: rates[user.currency], serverArkAddress, + forward, }; } @@ -38,6 +49,7 @@ export async function load({ params: { address, amount, feeRate }, cookies, pare subtract, hex, inputs, + forward, }; } catch (e) { const { message } = e as Error; diff --git a/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.svelte b/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.svelte index 10c46935..1ef38f02 100644 --- a/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.svelte +++ b/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.svelte @@ -124,7 +124,7 @@ let toggle = () => (submitting = !submitting); - let { account, amount, address, message, fee, fees, subtract, ourfee, hex, inputs } = + let { account, amount, address, message, fee, fees, subtract, ourfee, hex, inputs, forward } = $derived(data); let feeRate: any = $state(data.feeRate); @@ -166,7 +166,14 @@
{form?.message || message || error}
{:else} -
{address}
+ {#if forward} +
+ {$t("payments.to")} + {forward.alias} +
+ {:else} +
{address}
+ {/if} diff --git a/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.server.ts b/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.server.ts index de123e2e..c0b5c475 100644 --- a/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.server.ts +++ b/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.server.ts @@ -19,6 +19,15 @@ export async function load({ cookies, params, parent }) { data.account = account; data.serverArkAddress = await get("/ark/address"); } else if (account.type === "bitcoin") { + const amount = data.amount || parseInt(params.payreq.match(/amount=(\d+)/)?.[1] || "0"); + if (amount) { + const inv = await post( + "/invoice", + { invoice: { type: "bitcoin", amount, forward: params.payreq }, user }, + auth(cookies), + ); + redirect(307, `/send/bitcoin/${inv.hash}/${amount}`); + } data.account = account; } } diff --git a/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.svelte b/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.svelte index a204ca86..38407a0d 100644 --- a/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.svelte +++ b/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.svelte @@ -65,7 +65,7 @@ return; } - if (data.account?.seed) { + if (data.account?.type === "bitcoin") { cancel(); (async () => { -- cgit v1.2.3