From fa8533111d7acee71acdb2f67890d3c3d57cda5a Mon Sep 17 00:00:00 2001 From: Eras256 <219895655+Eras256@users.noreply.github.com> Date: Tue, 13 Oct 2026 13:58:07 -0600 Subject: [PATCH 1/3] feat(web): add /ecosystem and /build pages (EN+ES) /ecosystem lists real, running integrations with KUMPLY's attestation layer. Today that's one: 0xGasless, described exactly as Aditya approved ("which runs ERC-4337 account-abstraction infrastructure (bundler, paymaster, smart accounts) and x402 payment rails on Avalanche"), with the exact scope he asked for (the check covers UserOperations under the pilot's API key on Fuji, not 0xGasless's sponsorship service more broadly), an honest pilot/demo-attestation status note, and links to the existing blog write-up and its three Fuji transactions. No "partner"/"alianza" anywhere. No logo image: none exists anywhere in this repo (checked by filename and by content), so this ships as name-only, flagged to the user to confirm before Monse or Aditya see it. /build lists seven software ideas a builder can put on top of KUMPLY without custody or personal data, each tagged with its category and the exact SDK 1.3.0 helper it calls (isPersonAtLeast / isBusiness / isAgent, re-verified against the published npm tarball, not the repo's own README). The gas-sponsorship idea links to /ecosystem instead of repeating that content. Both pages: Fuji-only, demo-attestation and mainnet-zero-attestations language, no hackathon/track named, no superlatives, no em dashes. Linked from the footer's Developers column (desktop nav was already at 9 links plus wallet/network/language/theme controls); new Footer "ecosystem"/"build" keys in both message files. Fixes a real .gitignore bug found while adding this: the generic `build/` build-output rule was silently matching the new literal route folder apps/web/src/app/[locale]/build/ (a plain "git status" after creating the page showed nothing). The fix also needed escaping the literal brackets in [locale] as \[locale\], since unescaped square brackets are a gitignore glob character class, not literal text; the first attempt at un-ignoring the path silently failed for that reason until checked with `git check-ignore`. Verified: tsc --noEmit, eslint, and both pages rendered in EN and ES with run-web (zero pageErrors). Co-Authored-By: Claude Sonnet 5 --- .gitignore | 4 + apps/web/messages/en.json | 2 + apps/web/messages/es.json | 2 + apps/web/src/app/[locale]/build/page.tsx | 200 +++++++++++++++++++ apps/web/src/app/[locale]/ecosystem/page.tsx | 114 +++++++++++ apps/web/src/components/Footer.tsx | 2 + 6 files changed, 324 insertions(+) create mode 100644 apps/web/src/app/[locale]/build/page.tsx create mode 100644 apps/web/src/app/[locale]/ecosystem/page.tsx diff --git a/.gitignore b/.gitignore index 440c823..850de7d 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,10 @@ dist/ .next/ out/ build/ +# The generic build/ rule above also matches the real Next.js route at +# apps/web/src/app/[locale]/build/ (the "/build" page) - un-ignore it. +!apps/web/src/app/\[locale\]/build/ +!apps/web/src/app/\[locale\]/build/** # ── Hardhat / Solidity ────────────────────────────────────────── contracts/artifacts/ diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index 150aced..0527dcd 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -327,6 +327,8 @@ "developers": "Developers", "l1": "Compliance L1", "docs": "Docs", + "ecosystem": "Ecosystem", + "build": "Build", "legal": "Legal", "trademark": "Trademark Notice: AVALANCHE® and AVAX® are registered trademarks of Ava Labs, Inc. KUMPLY is an independent project and is not endorsed by, sponsored by, or affiliated with Ava Labs, Inc. KUMPLY is designed to operate as software infrastructure, not as a financial institution, custodian, or money transmitter — a formal legal opinion is planned before any fee is activated on mainnet.", "rights": "© 2026 KUMPLY Protocol. Open source under the Apache License 2.0." diff --git a/apps/web/messages/es.json b/apps/web/messages/es.json index 1a4eb2a..68d4f6a 100644 --- a/apps/web/messages/es.json +++ b/apps/web/messages/es.json @@ -327,6 +327,8 @@ "developers": "Desarrolladores", "l1": "Compliance L1", "docs": "Documentación", + "ecosystem": "Ecosistema", + "build": "Build", "legal": "Legal", "trademark": "Aviso de Marca: AVALANCHE® y AVAX® son marcas registradas de Ava Labs, Inc. KUMPLY es un proyecto independiente y no está respaldado, patrocinado ni afiliado con Ava Labs, Inc. KUMPLY está diseñado para operar como infraestructura de software, no como institución financiera, custodio ni transmisor de dinero — una opinión legal formal está planeada antes de activar cualquier comisión en mainnet.", "rights": "© 2026 Protocolo KUMPLY. Código abierto bajo Licencia Apache 2.0." diff --git a/apps/web/src/app/[locale]/build/page.tsx b/apps/web/src/app/[locale]/build/page.tsx new file mode 100644 index 0000000..0fc464d --- /dev/null +++ b/apps/web/src/app/[locale]/build/page.tsx @@ -0,0 +1,200 @@ +import { Link } from "@/i18n/routing"; +import { getLocale } from "next-intl/server"; + +type Idea = { + category: string; + title: string; + desc: string; + helper: string; + ecosystemLink?: boolean; +}; + +const content = { + en: { + title: "Build", + subtitle: "Software ideas builders can put on top of KUMPLY.", + note: "The app never holds user funds or keys, and never receives personal data. It only reads whether an address is verified.", + ideas: [ + { + category: "KYC", + title: "Anti-Sybil filter for airdrops and rewards", + desc: "Limit a reward to one claim per verified person, so a single person can't split it across many wallets.", + helper: "isPersonAtLeast(address, TIER.BASIC)", + }, + { + category: "KYC", + title: "One-person-one-vote DAO voting", + desc: "Gate voting power on a minimum verified level, so one verified person can't split their voice into many addresses.", + helper: "isPersonAtLeast(address, TIER.BASIC)", + }, + { + category: "ANY CATEGORY", + title: "Gas sponsorship limited to verified wallets", + desc: "The same idea as the 0xGasless pilot: a paymaster only sponsors gas for addresses that hold a valid attestation, at whatever category or tier the integration needs.", + helper: "verify() / isPersonAtLeast / isBusiness / isAgent", + ecosystemLink: true, + }, + { + category: "KYA", + title: "Marketplace where only verified AI agents can list or bid", + desc: "Gate listing and bidding on isAgent(), with payments settled directly wallet to wallet.", + helper: "isAgent(address)", + }, + { + category: "KYA", + title: "x402 payment APIs that only serve verified agents", + desc: "Check isAgent() before completing an HTTP 402 payment, so only a verified agent's wallet can pay for the response.", + helper: "isAgent(address)", + }, + { + category: "KYB", + title: "B2B invoicing or payroll restricted to verified businesses", + desc: "Check isBusiness() on both sides of a transfer, so the counterparty is a verified company, not an anonymous wallet.", + helper: "isBusiness(address)", + }, + { + category: "KYB", + title: "Avalanche L1 validators restricted to verified businesses (ACP-99)", + desc: "Gate validator registration on isBusiness(), the same pattern KUMPLY's own Compliance L1 uses for its ACP-99 ValidatorSetManager.", + helper: "isBusiness(address)", + }, + ] as Idea[], + ecosystemLinkText: "See how this works in practice on", + statusTitle: "Where this stands", + statusBody: "Everything above runs on Avalanche Fuji testnet. Attestations used for testing are demo attestations issued directly by KUMPLY's team, not a real KYC, KYB, or KYA check. Mainnet C-Chain stays at zero attestations issued until Sumsub production is active.", + legalNote: "This is not legal advice. Each builder reviews the rules of their own jurisdiction.", + linksIntro: "Read the full integration guide", + linksDevelopers: "SDK docs", + linksDocs: "Technical docs", + }, + es: { + title: "Build", + subtitle: "Ideas de software que un builder puede construir sobre KUMPLY.", + note: "La app nunca guarda fondos ni llaves de los usuarios y nunca recibe datos personales, solo lee si una dirección está verificada.", + ideas: [ + { + category: "KYC", + title: "Filtro anti-Sybil para airdrops y recompensas", + desc: "Limita una recompensa a un reclamo por persona verificada, para que una sola persona no pueda repartirla entre muchas wallets.", + helper: "isPersonAtLeast(address, TIER.BASIC)", + }, + { + category: "KYC", + title: "Votación de una persona, un voto en una DAO", + desc: "Controla el poder de voto con un nivel mínimo verificado, para que una sola persona verificada no pueda dividir su voz en muchas direcciones.", + helper: "isPersonAtLeast(address, TIER.BASIC)", + }, + { + category: "CUALQUIER CATEGORÍA", + title: "Patrocinio de gas limitado a wallets verificadas", + desc: "La misma idea del piloto con 0xGasless: un paymaster solo patrocina gas para direcciones con una attestation válida, en la categoría o tier que la integración necesite.", + helper: "verify() / isPersonAtLeast / isBusiness / isAgent", + ecosystemLink: true, + }, + { + category: "KYA", + title: "Marketplace donde solo agentes de IA verificados pueden publicar u ofertar", + desc: "Controla publicar y ofertar con isAgent(), con pagos liquidados directamente de wallet a wallet.", + helper: "isAgent(address)", + }, + { + category: "KYA", + title: "APIs de pago x402 que solo atienden a agentes verificados", + desc: "Revisa isAgent() antes de completar un pago HTTP 402, para que solo la wallet de un agente verificado pueda pagar por la respuesta.", + helper: "isAgent(address)", + }, + { + category: "KYB", + title: "Facturación o nómina B2B restringida a empresas verificadas", + desc: "Revisa isBusiness() en ambos lados de una transferencia, para que la contraparte sea una empresa verificada, no una wallet anónima.", + helper: "isBusiness(address)", + }, + { + category: "KYB", + title: "Validadores de una L1 de Avalanche restringidos a empresas verificadas (ACP-99)", + desc: "Controla el registro de validadores con isBusiness(), el mismo patrón que usa la propia L1 de Compliance de KUMPLY en su ValidatorSetManager de ACP-99.", + helper: "isBusiness(address)", + }, + ] as Idea[], + ecosystemLinkText: "Revisa cómo funciona esto en la práctica en", + statusTitle: "Dónde está esto hoy", + statusBody: "Todo lo anterior corre en la testnet Fuji de Avalanche. Las attestations usadas para pruebas son attestations de demo emitidas directamente por el equipo de KUMPLY, no una revisión real de KYC, KYB o KYA. Mainnet C-Chain se mantiene en cero attestations emitidas hasta que Sumsub producción esté activo.", + legalNote: "Esto no es asesoría legal. Cada builder revisa las reglas de su jurisdicción.", + linksIntro: "Lee la guía completa de integración", + linksDevelopers: "Documentación del SDK", + linksDocs: "Documentación técnica", + }, +}; + +export default async function BuildPage() { + const locale = await getLocale(); + const lang = locale === "es" ? "es" : "en"; + const t = content[lang]; + + return ( +
+
+

{t.title}

+

{t.subtitle}

+
+ +
+

{t.note}

+
+ +
+ {t.ideas.map((idea, i) => ( +
+ {idea.category} +

{idea.title}

+

{idea.desc}

+ {idea.helper} + {idea.ecosystemLink && ( +

+ {t.ecosystemLinkText} Ecosystem +

+ )} +
+ ))} +
+ +
+

{t.statusTitle}

+

{t.statusBody}

+
+ +

{t.legalNote}

+ +

+ {t.linksIntro} + {" · "} + {t.linksDevelopers} + {" · "} + {t.linksDocs} +

+ +