);
}
// =====================================================================
// Process strip - "How it works" reassurance
// =====================================================================
const PROCESS_STEPS = [
{
n: "01",
t: "Checkout in crypto",
d: "Pick a tier and a duration. Pay in BTC, XMR, USDT, ETH or LTC. Every invoice is capped at $30.",
icon: (
),
},
{
n: "02",
t: "Bind your key",
d: "Open a Discord ticket with your invoice ID. We bind the key to your HWID and deliver the DLL in minutes.",
icon: (
),
},
{
n: "03",
t: "Inject and play",
d: "Inject the DLL, launch MTA, press Insert to open the menu. Identity rotates on every launch.",
icon: (
),
},
];
function ProcessStrip() {
return (
{PROCESS_STEPS.map((s, i) => (
{s.n}{s.icon}
{s.t}
{s.d}
{i < PROCESS_STEPS.length - 1 && }
))}
);
}
// =====================================================================
// Capability rows
// =====================================================================
function CapabilityRow({ tier, flip, extra }) {
return (
{tier.name} tier
{tier.tagline}
Included
{tier.pros.map((f, i) => (
{f.t}
{f.d && {f.d}}
))}
{tier.cons.length > 0 && (
Not in this tier
{tier.cons.map((f, i) => (
{f.t}
{f.d && {f.d}}
))}
)}
{extra}
);
}
function CapVisual({ visual }) {
if (visual.type === "image-single") {
return (
{visual.primary.tag}
);
}
if (visual.type === "image-pair") {
return (
{visual.primary.tag}
{visual.secondary.tag}
);
}
if (visual.type === "code") {
return ;
}
if (visual.type === "fleet") {
return ;
}
return null;
}
function CapCodeVisual({ visual }) {
return (
Same ImGui shell that ships with the DLL. Click anything.
Prototype. All data is simulated.
);
}
// =====================================================================
// FAQ
// =====================================================================
const FAQ_ITEMS = [
{ q: "How does payment work?", a: "Crypto only. BTC, XMR, USDT (TRC-20 or ERC-20), ETH, LTC. Each invoice covers one tier for 1, 7, or 30 days and is capped at $30. On every launch, the DLL receives a session-bound capability ticket that authorizes your tier." },
{ q: "What does HWID-bound mean?", a: "Your license is tied to a single machine's HWID. After 14 days of usage you may reset your HWID for free. Before that, resets cost $2 each." },
{ q: "Will I get banned using this?", a: "We protect against any hardware detection so you remain anonymous. Identity rotates on every launch and the DLL signature is randomized per session." },
{ q: "What operating systems are supported?", a: "Windows is currently the only supported OS. Linux support may be added if you say \"pretty please\"." },
{ q: "Can I resell BasedMTA?", a: "Yes. Open a ticket on our Discord for reselling terms." },
{ q: "Are updates included?", a: "Updates are free for the entire duration of any active key." },
{ q: "What is your refund policy?", a: "No refunds. All sales are final." },
{ q: "How do I reach support?", a: "Open a ticket on our Discord for billing, license key delivery, HWID resets, and contact-priced add-ons. Keep your invoice ID private; do not share it publicly." },
];
function FAQ() {
const [open, setOpen] = useState(0);
return (
{FAQ_ITEMS.map((item, i) => (
setOpen(open === i ? -1 : i)}>
{String(i + 1).padStart(2, "0")}{item.q}+
{item.a}
))}
);
}
// =====================================================================
// Key status checker
// Public, read-only license oracle. POST /v1/license/status with
// {key, captcha} served same-origin via the Caddy reverse-proxy (no
// CORS, no secrets in the page). Server-side rate limit is 0.5/s
// burst 10, and every successful query consumes a verified hCaptcha
// token, so brute-force probing is both rate-bounded AND has to
// solve a fresh challenge per attempt.
// =====================================================================
const KEYCHK_API_BASE = (typeof window !== "undefined" && window.BMTA_API_BASE) || "";
const HCAPTCHA_SITEKEY = (typeof window !== "undefined" && window.BMTA_HCAPTCHA_SITE_KEY) || "";
function fmtTs(unix) {
if (!unix || unix <= 0) return null;
try {
return new Date(unix * 1000).toLocaleString(undefined, {
year: "numeric", month: "short", day: "numeric",
hour: "2-digit", minute: "2-digit",
});
} catch (_) { return null; }
}
function fmtRemaining(expiresUnix) {
if (!expiresUnix || expiresUnix <= 0) return null;
const secs = expiresUnix - Math.floor(Date.now() / 1000);
if (secs <= 0) return null;
const days = Math.floor(secs / 86400);
const hours = Math.floor((secs % 86400) / 3600);
const mins = Math.floor((secs % 3600) / 60);
if (days >= 2) return `${days} days remaining`;
if (days === 1) return `1 day ${hours}h remaining`;
if (hours >= 1) return `${hours}h ${mins}m remaining`;
return `${mins}m remaining`;
}
function maskKey(k) {
if (!k || k.length < 16) return k || "";
return k.slice(0, 8) + "…" + k.slice(-8);
}
const KEYCHK_TONES = {
Active: { tone: "ok", title: "Active", blurb: "This key is live." },
Unused: { tone: "info", title: "Unused", blurb: "Valid key, not activated yet. The clock starts on first launch." },
Expired: { tone: "warn", title: "Expired", blurb: "This key's duration has elapsed. Grab a new one any time." },
Revoked: { tone: "bad", title: "Revoked", blurb: "This key has been revoked or banned and can't be used." },
Invalid: { tone: "bad", title: "Not found", blurb: "No license matches that value. Double-check for typos." },
};
function KeyStatusChecker() {
const [key, setKey] = useState("");
const [loading, setLoading] = useState(false);
const [result, setResult] = useState(null);
const [checkedKey, setCheckedKey] = useState("");
const [err, setErr] = useState("");
const captchaHostRef = useRef(null);
const widgetIdRef = useRef(null);
const [captchaReady, setCaptchaReady] = useState(false);
// Render the invisible hCaptcha widget once. The script tag in
// index.html loads js.hcaptcha.com/1/api.js asynchronously, so we
// poll briefly until window.hcaptcha is defined.
useEffect(() => {
if (!HCAPTCHA_SITEKEY) return;
let cancelled = false;
let tries = 0;
const attempt = () => {
if (cancelled) return;
const hc = window.hcaptcha;
if (!hc || !captchaHostRef.current) {
if (tries++ < 50) setTimeout(attempt, 200);
return;
}
try {
widgetIdRef.current = hc.render(captchaHostRef.current, {
sitekey: HCAPTCHA_SITEKEY,
size: "invisible",
});
setCaptchaReady(true);
} catch (_) {
if (tries++ < 5) setTimeout(attempt, 400);
}
};
attempt();
return () => { cancelled = true; };
}, []);
const normalized = key.trim().toLowerCase();
const looksValid = /^[0-9a-f]{64}$/.test(normalized);
const check = async () => {
setErr("");
setResult(null);
setCheckedKey("");
if (!looksValid) {
setErr("A license key is exactly 64 hexadecimal characters (0-9, a-f).");
return;
}
setLoading(true);
// Get a fresh hCaptcha token. With size="invisible" this shows no
// challenge for legitimate users and pops a challenge modal only
// when hCaptcha thinks the visitor is suspicious.
let token = "";
const hc = window.hcaptcha;
if (HCAPTCHA_SITEKEY && hc && widgetIdRef.current !== null) {
try {
const exec = await hc.execute(widgetIdRef.current, { async: true });
token = exec && exec.response ? exec.response : "";
} catch (_) {
setErr("Captcha check was cancelled. Try again.");
setLoading(false);
return;
}
} else if (HCAPTCHA_SITEKEY) {
setErr("Captcha is still loading. Try again in a second.");
setLoading(false);
return;
}
try {
const resp = await fetch(KEYCHK_API_BASE + "/v1/license/status", {
method: "POST",
headers: { "Content-Type": "application/json", Accept: "application/json" },
body: JSON.stringify({ key: normalized, captcha: token }),
});
const data = await resp.json().catch(() => ({}));
if (resp.status === 429) {
setErr("Too many checks. Wait a few seconds and try again.");
} else if (data && data.error === "captcha_failed") {
setErr("Captcha verification failed. Please try again.");
} else if (!resp.ok && !data.Status) {
setErr(data.error || "Couldn't check that key right now. Try again shortly.");
} else {
setResult(data);
setCheckedKey(normalized);
}
} catch (_) {
setErr("Network error. Check your connection and try again.");
}
try { if (hc && widgetIdRef.current !== null) hc.reset(widgetIdRef.current); } catch (_) {}
setLoading(false);
};
const onKeyDown = (e) => { if (e.key === "Enter") check(); };
const meta = result ? (KEYCHK_TONES[result.Status] || { tone: "info", title: result.Status || "Unknown", blurb: "" }) : null;
const expiryStr = result ? fmtTs(result.Expires) : null;
const activatedStr = result ? fmtTs(result.ActivatedAt) : null;
const remaining = result && result.Status === "Active" ? fmtRemaining(result.Expires) : null;
const durationLbl = result && result.DurationDays > 0 ? `${result.DurationDays}-day key` : null;
return (