diff --git a/docs/.gitignore b/docs/.gitignore index 660b235ba..ddec2c5fe 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -1,4 +1,5 @@ /node_modules /.next -.DS_Store \ No newline at end of file +.DS_Store +.vercel diff --git a/docs/components/Tokenomics/Tokenomics.module.css b/docs/components/Tokenomics/Tokenomics.module.css index e922c2e75..622a3641c 100644 --- a/docs/components/Tokenomics/Tokenomics.module.css +++ b/docs/components/Tokenomics/Tokenomics.module.css @@ -142,6 +142,24 @@ font-weight: 500; } +.groupRow td { + padding: 0.75rem 0.5rem 0.1rem; + border-bottom: none; +} + +.groupLabel { + font-size: 0.7rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.09em; +} + +.groupPct { + font-weight: 700; + margin-left: 0.35rem; + opacity: 0.7; +} + /* Vesting */ .vesting { position: relative; diff --git a/docs/components/Tokenomics/index.tsx b/docs/components/Tokenomics/index.tsx index 4c5b5346f..1e52d4c0d 100644 --- a/docs/components/Tokenomics/index.tsx +++ b/docs/components/Tokenomics/index.tsx @@ -8,60 +8,62 @@ import React, { useRef, useState } from 'react' import classes from './Tokenomics.module.css' // --------------------------------------------------------------------------- -// Source data — Token Distribution Scheme (tab 1 of the allocation sheet) +// Source data // --------------------------------------------------------------------------- export const TOTAL_SUPPLY = 1_200_000_000 +type Group = 'community' | 'other' + type Slice = { key: string pct: number - tokens: number color: string + group: Group } -// Ordered largest → smallest. Colours are a cohesive cool/azure palette -// anchored on the docs' primary hue (203) so the charts match the theme. +// Community = vivid brand greens; Other = dark brand neutrals. +// Colors alternate light↔dark across stacking order for maximum area-chart legibility. 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' }, + // Community (57%) + { key: 'Foundation Treasury', pct: 40, color: '#3A7D44', group: 'community' }, // vivid forest + { key: 'CCA', pct: 10, color: '#687d71', group: 'community' }, // brand sage + { key: 'Airdrop', pct: 4, color: '#82F5AD', group: 'community' }, // brand bright mint + { key: 'Liquidity Reserve', pct: 3, color: '#C5EFD0', group: 'community' }, // pale mint + // Other (43%) + { key: 'Gnosis Guild', pct: 20, color: '#252525', group: 'other' }, // brand dark charcoal + { key: 'Investors', pct: 14, color: '#3A4E42', group: 'other' }, // dark muted forest + { key: 'Team and Advisors', pct: 9, color: '#8FAE96', group: 'other' }, // muted sage ] +const communitySlices = ALLOCATION.filter(d => d.group === 'community') +const otherSlices = ALLOCATION.filter(d => d.group === 'other') +const COMMUNITY_PCT = communitySlices.reduce((s, d) => s + d.pct, 0) // 57 +const OTHER_PCT = otherSlices.reduce((s, d) => s + d.pct, 0) // 43 + const COLOR_BY_KEY: Record = Object.fromEntries( ALLOCATION.map(s => [s.key, s.color]), ) +const GROUP_COLOR: Record = { + community: '#3A5E3C', // brand forest green + other: '#1C3A22', // dark forest +} + // --------------------------------------------------------------------------- // 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, + 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) @@ -84,7 +86,7 @@ function donutSlice( export function KeyParameters() { const cards = [ { label: 'Total Supply', value: '1.2B' }, - { label: 'Circulating Supply at TGE', value: '17%' }, + { label: 'Circulating Supply at TGE', value: '13%' }, ] return (
@@ -102,29 +104,58 @@ export function KeyParameters() { // Allocation donut + legend // --------------------------------------------------------------------------- +// Community and Other groups are separated by a small angular gap in the donut +// so the two colour families read as distinct visual clusters. +const GROUP_GAP_DEG = 6 +const TOTAL_SLICE_DEG = 360 - 2 * GROUP_GAP_DEG // 348° +const COMMUNITY_SPAN_DEG = (COMMUNITY_PCT / 100) * TOTAL_SLICE_DEG // ≈ 198.36° +const OTHER_SPAN_DEG = (OTHER_PCT / 100) * TOTAL_SLICE_DEG // ≈ 149.64° +const OTHER_START_DEG = COMMUNITY_SPAN_DEG + GROUP_GAP_DEG // ≈ 204.36° + export function AllocationPie() { - const size = 260 - const cx = size / 2 - const cy = size / 2 + const size = 260 + const cx = size / 2 // 130 + const cy = size / 2 // 130 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 POP = 7 + + const [hover, setHover] = useState(null) + const [pos, setPos] = useState({ x: 0, y: 0 }) + const [fromTable, setFromTable] = useState(false) + const wrapRef = useRef(null) + const svgRef = useRef(null) + + type Arc = Slice & { start: number; end: number; dx: number; dy: number } + + const buildArcs = (): Arc[] => { + let cur = 0 + const out: Arc[] = [] + + for (const d of communitySlices) { + const start = cur + const span = (d.pct / COMMUNITY_PCT) * COMMUNITY_SPAN_DEG + cur += span + const end = cur + const mid = (((start + end) / 2 - 90) * Math.PI) / 180 + out.push({ ...d, start, end, dx: Math.cos(mid) * POP, dy: Math.sin(mid) * POP }) + } + + cur = OTHER_START_DEG + + for (const d of otherSlices) { + const start = cur + const span = (d.pct / OTHER_PCT) * OTHER_SPAN_DEG + cur += span + const end = cur + const mid = (((start + end) / 2 - 90) * Math.PI) / 180 + out.push({ ...d, start, end, dx: Math.cos(mid) * POP, dy: Math.sin(mid) * POP }) + } + + return out + } - const hovered = ALLOCATION.find(d => d.key === hover) + const arcs = buildArcs() const onMove = (e: React.MouseEvent) => { const r = wrapRef.current?.getBoundingClientRect() @@ -134,8 +165,14 @@ export function AllocationPie() { return (
- + + {/* Donut slices */} {arcs.map(a => { const isHover = hover === a.key return ( @@ -151,11 +188,13 @@ export function AllocationPie() { opacity: hover && !isHover ? 0.78 : 1, cursor: 'pointer', }} - onMouseEnter={() => setHover(a.key)} - onMouseLeave={() => setHover(null)} + onMouseEnter={() => { setHover(a.key); setFromTable(false) }} + onMouseLeave={() => { setHover(null); setFromTable(false) }} /> ) })} + + {/* Centre label */} 1.2B @@ -169,16 +208,40 @@ export function AllocationPie() {
Category - Supply - Tokens + Distribution
- {ALLOCATION.map(d => ( +
+ + Community
({COMMUNITY_PCT}%) + + + {communitySlices.map(d => ( + { setHover(d.key); setFromTable(true) }} + onMouseLeave={() => { setHover(null); setFromTable(false) }} + style={{ background: hover === d.key ? 'rgba(15,23,42,0.05)' : undefined }} + > + + + {d.key} + + {fmtPct(d.pct)} + + ))} + + + + Other({OTHER_PCT}%) + + + {otherSlices.map(d => ( setHover(d.key)} - onMouseLeave={() => setHover(null)} + onMouseEnter={() => { setHover(d.key); setFromTable(true) }} + onMouseLeave={() => { setHover(null); setFromTable(false) }} style={{ background: hover === d.key ? 'rgba(15,23,42,0.05)' : undefined }} > @@ -186,17 +249,32 @@ export function AllocationPie() { {d.key} {fmtPct(d.pct)} - {fmtInt(d.tokens)} ))} - {hovered && ( -
- {hovered.key} -
- )} + {hover && (() => { + let tx = pos.x + let ty = pos.y + if (fromTable && svgRef.current && wrapRef.current) { + const arc = arcs.find(a => a.key === hover) + if (arc) { + const midAngle = (arc.start + arc.end) / 2 + const midR = (rOuter + rInner) / 2 + const [svgX, svgY] = polar(cx, cy, midR, midAngle) + const svgRect = svgRef.current.getBoundingClientRect() + const wrapRect = wrapRef.current.getBoundingClientRect() + tx = (svgRect.left - wrapRect.left) + svgX * (svgRect.width / size) + ty = (svgRect.top - wrapRect.top) + svgY * (svgRect.height / size) + } + } + return ( +
+ {hover} +
+ ) + })()}
) } @@ -207,89 +285,117 @@ export function AllocationPie() { type Vest = { key: string - total: number // tokens - vestMonths: number // linear duration; 1 = fully unlocked at TGE + total: number + vestMonths: number term: string } -// Bottom → top stacking order (flat/immediate at the base, long linear vests on -// top). +// Stacking order: bottom → top. Shorter unlock periods at the base so the +// chart reads as progressively longer commitments toward the 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' }, + { key: 'Liquidity Reserve', total: 36_000_000, vestMonths: 1, term: 'No restrictions from TGE' }, + { key: 'CCA', total: 120_000_000, vestMonths: 1, term: 'No restrictions from TGE' }, + { key: 'Investors', total: 168_000_000, vestMonths: 24, term: '24-month linear unlock' }, + { key: 'Airdrop', total: 48_000_000, vestMonths: 24, term: '24-month linear unlock' }, + { key: 'Team and Advisors', total: 108_000_000, vestMonths: 24, term: '24-month linear unlock' }, + { key: 'Gnosis Guild', total: 240_000_000, vestMonths: 48, term: '48-month linear unlock' }, + { key: 'Foundation Treasury', total: 480_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' }, + { key: 'Foundation Treasury', schedule: '48 month linear unlock from TGE', group: 'community' as Group }, + { key: 'CCA', schedule: 'No restrictions from TGE', group: 'community' as Group }, + { key: 'Airdrop', schedule: '24 month linear unlock from TGE', group: 'community' as Group }, + { key: 'Liquidity Reserve', schedule: 'No restrictions from TGE', group: 'community' as Group }, + { key: 'Gnosis Guild', schedule: '48 month linear unlock from TGE', group: 'other' as Group }, + { key: 'Investors', schedule: '24 month linear unlock from TGE', group: 'other' as Group }, + { key: 'Team and Advisors', schedule: '24 month linear unlock from TGE', group: 'other' as Group }, ] const MONTHS_AXIS = 48 -const X_TICKS = [0, 12, 24, 36, 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_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 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 => { + 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 [hover, setHover] = useState(null) + const [tip, setTip] = useState(false) + const [pos, setPos] = useState({ x: 0, y: 0 }) + const [fromTable, setFromTable] = useState(false) + const wrapRef = useRef(null) + const svgRef = 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 }) } + // Compute the centre of a vesting band at t=36 months, in container coords. + const getBandCenter = (key: string): { x: number; y: number } | null => { + if (!svgRef.current || !wrapRef.current) return null + const T = 36 + let runL = 0 + for (const v of VESTING) { + const c = cumulative(v, T) + if (v.key === key) { + const svgX = x(T) + const svgY = (y(runL) + y(runL + c)) / 2 + const svgRect = svgRef.current.getBoundingClientRect() + const wrapRect = wrapRef.current.getBoundingClientRect() + return { + x: (svgRect.left - wrapRect.left) + svgX * (svgRect.width / W), + y: (svgRect.top - wrapRect.top) + svgY * (svgRect.height / H), + } + } + runL += c + } + return null + } + + const communityVT = VESTING_TERMS.filter(v => v.group === 'community') + const otherVT = VESTING_TERMS.filter(v => v.group === 'other') + return (
- - {/* horizontal gridlines + y labels */} + + {/* Horizontal gridlines + y labels */} {Y_TICKS.map((t, i) => ( @@ -299,7 +405,7 @@ export function VestingSchedule() { ))} - {/* stacked area bands */} + {/* Stacked area bands */} {bands.map(b => { const isHover = hover === b.key return ( @@ -315,19 +421,13 @@ export function VestingSchedule() { filter: isHover ? 'brightness(1.08)' : 'none', cursor: 'pointer', }} - onMouseEnter={() => { - setHover(b.key) - setTip(true) - }} - onMouseLeave={() => { - setHover(null) - setTip(false) - }} + onMouseEnter={() => { setHover(b.key); setTip(true); setFromTable(false) }} + onMouseLeave={() => { setHover(null); setTip(false); setFromTable(false) }} /> ) })} - {/* x ticks + labels */} + {/* X ticks + labels */} {X_TICKS.map((m, i) => ( @@ -336,7 +436,6 @@ export function VestingSchedule() { ))} -
@@ -345,18 +444,40 @@ export function VestingSchedule() { Category - Linear Unlock + Unlock Schedule - {VESTING_TERMS.map(v => ( + + + Community + + + {communityVT.map(v => ( { - setHover(v.key) - setTip(false) - }} - onMouseLeave={() => setHover(null)} + onMouseEnter={() => { setHover(v.key); setTip(true); setFromTable(true) }} + onMouseLeave={() => { setHover(null); setTip(false); setFromTable(false) }} + style={{ background: hover === v.key ? 'rgba(15,23,42,0.05)' : undefined }} + > + + + {v.key} + + {v.schedule} + + ))} + + + + Other + + + {otherVT.map(v => ( + { setHover(v.key); setTip(true); setFromTable(true) }} + onMouseLeave={() => { setHover(null); setTip(false); setFromTable(false) }} style={{ background: hover === v.key ? 'rgba(15,23,42,0.05)' : undefined }} > @@ -370,11 +491,19 @@ export function VestingSchedule() {
- {tip && hover && ( -
- {hover} -
- )} + {tip && hover && (() => { + let tx = pos.x + let ty = pos.y + if (fromTable) { + const bc = getBandCenter(hover) + if (bc) { tx = bc.x; ty = bc.y } + } + return ( +
+ {hover} +
+ ) + })()}
) } diff --git a/docs/next-env.d.ts b/docs/next-env.d.ts index 030ecabb5..a4a7b3f5c 100644 --- a/docs/next-env.d.ts +++ b/docs/next-env.d.ts @@ -1,9 +1,3 @@ -// 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. - /// /// diff --git a/docs/next.config.js b/docs/next.config.js index 4f3ac8b89..f6f1a3eae 100644 --- a/docs/next.config.js +++ b/docs/next.config.js @@ -14,6 +14,13 @@ const withNextra = nextra({ }) module.exports = withNextra({ + webpack: (config) => { + // Nextra v2 skips addContextDependency in production, so webpack reuses + // cached MDX compilations when only _meta.json changes. Disabling the + // cache forces a full recompile on every build. + config.cache = false + return config + }, async redirects() { return [ { diff --git a/docs/pages/faq/auction.mdx b/docs/pages/faq/auction.mdx index 72011a833..0c65603e5 100644 --- a/docs/pages/faq/auction.mdx +++ b/docs/pages/faq/auction.mdx @@ -1,7 +1,7 @@ --- title: 'The Interfold Auction' description: - 'Frequently asked questions about the FOLD token auction — the Uniswap Continuous Clearing Auction, eligibility, holding period, and KYC' + 'Frequently asked questions about the FOLD token auction — the Uniswap Continuous Clearing Auction, eligibility, cooldown period, and KYC' --- import { Callout } from 'nextra/components' @@ -55,9 +55,9 @@ residence, citizenship, entity status, sanctions screening, or other legal requi 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? +## Is there any cooldown 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 +Yes. Tokens purchased in the FOLD token auction are subject to a cooldown period of 40 days. During this period, FOLD cannot be used for any other activity other than ciphernode bonding. After this period concludes, all restrictions are lifted. diff --git a/docs/pages/tokenomics.mdx b/docs/pages/tokenomics.mdx index 37aa5e65c..1e6c19df0 100644 --- a/docs/pages/tokenomics.mdx +++ b/docs/pages/tokenomics.mdx @@ -8,46 +8,58 @@ import { KeyParameters, AllocationPie, VestingSchedule } from '../components/Tok # FOLD Tokenomics +
+ Interfold tokenomics banner +
+ ## Token Distribution The total supply of FOLD is 1.2 billion. -The chart below illustrates how total supply is allocated: +The chart below illustrates how total supply is distributed: -### Community Grants & Treasury +## Community Allocations + +### Foundation Treasury The Interfold has been built in the open and is freely available as open-source software under the LGPLv3 license. To support the long-term sustainability of the network, The Interfold Foundation will allocate a significant portion of supply to community grants, ecosystem development, and future open-source contributors. Grants may be awarded proactively to support priority work or retroactively to recognize meaningful contributions. -### Gnosis Guild +### CCA -The Interfold has been developed by Gnosis Guild. To ensure its success, Gnosis Guild will act as a core contributor for the protocol's ongoing maintenance, research and development, business development, and marketing. This allocation ensures the team can continue to adequately cover the expenses associated with these activities, primarily payroll. +The CCA is designed to provide open access through uniform clearing mechanics. The starting fully diluted valuation will be set below that of previous funding rounds, allowing participants to access the launch through a transparent market-based process. -### Investors +### Airdrop -The Interfold (previously developed under the name Enclave) has completed two previous funding rounds: pre-seed and seed. Investors in these rounds share a common vision of sustainable, distributed privacy infrastructure systems. As such, these investors are subject to a 24-month linear unlock period, designed to support long-term alignment and not short-term liquidity exits. +This allocation is reserved for eligible community participants and ecosystem contributors. Distribution criteria, eligibility requirements, and timing will be announced separately. + +### Liquidity Reserve -### Uniswap CCA +Reserved to support market liquidity, primarily through decentralised exchange liquidity pools, and to help maintain orderly trading conditions following launch. -The Uniswap CCA is designed to provide open access through uniform clearing mechanics. The starting fully diluted valuation will be set below that of previous funding rounds, allowing participants to access the launch through a transparent market-based process. +## Other -### Airdrop +### Gnosis Guild -This allocation is reserved for eligible community participants and ecosystem contributors. Distribution criteria, eligibility requirements, and timing will be announced separately. +The Interfold was initially incubated by Gnosis Guild, a venture studio. Gnosis Guild is expected to provide ongoing support across research, engineering, product, operations, and ecosystem development. This allocation recognises Gnosis Guild's early role and is subject to a 48-month release schedule. -### Liquidity Reserves +### Investors -Reserved to support market liquidity, primarily through decentralised exchange liquidity pools, and to help maintain orderly trading conditions following launch. +The Interfold (previously developed under the name Enclave) has completed two previous funding rounds: pre-seed and seed. Investors in these rounds share a common vision of sustainable, distributed privacy infrastructure systems. As such, these investors are subject to a 24-month linear unlock period, designed to support long-term alignment and not short-term liquidity exits. -### Advisors +### Team and Advisors -Allocated to strategic, technical, and operational advisors, subject to vesting and lockup terms. +Allocated to the core team and advisors who supported Interfold's early development and are expected to continue contributing to the ecosystem. ## Unlock Schedule -Token unlock schedules commence at TGE unless otherwise specified. - diff --git a/docs/public/tokenomics-banner.webp b/docs/public/tokenomics-banner.webp new file mode 100644 index 000000000..775252f7a Binary files /dev/null and b/docs/public/tokenomics-banner.webp differ