Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions package-lock.json

This file was deleted.

11 changes: 0 additions & 11 deletions website/astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -33,17 +33,6 @@ const LOCALES_MAP = {

// https://astro.build/config
export default defineConfig({
redirects: {
"/whitepaper": "/blog/whitepaper",
"/zh-CN/whitepaper": "/zh-CN/blog/whitepaper",
"/ko-KR/whitepaper": "/ko-KR/blog/whitepaper",
"/id-ID/whitepaper": "/id-ID/blog/whitepaper",
"/ja-JP/whitepaper": "/ja-JP/blog/whitepaper",
"/ru-RU/whitepaper": "/ru-RU/blog/whitepaper",
"/es-ES/whitepaper": "/es-ES/blog/whitepaper",
"/de-DE/whitepaper": "/de-DE/blog/whitepaper",
"/hi-IN/whitepaper": "/hi-IN/blog/whitepaper",
},
build: {
inlineStylesheets: "always",
},
Expand Down
35 changes: 35 additions & 0 deletions website/bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 5 additions & 1 deletion website/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
"version": "0.0.1",
"scripts": {
"dev": "astro dev",
"build": "astro build",
"prebuild": "node scripts/sync-whitepapers.js",
"build": "bun prebuild && astro build",
"preview": "astro preview",
"astro": "astro",
"format:check": "prettier --check .",
Expand All @@ -23,6 +24,8 @@
"@tanstack/react-table": "^8.21.3",
"astro": "^5.13.2",
"astro-seo": "^0.8.4",
"chart.js": "^4.5.1",
"chartjs-plugin-datalabels": "^2.2.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"fuse.js": "^7.1.0",
Expand All @@ -36,6 +39,7 @@
"devDependencies": {
"@types/react": "^19.2.2",
"@types/react-dom": "^19.2.2",
"pdf-parse": "^2.4.5",
"prettier": "^3.6.2",
"prettier-plugin-astro": "^0.14.1",
"prettier-plugin-tailwindcss": "^0.6.14",
Expand Down
4 changes: 1 addition & 3 deletions website/public/_redirects
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
/quantum-security-checker /quantum-risk-checker 301
/quantum-security-checker/ /quantum-risk-checker 301
/quests /quests/shill 301
/quests/ /quests/shill 301
/whitepaper https://mozilla.github.io/pdf.js/web/viewer.html?file=https://raw.githubusercontent.com/Quantus-Network/whitepaper/main/whitepaper.pdf 301
/whitepaper/ https://mozilla.github.io/pdf.js/web/viewer.html?file=https://raw.githubusercontent.com/Quantus-Network/whitepaper/main/whitepaper.pdf 301
/quests/ /quests/shill 301
3 changes: 3 additions & 0 deletions website/public/whitepapers/en-US/seo-content.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"text": "1 Quantus Network Whitepaper \tV0.3.1 Prepared by Christopher Smith -- 1 of 23 -- 2 1. Introduction The Quantum Threat Unique Value Proposition Foundation 2. The Quantum Threat to Blockchain Quantum Computing Basics Forging Digital Signatures Forging False Proofs in Zero-Knowledge Systems Decrypting Secret Information Reversing Hash Functions Scaling Challenges in Post-Quantum Cryptography 3. Quantus Network Architecture Post-Quantum Cryptographic Primitives Scaling PQC Consensus Mechanism 4. Wealth Preservation Reversible Transactions Check-Phrases High-Security Accounts Key Recovery HD-Lattice 5. Tokenomics and Governance Block Rewards Investor Allocations Company Allocations Transaction Fees Forkless Upgrades Governance System 6. Roadmap 7. Risks Contents -- 2 of 23 -- 3 Legal Disclaimer: Legal Disclaimer: This whitepaper is provided for informational purposes only and does not constitute an offer to sell, a solicitation of an offer to buy, or a recommendation for any security, investment, or financial product. Readers should conduct their own due diligence and consult with qualified professionals before making any investment decisions. Quantus Network makes no representations or warranties regarding the accuracy or completeness of the information herein. -- 3 of 23 -- 4 1. Introduction The Quantum Threat Traditional blockchains face an existential threat from the advent of quantum computing. The cryptographic foundations of blockchains rely on the hardness of the discrete logarithm problem (DLP), and quantum algorithms, notably Shor’s, can solve the DLP exponentially faster than classical computers. This vulnerability could enable quantum-adversaries to derive private keys from public keys, which would allow them to forge transactions and decrypt sensitive financial data. The outcome is a catastrophic system failure. Without proactive quantum-resistant upgrades, the trillion-dollar crypto economy risks sudden devaluation from such attacks. Quantus fixes thi"
}
Binary file added website/public/whitepapers/en-US/thumb.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added website/public/whitepapers/en-US/whitepaper.pdf
Binary file not shown.
86 changes: 86 additions & 0 deletions website/scripts/sync-whitepapers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import fs from "node:fs";
import path from "node:path";
import { PDFParse } from "pdf-parse";

// Configuration
const REPO_BASE =
"https://raw.githubusercontent.com/Quantus-Network/whitepaper/main";
const SUPPORTED_LOCALES = [
"en-US",
"zh-CN",
"ko-KR",
"id-ID",
"ja-JP",
"ru-RU",
"es-ES",
"de-DE",
"hi-IN",
];
const OUTPUT_DIR = "./public/whitepapers";

async function processWhitepaper(lang) {
console.log(`Processing [${lang}] whitepaper...`);

// 1. Fetch the PDF
const url = `${REPO_BASE}/whitepaper.pdf`;
const res = await fetch(url);
if (!res.ok) {
console.warn(`⚠️ [${lang}] Whitepaper not found at ${url}. Skipping...`);
return;
}
const buffer = await res.arrayBuffer();
const pdfData = new Uint8Array(buffer);

// Ensure directory exists
const langDir = path.join(OUTPUT_DIR, lang);
fs.mkdirSync(langDir, { recursive: true });

// 2. Save the PDF (for download/iframe)
fs.writeFileSync(path.join(langDir, "whitepaper.pdf"), pdfData);

// 3. Extract text (for SEO)
const parser = new PDFParse({ data: pdfData });

try {
const textResult = await parser.getText();
// Save only the first 2000 chars to avoid bloating the HTML
const seoText = textResult.text.substring(0, 2000).replace(/\n/g, " ");
const seoContent = { text: seoText };
fs.writeFileSync(
path.join(langDir, "seo-content.json"),
JSON.stringify(seoContent),
);

// 4. Generate thumbnail (for mobile UX)
// Renders page 1 to a PNG via pdf-parse's built-in screenshot
const screenshotResult = await parser.getScreenshot({
partial: [1],
desiredWidth: 600,
imageBuffer: true,
imageDataUrl: false,
});

const firstPage = screenshotResult.pages[0];
if (firstPage?.data) {
fs.writeFileSync(path.join(langDir, "thumb.png"), firstPage.data);
} else {
console.warn(`⚠️ [${lang}] Could not generate thumbnail for page 1.`);
}
} finally {
await parser.destroy();
}

console.log(`✅ [${lang}] Ready: PDF, SEO text, and thumbnail saved.`);
}

// Run for all languages
(async () => {
try {
await Promise.all(SUPPORTED_LOCALES.map(processWhitepaper));
console.log("All whitepapers synced successfully.");
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
console.error("Failed to sync whitepapers:", message);
process.exit(1);
}
})();
16 changes: 16 additions & 0 deletions website/src/assets/socials/social-cg.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ const t = await createTranslator(locale);
>
<Button
class="md:min-w-[200px]"
href="https://mozilla.github.io/pdf.js/web/viewer.html?file=https://raw.githubusercontent.com/Quantus-Network/whitepaper/main/whitepaper.pdf"
target="_self"
href={getLocalizedPath(locale, "/whitepaper")}
variant="outline">{t("hero.cta_secondary")}</Button
>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const THUMBNAIL_URL = `https://i.ytimg.com/vi/${VIDEO_ID}/sddefault.jpg`;
>
<div
id="lazy-video-container"
class="lg:rounded-quantus relative flex aspect-video size-full flex-1 flex-col items-center justify-center overflow-hidden bg-(image:--color-video-player) transition-opacity duration-1000 lg:order-2"
class="lg:rounded-quantus relative z-0 flex aspect-video size-full flex-1 flex-col items-center justify-center overflow-hidden bg-(image:--color-video-player) transition-opacity duration-1000 lg:order-2"
>
<Image
src={THUMBNAIL_URL}
Expand Down
67 changes: 67 additions & 0 deletions website/src/components/features/launch/AllocationChart.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<canvas id="chart" class="mb-10 max-h-[400px]"></canvas>

<script>
import { Chart, PieController, ArcElement, Legend, Tooltip } from "chart.js";
import ChartDataLabels from "chartjs-plugin-datalabels";
import { createTranslator, getLocaleFromUrl } from "@/utils/i18n";
Chart.register(PieController, ArcElement, Legend, Tooltip);

const chartEl = document.getElementById("chart");
if (chartEl) {
const locale = getLocaleFromUrl(location.pathname);
const t = await createTranslator(locale);

new Chart(chartEl as HTMLCanvasElement, {
type: "pie",
plugins: [ChartDataLabels],
data: {
labels: [
t("launch.tge.table.private_sale"),
t("launch.tge.table.public_sale"),
t("launch.tge.table.dex_liquidity"),
t("launch.mining.table.miners"),
t("launch.mining.table.community"),
t("launch.mining.table.team"),
],
datasets: [
{
label: "Launch Allocation",
data: [15, 10, 5, 35, 25, 10],
backgroundColor: [
"#0000FF",
"#ED4CCE",
"#FFE91F",
"#00C2A8",
"#FF6B35",
"#1A1A1A",
],
borderColor: "#000000",
borderWidth: 2,
hoverOffset: 12,
},
],
},
options: {
responsive: true,
plugins: {
tooltip: {
enabled: false,
},
datalabels: {
formatter: (value, context) => {
const datapoints = context.chart.data.datasets[0]
.data as number[];
const total = datapoints.reduce((acc, val) => acc + val, 0);
const percentage = ((value / total) * 100).toFixed(1) + "%";
return percentage;
},
color: "#fff",
},
legend: {
display: true,
},
},
},
});
}
</script>
8 changes: 8 additions & 0 deletions website/src/components/ui/SiteSocials.astro
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import SocialYT from "@/assets/socials/social-yt.svg";
import SocialTelegram from "@/assets/socials/social-telegram.svg";
import SocialGithub from "@/assets/socials/social-github.svg";
import SocialLinktree from "@/assets/socials/social-linktree.svg";
import SocialCoingecko from "@/assets/socials/social-cg.svg";

export interface Props {
class?: string;
Expand Down Expand Up @@ -43,6 +44,13 @@ const socials = Object.entries(SITE_SOCIALS) as [SiteSocial, string][];
{social[0] === "linktree" && (
<SocialLinktree title="Quantus's Linktree account" />
)}
{social[0] === "coingecko" && (
<SocialCoingecko
width={28}
height={28}
title="Quantus's Coingecko Coin Page"
/>
)}
</a>
))
}
Expand Down
Loading
Loading