diff --git a/docs/components/Tokenomics/Tokenomics.module.css b/docs/components/Tokenomics/Tokenomics.module.css new file mode 100644 index 0000000000..e922c2e757 --- /dev/null +++ b/docs/components/Tokenomics/Tokenomics.module.css @@ -0,0 +1,254 @@ +/* SPDX-License-Identifier: LGPL-3.0-only */ + +.stats { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); + gap: 1rem; + margin: 1.5rem 0 2.5rem; +} + +.statCard { + background: #ffffff; + border: 1px solid rgba(15, 23, 42, 0.08); + border-radius: 12px; + padding: 1.1rem 1.25rem; + box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04); +} + +.statLabel { + font-size: 0.72rem; + text-transform: uppercase; + letter-spacing: 0.08em; + color: #6b7280; + margin: 0 0 0.4rem; +} + +.statValue { + font-size: 1.5rem; + font-weight: 600; + color: #0f2233; + line-height: 1.1; +} + +.statSub { + font-size: 0.78rem; + color: #9aa3b0; + margin-top: 0.25rem; +} + +/* Allocation */ +.allocation { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 2rem; + background: #ffffff; + border: 1px solid rgba(15, 23, 42, 0.08); + border-radius: 16px; + padding: 1.75rem; + margin: 1.5rem 0 2.5rem; + box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04); +} + +.legend tr { + transition: background 0.15s ease; +} + +.tooltip { + position: absolute; + pointer-events: none; + transform: translate(-50%, -135%); + background: #0f2233; + color: #ffffff; + font-size: 0.8rem; + font-weight: 500; + padding: 0.35rem 0.6rem; + border-radius: 8px; + white-space: nowrap; + box-shadow: 0 6px 16px rgba(15, 23, 42, 0.22); + z-index: 5; +} + +.tooltipSub { + margin-left: 0.45rem; + opacity: 0.65; + font-weight: 400; +} + +.pieWrap { + flex: 0 0 auto; + margin: 0 auto; + max-width: 100%; +} + +.pieWrap svg { + display: block; + max-width: 100%; + height: auto; +} + +.legend { + flex: 1 1 320px; + min-width: 0; + border-collapse: collapse; + width: 100%; + font-size: 0.92rem; +} + +.legend th { + text-align: left; + font-size: 0.7rem; + text-transform: uppercase; + letter-spacing: 0.06em; + color: #9aa3b0; + font-weight: 600; + padding: 0 0.5rem 0.6rem; + border-bottom: 1px solid rgba(15, 23, 42, 0.08); +} + +.legend td { + padding: 0.55rem 0.5rem; + border-bottom: 1px solid rgba(15, 23, 42, 0.05); + color: #243240; +} + +.legend tr:last-child td { + border-bottom: none; +} + +.legend .num { + text-align: right; + font-variant-numeric: tabular-nums; + white-space: nowrap; +} + +.legend .center { + text-align: center; + font-variant-numeric: tabular-nums; + white-space: nowrap; +} + +.swatch { + display: inline-block; + width: 12px; + height: 12px; + border-radius: 3px; + margin-right: 0.6rem; + vertical-align: -1px; +} + +.catCell { + font-weight: 500; +} + +/* Vesting */ +.vesting { + position: relative; + background: #ffffff; + border: 1px solid rgba(15, 23, 42, 0.08); + border-radius: 16px; + padding: 1.5rem 1.25rem; + margin: 1.5rem 0 1rem; + box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04); +} + +.svgScroll { + overflow-x: auto; +} + +.vtableWrap { + margin-top: 1.25rem; + padding-top: 1rem; + border-top: 1px solid rgba(15, 23, 42, 0.07); +} + +.vlegendItem { + transition: opacity 0.15s ease; +} + +.vestingNote { + font-size: 0.82rem; + color: #9aa3b0; + margin: 0 0 1.5rem; +} + +.tableCard { + background: #ffffff; + border: 1px solid rgba(15, 23, 42, 0.08); + border-radius: 16px; + padding: 1.25rem 1.5rem; + margin: 1.5rem 0 1rem; + box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04); + overflow-x: auto; +} + +.vlegend { + display: flex; + flex-wrap: wrap; + gap: 0.55rem 1.5rem; + margin-top: 1.25rem; + padding-top: 1.25rem; + border-top: 1px solid rgba(15, 23, 42, 0.07); +} + +.vlegendItem { + display: flex; + align-items: center; + font-size: 0.88rem; +} + +.vname { + font-weight: 500; + color: #243240; +} + +/* Mobile */ +@media (max-width: 640px) { + .stats { + grid-template-columns: repeat(2, 1fr); + gap: 0.6rem; + margin: 1.25rem 0 2rem; + } + + .statCard { + padding: 0.85rem 0.9rem; + } + + .statValue { + font-size: 1.25rem; + } + + .allocation { + flex-direction: column; + align-items: stretch; + gap: 1.25rem; + padding: 1.1rem; + border-radius: 14px; + } + + .legend { + flex: 1 1 auto; + font-size: 0.82rem; + } + + .legend th, + .legend td { + padding-left: 0.3rem; + padding-right: 0.3rem; + } + + .swatch { + margin-right: 0.4rem; + } + + .vesting { + padding: 1.1rem 0.85rem; + border-radius: 14px; + } + + /* Hover tooltip is not useful on touch; the table below conveys the same info */ + .tooltip { + display: none; + } +} diff --git a/docs/components/Tokenomics/index.tsx b/docs/components/Tokenomics/index.tsx new file mode 100644 index 0000000000..4c5b5346f9 --- /dev/null +++ b/docs/components/Tokenomics/index.tsx @@ -0,0 +1,380 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. + +import React, { useRef, useState } from 'react' +import classes from './Tokenomics.module.css' + +// --------------------------------------------------------------------------- +// Source data — Token Distribution Scheme (tab 1 of the allocation sheet) +// --------------------------------------------------------------------------- + +export const TOTAL_SUPPLY = 1_200_000_000 + +type Slice = { + key: string + pct: number + tokens: number + color: string +} + +// Ordered largest → smallest. Colours are a cohesive cool/azure palette +// anchored on the docs' primary hue (203) so the charts match the theme. +const ALLOCATION: Slice[] = [ + { key: 'Community Grants & Treasury', pct: 47, tokens: 564_000_000, color: '#075E9D' }, + { key: 'Gnosis Guild', pct: 20, tokens: 240_000_000, color: '#009DFF' }, + { key: 'Investors', pct: 15, tokens: 180_000_000, color: '#38BDF8' }, + { key: 'Uniswap CCA', pct: 10, tokens: 120_000_000, color: '#0D9488' }, + { key: 'Airdrop', pct: 4, tokens: 48_000_000, color: '#6366F1' }, + { key: 'Liquidity Reserves', pct: 3, tokens: 36_000_000, color: '#818CF8' }, + { key: 'Advisors', pct: 1, tokens: 12_000_000, color: '#94A3B8' }, +] + +const COLOR_BY_KEY: Record = Object.fromEntries( + ALLOCATION.map(s => [s.key, s.color]), +) + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +const fmtInt = (n: number) => n.toLocaleString('en-US') + +const fmtPct = (n: number) => `${Math.round(n)}%` + +const fmtCompact = (n: number) => { + if (n >= 1e9) return `${(n / 1e9).toFixed(n % 1e9 === 0 ? 0 : 2)}B` + if (n >= 1e6) return `${Math.round(n / 1e6)}M` + return fmtInt(n) +} + +function polar(cx: number, cy: number, r: number, angleDeg: number): [number, number] { + const a = ((angleDeg - 90) * Math.PI) / 180 + return [cx + r * Math.cos(a), cy + r * Math.sin(a)] +} + +function donutSlice( + cx: number, + cy: number, + rOuter: number, + rInner: number, + start: number, + end: number, +): string { + const [x1, y1] = polar(cx, cy, rOuter, end) + const [x2, y2] = polar(cx, cy, rOuter, start) + const [x3, y3] = polar(cx, cy, rInner, start) + const [x4, y4] = polar(cx, cy, rInner, end) + const large = end - start > 180 ? 1 : 0 + return [ + `M ${x1} ${y1}`, + `A ${rOuter} ${rOuter} 0 ${large} 0 ${x2} ${y2}`, + `L ${x3} ${y3}`, + `A ${rInner} ${rInner} 0 ${large} 1 ${x4} ${y4}`, + 'Z', + ].join(' ') +} + +// --------------------------------------------------------------------------- +// Key parameters +// --------------------------------------------------------------------------- + +export function KeyParameters() { + const cards = [ + { label: 'Total Supply', value: '1.2B' }, + { label: 'Circulating Supply at TGE', value: '17%' }, + ] + return ( +
+ {cards.map(c => ( +
+

{c.label}

+
{c.value}
+
+ ))} +
+ ) +} + +// --------------------------------------------------------------------------- +// Allocation donut + legend +// --------------------------------------------------------------------------- + +export function AllocationPie() { + const size = 260 + const cx = size / 2 + const cy = size / 2 + const rOuter = 122 + const rInner = 74 + const POP = 7 + + const [hover, setHover] = useState(null) + const [pos, setPos] = useState({ x: 0, y: 0 }) + const wrapRef = useRef(null) + + let cursor = 0 + const total = ALLOCATION.reduce((s, d) => s + d.pct, 0) + const arcs = ALLOCATION.map(d => { + const start = (cursor / total) * 360 + cursor += d.pct + const end = (cursor / total) * 360 + const mid = (((start + end) / 2 - 90) * Math.PI) / 180 + return { ...d, start, end, dx: Math.cos(mid) * POP, dy: Math.sin(mid) * POP } + }) + + const hovered = ALLOCATION.find(d => d.key === hover) + + const onMove = (e: React.MouseEvent) => { + const r = wrapRef.current?.getBoundingClientRect() + if (r) setPos({ x: e.clientX - r.left, y: e.clientY - r.top }) + } + + return ( +
+
+ + {arcs.map(a => { + const isHover = hover === a.key + return ( + setHover(a.key)} + onMouseLeave={() => setHover(null)} + /> + ) + })} + + 1.2B + + + TOTAL SUPPLY + + +
+ + + + + + + + + + + {ALLOCATION.map(d => ( + setHover(d.key)} + onMouseLeave={() => setHover(null)} + style={{ background: hover === d.key ? 'rgba(15,23,42,0.05)' : undefined }} + > + + + + + ))} + +
CategorySupplyTokens
+ + {d.key} + {fmtPct(d.pct)}{fmtInt(d.tokens)}
+ + {hovered && ( +
+ {hovered.key} +
+ )} +
+ ) +} + +// --------------------------------------------------------------------------- +// Vesting schedule — cumulative stacked-area chart (circulating supply) +// --------------------------------------------------------------------------- + +type Vest = { + key: string + total: number // tokens + vestMonths: number // linear duration; 1 = fully unlocked at TGE + term: string +} + +// Bottom → top stacking order (flat/immediate at the base, long linear vests on +// top). +const VESTING: Vest[] = [ + { key: 'Liquidity Reserves', total: 36_000_000, vestMonths: 1, term: '100% at TGE' }, + { key: 'Uniswap CCA', total: 120_000_000, vestMonths: 1, term: '100% at TGE' }, + { key: 'Airdrop', total: 48_000_000, vestMonths: 24, term: '24-month linear unlock' }, + { key: 'Advisors', total: 12_000_000, vestMonths: 24, term: '24-month linear unlock' }, + { key: 'Investors', total: 180_000_000, vestMonths: 24, term: '24-month linear unlock' }, + { key: 'Gnosis Guild', total: 240_000_000, vestMonths: 48, term: '48-month linear unlock' }, + { key: 'Community Grants & Treasury', total: 564_000_000, vestMonths: 48, term: '48-month linear unlock' }, +] + +// Vesting terms table — same order as the allocation table (largest → smallest +// share). Cliffs are all zero in the source schedule. +const VESTING_TERMS = [ + { key: 'Community Grants & Treasury', cliff: 'None', schedule: '48 months' }, + { key: 'Gnosis Guild', cliff: 'None', schedule: '48 months' }, + { key: 'Investors', cliff: 'None', schedule: '24 months' }, + { key: 'Uniswap CCA', cliff: 'None', schedule: '100% at TGE' }, + { key: 'Airdrop', cliff: 'None', schedule: '24 months' }, + { key: 'Liquidity Reserves', cliff: 'None', schedule: '100% at TGE' }, + { key: 'Advisors', cliff: 'None', schedule: '24 months' }, +] + +const MONTHS_AXIS = 48 +const X_TICKS = [0, 12, 24, 36, 48] +const X_LABELS = ['TGE', '12 mo', '24 mo', '36 mo', '48 mo'] +const Y_MAX = 1_200_000_000 +const Y_TICKS = [0, 300_000_000, 600_000_000, 900_000_000, 1_200_000_000] +const Y_LABELS = ['0', '300M', '600M', '900M', '1.2B'] + +// Cumulative tokens unlocked for a category at month t (first tranche at TGE). +function cumulative(v: Vest, t: number): number { + return (v.total * Math.min(t + 1, v.vestMonths)) / v.vestMonths +} + +export function VestingSchedule() { + const W = 860 + const H = 380 + const padL = 56 + const padR = 24 + const padT = 24 + const padB = 48 + const plotW = W - padL - padR + const plotH = H - padT - padB + + const x = (t: number) => padL + (t / MONTHS_AXIS) * plotW + const y = (v: number) => padT + plotH - (v / Y_MAX) * plotH + + // Build cumulative stacked boundaries for each band. + const months = Array.from({ length: MONTHS_AXIS + 1 }, (_, t) => t) + let running = months.map(() => 0) + const bands = VESTING.map(v => { + const lower = running.slice() + const upper = months.map((t, i) => lower[i] + cumulative(v, t)) + running = upper + // polygon: upper boundary L→R, then lower boundary R→L + const top = months.map((t, i) => `${x(t).toFixed(1)},${y(upper[i]).toFixed(1)}`) + const bot = months.map((t, i) => `${x(t).toFixed(1)},${y(lower[i]).toFixed(1)}`).reverse() + return { key: v.key, color: COLOR_BY_KEY[v.key], d: `M ${top.join(' L ')} L ${bot.join(' L ')} Z` } + }) + + const [hover, setHover] = useState(null) + const [tip, setTip] = useState(false) + const [pos, setPos] = useState({ x: 0, y: 0 }) + const wrapRef = useRef(null) + + const onMove = (e: React.MouseEvent) => { + const r = wrapRef.current?.getBoundingClientRect() + if (r) setPos({ x: e.clientX - r.left, y: e.clientY - r.top }) + } + + return ( +
+
+ + {/* horizontal gridlines + y labels */} + {Y_TICKS.map((t, i) => ( + + + + {Y_LABELS[i]} + + + ))} + + {/* stacked area bands */} + {bands.map(b => { + const isHover = hover === b.key + return ( + { + setHover(b.key) + setTip(true) + }} + onMouseLeave={() => { + setHover(null) + setTip(false) + }} + /> + ) + })} + + {/* x ticks + labels */} + {X_TICKS.map((m, i) => ( + + + + {X_LABELS[i]} + + + ))} + + +
+ +
+ + + + + + + + + {VESTING_TERMS.map(v => ( + { + setHover(v.key) + setTip(false) + }} + onMouseLeave={() => setHover(null)} + style={{ background: hover === v.key ? 'rgba(15,23,42,0.05)' : undefined }} + > + + + + ))} + +
CategoryLinear Unlock
+ + {v.key} + {v.schedule}
+
+ + {tip && hover && ( +
+ {hover} +
+ )} +
+ ) +} diff --git a/docs/pages/_app.tsx b/docs/pages/_app.tsx index 6873a1c71e..22f89ad10a 100644 --- a/docs/pages/_app.tsx +++ b/docs/pages/_app.tsx @@ -4,12 +4,39 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -import React from 'react' +import React, { useEffect } from 'react' import type { AppProps } from 'next/app' import 'katex/dist/katex.min.css' import '../styles/globals.css' +// When a sidebar folder is expanded, scroll its submenu into view so the +// newly revealed sub-pages are visible (Nextra doesn't do this by default, +// which hides children of folders sitting at the bottom of the sidebar). +function useSidebarAutoScroll() { + useEffect(() => { + const onClick = (e: MouseEvent) => { + const target = e.target as HTMLElement | null + const btn = target?.closest('.nextra-sidebar-container button') + if (!btn) return + const li = btn.closest('li') + if (!li) return + // Wait for the expand/collapse animation to settle, then, if the folder + // is now open, bring its last child into view. + window.setTimeout(() => { + const submenu = li.querySelector('ul') + if (submenu && submenu.getBoundingClientRect().height > 0) { + const last = (submenu.lastElementChild as HTMLElement | null) ?? submenu + last.scrollIntoView({ behavior: 'smooth', block: 'nearest' }) + } + }, 220) + } + document.addEventListener('click', onClick) + return () => document.removeEventListener('click', onClick) + }, []) +} + function App({ Component, pageProps }: AppProps) { + useSidebarAutoScroll() return ( <> diff --git a/docs/pages/_meta.json b/docs/pages/_meta.json index 90839cffea..e7a48b3075 100644 --- a/docs/pages/_meta.json +++ b/docs/pages/_meta.json @@ -115,5 +115,15 @@ }, "whitepaper": { "title": "Whitepaper" + }, + "-- FOLD Token": { + "type": "separator", + "title": "FOLD Token" + }, + "tokenomics": { + "title": "Tokenomics" + }, + "faq": { + "title": "Frequently Asked Questions" } } diff --git a/docs/pages/faq/_meta.json b/docs/pages/faq/_meta.json new file mode 100644 index 0000000000..b44b88bd64 --- /dev/null +++ b/docs/pages/faq/_meta.json @@ -0,0 +1,8 @@ +{ + "fold-token": { + "title": "FOLD Token" + }, + "auction": { + "title": "The Interfold Auction" + } +} diff --git a/docs/pages/faq/auction.mdx b/docs/pages/faq/auction.mdx new file mode 100644 index 0000000000..72011a8337 --- /dev/null +++ b/docs/pages/faq/auction.mdx @@ -0,0 +1,73 @@ +--- +title: 'The Interfold Auction' +description: + 'Frequently asked questions about the FOLD token auction — the Uniswap Continuous Clearing Auction, eligibility, holding period, and KYC' +--- + +import { Callout } from 'nextra/components' + +# The Interfold Auction + +The initial public distribution of FOLD will take place through a Uniswap Continuous Clearing Auction +(CCA). The auction is designed to distribute tokens progressively and establish a clearing price +through participant demand. + +## What is a Uniswap Continuous Clearing Auction? + +A Continuous Clearing Auction (CCA) is a price-discovery mechanism for token sales built on Uniswap +infrastructure. + +- The auction runs across multiple discrete periods. +- Participants submit either a market order or a capped order that sets the maximum price they are + willing to pay. +- At the end of each period, all successful participants pay the same clearing price. +- The minimum price for each subsequent period is the greater of the original floor or the previous + period's clearing price, so the price may rise but does not fall. +- Any tokens not distributed earlier remain available in the final period. + +By distributing tokens progressively and applying a uniform price within each period, the CCA is +designed to reduce gas competition, prevent sniping, and allow clearing prices to develop through +participant demand. The result is a fair auction for all participants. + +[Read more about Uniswap CCAs](https://cca.uniswap.org). + +## Where can I participate in the FOLD token auction? + +The FOLD token auction will be accessible through the Uniswap web app. The official auction page, +participation instructions, and relevant contract details will be published through Interfold's +verified channels before the auction opens. + + +The auction is **not yet live**. Treat any currently active link claiming to offer access to the +FOLD auction or FOLD tokens as **fraudulent**. + + +Official updates will only be published through: + +- [Interfold website](https://theinterfold.com/) +- [Interfold X account](https://x.com/theinterfold) + +## Who can participate in the FOLD token auction? + +The auction is available to eligible non-US, non-UK participants who are not subject to applicable +sanctions or other legal restrictions. Additional restrictions may apply based on jurisdiction, +residence, citizenship, entity status, sanctions screening, or other legal requirements. A list of +sanctioned parties is available at +[ofac.treasury.gov](https://ofac.treasury.gov/sanctions-programs-and-country-information). + +## Is there any holding period associated with FOLD purchased during the FOLD token auction? + +Yes. Tokens purchased in the FOLD token auction are subject to a holding period of 45 days. During +this period, FOLD cannot be used for any other activity other than ciphernode bonding. + +After this period concludes, all restrictions are lifted. + +## Do I need to complete KYC to participate? + +Yes. All participants must complete KYC through our third-party provider, Predicate, to verify non-US +status and confirm they are not subject to sanctions. + +## How long will the FOLD token auction last? + +The FOLD token auction will open with a 48-hour pre-sale window for participants to register and +complete verification, followed by a 48-hour bidding window. diff --git a/docs/pages/faq/fold-token.mdx b/docs/pages/faq/fold-token.mdx new file mode 100644 index 0000000000..6055e08cea --- /dev/null +++ b/docs/pages/faq/fold-token.mdx @@ -0,0 +1,58 @@ +--- +title: 'FOLD Token' +description: + 'Frequently asked questions about the FOLD token — its purpose, utility, and role in The Interfold protocol' +--- + +import { Callout } from 'nextra/components' + +# FOLD Token + +FOLD supports the economic operation of the Interfold network through ciphernode bonding, protocol +incentives, and protocol governance. This page summarises the token's total supply, initial +allocation, and scheduled release over time. + +## What role does FOLD play in the Interfold network? + +The Interfold is a distributed network for confidential coordination. Applications request Encrypted +Execution Environments (E3s), while ciphernodes coordinate and secure each computation. + +FOLD supports the economic operation of the network through ciphernode bonding, protocol incentives, +and protocol governance. + + +Some functions of FOLD will be introduced progressively as the network develops. The availability +and implementation of each function will be documented alongside the relevant network phase. + + +## What is the utility of the FOLD token? + +FOLD has three main, interlocking functions: + +- **Ciphernode bonding** — Ciphernode operators bond FOLD to become eligible for network duties. + Bonded FOLD remains locked while the operator is registered and may be subject to protocol-defined + withdrawal periods and penalties for provable misbehavior or failure to fulfill assigned + responsibilities. These mechanisms align operational responsibility with economic accountability. +- **Protocol incentives** — Alongside a share of protocol fees, ciphernode operators may receive + FOLD incentives for successfully completing protocol-defined duties as members of an E3 committee. +- **Governance** — FOLD holders will be able to participate in governance decisions via the Interfold + DAO. Governance may include decisions related to network parameters, protocol upgrades, and + treasury administration. The governance system is expected to use a secret-ballot application + powered by the Interfold network. + +## How can I use FOLD to operate a ciphernode? + +Operating a ciphernode is permissionless and open to anyone able to put up the required FOLD and +stablecoin bond. The setup involves provisioning cloud-based or personal hardware, running the +ciphernode software, and completing on-chain registration to begin participating in E3 committees. +For full instructions, please refer to the [Ciphernode Operators](/ciphernode-operators) +documentation. + +## Can I delegate my FOLD to a ciphernode operator? + +No. The Interfold's bonding model is deliberately operator-only. Every FOLD bonded to a ciphernode +represents capital at risk to the operator running it. Delegated capital would allow operators to run +partially-owned ciphernodes, diluting accountability and weakening the network's economic security +guarantees. We encourage all FOLD token holders to participate in ciphernode operations. + +If you need support, join the designated [Telegram group](https://t.me/enclave_e3). diff --git a/docs/pages/tokenomics.mdx b/docs/pages/tokenomics.mdx new file mode 100644 index 0000000000..8d1b41b22f --- /dev/null +++ b/docs/pages/tokenomics.mdx @@ -0,0 +1,29 @@ +--- +title: 'Interfold Tokenomics' +description: + 'An overview of the Interfold token: total supply, allocation across categories, and the vesting schedule' +--- + +import { KeyParameters, AllocationPie, VestingSchedule } from '../components/Tokenomics' + +# FOLD Tokenomics + +FOLD supports the economic operation of the Interfold network through ciphernode bonding, protocol +incentives, and protocol governance. This page summarises the token's total supply, initial +allocation, and scheduled unlocks over time. + + + +## Token Distribution + +The total supply of FOLD is 1.2 billion. + +The chart below illustrates how total supply is allocated: + + + +## Unlock Schedule + +Token unlock schedules commence at TGE unless otherwise specified. + + diff --git a/docs/styles/globals.css b/docs/styles/globals.css index 15c266c6f2..ab02fa349c 100644 --- a/docs/styles/globals.css +++ b/docs/styles/globals.css @@ -14,3 +14,16 @@ body { img { border-radius: 10px; } + +/* On mobile, Nextra merges the active page's in-page heading anchors (#...) into + the sidebar drawer (there is no right-hand "On this page" rail on small + screens). That clutters the menu, so hide those heading anchors on mobile — + page and section navigation still works. */ +@media (max-width: 767px) { + .nextra-sidebar-container a[href^='#'] { + display: none; + } + .nextra-sidebar-container ul:has(> li > a[href^='#']) { + display: none; + } +} diff --git a/docs/theme.config.jsx b/docs/theme.config.jsx index 040d457a3e..3b26af5490 100644 --- a/docs/theme.config.jsx +++ b/docs/theme.config.jsx @@ -17,10 +17,10 @@ export default { logoLink: false, banner: { - key: 'interfold-rename', + key: 'enclave-rename', text: ( - Interfold is now The Interfold. Documentation is being updated. + Enclave is now The Interfold. Documentation is being updated. ), },