diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 4ff32e6..0000000 --- a/package-lock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "website", - "lockfileVersion": 3, - "requires": true, - "packages": {} -} diff --git a/website/astro.config.mjs b/website/astro.config.mjs index 58a5c41..45729bf 100644 --- a/website/astro.config.mjs +++ b/website/astro.config.mjs @@ -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", }, diff --git a/website/bun.lock b/website/bun.lock index 0a79c0b..126064c 100644 --- a/website/bun.lock +++ b/website/bun.lock @@ -17,6 +17,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", @@ -30,6 +32,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", @@ -277,10 +280,34 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + "@kurkle/color": ["@kurkle/color@0.3.4", "", {}, "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w=="], + "@lhci/utils": ["@lhci/utils@0.15.1", "", { "dependencies": { "debug": "^4.3.1", "isomorphic-fetch": "^3.0.0", "js-yaml": "^3.13.1", "lighthouse": "12.6.1", "tree-kill": "^1.2.1" } }, "sha512-WclJnUQJeOMY271JSuaOjCv/aA0pgvuHZS29NFNdIeI14id8eiFsjith85EGKYhljgoQhJ2SiW4PsVfFiakNNw=="], "@lucide/astro": ["@lucide/astro@0.541.0", "", { "peerDependencies": { "astro": "^4 || ^5" } }, "sha512-12n6tMk7qKYOx+5dKdDuzyLnvXgXicrer+LRiKSrrnt8xTBuoc0BDnDZ+ZceAUL65726WwW09G0VPXTxtoSWXQ=="], + "@napi-rs/canvas": ["@napi-rs/canvas@0.1.80", "", { "optionalDependencies": { "@napi-rs/canvas-android-arm64": "0.1.80", "@napi-rs/canvas-darwin-arm64": "0.1.80", "@napi-rs/canvas-darwin-x64": "0.1.80", "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.80", "@napi-rs/canvas-linux-arm64-gnu": "0.1.80", "@napi-rs/canvas-linux-arm64-musl": "0.1.80", "@napi-rs/canvas-linux-riscv64-gnu": "0.1.80", "@napi-rs/canvas-linux-x64-gnu": "0.1.80", "@napi-rs/canvas-linux-x64-musl": "0.1.80", "@napi-rs/canvas-win32-x64-msvc": "0.1.80" } }, "sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww=="], + + "@napi-rs/canvas-android-arm64": ["@napi-rs/canvas-android-arm64@0.1.80", "", { "os": "android", "cpu": "arm64" }, "sha512-sk7xhN/MoXeuExlggf91pNziBxLPVUqF2CAVnB57KLG/pz7+U5TKG8eXdc3pm0d7Od0WreB6ZKLj37sX9muGOQ=="], + + "@napi-rs/canvas-darwin-arm64": ["@napi-rs/canvas-darwin-arm64@0.1.80", "", { "os": "darwin", "cpu": "arm64" }, "sha512-O64APRTXRUiAz0P8gErkfEr3lipLJgM6pjATwavZ22ebhjYl/SUbpgM0xcWPQBNMP1n29afAC/Us5PX1vg+JNQ=="], + + "@napi-rs/canvas-darwin-x64": ["@napi-rs/canvas-darwin-x64@0.1.80", "", { "os": "darwin", "cpu": "x64" }, "sha512-FqqSU7qFce0Cp3pwnTjVkKjjOtxMqRe6lmINxpIZYaZNnVI0H5FtsaraZJ36SiTHNjZlUB69/HhxNDT1Aaa9vA=="], + + "@napi-rs/canvas-linux-arm-gnueabihf": ["@napi-rs/canvas-linux-arm-gnueabihf@0.1.80", "", { "os": "linux", "cpu": "arm" }, "sha512-eyWz0ddBDQc7/JbAtY4OtZ5SpK8tR4JsCYEZjCE3dI8pqoWUC8oMwYSBGCYfsx2w47cQgQCgMVRVTFiiO38hHQ=="], + + "@napi-rs/canvas-linux-arm64-gnu": ["@napi-rs/canvas-linux-arm64-gnu@0.1.80", "", { "os": "linux", "cpu": "arm64" }, "sha512-qwA63t8A86bnxhuA/GwOkK3jvb+XTQaTiVML0vAWoHyoZYTjNs7BzoOONDgTnNtr8/yHrq64XXzUoLqDzU+Uuw=="], + + "@napi-rs/canvas-linux-arm64-musl": ["@napi-rs/canvas-linux-arm64-musl@0.1.80", "", { "os": "linux", "cpu": "arm64" }, "sha512-1XbCOz/ymhj24lFaIXtWnwv/6eFHXDrjP0jYkc6iHQ9q8oXKzUX1Lc6bu+wuGiLhGh2GS/2JlfORC5ZcXimRcg=="], + + "@napi-rs/canvas-linux-riscv64-gnu": ["@napi-rs/canvas-linux-riscv64-gnu@0.1.80", "", { "os": "linux", "cpu": "none" }, "sha512-XTzR125w5ZMs0lJcxRlS1K3P5RaZ9RmUsPtd1uGt+EfDyYMu4c6SEROYsxyatbbu/2+lPe7MPHOO/0a0x7L/gw=="], + + "@napi-rs/canvas-linux-x64-gnu": ["@napi-rs/canvas-linux-x64-gnu@0.1.80", "", { "os": "linux", "cpu": "x64" }, "sha512-BeXAmhKg1kX3UCrJsYbdQd3hIMDH/K6HnP/pG2LuITaXhXBiNdh//TVVVVCBbJzVQaV5gK/4ZOCMrQW9mvuTqA=="], + + "@napi-rs/canvas-linux-x64-musl": ["@napi-rs/canvas-linux-x64-musl@0.1.80", "", { "os": "linux", "cpu": "x64" }, "sha512-x0XvZWdHbkgdgucJsRxprX/4o4sEed7qo9rCQA9ugiS9qE2QvP0RIiEugtZhfLH3cyI+jIRFJHV4Fuz+1BHHMg=="], + + "@napi-rs/canvas-win32-x64-msvc": ["@napi-rs/canvas-win32-x64-msvc@0.1.80", "", { "os": "win32", "cpu": "x64" }, "sha512-Z8jPsM6df5V8B1HrCHB05+bDiCxjE9QA//3YrkKIdVDEwn5RKaqOxCJDRJkl48cJbylcrJbW4HxZbTte8juuPg=="], + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], @@ -935,6 +962,10 @@ "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + "chart.js": ["chart.js@4.5.1", "", { "dependencies": { "@kurkle/color": "^0.3.0" } }, "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw=="], + + "chartjs-plugin-datalabels": ["chartjs-plugin-datalabels@2.2.0", "", { "peerDependencies": { "chart.js": ">=3.0.0" } }, "sha512-14ZU30lH7n89oq+A4bWaJPnAG8a7ZTk7dKf48YAzMvJjQtjrgg5Dpk9f+LbjCF6bpx3RAGTeL13IXpKQYyRvlw=="], + "cheerio": ["cheerio@1.1.0", "", { "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "encoding-sniffer": "^0.2.0", "htmlparser2": "^10.0.0", "parse5": "^7.3.0", "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", "undici": "^7.10.0", "whatwg-mimetype": "^4.0.0" } }, "sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ=="], "cheerio-select": ["cheerio-select@2.1.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", "css-what": "^6.1.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1" } }, "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g=="], @@ -1711,6 +1742,10 @@ "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + "pdf-parse": ["pdf-parse@2.4.5", "", { "dependencies": { "@napi-rs/canvas": "0.1.80", "pdfjs-dist": "5.4.296" }, "bin": { "pdf-parse": "bin/cli.mjs" } }, "sha512-mHU89HGh7v+4u2ubfnevJ03lmPgQ5WU4CxAVmTSh/sxVTEDYd1er/dKS/A6vg77NX47KTEoihq8jZBLr8Cxuwg=="], + + "pdfjs-dist": ["pdfjs-dist@5.4.296", "", { "optionalDependencies": { "@napi-rs/canvas": "^0.1.80" } }, "sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q=="], + "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], "perfect-debounce": ["perfect-debounce@2.1.0", "", {}, "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g=="], diff --git a/website/package.json b/website/package.json index 799deda..e27cbc1 100644 --- a/website/package.json +++ b/website/package.json @@ -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 .", @@ -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", @@ -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", diff --git a/website/public/_redirects b/website/public/_redirects index 341c324..1a83d31 100644 --- a/website/public/_redirects +++ b/website/public/_redirects @@ -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 \ No newline at end of file +/quests/ /quests/shill 301 \ No newline at end of file diff --git a/website/public/whitepapers/en-US/seo-content.json b/website/public/whitepapers/en-US/seo-content.json new file mode 100644 index 0000000..e71ba63 --- /dev/null +++ b/website/public/whitepapers/en-US/seo-content.json @@ -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" +} diff --git a/website/public/whitepapers/en-US/thumb.png b/website/public/whitepapers/en-US/thumb.png new file mode 100644 index 0000000..9dfcb29 Binary files /dev/null and b/website/public/whitepapers/en-US/thumb.png differ diff --git a/website/public/whitepapers/en-US/whitepaper.pdf b/website/public/whitepapers/en-US/whitepaper.pdf new file mode 100644 index 0000000..1025b30 Binary files /dev/null and b/website/public/whitepapers/en-US/whitepaper.pdf differ diff --git a/website/scripts/sync-whitepapers.js b/website/scripts/sync-whitepapers.js new file mode 100644 index 0000000..f027d38 --- /dev/null +++ b/website/scripts/sync-whitepapers.js @@ -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); + } +})(); diff --git a/website/src/assets/socials/social-cg.svg b/website/src/assets/socials/social-cg.svg new file mode 100644 index 0000000..5485d61 --- /dev/null +++ b/website/src/assets/socials/social-cg.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/website/src/components/features/home/hero-banner/Banner.astro b/website/src/components/features/home/hero-banner/Banner.astro index 2e7cd62..a0c7f6b 100644 --- a/website/src/components/features/home/hero-banner/Banner.astro +++ b/website/src/components/features/home/hero-banner/Banner.astro @@ -31,7 +31,8 @@ const t = await createTranslator(locale); > diff --git a/website/src/components/features/home/introduction-video/IntroductionVideo.astro b/website/src/components/features/home/introduction-video/IntroductionVideo.astro index 3fa3eb7..a04a5a0 100644 --- a/website/src/components/features/home/introduction-video/IntroductionVideo.astro +++ b/website/src/components/features/home/introduction-video/IntroductionVideo.astro @@ -16,7 +16,7 @@ const THUMBNAIL_URL = `https://i.ytimg.com/vi/${VIDEO_ID}/sddefault.jpg`; >
+ + diff --git a/website/src/components/ui/SiteSocials.astro b/website/src/components/ui/SiteSocials.astro index 45fce76..6dd790e 100644 --- a/website/src/components/ui/SiteSocials.astro +++ b/website/src/components/ui/SiteSocials.astro @@ -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; @@ -43,6 +44,13 @@ const socials = Object.entries(SITE_SOCIALS) as [SiteSocial, string][]; {social[0] === "linktree" && ( )} + {social[0] === "coingecko" && ( + + )} )) } diff --git a/website/src/constants/default-jsonld.ts b/website/src/constants/default-jsonld.ts index 38e938d..ede1cc6 100644 --- a/website/src/constants/default-jsonld.ts +++ b/website/src/constants/default-jsonld.ts @@ -1,5 +1,10 @@ import env from "@/config"; -import type { MobileApplication, Organization, WebSite } from "schema-dts"; +import type { + MobileApplication, + Organization, + TechArticle, + WebSite, +} from "schema-dts"; import defaultMetadata from "./default-metadata"; import { APP_LINKS } from "./app-links"; @@ -94,3 +99,54 @@ export const androidAppJsonLd: MobileApplication = { installUrl: APP_LINKS.android, publisher: organizationJsonLd, }; + +export const whitepaperJsonLd: TechArticle = { + "@id": `${env.SITE_BASE_URL}/whitepaper`, + "@type": "TechArticle", + headline: "Quantus Network Whitepaper", + description: + "The official whitepaper for Quantus Network, detailing the versioned history, protocol, and architecture of the network.", + author: { + "@type": "Organization", + name: "Quantus Network", + url: "https://github.com/Quantus-Network", + }, + publisher: { + "@type": "Organization", + name: "Quantus Network", + logo: { + "@type": "ImageObject", + url: "https://github.com/Quantus-Network.png", + }, + }, + inLanguage: "en-US", + encoding: { + "@type": "MediaObject", + contentUrl: + "https://raw.githubusercontent.com/Quantus-Network/whitepaper/main/whitepaper.pdf", + encodingFormat: "application/pdf", + }, + about: { + "@type": "Thing", + name: "Blockchain Protocol", + description: "Technical specification of the Quantus Network protocol.", + }, +}; + +export const getWhitepaperJsonLd = (locale: string): TechArticle => { + const url = + locale === "en-US" + ? `${env.SITE_BASE_URL}/whitepaper` + : `${env.SITE_BASE_URL}/${locale}/whitepaper`; + + return { + ...whitepaperJsonLd, + "@id": url, + inLanguage: locale, + encoding: { + "@type": "MediaObject", + contentUrl: `https://raw.githubusercontent.com/Quantus-Network/whitepaper/main/${locale}/whitepaper.pdf`, + encodingFormat: "application/pdf", + }, + }; +}; diff --git a/website/src/constants/site-socials.ts b/website/src/constants/site-socials.ts index 03cc1c7..5a487ae 100644 --- a/website/src/constants/site-socials.ts +++ b/website/src/constants/site-socials.ts @@ -4,7 +4,8 @@ export type SiteSocial = | "telegram" | "github" | "instagram" - | "linktree"; + | "linktree" + | "coingecko"; export const SITE_SOCIALS = { x: "https://x.com/QuantusNetwork", @@ -13,4 +14,5 @@ export const SITE_SOCIALS = { github: "https://github.com/Quantus-Network", instagram: "https://www.instagram.com/quantusnetwork/", linktree: "https://tr.ee/wFDhS5", + coingecko: "https://www.coingecko.com/en/coins/quantus", } as const; diff --git a/website/src/i18n/de-DE.json b/website/src/i18n/de-DE.json index 7945e8f..5b7d371 100644 --- a/website/src/i18n/de-DE.json +++ b/website/src/i18n/de-DE.json @@ -712,6 +712,20 @@ "accept": "Akzeptieren", "decline": "Ablehnen" }, + "whitepaper": { + "meta": { + "title": "Quantus Whitepaper | Technische Grundlagen der Quantensicherheit", + "description": "Lesen Sie das Quantus Network Whitepaper. Entdecken Sie unseren technischen Ansatz für Post-Quanten-Kryptographie, Zero-Knowledge-Proofs und eine sichere Layer-1-Blockchain-Architektur." + }, + "title": "Quantus Whitepaper", + "executive_summary": "Zusammenfassung", + "pdf": { + "unable": "PDF kann nicht direkt angezeigt werden.", + "download": "Herunterladen", + "read": "Lesen", + "preview_alt": "Whitepaper Vorschau" + } + }, "common": { "loading": "Wird geladen...", "error": "Fehler", diff --git a/website/src/i18n/en-US.json b/website/src/i18n/en-US.json index d095118..21af34e 100644 --- a/website/src/i18n/en-US.json +++ b/website/src/i18n/en-US.json @@ -712,6 +712,20 @@ "accept": "Accept", "decline": "Decline" }, + "whitepaper": { + "meta": { + "title": "Quantus Whitepaper | Technical Foundations of Quantum Security", + "description": "Read the Quantus Network whitepaper. Explore our technical approach to post-quantum cryptography, zero-knowledge proofs, and secure Layer 1 blockchain architecture." + }, + "title": "Quantus Whitepaper", + "executive_summary": "Executive Summary", + "pdf": { + "unable": "Unable to display PDF directly.", + "download": "Download", + "read": "Read", + "preview_alt": "Whitepaper Preview" + } + }, "common": { "loading": "Loading...", "error": "Error", diff --git a/website/src/i18n/es-ES.json b/website/src/i18n/es-ES.json index d10dd71..72189c0 100644 --- a/website/src/i18n/es-ES.json +++ b/website/src/i18n/es-ES.json @@ -712,6 +712,20 @@ "accept": "Aceptar", "decline": "Rechazar" }, + "whitepaper": { + "meta": { + "title": "Whitepaper de Quantus | Fundamentos Técnicos de la Seguridad Cuántica", + "description": "Lea el whitepaper de Quantus Network. Explore nuestro enfoque técnico de la criptografía post-cuántica, las pruebas de conocimiento cero y la arquitectura segura de blockchain de Capa 1." + }, + "title": "Whitepaper de Quantus", + "executive_summary": "Resumen Ejecutivo", + "pdf": { + "unable": "No se puede mostrar el PDF directamente.", + "download": "Descargar", + "read": "Leer", + "preview_alt": "Vista Previa del Whitepaper" + } + }, "common": { "loading": "Cargando...", "error": "Error", diff --git a/website/src/i18n/hi-IN.json b/website/src/i18n/hi-IN.json index 23db922..03c039d 100644 --- a/website/src/i18n/hi-IN.json +++ b/website/src/i18n/hi-IN.json @@ -715,6 +715,20 @@ "accept": "स्वीकार करें", "decline": "अस्वीकार करें" }, + "whitepaper": { + "meta": { + "title": "क्वांटस व्हाइटपेपर | क्वांटम सुरक्षा की तकनीकी नींव", + "description": "क्वांटस नेटवर्क व्हाइटपेपर पढ़ें। पोस्ट-क्वांटम क्रिप्टोग्राफी, जीरो-नॉलेज प्रूफ और सुरक्षित लेयर 1 ब्लॉकचेन आर्किटेक्चर के लिए हमारे तकनीकी दृष्टिकोण का पता लगाएं।" + }, + "title": "क्वांटस व्हाइटपेपर", + "executive_summary": "कार्यकारी सारांश", + "pdf": { + "unable": "पीडीएफ को सीधे प्रदर्शित करने में असमर्थ।", + "download": "डाउनलोड", + "read": "पढ़ें", + "preview_alt": "व्हाइटपेपर पूर्वावलोकन" + } + }, "common": { "loading": "लोड हो रहा है...", "error": "त्रुटि", diff --git a/website/src/i18n/id-ID.json b/website/src/i18n/id-ID.json index 3039d9e..d0d98be 100644 --- a/website/src/i18n/id-ID.json +++ b/website/src/i18n/id-ID.json @@ -712,6 +712,20 @@ "accept": "Terima", "decline": "Tolak" }, + "whitepaper": { + "meta": { + "title": "Whitepaper Quantus | Fondasi Teknis Keamanan Kuantum", + "description": "Baca whitepaper Quantus Network. Jelajahi pendekatan teknis kami terhadap kriptografi pasca-kuantum, zero-knowledge proof, dan arsitektur blockchain Layer 1 yang aman." + }, + "title": "Whitepaper Quantus", + "executive_summary": "Ringkasan Eksekutif", + "pdf": { + "unable": "Tidak dapat menampilkan PDF secara langsung.", + "download": "Unduh", + "read": "Baca", + "preview_alt": "Pratinjau Whitepaper" + } + }, "common": { "loading": "Memuat...", "error": "Error", diff --git a/website/src/i18n/ja-JP.json b/website/src/i18n/ja-JP.json index f7beeef..1b7ca8c 100644 --- a/website/src/i18n/ja-JP.json +++ b/website/src/i18n/ja-JP.json @@ -704,6 +704,20 @@ "accept": "同意する", "decline": "拒否する" }, + "whitepaper": { + "meta": { + "title": "Quantus ホワイトペーパー | 量子セキュリティの技術的基盤", + "description": "Quantus Network のホワイトペーパーをご覧ください。ポスト量子暗号、ゼロ知識証明、および安全なレイヤー 1 ブロックチェーン アーキテクチャへの当社の技術的アプローチを解説します。" + }, + "title": "Quantus ホワイトペーパー", + "executive_summary": "エグゼクティブサマリー", + "pdf": { + "unable": "PDF を直接表示できません。", + "download": "ダウンロード", + "read": "読む", + "preview_alt": "ホワイトペーパーのプレビュー" + } + }, "common": { "loading": "読み込み中...", "error": "エラー", diff --git a/website/src/i18n/ko-KR.json b/website/src/i18n/ko-KR.json index ac727e9..17daed8 100644 --- a/website/src/i18n/ko-KR.json +++ b/website/src/i18n/ko-KR.json @@ -704,6 +704,20 @@ "accept": "수락", "decline": "거부" }, + "whitepaper": { + "meta": { + "title": "Quantus 백서 | 양자 보안의 기술적 토대", + "description": "Quantus Network 백서를 읽어보세요. 포스트 퀀텀 암호화, 영지식 증명 및 안전한 레이어 1 블록체인 아키텍처에 대한 당사의 기술적 접근 방식을 탐구합니다." + }, + "title": "Quantus 백서", + "executive_summary": "요약", + "pdf": { + "unable": "PDF를 직접 표시할 수 없습니다.", + "download": "다운로드", + "read": "읽기", + "preview_alt": "백서 미리보기" + } + }, "common": { "loading": "로딩 중...", "error": "오류", diff --git a/website/src/i18n/ru-RU.json b/website/src/i18n/ru-RU.json index afb7d9f..30a051f 100644 --- a/website/src/i18n/ru-RU.json +++ b/website/src/i18n/ru-RU.json @@ -712,6 +712,20 @@ "accept": "Принять", "decline": "Отклонить" }, + "whitepaper": { + "meta": { + "title": "Whitepaper Quantus | Технические основы квантовой безопасности", + "description": "Прочтите whitepaper Quantus Network. Изучите наш технический подход к постквантовой криптографии, доказательствам с нулевым разглашением и безопасной архитектуре блокчейна Уровня 1." + }, + "title": "Whitepaper Quantus", + "executive_summary": "Краткое описание", + "pdf": { + "unable": "Невозможно отобразить PDF напрямую.", + "download": "Скачать", + "read": "Читать", + "preview_alt": "Предпросмотр Whitepaper" + } + }, "common": { "loading": "Загрузка...", "error": "Ошибка", diff --git a/website/src/i18n/zh-CN.json b/website/src/i18n/zh-CN.json index 34b6c1a..fa10541 100644 --- a/website/src/i18n/zh-CN.json +++ b/website/src/i18n/zh-CN.json @@ -701,6 +701,20 @@ "accept": "接受", "decline": "拒绝" }, + "whitepaper": { + "meta": { + "title": "Quantus 白皮书 | 量子安全的技术基础", + "description": "阅读 Quantus Network 白皮书。探索我们在后量子密码学、零知识证明和安全的第一层区块链架构方面的技术方案。" + }, + "title": "Quantus 白皮书", + "executive_summary": "执行摘要", + "pdf": { + "unable": "无法直接显示 PDF。", + "download": "下载", + "read": "阅读", + "preview_alt": "白皮书预览" + } + }, "common": { "loading": "加载中...", "error": "错误", diff --git a/website/src/pages/[lang]/about.astro b/website/src/pages/[lang]/about.astro index c029301..61a5b08 100644 --- a/website/src/pages/[lang]/about.astro +++ b/website/src/pages/[lang]/about.astro @@ -26,7 +26,7 @@ const metadata = createMetadata({ }); const jsonLd = { "@context": "https://schema.org", - ...organizationJsonLd, + ...(organizationJsonLd as any), }; --- diff --git a/website/src/pages/[lang]/launch.astro b/website/src/pages/[lang]/launch.astro index 43b2238..a077fd1 100644 --- a/website/src/pages/[lang]/launch.astro +++ b/website/src/pages/[lang]/launch.astro @@ -1,4 +1,5 @@ --- +import AllocationChart from "@/components/features/launch/AllocationChart.astro"; import Layout from "@/components/layout/Layout.astro"; import { organizationJsonLd } from "@/constants/default-jsonld"; import { createMetadata } from "@/utils/create-metadata"; @@ -23,7 +24,7 @@ const metadata = createMetadata({ const jsonLd = { "@context": "https://schema.org", - ...organizationJsonLd, + ...(organizationJsonLd as any), }; // Helper to render text with **bold** markdown @@ -106,6 +107,9 @@ const feesPoints = t("launch.fees.points") as unknown as string[];

+ + +

{t("launch.tge.title")}

diff --git a/website/src/pages/[lang]/whitepaper.astro b/website/src/pages/[lang]/whitepaper.astro new file mode 100644 index 0000000..09c107d --- /dev/null +++ b/website/src/pages/[lang]/whitepaper.astro @@ -0,0 +1,91 @@ +--- +import fs from "fs"; +import path from "path"; +import Layout from "@/components/layout/Layout.astro"; +import { + getLocaleFromUrl, + createTranslator, + SUPPORTED_LOCALES, +} from "@/utils/i18n"; +import { JsonLdGraph } from "@/utils/build-json-ld"; +import { getWhitepaperJsonLd } from "@/constants/default-jsonld"; +import { createMetadata } from "@/utils/create-metadata"; +import Button from "@/components/ui/Button.astro"; + +export async function getStaticPaths() { + return SUPPORTED_LOCALES.map((lang) => ({ params: { lang } })); +} + +const locale = getLocaleFromUrl(Astro.url.pathname); +const t = await createTranslator(locale); + +const getAssetUrl = (fileName: string) => { + const localePath = `./public/whitepapers/${locale}/${fileName}`; + if (fs.existsSync(path.resolve(localePath))) { + return `/whitepapers/${locale}/${fileName}`; + } + return `/whitepapers/en-US/${fileName}`; +}; + +const seoPath = path.resolve(`./public${getAssetUrl("seo-content.json")}`); +const seoData = JSON.parse(fs.readFileSync(seoPath, "utf-8")); + +const pdfUrl = getAssetUrl("whitepaper.pdf"); +const thumbUrl = getAssetUrl("thumb.png"); + +const metadata = createMetadata({ + title: t("whitepaper.meta.title"), + description: t("whitepaper.meta.description"), + pathname: Astro.url.pathname, +}); + +const jsonLd = JsonLdGraph({ + "@context": "https://schema.org", + "@graph": [getWhitepaperJsonLd(locale)], +}); +--- + + +
+

+ {t("whitepaper.title")} +

+ +
+

{t("whitepaper.executive_summary")}

+

{seoData.text}

+
+ + + +
+ Whitepaper Preview + + +
+
+
diff --git a/website/src/pages/about.astro b/website/src/pages/about.astro index 4137603..ff34046 100644 --- a/website/src/pages/about.astro +++ b/website/src/pages/about.astro @@ -18,7 +18,7 @@ const metadata = createMetadata({ const jsonLd = { "@context": "https://schema.org", - ...organizationJsonLd, + ...(organizationJsonLd as any), }; --- diff --git a/website/src/pages/launch.astro b/website/src/pages/launch.astro index 22371a0..bbdaa2e 100644 --- a/website/src/pages/launch.astro +++ b/website/src/pages/launch.astro @@ -3,6 +3,7 @@ import Layout from "@/components/layout/Layout.astro"; import { organizationJsonLd } from "@/constants/default-jsonld"; import { getLocaleFromUrl, createTranslator } from "@/utils/i18n"; import { createMetadata } from "@/utils/create-metadata"; +import AllocationChart from "@/components/features/launch/AllocationChart.astro"; const locale = getLocaleFromUrl(Astro.url.pathname); const t = await createTranslator(locale); @@ -15,7 +16,7 @@ const metadata = createMetadata({ const jsonLd = { "@context": "https://schema.org", - ...organizationJsonLd, + ...(organizationJsonLd as any), }; // Helper to render text with **bold** markdown @@ -98,6 +99,9 @@ const feesPoints = t("launch.fees.points") as unknown as string[];

+ + +

{t("launch.tge.title")}

diff --git a/website/src/pages/whitepaper.astro b/website/src/pages/whitepaper.astro new file mode 100644 index 0000000..236fc39 --- /dev/null +++ b/website/src/pages/whitepaper.astro @@ -0,0 +1,83 @@ +--- +import fs from "fs"; +import path from "path"; +import Layout from "@/components/layout/Layout.astro"; +import { getLocaleFromUrl, createTranslator } from "@/utils/i18n"; +import { JsonLdGraph } from "@/utils/build-json-ld"; +import { getWhitepaperJsonLd } from "@/constants/default-jsonld"; +import { createMetadata } from "@/utils/create-metadata"; +import Button from "@/components/ui/Button.astro"; + +const locale = getLocaleFromUrl(Astro.url.pathname); +const t = await createTranslator(locale); + +const getAssetUrl = (fileName: string) => { + const localePath = `./public/whitepapers/${locale}/${fileName}`; + if (fs.existsSync(path.resolve(localePath))) { + return `/whitepapers/${locale}/${fileName}`; + } + return `/whitepapers/en-US/${fileName}`; +}; + +const seoPath = path.resolve(`./public${getAssetUrl("seo-content.json")}`); +const seoData = JSON.parse(fs.readFileSync(seoPath, "utf-8")); + +const pdfUrl = getAssetUrl("whitepaper.pdf"); +const thumbUrl = getAssetUrl("thumb.png"); + +const metadata = createMetadata({ + title: t("whitepaper.meta.title"), + description: t("whitepaper.meta.description"), + pathname: Astro.url.pathname, +}); + +const jsonLd = JsonLdGraph({ + "@context": "https://schema.org", + "@graph": [getWhitepaperJsonLd(locale)], +}); +--- + + +
+

+ {t("whitepaper.title")} +

+ +
+

{t("whitepaper.executive_summary")}

+

{seoData.text}

+
+ + + +
+ Whitepaper Preview + + +
+
+