diff --git a/public/Icon_only_cyan.png b/public/Icon_only_cyan.png new file mode 100644 index 00000000..87fa2ce1 Binary files /dev/null and b/public/Icon_only_cyan.png differ diff --git a/server/routes/api/faucet/[...path].ts b/server/routes/api/faucet/[...path].ts deleted file mode 100644 index 0f2b516d..00000000 --- a/server/routes/api/faucet/[...path].ts +++ /dev/null @@ -1,16 +0,0 @@ -const FAUCET_ORIGIN = "https://usdh.com"; - -export default defineEventHandler(async (event: any) => { - const url = getRequestURL(event); - const targetUrl = `${FAUCET_ORIGIN}${url.pathname}${url.search}`; - - const body = event.method !== "GET" ? await readBody(event) : undefined; - - const response = await fetch(targetUrl, { - method: event.method, - headers: { "Content-Type": "application/json" }, - body: body ? JSON.stringify(body) : undefined, - }); - - return response.json(); -}); diff --git a/src/components/trade/header/top-nav.tsx b/src/components/trade/header/top-nav.tsx index 06f00281..ad321333 100644 --- a/src/components/trade/header/top-nav.tsx +++ b/src/components/trade/header/top-nav.tsx @@ -1,6 +1,6 @@ import { t } from "@lingui/core/macro"; import { Trans } from "@lingui/react/macro"; -import { DownloadSimpleIcon, DropIcon, GearIcon, TerminalIcon, TrophyIcon } from "@phosphor-icons/react"; +import { DownloadSimpleIcon, DropIcon, GearIcon, TrophyIcon } from "@phosphor-icons/react"; import { Link } from "@tanstack/react-router"; import { useConnection } from "wagmi"; import { Button } from "@/components/ui/button"; @@ -55,12 +55,11 @@ export function TopNav() { >
-
- -
+ Hyperodd + Hyperodd - HyperOdd - Terminal + Hyperodd + Terminal
diff --git a/src/components/trade/tradebox/faucet-modal.tsx b/src/components/trade/tradebox/faucet-modal.tsx index 9baef7db..edef3caf 100644 --- a/src/components/trade/tradebox/faucet-modal.tsx +++ b/src/components/trade/tradebox/faucet-modal.tsx @@ -1,94 +1,36 @@ import { t } from "@lingui/core/macro"; import { Trans } from "@lingui/react/macro"; -import { Turnstile, type TurnstileInstance } from "@marsidev/react-turnstile"; import { CheckCircleIcon, ClockIcon, - CurrencyDollarIcon, DropIcon, SpinnerGapIcon, WalletIcon, WarningCircleIcon, } from "@phosphor-icons/react"; -import { useRef, useState } from "react"; +import { usePrivy } from "@privy-io/react-auth"; import { useConnection } from "wagmi"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { InfoRow } from "@/components/ui/info-row"; -import { cn } from "@/lib/cn"; import { useFaucetClaim } from "@/lib/faucet/use-faucet-claim"; import { useFaucetModalActions, useFaucetModalOpen } from "@/stores/use-global-modal-store"; -const TURNSTILE_SITE_KEY = import.meta.env.VITE_TURNSTILE_SITE_KEY; - -interface StepProps { - label: string; - active: boolean; - done: boolean; -} - -function Step({ label, active, done }: StepProps) { - return ( -
- {done ? ( - - ) : active ? ( - - ) : ( -
- )} - {label} -
- ); -} - -function ClaimProgress({ status }: { status: string }) { - const steps = [ - { key: "verifying-captcha", label: t`Verifying captcha` }, - { key: "verifying-balance", label: t`Checking balance` }, - { key: "claiming", label: t`Claiming USDH` }, - ]; - const activeIdx = steps.findIndex((s) => s.key === status); - - return ( -
- {steps.map((step, i) => ( - - ))} -
- ); -} - export function FaucetModal() { const open = useFaucetModalOpen(); const { close } = useFaucetModalActions(); const { address } = useConnection(); + const { authenticated, getAccessToken } = usePrivy(); const { status, error, result, claim, reset } = useFaucetClaim(); - const [turnstileToken, setTurnstileToken] = useState(null); - const turnstileRef = useRef(null); - - const isProcessing = status === "verifying-captcha" || status === "verifying-balance" || status === "claiming"; function handleClose() { reset(); - setTurnstileToken(null); close(); } function handleClaim() { - if (!turnstileToken || !address) return; - claim(turnstileToken, address); - } - - function handleRetry() { - reset(); - setTurnstileToken(null); - turnstileRef.current?.reset(); + if (!address) return; + claim(address, getAccessToken); } if (status === "success") { @@ -145,7 +87,7 @@ export function FaucetModal() { -
@@ -155,7 +97,7 @@ export function FaucetModal() { ); } - if (isProcessing) { + if (status === "claiming") { return ( {}}> @@ -171,7 +113,9 @@ export function FaucetModal() {
- +

+ Claiming USDH... +

@@ -214,20 +158,9 @@ export function FaucetModal() { Amount } - value="1,000 USDH" + value="50 USDH" valueClassName="font-medium" /> - - - Requirement - - } - value={t`$5+ USDC balance`} - /> -
- setTurnstileToken(null)} - onError={() => setTurnstileToken(null)} - /> -
- - )} diff --git a/src/domain/market/scope.ts b/src/domain/market/scope.ts index 7088f081..7cd2413c 100644 --- a/src/domain/market/scope.ts +++ b/src/domain/market/scope.ts @@ -3,7 +3,7 @@ export type ExchangeScope = "all" | "perp" | "spot" | "builders-perp"; export const EXCHANGE_SCOPES: ExchangeScope[] = ["all", "perp", "spot", "builders-perp"]; export const DEFAULT_SELECTED_MARKETS: Record = { - all: "BTC", + all: "VOLX-USDH", perp: "BTC", spot: "@107", // ETH/USDC "builders-perp": "xyz:SILVER", diff --git a/src/lib/faucet/use-faucet-claim.ts b/src/lib/faucet/use-faucet-claim.ts index e68a1322..84beb1c6 100644 --- a/src/lib/faucet/use-faucet-claim.ts +++ b/src/lib/faucet/use-faucet-claim.ts @@ -1,82 +1,58 @@ import { useState } from "react"; -type FaucetStatus = "idle" | "verifying-captcha" | "verifying-balance" | "claiming" | "success" | "error"; +const API_URL = import.meta.env.VITE_HYPERMILES_API_URL; + +type FaucetStatus = "idle" | "claiming" | "success" | "error"; interface FaucetResult { - amount: string; - txHash?: string; + amount: number; + walletAddress: string; } interface UseFaucetClaimReturn { status: FaucetStatus; error: string | null; result: FaucetResult | null; - claim: (turnstileToken: string, address: string) => Promise; + claim: (address: string, getAccessToken: () => Promise) => Promise; reset: () => void; } -async function postFaucet(path: string, body: Record): Promise { - const res = await fetch(`/api/faucet/${path}`, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(body), - }); - return res.json(); -} - export function useFaucetClaim(): UseFaucetClaimReturn { const [status, setStatus] = useState("idle"); const [error, setError] = useState(null); const [result, setResult] = useState(null); - async function claim(turnstileToken: string, address: string) { - setStatus("verifying-captcha"); + async function claim(address: string, getAccessToken: () => Promise) { + setStatus("claiming"); setError(null); setResult(null); try { - const turnstileData = await postFaucet<{ success: boolean; sessionToken?: string; error?: string }>( - "verify-turnstile", - { token: turnstileToken }, - ); - if (!turnstileData.success || !turnstileData.sessionToken) - throw new Error(turnstileData.error || "Captcha verification failed"); - const sessionToken = turnstileData.sessionToken; + const token = await getAccessToken(); + if (!token) throw new Error("Not authenticated"); - setStatus("verifying-balance"); - const balanceData = await postFaucet<{ - success: boolean; - hasMinimumBalance?: boolean; - totalBalance?: string; - required?: string; - error?: string; - }>("verify-balance", { address, sessionToken }); - if (!balanceData.success) throw new Error(balanceData.error || "Balance check failed"); - if (!balanceData.hasMinimumBalance) - throw new Error(`Insufficient balance: $${balanceData.totalBalance} (need $${balanceData.required})`); - - setStatus("claiming"); - const claimData = await postFaucet<{ - success: boolean; - amount?: string; - txHash?: string; - error?: string; - nextClaimTime?: number; - }>("claim", { - recipientAddress: address, - sessionToken, - authMethod: "wallet", - walletAddress: address, + const res = await fetch(`${API_URL}/faucet`, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify({ walletAddress: address }), }); - if (!claimData.success) { - if (claimData.nextClaimTime) { - const hours = Math.max(1, Math.ceil((claimData.nextClaimTime * 1000 - Date.now()) / (1000 * 60 * 60))); - throw new Error(`Cooldown active. Try again in ~${hours}h`); - } - throw new Error(claimData.error || "Claim failed"); + + if (!res.ok) { + const text = await res.text(); + let message = `Claim failed (${res.status})`; + try { + const data = JSON.parse(text); + if (data.error) message = data.error; + } catch {} + throw new Error(message); } - setResult({ amount: claimData.amount || "1,000", txHash: claimData.txHash }); + const data = await res.json(); + + setResult({ amount: data.amount, walletAddress: data.walletAddress }); setStatus("success"); } catch (err) { setError(err instanceof Error ? err.message : "Something went wrong"); diff --git a/src/locales/ar/messages.po b/src/locales/ar/messages.po index d2f874bd..220e5d07 100644 --- a/src/locales/ar/messages.po +++ b/src/locales/ar/messages.po @@ -18,8 +18,8 @@ msgid "% filled" msgstr "% مكتمل" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "$5+ USDC balance" -msgstr "" +#~ msgid "$5+ USDC balance" +#~ msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx msgid "24 hours" @@ -288,11 +288,15 @@ msgid "Chart" msgstr "الرسم البياني" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Checking balance" -msgstr "" +#~ msgid "Checking balance" +#~ msgstr "" + +#: src/components/trade/tradebox/faucet-modal.tsx +#~ msgid "Claim 1,000 USDH" +#~ msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Claim 1,000 USDH" +msgid "Claim 50 USDH" msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx @@ -300,7 +304,11 @@ msgid "Claim failed" msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Claiming USDH" +#~ msgid "Claiming USDH" +#~ msgstr "" + +#: src/components/trade/tradebox/faucet-modal.tsx +msgid "Claiming USDH..." msgstr "" #: src/components/trade/positions/position-actions-dropdown.tsx @@ -1478,8 +1486,8 @@ msgid "Remove from favorites" msgstr "إزالة من المفضلة" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Requirement" -msgstr "" +#~ msgid "Requirement" +#~ msgstr "" #: src/components/pages/builder-page.tsx #~ msgid "Requirements:" @@ -2169,8 +2177,8 @@ msgstr "" #~ msgstr "الخزائن" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Verifying captcha" -msgstr "" +#~ msgid "Verifying captcha" +#~ msgstr "" #: src/lib/trade/use-button-content.ts msgid "Verifying..." diff --git a/src/locales/en/messages.po b/src/locales/en/messages.po index 2cd22d77..aea725d5 100644 --- a/src/locales/en/messages.po +++ b/src/locales/en/messages.po @@ -18,8 +18,8 @@ msgid "% filled" msgstr "% filled" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "$5+ USDC balance" -msgstr "$5+ USDC balance" +#~ msgid "$5+ USDC balance" +#~ msgstr "$5+ USDC balance" #: src/components/trade/tradebox/faucet-modal.tsx msgid "24 hours" @@ -288,20 +288,28 @@ msgid "Chart" msgstr "Chart" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Checking balance" -msgstr "Checking balance" +#~ msgid "Checking balance" +#~ msgstr "Checking balance" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Claim 1,000 USDH" -msgstr "Claim 1,000 USDH" +#~ msgid "Claim 1,000 USDH" +#~ msgstr "Claim 1,000 USDH" + +#: src/components/trade/tradebox/faucet-modal.tsx +msgid "Claim 50 USDH" +msgstr "Claim 50 USDH" #: src/components/trade/tradebox/faucet-modal.tsx msgid "Claim failed" msgstr "Claim failed" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Claiming USDH" -msgstr "Claiming USDH" +#~ msgid "Claiming USDH" +#~ msgstr "Claiming USDH" + +#: src/components/trade/tradebox/faucet-modal.tsx +msgid "Claiming USDH..." +msgstr "Claiming USDH..." #: src/components/trade/positions/position-actions-dropdown.tsx #: src/components/trade/tradebox/points-modal.tsx @@ -1487,8 +1495,8 @@ msgid "Remove from favorites" msgstr "Remove from favorites" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Requirement" -msgstr "Requirement" +#~ msgid "Requirement" +#~ msgstr "Requirement" #: src/components/pages/builder-page.tsx #~ msgid "Requirements:" @@ -2182,8 +2190,8 @@ msgstr "USDH claimed!" #~ msgstr "Vaults" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Verifying captcha" -msgstr "Verifying captcha" +#~ msgid "Verifying captcha" +#~ msgstr "Verifying captcha" #: src/lib/trade/use-button-content.ts msgid "Verifying..." diff --git a/src/locales/es/messages.po b/src/locales/es/messages.po index f6d40671..471cc63c 100644 --- a/src/locales/es/messages.po +++ b/src/locales/es/messages.po @@ -18,8 +18,8 @@ msgid "% filled" msgstr "% ejecutado" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "$5+ USDC balance" -msgstr "" +#~ msgid "$5+ USDC balance" +#~ msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx msgid "24 hours" @@ -288,11 +288,15 @@ msgid "Chart" msgstr "Gráfico" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Checking balance" -msgstr "" +#~ msgid "Checking balance" +#~ msgstr "" + +#: src/components/trade/tradebox/faucet-modal.tsx +#~ msgid "Claim 1,000 USDH" +#~ msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Claim 1,000 USDH" +msgid "Claim 50 USDH" msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx @@ -300,7 +304,11 @@ msgid "Claim failed" msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Claiming USDH" +#~ msgid "Claiming USDH" +#~ msgstr "" + +#: src/components/trade/tradebox/faucet-modal.tsx +msgid "Claiming USDH..." msgstr "" #: src/components/trade/positions/position-actions-dropdown.tsx @@ -1478,8 +1486,8 @@ msgid "Remove from favorites" msgstr "Quitar de favoritos" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Requirement" -msgstr "" +#~ msgid "Requirement" +#~ msgstr "" #: src/components/pages/builder-page.tsx #~ msgid "Requirements:" @@ -2169,8 +2177,8 @@ msgstr "" #~ msgstr "Bóvedas" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Verifying captcha" -msgstr "" +#~ msgid "Verifying captcha" +#~ msgstr "" #: src/lib/trade/use-button-content.ts msgid "Verifying..." diff --git a/src/locales/fr/messages.po b/src/locales/fr/messages.po index 2a6a6b02..279043e8 100644 --- a/src/locales/fr/messages.po +++ b/src/locales/fr/messages.po @@ -18,8 +18,8 @@ msgid "% filled" msgstr "% exécuté" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "$5+ USDC balance" -msgstr "" +#~ msgid "$5+ USDC balance" +#~ msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx msgid "24 hours" @@ -288,11 +288,15 @@ msgid "Chart" msgstr "Graphique" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Checking balance" -msgstr "" +#~ msgid "Checking balance" +#~ msgstr "" + +#: src/components/trade/tradebox/faucet-modal.tsx +#~ msgid "Claim 1,000 USDH" +#~ msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Claim 1,000 USDH" +msgid "Claim 50 USDH" msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx @@ -300,7 +304,11 @@ msgid "Claim failed" msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Claiming USDH" +#~ msgid "Claiming USDH" +#~ msgstr "" + +#: src/components/trade/tradebox/faucet-modal.tsx +msgid "Claiming USDH..." msgstr "" #: src/components/trade/positions/position-actions-dropdown.tsx @@ -1478,8 +1486,8 @@ msgid "Remove from favorites" msgstr "Retirer des favoris" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Requirement" -msgstr "" +#~ msgid "Requirement" +#~ msgstr "" #: src/components/pages/builder-page.tsx #~ msgid "Requirements:" @@ -2169,8 +2177,8 @@ msgstr "" #~ msgstr "Coffres" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Verifying captcha" -msgstr "" +#~ msgid "Verifying captcha" +#~ msgstr "" #: src/lib/trade/use-button-content.ts msgid "Verifying..." diff --git a/src/locales/hi/messages.po b/src/locales/hi/messages.po index 723dbb9d..be6d790f 100644 --- a/src/locales/hi/messages.po +++ b/src/locales/hi/messages.po @@ -18,8 +18,8 @@ msgid "% filled" msgstr "% पूर्ण" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "$5+ USDC balance" -msgstr "" +#~ msgid "$5+ USDC balance" +#~ msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx msgid "24 hours" @@ -288,11 +288,15 @@ msgid "Chart" msgstr "चार्ट" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Checking balance" -msgstr "" +#~ msgid "Checking balance" +#~ msgstr "" + +#: src/components/trade/tradebox/faucet-modal.tsx +#~ msgid "Claim 1,000 USDH" +#~ msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Claim 1,000 USDH" +msgid "Claim 50 USDH" msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx @@ -300,7 +304,11 @@ msgid "Claim failed" msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Claiming USDH" +#~ msgid "Claiming USDH" +#~ msgstr "" + +#: src/components/trade/tradebox/faucet-modal.tsx +msgid "Claiming USDH..." msgstr "" #: src/components/trade/positions/position-actions-dropdown.tsx @@ -1478,8 +1486,8 @@ msgid "Remove from favorites" msgstr "पसंदीदा से हटाएं" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Requirement" -msgstr "" +#~ msgid "Requirement" +#~ msgstr "" #: src/components/pages/builder-page.tsx #~ msgid "Requirements:" @@ -2169,8 +2177,8 @@ msgstr "" #~ msgstr "वॉल्ट" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Verifying captcha" -msgstr "" +#~ msgid "Verifying captcha" +#~ msgstr "" #: src/lib/trade/use-button-content.ts msgid "Verifying..." diff --git a/src/locales/zh/messages.po b/src/locales/zh/messages.po index ff6ed273..9c8bfefc 100644 --- a/src/locales/zh/messages.po +++ b/src/locales/zh/messages.po @@ -18,8 +18,8 @@ msgid "% filled" msgstr "% 已成交" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "$5+ USDC balance" -msgstr "" +#~ msgid "$5+ USDC balance" +#~ msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx msgid "24 hours" @@ -288,11 +288,15 @@ msgid "Chart" msgstr "图表" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Checking balance" -msgstr "" +#~ msgid "Checking balance" +#~ msgstr "" + +#: src/components/trade/tradebox/faucet-modal.tsx +#~ msgid "Claim 1,000 USDH" +#~ msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Claim 1,000 USDH" +msgid "Claim 50 USDH" msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx @@ -300,7 +304,11 @@ msgid "Claim failed" msgstr "" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Claiming USDH" +#~ msgid "Claiming USDH" +#~ msgstr "" + +#: src/components/trade/tradebox/faucet-modal.tsx +msgid "Claiming USDH..." msgstr "" #: src/components/trade/positions/position-actions-dropdown.tsx @@ -1478,8 +1486,8 @@ msgid "Remove from favorites" msgstr "从收藏中移除" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Requirement" -msgstr "" +#~ msgid "Requirement" +#~ msgstr "" #: src/components/pages/builder-page.tsx #~ msgid "Requirements:" @@ -2169,8 +2177,8 @@ msgstr "" #~ msgstr "金库" #: src/components/trade/tradebox/faucet-modal.tsx -msgid "Verifying captcha" -msgstr "" +#~ msgid "Verifying captcha" +#~ msgstr "" #: src/lib/trade/use-button-content.ts msgid "Verifying..."