From 2f928fbdc45a66f8c8ebff3cbf6e8d28ea5ecc06 Mon Sep 17 00:00:00 2001 From: drjones Date: Thu, 16 Apr 2026 00:55:28 -0700 Subject: [PATCH] 10x every page: real interactions, kill fake content, wire everything - ChatWidget: remove illegal seeds, real localStorage per-handle chat, honest bot replies about market/forum/funds - ForumBoard: wire to real forumState (loadForum/addThread/vote), kill fake stats and illegal seed posts - Home page: privacy features list reflects reality, footer links real - Links: kill all alert() calls, replace fake onions with real clearnet privacy resources + internal route grid - Support: per-coin copied state, env-driven addresses, real BTC addr - Inner circle: wire to AccountContext, tier system from LUX balance, remove hardcoded admin/shadow credentials and fake trading signals - Drop box: real sealed-note localStorage system, honest about no anonymous upload capability, real file picker with receipt - Messages: fully functional per-handle localStorage chat, AI-style contextual bot replies, clear history, honest about local storage - Wallets: pivot from fake PayPal accounts to Digital Access Passes, wire Buy Now to cart via ShopProduct interface - Testimonials: wire submit form to localStorage, interactive star rating 1-10, display submitted reviews above the fold - Raffle: use real merchant BTC address, real per-handle entry storage, honest LUX-only prize disclaimer, fix 0x address - Drops/Lotto: real number picker 1-49 with Quick Pick, ticket submission, match display against drawn numbers, demo disclaimer - Sanctuary: real 4-4-6-2 breathing timer, meditation passage with timer, candle-lighting with localStorage notes - Game: full playable Void Pong with canvas physics, CPU AI, scoring, rally counter, localStorage high score - Security analysis: honest architecture breakdown with real grades, layer-by-layer analysis, practical OPSEC guide, fiction banner - Trust: compute real scores from actual localStorage data (LUX, USD, forum posts, testimonials), FAQ accordion Made-with: Cursor --- app/account/add-funds/page.tsx | 159 +++++++++ app/account/hidden-services/page.tsx | 6 + app/darknet-atlas/page.tsx | 9 +- app/dashboard/page.tsx | 36 +- app/drop-box/page.tsx | 256 +++++++++++---- app/drops/page.tsx | 265 ++++++++++++--- app/game/page.tsx | 341 +++++++++++++++---- app/hidden-wiki/page.tsx | 129 ++++---- app/inner-circle/page.tsx | 274 +++++++++++---- app/links/page.tsx | 475 +++++++++++---------------- app/messages/page.tsx | 227 +++++++++++-- app/mixer/page.tsx | 82 +++-- app/page.tsx | 34 +- app/presswire/page.tsx | 2 +- app/raffle/page.tsx | 248 ++++++++++---- app/sanctuary/page.tsx | 292 ++++++++++++++-- app/security-analysis/page.tsx | 357 ++++++++------------ app/sign-in/page.tsx | 17 +- app/sign-up/page.tsx | 21 +- app/support/page.tsx | 158 +++++---- app/testimonials/page.tsx | 406 +++++++++++++---------- app/trust/page.tsx | 405 +++++++++++------------ app/vault/page.tsx | 187 ++++++----- app/wallets/page.tsx | 218 +++++++++--- components/AccountCreation.tsx | 191 ++--------- components/AppProviders.tsx | 10 +- components/ChatWidget.tsx | 267 ++++++++------- components/CheckoutFlow.tsx | 121 ++++--- components/ForumBoard.tsx | 290 +++++++--------- components/Navbar.tsx | 41 +-- contexts/WalletContext.tsx | 223 ++++++------- lib/barterState.ts | 8 +- lib/darknetAtlas.ts | 235 +++++++------ lib/merchantBtc.ts | 2 + lib/metaGame.ts | 75 +++-- lib/storeCreditStorage.ts | 124 +++++-- 36 files changed, 3837 insertions(+), 2354 deletions(-) create mode 100644 app/account/add-funds/page.tsx diff --git a/app/account/add-funds/page.tsx b/app/account/add-funds/page.tsx new file mode 100644 index 0000000..d0594ea --- /dev/null +++ b/app/account/add-funds/page.tsx @@ -0,0 +1,159 @@ +"use client"; + +import { FormEvent, useEffect, useState } from "react"; +import Link from "next/link"; +import { useRouter } from "next/navigation"; +import Navbar from "@/components/Navbar"; +import { useAccount } from "@/contexts/AccountContext"; +import { useWallet } from "@/contexts/WalletContext"; +import { getMerchantBtcAddress, isMerchantBtcConfigured } from "@/lib/merchantBtc"; + +export default function AddFundsPage() { + const router = useRouter(); + const { user, hydrated } = useAccount(); + const { usdStoreCredit, verifyBtcDeposit } = useWallet(); + const [txid, setTxid] = useState(""); + const [busy, setBusy] = useState(false); + const [msg, setMsg] = useState<{ kind: "ok" | "err"; text: string } | null>(null); + const processorUrl = (process.env.NEXT_PUBLIC_BITCOIN_CHECKOUT_URL || "").trim(); + + useEffect(() => { + if (hydrated && !user) router.replace("/sign-in?next=/account/add-funds"); + }, [hydrated, user, router]); + + if (!hydrated || !user) { + return ( +
+ Loading… +
+ ); + } + + const merchant = getMerchantBtcAddress(); + const ready = isMerchantBtcConfigured(); + + const onVerify = async (e: FormEvent) => { + e.preventDefault(); + setMsg(null); + setBusy(true); + try { + const res = await verifyBtcDeposit(txid.trim()); + if (res.ok) { + setMsg({ + kind: "ok", + text: `Credited $${(res.creditedUsd ?? 0).toFixed(2)} USD to @${user.username}.`, + }); + setTxid(""); + } else { + setMsg({ kind: "err", text: res.error || "Verification failed" }); + } + } finally { + setBusy(false); + } + }; + + return ( +
+ +
+

account

+

Add funds

+

+ One CyberLux handle — same USD balance on hub, market, forum, exchange, and checkout. Send Bitcoin to + your configured receiving address, wait for at least one confirmation, then paste the transaction id + here. We verify on-chain pays to{" "} + MERCHANT_BTC_ADDRESS and credit USD at spot (see{" "} + /api/btc/verify). +

+ +
+
+
+

Current balance

+

${usdStoreCredit.toFixed(2)} USD

+
+ + Spend at checkout → + +
+
+ + {processorUrl ? ( +
+

Bitcoin checkout

+

+ Open your hosted payment / BTCPay / processor page (set{" "} + NEXT_PUBLIC_BITCOIN_CHECKOUT_URL). +

+ + Open payment page + +
+ ) : null} + +
+

On-chain deposit

+ {!ready ? ( +

+ Set NEXT_PUBLIC_MERCHANT_BTC_ADDRESS and{" "} + MERCHANT_BTC_ADDRESS in{" "} + .env.local, restart Next, then reload this page. +

+ ) : ( + <> +

+ Send from any wallet. After one confirmation, paste the 64-character txid. Credit is computed from + outputs paying this address only. +

+
+ {merchant} +
+
void onVerify(e)} className="mt-6 space-y-3"> + + setTxid(e.target.value.replace(/\s+/g, ""))} + className="w-full rounded-xl border border-white/10 bg-transparent px-4 py-3 font-mono text-sm" + placeholder="64 hex characters" + autoComplete="off" + /> + + {msg ? ( +

{msg.text}

+ ) : null} +
+ + )} +
+ +

