"use client"; import Link from "next/link"; import { useMemo, useState } from "react"; import ThemedLayout from "@/components/layouts/ThemedLayout"; import { isMerchantBtcConfigured, getMerchantBtcAddress } from "@/lib/merchantBtc"; type Coin = "BTC" | "ETH" | "XMR"; function getAddresses() { return { BTC: (process.env.NEXT_PUBLIC_MERCHANT_BTC_ADDRESS || "").trim() || "bc1q — set NEXT_PUBLIC_MERCHANT_BTC_ADDRESS", ETH: (process.env.NEXT_PUBLIC_ETH_ADDRESS || "").trim() || "0x — set NEXT_PUBLIC_ETH_ADDRESS", XMR: (process.env.NEXT_PUBLIC_XMR_ADDRESS || "").trim() || "4A — set NEXT_PUBLIC_XMR_ADDRESS", }; } export default function SupportPage() { const [copied, setCopied] = useState>({ BTC: false, ETH: false, XMR: false }); const btcReady = isMerchantBtcConfigured(); const btcAddr = getMerchantBtcAddress(); const addresses = useMemo(() => getAddresses(), []); const copy = async (coin: Coin) => { const addr = coin === "BTC" && btcReady ? btcAddr : addresses[coin]; try { await navigator.clipboard.writeText(addr); setCopied((p) => ({ ...p, [coin]: true })); window.setTimeout(() => setCopied((p) => ({ ...p, [coin]: false })), 1800); } catch { // ignore } }; const displayAddr = (coin: Coin) => coin === "BTC" && btcReady ? btcAddr : addresses[coin]; const configured = { BTC: btcReady, ETH: Boolean((process.env.NEXT_PUBLIC_ETH_ADDRESS || "").trim()), XMR: Boolean((process.env.NEXT_PUBLIC_XMR_ADDRESS || "").trim()), }; return (
optional ritual

THE OFFERING

If this operation kept you online, throw fuel on the fire. Infrastructure and onion mirrors cost time and hardware.

Transparent tip jar — choose your asset and amount. No paywalls, no pressure, no analytics. To configure addresses, set the corresponding env vars in{" "} .env.local and restart Next.

{(["BTC", "ETH", "XMR"] as Coin[]).map((coin) => { const addr = displayAddr(coin); const isConfigured = configured[coin]; return (
{coin}
{!isConfigured && ( Not configured )}
{isConfigured ? addr : ( Set{" "} NEXT_PUBLIC_{coin === "BTC" ? "MERCHANT_BTC" : coin}_ADDRESS {" "} in .env.local )}
); })}
What you're supporting
  • Onion mirror hosting and key backup infrastructure
  • More Vault unlocks, drops, and forum rings
  • More UI weirdness (the good kind)
  • The README staying accurate
Where to go next
Add funds → Market Forum Hub →
Confirm any BTC address against the signed message on the hub before sending. Same bytes, every time. If the address differs from a prior session, treat it as a compromise — do not proceed.
); }