diff --git a/DESIGN.md b/DESIGN.md index 8967986..e5f18f7 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -97,6 +97,10 @@ Vault title, 660px and below: the picture's left edge is `max(0, min((panel - pi Deposit and Redeem titles, 660px and below, while the heading shows the focus marker (`:focus-visible`: a 3px ink outline inside a 6px yellow band; iPhone browsers show it after a tab is tapped): her shelf line sits 6px under her feet instead of 3px and ends 6px before the heading's left edge, which is the marker's outer edge, so the line and the marker's bottom band are one 3px yellow line into the corner. The rule uses `:has()` and applies only when forced colours are off; without the marker the line is v14's. +## v17 presentation details + +Contact links (owner's decision, 2026-10-15). The footer's link row keeps its order and gains two entries after "Basket Protocol on X": "Basket Protocol on Telegram" (opens https://t.me/basket_protocol in a new tab, like the X link) and the project e-mail "protocolbasket@gmail.com" (a mailto link). The Docs page's "Find Basket" panel shows the same two under the X link, the e-mail as "Contact: protocolbasket@gmail.com". Same link style as the X link; no new rule in styles.css. + ## v16 presentation details Tokenomics tab, release chart: a single royal-blue line with its light area and its four yearly points, captioned "Total ITEM available"; under the chart one legend entry with the blue line mark, "260 million at launch → 1 billion by year four". No dashed line, no red line. The release table's columns are "End of", "Liquidity rewards released", "Development unlocked" and "Total ITEM available". Sizes, colours, axes and the phone layout are v15's. diff --git a/README.md b/README.md index 9b9758f..a2874f5 100644 --- a/README.md +++ b/README.md @@ -239,6 +239,14 @@ What the checks allow in this update: - check-art keeps every earlier assertion (whole bubble words, the bubble off her face, hands and the crate and off every opaque picture pixel, the strip clear of the text, no taller Vault title) at every width from 320 to 2560px in Chromium and WebKit, and adds: the Vault phone layout at every phone width; the live v14 title beside it (nothing in a title moves above 660px; on phones the Deposit and Redeem titles equal v14 and the Vault title differs only sideways as decided), with the v15 check rejecting the v14 look; and the focus marker at 660, 430, 393, 375, 360, 359 and 320px (the line on the marker's bottom band up to its outer edge, the v14 line put back is rejected, the line returns after blur, no shelf line at 661px). - The fork walk is unchanged in what it checks: all 91 v14 checks under the same names in the same order, none added, the same 70 page sends, the same 24 screenshot names at JPEG quality 18. check-motion, check-fixes, inspect-export, check-guards, check-preservation, check-interface, check-tokenomics, check-tokenomics-live and check-bask-guide are unchanged. +## Site update v17 + +The current patch is applied to v16, commit 27315d9974a065935f260dec29a52fa30fc7a109. One thing, decided by the owner on 2026-10-15: the project's contact links. The footer and the Docs page's "Find Basket" panel each gain two links beside the existing "Basket Protocol on X": "Basket Protocol on Telegram" (https://t.me/basket_protocol) and the project e-mail address (protocolbasket@gmail.com, a mailto link). Explorers that list token information ask for the project's e-mail to be shown on its website; this is that line. +- Two display sources change: web/src/main.tsx (footer) and web/src/Docs.tsx (Find Basket panel). No style rule, picture or script changes. +- No transaction input, send preparation, chain read, wallet request, storage key or application network call changes. Every other web/src file is byte-identical to v16, styles.css included. + +What the checks allow in this update: check-calldata freezes every web/src source except main.tsx and Docs.tsx, pins both by their reviewed digests and by their generated pieces (putting the pieces back gives v16's text exactly), allows no added call, attribute that acts, import, state, storage use or wallet request in them, and lists the four added links (two per file, in place and order) as the only additions to what a page loads or opens; check-bundle limits source changes to the same two files. + ## Site update v16 The current patch is applied to v15, commit 5110ca96c434441cdffaec727413c54ede26dafe. Two things, both decided by the owner on 2026-10-13: diff --git a/web/scripts/check-bundle.mjs b/web/scripts/check-bundle.mjs index 02ccdff..0a9f371 100644 --- a/web/scripts/check-bundle.mjs +++ b/web/scripts/check-bundle.mjs @@ -6,9 +6,9 @@ import {createHash} from 'node:crypto'; const root=process.env.BASKET_SOURCE_ROOT||path.resolve('..'); const git=args=>execFileSync('git',args,{cwd:root,encoding:'utf8'}); const changed=git(['diff','--name-only','HEAD']).trim().split('\n').filter(Boolean); -// v16 (owner-approved Tokenomics chart correction of 2026-10-13: one total line, reviewed words): only these two sources may change. +// v17 (the owner's contact links, 2026-10-15: Telegram and e-mail in the footer and the Docs Find Basket panel): only these two sources may change. // check-calldata independently pins each reviewed source and freezes every other. -const v16Source=['Tokenomics.tsx','tokenomicsData.ts'].map(f=>'web/src/'+f); +const v17Source=['main.tsx','Docs.tsx'].map(f=>'web/src/'+f); const SHELL_SHA256='82f66899a0c19f61299254c0005ee5117af0a912b97e8e57d249288e9dbc962d'; const SHARE_SHA256='dc14dd6f4068ec9325426583104b1c6ae8748fbb17d8326863c9612280eacd85'; // The new favicon: red panel, yellow frame, the header's basket in yellow. @@ -23,10 +23,10 @@ for(const p of changed){ // v12 section 5: the exact page shell is pinned below; build configuration and validation fixtures stay unchanged. assert.ok(!['web/vite.config.ts','web/tsconfig.json'].includes(p)&&(!p.startsWith('web/validation/')||p==='web/validation/README.md'),'Page shell, build configuration or validation fixture changed: '+p); assert.ok(!/(^|\/)(lib|node_modules|\.github|\.git)(\/|$)|(^|\/)\.env(?:\.|$)|(^|\/)(foundry\.toml|foundry\.lock|remappings\.txt|\.gitmodules|package\.json|[^/]*lock[^/]*)$/.test(p),'Protected path changed: '+p); - if(p.startsWith('web/src/'))assert.ok(v16Source.includes(p),'Source outside the v16 scope changed: '+p); + if(p.startsWith('web/src/'))assert.ok(v17Source.includes(p),'Source outside the v17 scope changed: '+p); assert.ok(!p.startsWith('src/'),'Root contract source changed'); } -// v16: no new source and no new public asset. +// v17: no new source and no new public asset. const untracked=git(['ls-files','--others','--exclude-standard','--','web/src','web/public']).trim().split('\n').filter(Boolean); assert.deepEqual(untracked,[],'New files in web/src or web/public'); assert.equal(sha256('web/index.html'),SHELL_SHA256,'exact v12 source shell'); diff --git a/web/scripts/check-calldata.mjs b/web/scripts/check-calldata.mjs index 9802fe1..332159b 100644 --- a/web/scripts/check-calldata.mjs +++ b/web/scripts/check-calldata.mjs @@ -11,21 +11,20 @@ const git=args=>execFileSync('git',args,{cwd:root,encoding:'utf8'}); const baseline=p=>git(['show','HEAD:'+p]); const read=p=>fs.readFileSync(path.join(root,p),'utf8'); const sha256=s=>createHash('sha256').update(s).digest('hex'); -// v16 on HEAD=v15: two things. (1) The owner-approved Tokenomics chart correction ("we should only show the supply as if -// the protocol has depositors"; "yes make it that"): Tokenomics.tsx and tokenomicsData.ts lose the chart's two component -// lines and their legend entries and change reviewed words and labels; the total line, every number, formula and the -// null-address guard are HEAD's. (2) A check script: check-motion.mjs counts the strip's own animation events only. +// v17 on HEAD=v16: one thing. The owner's contact links (2026-10-15): main.tsx gains two links in the footer and Docs.tsx +// the same two in the "Find Basket" panel (the project's Telegram group and its e-mail address), beside the X link that +// HEAD already has. No call, attribute that acts, import, state, storage, wallet request or chain read is added. // Every other web/src file is byte-identical to HEAD, styles.css included. Transactions and chain reads remain HEAD's. const protectedFiles=[ "BaskGuide.tsx", - "Docs.tsx", "Flows.tsx", "Losses.tsx", "Owner.tsx", "Scenery.tsx", "Vault.tsx", "components.tsx", - "main.tsx", + "Tokenomics.tsx", + "tokenomicsData.ts", "wallet.tsx", "baskGuideData.ts", "chain.ts", @@ -64,34 +63,26 @@ assert.equal(sha256(fs.readFileSync(path.join(root,'web/src/styles.css')).subarr // v16: no style rule after HEAD's text (the v15 rules are HEAD's own now). const cssTail=fs.readFileSync(path.join(root,'web/src/styles.css')).subarray(Buffer.byteLength(baseline('web/src/styles.css'))).toString('utf8'); assert.equal(cssTail,'','v16: no style rule after the text of HEAD'); -// The v16 files: byte-identical to HEAD once their documented pieces [v16, HEAD] are put back (each exactly once), so +// The v17 files: byte-identical to HEAD once their documented pieces [v16, HEAD] are put back (each exactly once), so // every word, call and attribute in them is pinned. The list between the two marker lines was generated from the // difference to HEAD; the pins further down do not depend on it: they compare with HEAD itself or with texts written // out in this file, so a piece cannot carry a change to a transaction, a wallet request or a chain read past them. -// >>> v16 pieces (generated from the difference to HEAD, not edited by hand) +// >>> v17 pieces (generated from the difference to HEAD, not edited by hand) const editedFiles={ - "Tokenomics.tsx":[ - ["import { many } from \"./chain\";\nimport { ADDRESSES, ALLOCATIONS, ALLOCATION_HEADERS, ALLOCATION_ROWS, RELEASE_HEADERS, RELEASE_ROWS, PARAGRAPHS, T, OUTSIDE_AT_LAUNCH, TOTAL_SUPPLY, outsideContracts, formatItem, SUPPLY_LABEL, RELEASE_LABEL, type Addresses } from \"./tokenomicsData\";\n\n", - "import { many } from \"./chain\";\nimport { ADDRESSES, ALLOCATIONS, ALLOCATION_HEADERS, ALLOCATION_ROWS, RELEASE_HEADERS, RELEASE_ROWS, PARAGRAPHS, T, gaugeReleased, developmentVested, outsideContracts, formatItem, SUPPLY_LABEL, RELEASE_LABEL, type Addresses } from \"./tokenomicsData\";\n\n"], - [" const line = (fn: (seconds: number) => number) => samples.map((m, i) => `${i ? \"L\" : \"M\"}${x(m).toFixed(3)},${y(fn(m / 48 * T)).toFixed(3)}`).join(\" \");\n return {[0, 250, 500, 750, 1000].map(n => {formatItem(n)})}{[0, 12, 24, 36, 48].map(m => {m})}{[12, 24, 36, 48].map(m => )};\n}\nfunction ReleaseChart() {\n return
Total ITEM available
Million ITEM
Months after launch
{formatItem(OUTSIDE_AT_LAUNCH / 1e6)} million at launch → {formatItem(TOTAL_SUPPLY / 1e9)} billion by year four
;\n}\n", - " const line = (fn: (seconds: number) => number) => samples.map((m, i) => `${i ? \"L\" : \"M\"}${x(m).toFixed(3)},${y(fn(m / 48 * T)).toFixed(3)}`).join(\" \");\n return {[0, 250, 500, 750, 1000].map(n => {formatItem(n)})}{[0, 12, 24, 36, 48].map(m => {m})}{[12, 24, 36, 48].map(m => )};\n}\nfunction ReleaseChart() {\n return
Released over four years
Million ITEM
Months after launch
Outside the contracts, at mostLiquidity rewards releasedDevelopment vested
;\n}\n"] + "main.tsx":[ + [" \n \n Basket Protocol on Telegram\n \n protocolbasket@gmail.com\n \n", + " \n \n"] ], - "tokenomicsData.ts":[ - [" \"who\": \"BASK/USDG liquidity providers\",\n \"terms\": \"Released over four years, with more rewards at the start\"\n },\n", - " \"who\": \"BASK/USDG liquidity providers\",\n \"terms\": \"Released by the gauge over four years, front loaded, only while someone is staked\"\n },\n"], - [" \"How the supply is divided:\",\n \"What is available when. At launch, 260,000,000 ITEM (26% of the supply) is available through the launch pool, the swarm's share, operations and the unlocked development amount. The remaining 740,000,000 ITEM is released over four years: 700,000,000 as liquidity rewards and 40,000,000 through development vesting. The chart and table show this schedule with liquidity providers staked in both reward pools from launch throughout the four years.\",\n \"The line shows the total ITEM available: the 260,000,000 available at launch plus the liquidity rewards and development tokens released by each date. The table shows the breakdown.\",\n \"Where value flows. ITEM pays the people who make BASK and ITEM tradable: liquidity providers earn ITEM from the gauges. ITEM holders who stake earn the vault's fees, 0.5% of every deposit and 0.5% of every redemption, paid in BASK. Trading fees in the two Uniswap v2 pools stay with the liquidity providers of those pools. Trades in the launch pool carry a 1.25% fee set by IMD: 1% to the protocol's operations wallet and 0.25% to IMD.\",\n", - " \"How the supply is divided:\",\n \"What is available when. At launch, 26% of the supply exists outside the reward and vesting contracts: the launch pool, the swarm's share, operations and the unlocked development amount. The other 74% is held by contracts and comes out only on schedule: 70% through the two gauges, to the people staked in them, and 4% through vesting. If both gauges run without a pause, the most that can be outside those contracts is:\",\n \"A gauge's clock only runs while someone is staked, so these are the earliest dates, not fixed ones.\",\n \"Where value flows. ITEM pays the people who make BASK and ITEM tradable: liquidity providers earn ITEM from the gauges. ITEM holders who stake earn the vault's fees, 0.5% of every deposit and 0.5% of every redemption, paid in BASK. Trading fees in the two Uniswap v2 pools stay with the liquidity providers of those pools. Trades in the launch pool carry a 1.25% fee set by IMD: 1% to the protocol's operations wallet and 0.25% to IMD.\",\n"], - ["export const ALLOCATION_HEADERS = [\"Share\",\"ITEM\",\"Who\",\"Terms\"] as const;\nexport const RELEASE_HEADERS = [\"End of\",\"Liquidity rewards released\",\"Development unlocked\",\"Total ITEM available\"] as const;\nexport const ADDRESSES: Record<\"ITEM\" | \"ITEM_STAKING\" | \"BASK_USDG_GAUGE\" | \"ITEM_ETH_GAUGE\" | \"DEV_VESTING\", Address | null> = {\n", - "export const ALLOCATION_HEADERS = [\"Share\",\"ITEM\",\"Who\",\"Terms\"] as const;\nexport const RELEASE_HEADERS = [\"End of\",\"Released by the gauges\",\"Vested\",\"Outside the contracts, at most\"] as const;\nexport const ADDRESSES: Record<\"ITEM\" | \"ITEM_STAKING\" | \"BASK_USDG_GAUGE\" | \"ITEM_ETH_GAUGE\" | \"DEV_VESTING\", Address | null> = {\n"], - ["export const SUPPLY_LABEL = ALLOCATIONS.map(r => r.who + \" \" + r.share + \"%\").join(\", \");\nexport const RELEASE_LABEL = \"Total ITEM available: \" + formatItem(OUTSIDE_AT_LAUNCH) + \" at launch, \" + RELEASES.map(r => formatItem(r.outside) + \" at year \" + r.year).join(\", \") + \". Includes the launch allocation, liquidity rewards and unlocked development tokens, with liquidity providers staked in both reward pools throughout the four years.\";\n", - "export const SUPPLY_LABEL = ALLOCATIONS.map(r => r.who + \" \" + r.share + \"%\").join(\", \");\nexport const RELEASE_LABEL = \"Outside the contracts, at most: \" + formatItem(OUTSIDE_AT_LAUNCH) + \" at launch, \" + RELEASES.map(r => formatItem(r.outside) + \" at year \" + r.year).join(\", \") + \". Liquidity rewards released: \" + formatItem(GAUGE_ALLOCATION) + \" over four years. Development vested: 0 before month 12, \" + formatItem(developmentVested(CLIFF)) + \" at month 12, \" + formatItem(VESTED_ALLOCATION) + \" at month 48.\";\n"] + "Docs.tsx":[ + ["

\n

\n \n Basket Protocol on Telegram\n \n

\n

\n Contact: protocolbasket@gmail.com\n

\n \n", + "

\n \n"] ] }; -// <<< v16 pieces +// <<< v17 pieces assert.deepEqual(Object.keys(editedFiles),[ - "Tokenomics.tsx", - "tokenomicsData.ts" -],'the v16 files'); + "main.tsx", + "Docs.tsx" +],'the v17 files'); const putBack=(text,pieces,what)=>{for(const [n,o] of pieces){assert.equal(text.split(n).length,2,what+': expected once: '+n);text=text.split(n).join(o);}return text;}; for(const [f,edits] of Object.entries(editedFiles)) assert.equal(putBack(read('web/src/'+f),edits,f),baseline('web/src/'+f),f+' changed beyond the documented pieces'); // Calls that build, encode, simulate or send a transaction (or parse its arguments) or read the chain. @@ -151,11 +142,11 @@ const expected={}; // equals HEAD in order, text for text. None of them builds or starts a transaction (no onSubmit, getSpec, build or // claim) and none contains a guarded call (both asserted below). The list between the marker lines was generated // from the difference to HEAD, as the pieces were; each why was written by hand, and an entry without one fails. -// >>> v16 attributes (generated from the difference to HEAD; each why written by hand) +// >>> v17 attributes (generated from the difference to HEAD; each why written by hand) const attributeChanges={ }; -// <<< v16 attributes +// <<< v17 attributes // Every call expression: HEAD's calls, in order and place, are all still there, except the removed ones listed here; // a call that only gained the documented piece inside it (put back before comparing) counts as kept. Every added // call, including display helpers and effects, is independently pinned below, not only the guarded calls. @@ -168,28 +159,7 @@ const attributeChanges={ // The guarded startup eth_accounts answer is part of HEAD and must remain exact. const restoreAccountReply=(x)=>x.text; // Reviewed v16 differences in calls and watched-name uses. Independent of the generated pieces. -const callChanges={ - "Tokenomics.tsx": { - "why": "v16 (owner-approved chart correction, 2026-10-13): the release chart shows one line, the total ITEM available. Its two component lines (liquidity rewards released, development vested) and their legend entries are removed, the caption and the one legend line are re-worded, and the legend's two figures are formatted from the data file's own launch and supply constants. The total line and its area, the axes, the points, the tables and the null-address guard before the only optional read are HEAD's. No read, send, storage or network use is added.", - "pieces": [], - "removed": [ - "line(gaugeReleased)", - "line(developmentVested)" - ], - "uses": [] - }, - "tokenomicsData.ts": { - "why": "v16 (owner-approved chart correction, 2026-10-13): reviewed words only. One allocation term, the two release paragraphs, the release table's three column headings and the chart's accessible description are re-worded to describe the total available with liquidity providers staked from launch; the description no longer formats the two component totals. Every number, formula, schedule, address constant and helper is HEAD's.", - "pieces": [], - "removed": [ - "formatItem(GAUGE_ALLOCATION)", - "formatItem(developmentVested(CLIFF))", - "developmentVested(CLIFF)", - "formatItem(VESTED_ALLOCATION)" - ], - "uses": [] - } -}; +const callChanges={}; const WATCHED=[...names].filter(x=>!x.includes('.')).concat('client'); // The state setters and refs a file declares: const [x, setX] = useState(...) gives setX, const r = useRef(...) gives r. function stateNames(text,file){ @@ -240,7 +210,7 @@ function localDeclarations(file,text,fn,list){ const sources=git(['ls-tree','-r','--name-only','HEAD','web/src']).trim().split('\n').filter(p=>/\.tsx?$/.test(p)).map(p=>p.slice(8)); assert.deepEqual(git(['ls-files','--cached','--others','--exclude-standard','web/src']).trim().split('\n').filter(p=>/\.tsx?$/.test(p)).map(p=>p.slice(8)).sort(),[...sources,...NEW_SOURCES].sort(),'No source file added or removed'); // Every source is either frozen (byte-identical to HEAD) or a v16 file with its documented pieces (above). -assert.deepEqual([...sources].sort(),[...protectedFiles,...Object.keys(editedFiles)].filter(f=>/\.tsx?$/.test(f)).sort(),'every web/src source is frozen or a documented v16 file'); +assert.deepEqual([...sources].sort(),[...protectedFiles,...Object.keys(editedFiles)].filter(f=>/\.tsx?$/.test(f)).sort(),'every web/src source is frozen or a documented v17 file'); const scans={},facts={attributes:{},guarded:{},calls:{}}; for(const f of sources){ const old=calls(baseline('web/src/'+f),f),now=calls(read('web/src/'+f),f),c=callChanges[f]??{pieces:[],removed:[],uses:[]},used=c.pieces.map(()=>0); @@ -264,11 +234,11 @@ if(process.env.BASKET_GATE_FACTS)fs.writeFileSync(process.env.BASKET_GATE_FACTS, // includes these pins. Changing a callback, receiver, argument, location, order or count changes the digest. // >>> reviewed calls (manual; never refreshed by put-pieces) const addedCallPins={ - "Tokenomics.tsx": { - "sha256": "7227ef4f006ce23b4c3ab906792bbf5a6a714da0bec09c988611e350d7ebd540", - "callees": "formatItem formatItem" + "main.tsx": { + "sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "callees": "" }, - "tokenomicsData.ts": { + "Docs.tsx": { "sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", "callees": "" } @@ -276,7 +246,8 @@ const addedCallPins={ // <<< reviewed calls // The exact reviewed source of the two v14 files (frozen now) and of the two v16 files, beyond either generated block. const reviewedSourcePins={ - "Docs.tsx": "6c9cc7e308109e50b7b9a6e5c861fc4d9feec927e7d568f4c238e9a807930e77", + "Docs.tsx": "80a96319c164bfecef20669b86f4cae043c98e714123ff97b065b884e21d228e", + "main.tsx": "57c087df660d9d60b3c6b2ca6d4708136cbb8850681ec9fdd3843ae4b9f0d53a", "Flows.tsx": "b9452b067fabd93c4ce9718d19e4c70906263068bcb81589b2e151beb411c309", "Tokenomics.tsx": "6d57c2f9d8629f7207368b6d00618da9351e72aba0de52fcff225490be47c85a", "tokenomicsData.ts": "8e2cfc45c8055f2dbfdc7a7610e57856809845d52dd103712dd8398f3b11a99a" @@ -450,12 +421,27 @@ function loadsOf(text,file){ })(tree); return out; } -// v16 adds nothing a page loads or opens: every file equals HEAD here (the module files are scanned above too). -const loadDisplayAdded={}; +// v17 adds exactly four links a page opens, the owner's contact links (2026-10-15), each written out here with its place: +// the Telegram group and the e-mail address in the footer (main.tsx, after the X link) and in the Docs "Find Basket" +// panel (Docs.tsx, after the X link). Nothing else a page loads or opens changes in any file: HEAD's list stays complete, +// in order and in place, and the only additions are these, in this order. +const loadDisplayAdded={ + "main.tsx": [ + {"place": "App", "text": "href=\"https://t.me/basket_protocol\""}, + {"place": "App", "text": "href=\"mailto:protocolbasket@gmail.com\""} + ], + "Docs.tsx": [ + {"place": "DocsPage", "text": "href=\"https://t.me/basket_protocol\""}, + {"place": "DocsPage", "text": "href=\"mailto:protocolbasket@gmail.com\""} + ] +}; const loadUses={}; for(const f of sources){ - const h=loadsOf(baseline('web/src/'+f),f),n=loadsOf(read('web/src/'+f),f); - assert.deepEqual(n,[...(loadDisplayAdded[f]??[]),...h],f+': something a page loads or opens (a picture, frame, worker or element made in script, a navigation, a link, a style attribute) was added, removed, changed or moved'); + const h=loadsOf(baseline('web/src/'+f),f),n=loadsOf(read('web/src/'+f),f),added=loadDisplayAdded[f]??[]; + const isAdded=x=>added.some(a=>a.place===x.place&&a.text===x.text); + assert.deepEqual(n.filter(x=>!isAdded(x)),h,f+': something a page loads or opens (a picture, frame, worker or element made in script, a navigation, a link, a style attribute) was added, removed, changed or moved'); + assert.deepEqual(n.filter(isAdded),added,f+': the added links differ from the documented ones in text, place, order or count'); + for(const a of added)assert.equal(h.filter(x=>x.place===a.place&&x.text===a.text).length,0,f+': a documented added link already existed at HEAD: '+a.text); if(n.length)loadUses[f]=n.length; } // v12: the wallet and RPC methods the pages name. Every `method` given as a property (or assigned) in web/src, in order @@ -681,70 +667,12 @@ for(const f of Object.keys(editedFiles)){ transactionCode[f]={pieces:n.count,namesDeclaredAroundThem:n.names}; } const namesAdded={ - "Tokenomics.tsx": { - "OUTSIDE_AT_LAUNCH": "import OUTSIDE_AT_LAUNCH from \"./tokenomicsData\"", - "TOTAL_SUPPLY": "import TOTAL_SUPPLY from \"./tokenomicsData\"" - }, - "tokenomicsData.ts": {} + "main.tsx": {}, + "Docs.tsx": {} }; // v16: the exact declarations that change at the top of the two files (two imports leave Tokenomics.tsx; four data // declarations of tokenomicsData.ts carry the reviewed words); never generated by put-pieces. -const moduleChanges={ - "Tokenomics.tsx": [ - { - "name": "gaugeReleased", - "head": [ - "import gaugeReleased from \"./tokenomicsData\"" - ], - "now": null - }, - { - "name": "developmentVested", - "head": [ - "import developmentVested from \"./tokenomicsData\"" - ], - "now": null - } - ], - "tokenomicsData.ts": [ - { - "name": "ALLOCATIONS", - "head": [ - "ALLOCATIONS = [ { \"share\": 49, \"amount\": 490000000, \"who\": \"BASK/USDG liquidity providers\", \"terms\": \"Released by the gauge over four years, front loaded, only while someone is staked\" }, { \"share\": 21, \"amount\": 210000000, \"who\": \"ITEM/ETH liquidity providers\", \"terms\": \"Same schedule, same rules\" }, { \"share\": 10, \"amount\": 100000000, \"who\": \"ITEM/ETH launch pool\", \"terms\": \"Paired with ETH at launch; where ITEM first trades\" }, { \"share\": 10, \"amount\": 100000000, \"who\": \"The IMD swarm that built and launched the contracts\", \"terms\": \"Paid to IMD's members under IMD's own rules\" }, { \"share\": 5, \"amount\": 50000000, \"who\": \"Operations\", \"terms\": \"Seeding the two pools and the first stakes; held by the owner wallet\" }, { \"share\": 4, \"amount\": 40000000, \"who\": \"Development, vested\", \"terms\": \"Nothing for 12 months, 25% at month 12, the rest evenly to month 48; cannot be revoked or sped up\" }, { \"share\": 1, \"amount\": 10000000, \"who\": \"Development, unlocked\", \"terms\": \"Sent once at launch\" } ] as const" - ], - "now": [ - "ALLOCATIONS = [ { \"share\": 49, \"amount\": 490000000, \"who\": \"BASK/USDG liquidity providers\", \"terms\": \"Released over four years, with more rewards at the start\" }, { \"share\": 21, \"amount\": 210000000, \"who\": \"ITEM/ETH liquidity providers\", \"terms\": \"Same schedule, same rules\" }, { \"share\": 10, \"amount\": 100000000, \"who\": \"ITEM/ETH launch pool\", \"terms\": \"Paired with ETH at launch; where ITEM first trades\" }, { \"share\": 10, \"amount\": 100000000, \"who\": \"The IMD swarm that built and launched the contracts\", \"terms\": \"Paid to IMD's members under IMD's own rules\" }, { \"share\": 5, \"amount\": 50000000, \"who\": \"Operations\", \"terms\": \"Seeding the two pools and the first stakes; held by the owner wallet\" }, { \"share\": 4, \"amount\": 40000000, \"who\": \"Development, vested\", \"terms\": \"Nothing for 12 months, 25% at month 12, the rest evenly to month 48; cannot be revoked or sped up\" }, { \"share\": 1, \"amount\": 10000000, \"who\": \"Development, unlocked\", \"terms\": \"Sent once at launch\" } ] as const" - ] - }, - { - "name": "PARAGRAPHS", - "head": [ - "PARAGRAPHS = [ \"ITEM's supply is 1,000,000,000, created once at launch. Nothing can mint more. It is a plain token: anyone can hold, send or trade it.\", \"How the supply is divided:\", \"What is available when. At launch, 26% of the supply exists outside the reward and vesting contracts: the launch pool, the swarm's share, operations and the unlocked development amount. The other 74% is held by contracts and comes out only on schedule: 70% through the two gauges, to the people staked in them, and 4% through vesting. If both gauges run without a pause, the most that can be outside those contracts is:\", \"A gauge's clock only runs while someone is staked, so these are the earliest dates, not fixed ones.\", \"Where value flows. ITEM pays the people who make BASK and ITEM tradable: liquidity providers earn ITEM from the gauges. ITEM holders who stake earn the vault's fees, 0.5% of every deposit and 0.5% of every redemption, paid in BASK. Trading fees in the two Uniswap v2 pools stay with the liquidity providers of those pools. Trades in the launch pool carry a 1.25% fee set by IMD: 1% to the protocol's operations wallet and 0.25% to IMD.\", \"What cannot change. The split above, the four-year gauge schedule, the 7-day fee stream and the vesting dates are constants in contracts with no owner. Nobody holds a key that can alter them.\" ] as const" - ], - "now": [ - "PARAGRAPHS = [ \"ITEM's supply is 1,000,000,000, created once at launch. Nothing can mint more. It is a plain token: anyone can hold, send or trade it.\", \"How the supply is divided:\", \"What is available when. At launch, 260,000,000 ITEM (26% of the supply) is available through the launch pool, the swarm's share, operations and the unlocked development amount. The remaining 740,000,000 ITEM is released over four years: 700,000,000 as liquidity rewards and 40,000,000 through development vesting. The chart and table show this schedule with liquidity providers staked in both reward pools from launch throughout the four years.\", \"The line shows the total ITEM available: the 260,000,000 available at launch plus the liquidity rewards and development tokens released by each date. The table shows the breakdown.\", \"Where value flows. ITEM pays the people who make BASK and ITEM tradable: liquidity providers earn ITEM from the gauges. ITEM holders who stake earn the vault's fees, 0.5% of every deposit and 0.5% of every redemption, paid in BASK. Trading fees in the two Uniswap v2 pools stay with the liquidity providers of those pools. Trades in the launch pool carry a 1.25% fee set by IMD: 1% to the protocol's operations wallet and 0.25% to IMD.\", \"What cannot change. The split above, the four-year gauge schedule, the 7-day fee stream and the vesting dates are constants in contracts with no owner. Nobody holds a key that can alter them.\" ] as const" - ] - }, - { - "name": "RELEASE_HEADERS", - "head": [ - "RELEASE_HEADERS = [\"End of\", \"Released by the gauges\", \"Vested\", \"Outside the contracts, at most\"] as const" - ], - "now": [ - "RELEASE_HEADERS = [\"End of\", \"Liquidity rewards released\", \"Development unlocked\", \"Total ITEM available\"] as const" - ] - }, - { - "name": "RELEASE_LABEL", - "head": [ - "RELEASE_LABEL = \"Outside the contracts, at most: \" + formatItem(OUTSIDE_AT_LAUNCH) + \" at launch, \" + RELEASES.map(r => formatItem(r.outside) + \" at year \" + r.year).join(\", \") + \". Liquidity rewards released: \" + formatItem(GAUGE_ALLOCATION) + \" over four years. Development vested: 0 before month 12, \" + formatItem(developmentVested(CLIFF)) + \" at month 12, \" + formatItem(VESTED_ALLOCATION) + \" at month 48.\"" - ], - "now": [ - "RELEASE_LABEL = \"Total ITEM available: \" + formatItem(OUTSIDE_AT_LAUNCH) + \" at launch, \" + RELEASES.map(r => formatItem(r.outside) + \" at year \" + r.year).join(\", \") + \". Includes the launch allocation, liquidity rewards and unlocked development tokens, with liquidity providers staked in both reward pools throughout the four years.\"" - ] - } - ] -}; +const moduleChanges={}; // v16 changes no declaration at the top of a component or hook; never generated by put-pieces. const scopeChanges={}; const newNames={}; diff --git a/web/src/Docs.tsx b/web/src/Docs.tsx index 59a0961..d0a20be 100644 --- a/web/src/Docs.tsx +++ b/web/src/Docs.tsx @@ -249,6 +249,14 @@ export function DocsPage() { Basket Protocol on X

+

+ + Basket Protocol on Telegram + +

+

+ Contact: protocolbasket@gmail.com +

diff --git a/web/src/main.tsx b/web/src/main.tsx index 84a88f8..3a5c475 100644 --- a/web/src/main.tsx +++ b/web/src/main.tsx @@ -282,6 +282,10 @@ function App() { Basket Protocol on X + + Basket Protocol on Telegram + + protocolbasket@gmail.com
diff --git a/web/validation/README.md b/web/validation/README.md index 6b6b37c..6a61cff 100644 --- a/web/validation/README.md +++ b/web/validation/README.md @@ -53,4 +53,6 @@ The v14 baseline is the v13 commit 2b7d55bc32d09610fed936d963d9a8c492f4eecf. che The v15 baseline is the v14 commit c05c174f639d352fb6184636bcc6e083031daa65. v15 changes style rules only (the end of styles.css): check-calldata has no edited script file, freezes every source whole against v14, keeps the module and source digests and pins the added style rules by one reviewed digest with a scan; check-bundle's source scope is styles.css alone with no new file. check-visibility compares the v14 six-route phone view at 375×812 with no exception: every first-screen element keeps its words and vertical place, the Deposit and Redeem titles equal v14 across the panel, and the Vault title is asserted across the panel (picture in the middle, shelf line across the panel, heading centred) against the v14 look. check-art keeps its assertions at every width from 320 to 2560px in both engines and adds the Vault phone layout, the comparison of every title with the live v14 title, and the heading's focus marker meeting the shelf line on Deposit and Redeem at seven phone widths, each with the v14 look rejected by the same check. The v15 fork keeps all 91 v14 checks under their names in order with none added, the same 70 page sends and the same 24 screenshots at JPEG quality 18. +The v17 baseline is the v16 commit 27315d9974a065935f260dec29a52fa30fc7a109. v17 changes two display sources (main.tsx: two footer links; Docs.tsx: the same two links in the Find Basket panel) and nothing else; check-calldata freezes every other source, pins the two by digest and by generated pieces, and lists the four added links as the only additions to what a page loads or opens. No transaction, wallet request, chain read or storage change. + The v16 baseline is the v15 commit 5110ca96c434441cdffaec727413c54ede26dafe. v16 changes two display sources (Tokenomics.tsx, tokenomicsData.ts: the release chart shows one total line with reviewed words; numbers and formulas unchanged) and one check script (check-motion.mjs counts only the slogan strip's own animationiteration events, so the Deposit page's CLOSED sign no longer fails it). check-calldata permits the two sources through documented pieces, written-out call and declaration changes and new reviewed digests, and freezes every other source; check-bundle's source scope is those two files. check-visibility and check-art compare with the v15 site and expect equality everywhere they compare (the Tokenomics tab is not on the first screen of any route). The v16 fork keeps every v15 check under its name in order, the same 70 page sends and the same 24 screenshots at JPEG quality 18.