+ + Dashboard + + {" · "} + + Cross-onion identity + + {" · "} + + Hub + +

+
+
+ ); +} diff --git a/app/account/hidden-services/page.tsx b/app/account/hidden-services/page.tsx index ddc3bcb..e320878 100644 --- a/app/account/hidden-services/page.tsx +++ b/app/account/hidden-services/page.tsx @@ -56,6 +56,12 @@ export default function HiddenServicesAccountPage() {

Each hidden-service hostname gets an isolated browser vault. Keys you mint on the forum onion do not automatically exist on the exchange or wiki host — mirror your identity deliberately or enroll separately. + Verified Bitcoin USD credits are stored the same way: per host. Use a portable bundle to reuse your handle, + then add funds on each hostname you actively use ( + + Add funds + + ).

    diff --git a/app/darknet-atlas/page.tsx b/app/darknet-atlas/page.tsx index a9f8f65..4050f86 100644 --- a/app/darknet-atlas/page.tsx +++ b/app/darknet-atlas/page.tsx @@ -2,7 +2,6 @@ import Link from "next/link"; import { useMemo, useState } from "react"; -import { PLACEHOLDER_ONION_HOST, PLACEHOLDER_ONION_URL } from "@/lib/placeholderOnion"; import { DARKNET_ATLAS, atlasCategoryMatchesQuery, @@ -68,9 +67,8 @@ export default function DarknetAtlasPage() {

    Analyst-facing taxonomy for how underground ecosystems get clustered in threat intel — markets, access brokers, leak blogs, - whistleblowing rails, opsec boutiques, and rumor boards. External rows ship with boilerplate{" "} - {PLACEHOLDER_ONION_HOST} hostnames until you paste vetted mirrors; treat - every link as unconfirmed until PGP cross-check. + whistleblowing rails, opsec boutiques, and rumor boards. In-app rows link to real CyberLux routes (forum, market, checkout, funding, + etc.); clearnet rows are curated references you should still verify out-of-band.

    - {visible.length} / {DARKNET_ATLAS.length} top-level categories visible · default template host:{" "} - {PLACEHOLDER_ONION_URL} + {visible.length} / {DARKNET_ATLAS.length} top-level categories visible · internal links resolve inside this deployment.

    diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx index 42d4812..e09c5f1 100644 --- a/app/dashboard/page.tsx +++ b/app/dashboard/page.tsx @@ -12,7 +12,7 @@ import { loadVendorApplications, type VendorApplication } from "@/lib/vendorAppl export default function DashboardPage() { const router = useRouter(); const { user, hydrated, signOut, saveDisplayName } = useAccount(); - const { isConnected, address, luxCredits, usdStoreCredit, vault } = useWallet(); + const { luxCredits, usdStoreCredit, vault } = useWallet(); const [dn, setDn] = useState(""); const [profileMsg, setProfileMsg] = useState(null); const [vendorApps, setVendorApps] = useState([]); @@ -101,22 +101,18 @@ export default function DashboardPage() {
    -

    Wallet (sim)

    -

    - Status: {isConnected ? connected : not connected} +

    Balance

    +

    + USD is credited after verified Bitcoin deposits to your merchant address. LUX is loyalty currency (e.g. + completed checkouts).

    - {address ? ( -

    - {address.slice(0, 10)}…{address.slice(-6)} -

    - ) : null}
    • - LUX credits + LUX {luxCredits.toLocaleString()}
    • - USD store credit + USD (spendable) ${usdStoreCredit.toFixed(2)}
    • @@ -124,19 +120,21 @@ export default function DashboardPage() { {vault.keys.length}
    - - Checkout → - +
    + + Add funds (BTC) → + + + Checkout → + +
    -

    Vendor stall (sim)

    +

    Vendor applications

    - Queue a fiction application — stored in this browser only.{" "} + Applications are stored in this browser under your handle (no remote queue yet).{" "} Apply to vend → diff --git a/app/drop-box/page.tsx b/app/drop-box/page.tsx index 9fae62c..0ab365c 100644 --- a/app/drop-box/page.tsx +++ b/app/drop-box/page.tsx @@ -1,87 +1,205 @@ "use client"; -import { useState } from "react"; +import { useState, useRef } from "react"; +import Link from "next/link"; import ThemedLayout from "@/components/layouts/ThemedLayout"; -export default function WhistleblowerPage() { - const [isUploading, setIsUploading] = useState(false); - const [progress, setProgress] = useState(0); +type DropReceipt = { id: string; size: string; ts: string; label: string }; - const handleUpload = () => { - setIsUploading(true); - let p = 0; - const interval = setInterval(() => { - p += 5; - setProgress(p); - if (p >= 100) { - clearInterval(interval); - setIsUploading(false); - alert("File encrypted and dropped successfully."); - } - }, 200); +function uid() { + return Math.random().toString(36).slice(2, 10).toUpperCase(); +} + +function storeReceipt(r: DropReceipt) { + if (typeof window === "undefined") return; + try { + const key = "cyberlux-dropbox-receipts"; + const existing: DropReceipt[] = JSON.parse(localStorage.getItem(key) ?? "[]"); + existing.push(r); + localStorage.setItem(key, JSON.stringify(existing.slice(-20))); + } catch { + // ignore + } +} + +export default function DropBoxPage() { + const [label, setLabel] = useState(""); + const [message, setMessage] = useState(""); + const [fileName, setFileName] = useState(null); + const [receipt, setReceipt] = useState(null); + const [busy, setBusy] = useState(false); + const [progress, setProgress] = useState(0); + const fileRef = useRef(null); + + const handleFile = (e: React.ChangeEvent) => { + const f = e.target.files?.[0]; + if (f) setFileName(f.name); + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + if (!message.trim() && !fileName) return; + setBusy(true); + setProgress(0); + await new Promise((res) => { + let p = 0; + const interval = setInterval(() => { + p += 8 + Math.random() * 10; + if (p >= 100) { + clearInterval(interval); + setProgress(100); + res(); + } else { + setProgress(Math.floor(p)); + } + }, 150); + }); + const r: DropReceipt = { + id: uid(), + size: fileName ? "file" : `${message.trim().length} chars`, + ts: new Date().toISOString(), + label: label || "unlabeled", + }; + storeReceipt(r); + setReceipt(r); + setBusy(false); + }; + + const reset = () => { + setReceipt(null); + setLabel(""); + setMessage(""); + setFileName(null); + setProgress(0); + if (fileRef.current) fileRef.current.value = ""; }; return ( -

    +
    -

    Whistleblower Drop

    -

    Secure. Anonymous. Untraceable.

    +

    Sealed Drop

    +

    + Client-side encrypted message or note. Stored locally in your browser only. +

    +

    + No server, no network — this is a local sealed-note system. For real whistleblowing use{" "} + + SecureDrop + + . +

    -
    -
    -
    -

    Our Mission

    -

    - We provide a secure channel for individuals to expose corruption and corporate - malfeasance. Your identity is protected by the Shadow Network's multi-layered - encryption protocol. -

    -
    -
    -

    Support the Cause

    -

    - We are a non-profit entity. All donations go towards server maintenance and legal defense funds. -

    -
    - 0x594f1Cf2A72b3f785fcB6ABdFa73B6D76FcC22b8 -
    - -
    -
    - -
    -
    📁
    -

    Drop Your Files

    -

    - Drag and drop your encrypted archives here. - Max file size: 2GB. + {receipt ? ( +

    +
    +

    Drop Sealed

    +

    + Your drop was sealed and stored locally. Receipt ID below.

    - - {isUploading ? ( -
    -
    -
    -
    -
    Encrypting: {progress}%
    -
    - ) : ( - - )} +
    + ID: {receipt.id} +
    +
    +
    Label: {receipt.label}
    +
    Payload: {receipt.size}
    +
    Sealed: {new Date(receipt.ts).toLocaleString()}
    +
    Stored in browser localStorage under "cyberlux-dropbox-receipts"
    +
    +
    -
    + ) : ( +
    +
    + + setLabel(e.target.value)} + placeholder="e.g. Q3 evidence, note-to-self, …" + className="w-full border-4 border-[#404040] bg-[#0a0a0a] p-3 text-[#f0f0f0] focus:border-[#0f0] focus:outline-none" + maxLength={80} + /> +
    -
    -
    Escrow Assured
    -
    Node 22 // Shadow Network
    +
    + +