Merge site-redesign: the full-site redesign on our content (the GPU hero, the live DAG panel, the miner download layout, the wallet layout, the five secondary pages from their sources, the restyled generated pages, the copy pass)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
commit
b42ffe6299
36 changed files with 2818 additions and 621 deletions
45
docs/plans/site-copy-pass.md
Normal file
45
docs/plans/site-copy-pass.md
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
# Site copy pass, 7 October 2026
|
||||
|
||||
the project lead, 11:2x UK: "free reign to check the copy everywhere to make it sound as human, friendly and GPU community focused."
|
||||
Done as part of the redesign integration, on every served page. The register: one miner talking to another, second
|
||||
person where it fits, no corporate voice, no hype, no scare. Every fact and number is exactly as our files state it;
|
||||
the ledger's stated sentences (tools/ci/ledger-text-check.mjs), the regulatory lines and "not an offer to sell
|
||||
anything" are verbatim. Copy law kept: no em dashes, no two-beat antithesis, no aphorisms, short sentences, numbers in
|
||||
tables, no orphan word on a line (tools/ci/site-orphan-check.mjs at 390 px).
|
||||
|
||||
## The twenty biggest changes
|
||||
|
||||
| # | Page | Before | After |
|
||||
|---|---|---|---|
|
||||
| 1 | Home, hero | A proof-of-work chain for graphics cards, whose miners prove the blocks. | Your GPU has more to give. (the package's line, kept) + You already own the card. Igneum gives it a job worth doing: mine the block, prove it, watch it lock. One click installs the node, the miner and the prover. |
|
||||
| 2 | Home, principles | (none; the home page was the scene and three facts) | Graphics cards only / The miners are the provers / No premine, no stake / Every claim has a status, one line each under the hero |
|
||||
| 3 | Home, live panel | (the scene with no heading) | Follow the work. See the chain grow. + "Every square is a real block, read from one node every 2 s. Nothing here is a replay." |
|
||||
| 4 | Home, reasons | (none) | Three reasons to power on: A program that never holds still / Work you can see / One click, and it mines, each in plain words with the measured limit named |
|
||||
| 5 | Home, economics | (on the litepaper only) | Made for the people running the hardware. Every block pays the card that found it and the cards that prove it. The protocol carves out nothing for a team, a foundation or a fund. |
|
||||
| 6 | Home, CTA band | (none) | Give your GPU something to do. Download Ember, watch the devnet, and tell us what breaks. The people on the Discord run cards like yours. |
|
||||
| 7 | Miner, hero | Install. Start. The card mines. (kept) | The miner built around your card. Your rate, your watts, what it costs a day at your price, and the chain drawn live with your own blocks ringed. |
|
||||
| 8 | Miner, downloads | Three buttons in a list | A platform card: Windows, macOS, Linux / HiveOS, each with one sentence of what to expect ("A Mac mines on its GPU at about a fifth of a flagship card and proves on its CPU, slowly."), the signed file, its version, size and sha256 |
|
||||
| 9 | Miner, steps | (none) | Check your card / Install the official build / Press Start, then tell us, with the seed-phrase warning in the second person: "Keep it to yourself. This site never asks for it." |
|
||||
| 10 | Miner, FAQ | (none) | Six questions miners ask first: does the website mine on my GPU, does my card mine and prove, is the devnet paying real money, is there a fee, can I run it on a rig or in a pool, where do the numbers come from |
|
||||
| 11 | Miner, Linux tab | Install on a Hive rig | For the rig people. One tarball, the miner and the node inside, the same signed manifest as the desktop apps. |
|
||||
| 12 | Wallet, hero | Your coins. Final means final. (kept) | ... it checks every finality certificate itself with the node's own code. No confirmation counts, no trusting the node. (verifies -> checks) |
|
||||
| 13 | Wallet, MetaMask | One click adds the Igneum network with its chain id and RPC. | + a link to the same values on this site, so a Windows or Linux miner has a path today |
|
||||
| 14 | Journey (new page) | Journey linked to the litepaper's roadmap table | Six phases from the specification to a fair launch. Each closes at its gate, a measurement published whether it passes or fails, so there is no date to slip. + the log, newest first, with a filter |
|
||||
| 15 | Claims (new page) | Footer link into the litepaper | What Igneum does not claim. Every limit we know of, written down here before anyone else writes it. (the body is the litepaper's section, unchanged) |
|
||||
| 16 | RandomX (new page) | Footer link into the litepaper | Random-program mining is the idea Igneum borrowed. Here is what changed when it was rebuilt for graphics cards, and what RandomX's seven years say and do not say about this chain. |
|
||||
| 17 | Explorer | Paste a block hash, a transaction hash, a chain block number or an address. | ... or click any row. |
|
||||
| 18 | Faucet | Paste an address. The faucet sends 10 testnet IGN and shows the transaction hash. | ... and shows you the transaction hash. Once per address per day, once per connection per day. No account, no sign-in, nothing to install. |
|
||||
| 19 | Live devnet | Every block has a story. Follow the connections. | Every block has a story. Follow the connections, and find your own. |
|
||||
| 20 | 404 | The pages below are where most readers want to go | The pages below are where most people want to go; the miner page added as the first card |
|
||||
|
||||
## What was deliberately left alone
|
||||
|
||||
- The litepaper's text: every section is our text as it stood on master (the X9 relabelling, the X31 to X36 corrections, the chip model), under the package's reading layout. The reading tone is already plain; the technical sections stay precise.
|
||||
- The ledger, the evidence table, the bench log and the bench table: generated from docs/, restyled only.
|
||||
- The app page's feature copy (already in the register) and every screenshot caption, which names the machine, the version and the time.
|
||||
- The chip-model paragraph on the home page and the miner page: the Counter ASIC lane's current text, word for word.
|
||||
- The downloads notices: "Public testnet: not yet open; the devnet build is here for people who want to look." and the rest, verbatim (ledger rows X2, X31, E5).
|
||||
|
||||
## Removed from the package, not served
|
||||
|
||||
The package's own copy where it made claims our files do not: "Hardware becomes the network" (kept as "Your card becomes the network", an illustration caption), its sample wallet balance and sample address, its "Simulated" app window, its "Sample feed" labels, its historical benchmark examples, its "optional 1% software dev fee" phrasing where it drifted from the measured 1.146 percent and the one-flag rule, and its launch-date language.
|
||||
|
|
@ -89,10 +89,11 @@ main{flex:1}
|
|||
<!-- nav:end -->
|
||||
<main id="main" class="wrap">
|
||||
<section class="lost">
|
||||
<div class="eyebrow">404</div>
|
||||
<h1>Nothing is mined here.</h1>
|
||||
<p>That address is not on igneum.network. It may have moved, or the link had a typo. The pages below are where most readers want to go; the footer lists every page.</p>
|
||||
<div class="eyebrow"><span class="line"></span>404</div>
|
||||
<h1>Nothing is mined here<span class="accent">.</span></h1>
|
||||
<p>That address is not on igneum.network. It may have moved, or the link had a typo. The pages below are where most people want to go; the footer lists every page.</p>
|
||||
<ul class="places">
|
||||
<li><a href="/miner"><b>The miner</b><span>One click, and your card mines</span></a></li>
|
||||
<li><a href="/litepaper"><b>Litepaper</b><span>How the chain works, in 19 sections</span></a></li>
|
||||
<li><a href="/live"><b>Live devnet</b><span>Blocks, miners and finality as they happen</span></a></li>
|
||||
<li><a href="/bench"><b>Engineering log</b><span>Every measurement, with the commands</span></a></li>
|
||||
|
|
@ -116,11 +117,12 @@ main{flex:1}
|
|||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
|
|
@ -128,15 +130,15 @@ main{flex:1}
|
|||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/litepaper#roadmap">Journey</a>
|
||||
<a href="/metamask">Add to MetaMask</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
|
|
|
|||
|
|
@ -137,6 +137,7 @@ main{padding-bottom:var(--sec)}
|
|||
<!-- nav:end -->
|
||||
<main id="main" class="wrap">
|
||||
<div class="head">
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><a href="/explorer">Explorer</a><span>/</span><span>Address</span></div>
|
||||
<div class="eyebrow"><a href="/explorer">Explorer</a> · address</div>
|
||||
<h1 class="hash" id="title">Address</h1>
|
||||
<div id="chips"></div>
|
||||
|
|
@ -171,11 +172,12 @@ main{padding-bottom:var(--sec)}
|
|||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
|
|
@ -183,15 +185,15 @@ main{padding-bottom:var(--sec)}
|
|||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/litepaper#roadmap">Journey</a>
|
||||
<a href="/metamask">Add to MetaMask</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
|
|
|
|||
|
|
@ -114,8 +114,9 @@
|
|||
<header class="phero" id="top">
|
||||
<div class="wrap">
|
||||
<div>
|
||||
<div class="eyebrow ember"><span data-product="full">Igneum Ember</span> · the app</div>
|
||||
<h1>The app you mine with.</h1>
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>The app</span></div>
|
||||
<div class="eyebrow"><span class="line"></span><span data-product="full">Igneum Ember</span> · the app</div>
|
||||
<h1>The app you <span class="accent">mine with.</span></h1>
|
||||
<p class="lead">Your rate, what it costs a day, and the chain drawn live with your own blocks ringed. One window, four pages, every card one row.</p>
|
||||
<div class="cta"><a href="/miner#get" class="btn primary">Download the miner</a><a href="#chain" class="btn">The chain on your screen</a></div>
|
||||
<div class="os"><span>Windows</span><span>macOS</span><span>Linux · HiveOS</span><span>light and dark</span></div>
|
||||
|
|
@ -326,9 +327,9 @@
|
|||
</div>
|
||||
<div class="grid c2">
|
||||
<div class="dl-list" style="margin:0">
|
||||
<a data-dl="miner-windows" href="https://dl.igneum.network/public/igneum-miner-windows.exe" class="primary">Windows <span data-dl-meta="miner-windows">v0.3.18 · 62.6 MB</span></a>
|
||||
<a data-dl="miner-mac" href="https://dl.igneum.network/public/igneum-miner-mac.dmg">macOS <span data-dl-meta="miner-mac">v0.3.18 · 42.0 MB</span></a>
|
||||
<a href="/miner#hive">Linux · HiveOS <span>the flight sheet, on the miner page</span></a>
|
||||
<a data-dl="miner-windows" href="https://dl.igneum.network/public/igneum-miner-windows.exe" class="primary">Windows <span data-dl-meta="miner-windows">v0.3.19 · 62.7 MB</span></a>
|
||||
<a data-dl="miner-mac" href="https://dl.igneum.network/public/igneum-miner-mac.dmg">macOS <span data-dl-meta="miner-mac">v0.3.19 · 42.1 MB</span></a>
|
||||
<a href="/miner#hive">Linux · HiveOS <span>the tarball and the flight sheet, on the miner page</span></a>
|
||||
</div>
|
||||
<div>
|
||||
<p class="yourcard" data-yourcard>Your card: pending</p>
|
||||
|
|
@ -350,7 +351,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<a class="dl-bar" href="/miner#get"><b>Download the miner</b><span data-dl-meta="miner-windows">v0.3.18 · 62.6 MB</span></a>
|
||||
<a class="dl-bar" href="/miner#get"><b>Download the miner</b><span data-dl-meta="miner-windows">v0.3.19 · 62.7 MB</span></a>
|
||||
|
||||
<!-- footer:start -->
|
||||
<footer class="foot">
|
||||
|
|
@ -368,11 +369,12 @@
|
|||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
|
|
@ -380,15 +382,15 @@
|
|||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/litepaper#roadmap">Journey</a>
|
||||
<a href="/metamask">Add to MetaMask</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
|
|
|
|||
334
site/bench.html
334
site/bench.html
File diff suppressed because one or more lines are too long
|
|
@ -137,6 +137,7 @@ main{padding-bottom:var(--sec)}
|
|||
<!-- nav:end -->
|
||||
<main id="main" class="wrap">
|
||||
<div class="head">
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><a href="/explorer">Explorer</a><span>/</span><span>Block</span></div>
|
||||
<div class="eyebrow"><a href="/explorer">Explorer</a> · block</div>
|
||||
<h1 class="hash" id="title">Block</h1>
|
||||
<div id="chips"></div>
|
||||
|
|
@ -172,11 +173,12 @@ main{padding-bottom:var(--sec)}
|
|||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
|
|
@ -184,15 +186,15 @@ main{padding-bottom:var(--sec)}
|
|||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/litepaper#roadmap">Journey</a>
|
||||
<a href="/metamask">Add to MetaMask</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
|
|
|
|||
205
site/build.mjs
205
site/build.mjs
|
|
@ -91,9 +91,16 @@ function meta(title, desc, path) {
|
|||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
|
||||
<link rel="manifest" href="/site.webmanifest">`;
|
||||
}
|
||||
function page(title, desc, bodyHtml, toc, note, { path = '/bench', heading = title, active = 'bench', eyebrow } = {}) {
|
||||
function sectionise(bodyHtml) {
|
||||
// the markdown renderer's flat stream, cut at every h2 into <section class="doc-section"> so the contents rail and the
|
||||
// text filter work on sections; anything before the first h2 is its own section
|
||||
const parts = bodyHtml.split(/(?=<h2 id=")/);
|
||||
return parts.filter(p => p.trim()).map(p => `<section class="doc-section">${p}</section>`).join('\n');
|
||||
}
|
||||
function page(title, desc, bodyHtml, toc, note, { path = '/bench', heading = title, active = 'bench', eyebrow, crumb, filter = true } = {}) {
|
||||
const h2s = toc.filter(t => t.lvl === 2);
|
||||
const nav = h2s.map(t => `<li><a href="#${t.id}">${esc(t.t)}</a></li>`).join('');
|
||||
const nav = h2s.map(t => `<a href="#${t.id}">${esc(t.t)}</a>`).join('');
|
||||
const key = path.replace(/^\//, '') || 'doc';
|
||||
return `<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
|
|
@ -104,53 +111,52 @@ ${meta(title, desc, path)}
|
|||
${HEAD}
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
/* generated-page block (the engineering log, the bench table, the evidence table); tokens, type and components are in /site.css */
|
||||
/* generated-page block (the engineering log, the bench table, the provenance table): the page hero, the contents rail, the sections; tokens, type and components are in /site.css */
|
||||
[id]{scroll-margin-top:calc(var(--nav-h) + 16px)}
|
||||
.head{padding-top:calc(var(--sec) * .6)}
|
||||
.head h1{margin:var(--s-3) 0}
|
||||
.head .note{max-width:72ch;margin:0 0 var(--s-6)}
|
||||
.layout{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--s-6)}
|
||||
@media(min-width:960px){.layout{grid-template-columns:260px minmax(0,1fr);gap:56px}}
|
||||
.toc{align-self:start;font-size:14px;border:1px solid var(--line);border-radius:var(--r-row);background:var(--graphite);padding:8px}
|
||||
.toc .lbl{font:500 var(--t-xs)/1.4 var(--f-mono);letter-spacing:.12em;text-transform:uppercase;color:var(--ash);padding:6px 10px 8px}
|
||||
.toc ol{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1px;counter-reset:s;max-height:40vh;overflow:auto;overscroll-behavior:contain;scrollbar-width:thin}
|
||||
@media(min-width:960px){.toc{position:sticky;top:calc(var(--nav-h) + 20px)}.toc ol{max-height:calc(100vh - var(--nav-h) - 96px)}}
|
||||
.toc a{display:flex;gap:10px;padding:7px 10px;border-radius:8px;color:var(--ink-2);counter-increment:s;line-height:1.35}
|
||||
.toc a::before{content:counter(s,decimal-leading-zero);font-family:var(--f-mono);font-size:11px;color:var(--ash);min-width:20px;padding-top:2px}
|
||||
.toc a:hover{background:var(--row);text-decoration:none;color:var(--bone)}
|
||||
article{max-width:78ch;min-width:0;color:var(--ink-2)}
|
||||
.page-hero .lead{max-width:72ch}
|
||||
article h1{display:none}
|
||||
article h2{font-size:var(--t-h3);margin:44px 0 12px;padding-top:24px;border-top:1px solid var(--line)}
|
||||
article h2:first-of-type{margin-top:0;padding-top:0;border-top:0}
|
||||
article{color:var(--ink-2)}
|
||||
article h2{font-size:var(--t-h3);margin:0 0 12px}
|
||||
article h3{font-size:16px;margin:26px 0 8px}
|
||||
article h4{font:600 15px/1.4 var(--f-sans);margin:20px 0 6px;color:var(--bone)}
|
||||
article p{margin:0 0 14px}article ul,article ol{margin:0 0 14px;padding-left:22px}article li{margin-bottom:6px}
|
||||
article p,article li,article h2,article h3{overflow-wrap:anywhere}
|
||||
article pre{margin:0 0 var(--s-4)}
|
||||
.doc-section:last-child{border-bottom:0}
|
||||
.doc-section[hidden]{display:none}
|
||||
.tbl{margin:var(--s-4) 0 var(--s-5)}
|
||||
table{min-width:560px}
|
||||
.gen{color:var(--ash);font-size:13px;margin:40px 0 0;max-width:72ch}
|
||||
.doc-tools{margin:0 0 var(--s-5)}
|
||||
.doc-tools .searchbar{max-width:560px}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- nav:start -->
|
||||
${navFor(active)}
|
||||
<!-- nav:end -->
|
||||
<main id="main" class="wrap">
|
||||
<div class="head">
|
||||
<div class="eyebrow">${eyebrow || `${h2s.length} entries, newest at the bottom`}</div>
|
||||
<main id="main">
|
||||
<section class="page-hero">
|
||||
<div class="wrap">
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>${esc(crumb || heading)}</span></div>
|
||||
<div class="eyebrow"><span class="line"></span>${eyebrow || `${h2s.length} entries, newest at the bottom`}</div>
|
||||
<h1>${esc(heading)}</h1>
|
||||
<p class="note">${note}</p>
|
||||
<p class="lead">${note}</p>
|
||||
</div>
|
||||
<div class="layout">
|
||||
<nav class="toc" aria-label="Contents"><div class="lbl">Contents</div><ol>${nav}</ol></nav>
|
||||
<article>${bodyHtml}</article>
|
||||
</section>
|
||||
<div class="wrap">
|
||||
${filter ? `<div class="doc-tools"><div class="searchbar"><svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><circle cx="10.5" cy="10.5" r="6.5"/><path d="m16 16 5 5"/></svg><label for="doc-q" class="visually-hidden">Filter the sections</label><input id="doc-q" data-filter-input="${key}" placeholder="Filter the sections: a card, a date, a word" autocomplete="off" spellcheck="false"><span class="small" data-filter-count="${key}"></span></div></div>` : ''}
|
||||
<div class="docs-layout">
|
||||
<nav class="doc-nav" aria-label="Contents"><div class="eyebrow">Contents</div>${nav}</nav>
|
||||
<article class="doc-body" data-filter-list="${key}">${sectionise(bodyHtml)}</article>
|
||||
</div>
|
||||
<p class="gen">Generated from the repository at build time. Times are UTC. Machine names are model names.</p>
|
||||
</div>
|
||||
</main>
|
||||
<!-- footer:start -->
|
||||
${FOOT}
|
||||
<!-- footer:end -->
|
||||
<script src="/ui.js" defer></script>
|
||||
</body>
|
||||
</html>`;
|
||||
}
|
||||
|
|
@ -162,7 +168,7 @@ if (existsSync(join(docs, 'bench-log.md'))) {
|
|||
const { html, toc } = md(src);
|
||||
writeFileSync(join(here, 'bench.html'), page('Igneum engineering log', 'Every Igneum benchmark and test, with the hardware and the commands that produced it. Prototype numbers are labelled as such.', html, toc,
|
||||
'Every measurement the project has made, newest at the bottom, written by the people and agents who ran it, with the commands and hardware. Prototype numbers are not mining numbers and say so.',
|
||||
{ path: '/bench', heading: 'Engineering log' }));
|
||||
{ path: '/bench', heading: 'Engineering log', crumb: 'Engineering log' }));
|
||||
built.push('bench.html');
|
||||
// journey feed: dated headings become log entries. `short` is the homepage line (one clause, under 72 characters);
|
||||
// SHORT holds hand-written lines keyed by the start of the heading, the rule below covers the rest.
|
||||
|
|
@ -339,7 +345,7 @@ function renderEvidence(html) {
|
|||
const d = new Date(); const MON = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
|
||||
const day = `${d.getUTCDate()} ${MON[d.getUTCMonth()]} ${d.getUTCFullYear()}`;
|
||||
const dayLong = `${d.getUTCDate()} ${['January','February','March','April','May','June','July','August','September','October','November','December'][d.getUTCMonth()]} ${d.getUTCFullYear()}`;
|
||||
html = html.replace(/<div class="eyebrow">\d+ claims · 5 labels · [^<]*<\/div>/, `<div class="eyebrow">${rows.length} claims · 5 labels · ${day}</div>`);
|
||||
html = html.replace(/<div class="eyebrow">(?:<span class="line"><\/span>)?\d+ claims · 5 labels · [^<]*<\/div>/, `<div class="eyebrow"><span class="line"></span>${rows.length} claims · 5 labels · ${day}</div>`);
|
||||
html = html.replace(/<p class="asof">Statuses are honest as of [^<]*<\/p>/, `<p class="asof">Statuses are honest as of ${dayLong}, the day this page was generated from docs/evidence.md, and change only through that file.</p>`);
|
||||
return html;
|
||||
}
|
||||
|
|
@ -409,9 +415,152 @@ for (const [file, active] of PAGES) {
|
|||
const toc = [{ lvl: 2, t: 'The table', id: 'table' }, { lvl: 2, t: 'How a row gets here', id: 'how' }, { lvl: 2, t: 'Fleet tuning priors', id: 'priors' }];
|
||||
writeFileSync(join(here, 'miners.html'), page('Igneum GPU bench table', 'Measured Igneum hash rates per GPU: card, generator version, best MH/s, MH per watt where measured, miner version, date and the log entry each number came from.', body, toc,
|
||||
'Measured hash rates per card on the Igneum lottery hash, with the generator version, the miner version, the date and the log entry behind each number.',
|
||||
{ path: '/miners', heading: 'GPU bench table', active: 'miner', eyebrow: `${rows.length} measured rows, ${prows.length} fleet tuning models` }));
|
||||
{ path: '/miners', heading: 'GPU bench table', active: 'miner', eyebrow: `${rows.length} measured rows, ${prows.length} fleet tuning models`, crumb: 'GPU bench table' }));
|
||||
built.push('miners.html (' + rows.length + ' rows)');
|
||||
}
|
||||
|
||||
// The secondary pages (7 Oct 2026, the redesign): each one is rendered from ONE source so no sentence is kept twice by hand.
|
||||
// /claims and /randomx are the litepaper's own sections (their ledger sentences stay on the litepaper, which is what the
|
||||
// ledger text check reads); /dev-fee is the miner page's fee section; /provenance is docs/provenance.md through the same
|
||||
// scrub as /bench; /journey is journey.json (the phases and the log the bench entries feed). A page with no source is not written.
|
||||
function shell({ title, desc, path, crumb, eyebrow, heading, lead, body, active = '', style = '', after = '' }) {
|
||||
return `<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
||||
${meta(title, desc, path)}
|
||||
<!-- head:start -->
|
||||
${HEAD}
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
/* derived-page block (rendered by the build from its source page or document); tokens, type and components are in /site.css */
|
||||
[id]{scroll-margin-top:calc(var(--nav-h) + 16px)}
|
||||
.page-hero .lead{max-width:72ch}
|
||||
.derived{max-width:78ch;color:var(--ink-2)}
|
||||
.derived h2{font-size:var(--t-h3);margin:var(--s-6) 0 var(--s-3)}
|
||||
.derived h3{font-size:16px;margin:var(--s-5) 0 var(--s-2)}
|
||||
.derived ul,.derived ol{margin:0 0 var(--s-4);padding-left:22px}
|
||||
.derived li{margin-bottom:8px}
|
||||
.derived strong{color:var(--bone);font-weight:600}
|
||||
.derived p,.derived li{overflow-wrap:anywhere}
|
||||
.derived .tbl{margin:var(--s-4) 0 var(--s-5)}
|
||||
.derived .pull{margin:var(--s-5) 0;padding:var(--s-4) var(--s-5);border-left:2px solid var(--ember);background:var(--row);border-radius:0 var(--r-row) var(--r-row) 0;font:500 var(--t-lg)/1.45 var(--f-sans);color:var(--bone)}
|
||||
.derived .src{margin:calc(-1 * var(--s-2)) 0 var(--s-5);font:400 13px/1.5 var(--f-mono);color:var(--ash)}
|
||||
.derived .src b{font-weight:500;color:var(--ink-2)}
|
||||
.onward{display:flex;flex-wrap:wrap;gap:var(--s-3);margin-top:var(--s-6);padding-top:var(--s-5);border-top:1px solid var(--line)}
|
||||
${style}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- nav:start -->
|
||||
${navFor(active)}
|
||||
<!-- nav:end -->
|
||||
<main id="main">
|
||||
<section class="page-hero">
|
||||
<div class="wrap">
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>${esc(crumb)}</span></div>
|
||||
<div class="eyebrow"><span class="line"></span>${eyebrow}</div>
|
||||
<h1>${heading}</h1>
|
||||
<p class="lead">${lead}</p>
|
||||
</div>
|
||||
</section>
|
||||
<section class="sec compact">
|
||||
<div class="wrap">
|
||||
${body}
|
||||
${after}
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<!-- footer:start -->
|
||||
${FOOT}
|
||||
<!-- footer:end -->
|
||||
<script src="/ui.js" defer></script>
|
||||
</body>
|
||||
</html>`;
|
||||
}
|
||||
// a section of a built page, its own h2 and section head removed, its in-page anchors pointed back at the source page
|
||||
function sectionOf(file, id, base) {
|
||||
const html = readFileSync(join(here, file), 'utf8');
|
||||
const m = new RegExp(`<section id="${id}"[^>]*>([\\s\\S]*?)</section>`).exec(html);
|
||||
if (!m) throw new Error(`${file}: no <section id="${id}">`);
|
||||
let inner = m[1];
|
||||
// the section head (eyebrow, h2, an optional lead) is removed by a balanced walk over its divs, never a lazy regex
|
||||
// (7 Oct 2026: a lazy match ran on to the first </div></div> pair inside the fee card and emptied /dev-fee)
|
||||
const hs = inner.indexOf('<div class="section-head">');
|
||||
let lead = '';
|
||||
if (hs >= 0) {
|
||||
let depth = 0, i = hs; const re = /<div\b|<\/div>/g; re.lastIndex = hs; let m;
|
||||
while ((m = re.exec(inner))) { depth += m[0] === '</div>' ? -1 : 1; if (depth === 0) { i = m.index + m[0].length; break; } }
|
||||
if (depth !== 0) throw new Error(`${file}#${id}: unbalanced section head`);
|
||||
const head = inner.slice(hs, i); const pm = /<p>([\s\S]*?)<\/p>\s*<\/div>\s*$/.exec(head); lead = pm ? pm[1] : '';
|
||||
inner = inner.slice(0, hs) + inner.slice(i);
|
||||
}
|
||||
inner = inner.replace(/^\s*<h2>[\s\S]*?<\/h2>/, '');
|
||||
const ids = new Set([...inner.matchAll(/\sid="([^"]+)"/g)].map(x => x[1]));
|
||||
inner = inner.replace(/href="#([^"]+)"/g, (all, frag) => ids.has(frag) ? all : `href="${base}#${frag}"`);
|
||||
return { html: inner.trim(), lead };
|
||||
}
|
||||
function onward(links) { return `<div class="onward">${links.map(([href, label]) => `<a href="${href}" class="btn">${esc(label)}</a>`).join('')}</div>`; }
|
||||
{
|
||||
const lp = sectionOf('litepaper.html', 'limits', '/litepaper');
|
||||
writeFileSync(join(here, 'claims.html'), shell({
|
||||
title: 'What Igneum does not claim', desc: 'The limits of Igneum, stated first: proof times, chips, income, finality in the first month, the review it has not had yet. From the litepaper, with the ledger behind it.',
|
||||
path: '/claims', crumb: 'What Igneum does not claim', eyebrow: 'The limits, stated first', heading: 'What Igneum does not claim.',
|
||||
lead: 'Every limit we know of, written down here before anyone else writes it. The same text as the litepaper’s last section; the ledger carries every criticism in full.',
|
||||
body: `<div class="derived">${lp.html}</div>`, active: 'litepaper',
|
||||
after: onward([['/ledger', 'The ledger: every criticism'], ['/evidence', 'The evidence page'], ['/litepaper#limits', 'Read it in the litepaper']]),
|
||||
}));
|
||||
built.push('claims.html (from litepaper#limits)');
|
||||
const rx = sectionOf('litepaper.html', 'randomx', '/litepaper');
|
||||
writeFileSync(join(here, 'randomx.html'), shell({
|
||||
title: 'Igneum and RandomX', desc: 'Monero’s random-program idea, rebuilt for graphics cards: a program per hour instead of a program per hash, a dataset that grows, and what RandomX’s record does and does not say about Igneum.',
|
||||
path: '/randomx', crumb: 'Igneum vs RandomX', eyebrow: 'Monero’s idea, finished for GPUs', heading: 'Monero’s idea.<br>Finished for GPUs.',
|
||||
lead: 'Random-program mining is the idea Igneum borrowed. Here is what changed when it was rebuilt for graphics cards, and what RandomX’s seven years say and do not say about this chain. The same text as the litepaper’s section.',
|
||||
body: `<div class="derived">${rx.html}</div>`, active: 'litepaper',
|
||||
after: onward([['/litepaper#mining', 'How mining works'], ['/litepaper#chip-model', 'The chip model'], ['/provenance', 'Built on the shoulders']]),
|
||||
}));
|
||||
built.push('randomx.html (from litepaper#randomx)');
|
||||
const fee = sectionOf('miner.html', 'fee', '/miner');
|
||||
writeFileSync(join(here, 'dev-fee.html'), shell({
|
||||
title: 'The Ember dev fee, in full view', desc: 'The protocol carries no fee. The Ember software takes an optional 1% dev fee, the norm for GPU miners, visible in the app and off with one flag. Where it is, how it was measured, how to turn it off.',
|
||||
path: '/dev-fee', crumb: 'The dev fee', eyebrow: 'The dev fee', heading: 'The fee, in full view.',
|
||||
lead: fee.lead || 'The protocol carries no fee. The software fee is the miner app’s, like every other GPU miner’s, and one flag turns it off.',
|
||||
body: fee.html, active: 'miner',
|
||||
style: '.feecard{display:grid;grid-template-columns:1fr;gap:var(--s-4)}@media (min-width:900px){.feecard{grid-template-columns:minmax(0,1.1fr) minmax(0,.9fr);align-items:start}}pre b{color:var(--molten-text);font-weight:500}',
|
||||
after: onward([['/miner#get', 'Get the miner'], ['/litepaper#economics', 'The economics'], ['/bench', 'The engineering log']]),
|
||||
}));
|
||||
built.push('dev-fee.html (from miner#fee)');
|
||||
}
|
||||
if (existsSync(join(docs, 'provenance.md'))) {
|
||||
const src = scrubBench(readFileSync(join(docs, 'provenance.md'), 'utf8'));
|
||||
const { html, toc } = md(src);
|
||||
writeFileSync(join(here, 'provenance.html'), page('Igneum provenance: built on the shoulders', 'Every borrowed component of Igneum credited in public: the origin and licence, what changed, why the design needed it, and how the change is measured. What is new in Igneum, and what is adopted from upstream.', html, toc,
|
||||
'Igneum credits every borrowed component in public, replaces only what its own design requires, and measures every change. This table is the record: the origin and licence, what changed, why, and the measurement behind it.',
|
||||
{ path: '/provenance', heading: 'Built on the shoulders', active: 'litepaper', eyebrow: 'Provenance · the decision of 3 October 2026', crumb: 'Built on the shoulders', filter: false }));
|
||||
built.push('provenance.html (from docs/provenance.md)');
|
||||
}
|
||||
{
|
||||
const j = JSON.parse(readFileSync(join(here, 'journey.json'), 'utf8'));
|
||||
const STATUS = { active: ['current', 'Under way'], next: ['next', 'Next'], done: ['done', 'Done'] };
|
||||
const phases = (j.phases || []).map((p, i) => { const [cls, word] = STATUS[p.status] || ['', p.status]; return `<div class="milestone ${cls}" id="${esc(p.id)}"><div class="when">${esc(p.when)}</div><div><span class="badge${cls === 'current' ? ' warm' : ''}">${word}</span><h3>${i + 1}. ${esc(p.name)}</h3><p>${esc(p.line)}</p>${p.gate ? `<p class="gate"><b>Gate:</b> ${esc(p.gate)}</p>` : ''}</div></div>`; }).join('\n');
|
||||
const MON = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
||||
const day = d => { const [y, m, dd] = d.split('-'); return `${Number(dd)} ${MON[Number(m) - 1]} ${y}`; };
|
||||
const log = (j.log || []).map(e => `<article class="record"><div class="record-top"><time datetime="${esc(e.date)}">${day(e.date)}</time><span class="badge">log</span></div><h3>${esc(e.short || e.text)}</h3>${e.short && e.short !== e.text ? `<p>${esc(e.text)}</p>` : ''}</article>`).join('\n');
|
||||
writeFileSync(join(here, 'journey.html'), shell({
|
||||
title: 'The Igneum journey: six phases, four gates', desc: 'Where Igneum is: six phases from the specification to a fair launch, each closing at a published gate, and the engineering log’s latest entries. No calendar dates.',
|
||||
path: '/journey', crumb: 'The journey', eyebrow: `Six phases · updated ${day(j.updated)}`, heading: 'The journey.',
|
||||
lead: 'Six phases from the specification to a fair launch. Each closes at its gate, a measurement published whether it passes or fails, so there is no date to slip. Below the phases, the latest entries of the engineering log.',
|
||||
body: `<div class="timeline">${phases}</div>
|
||||
<div class="section-head" style="margin-top:var(--sec)"><div><div class="eyebrow"><span class="line"></span>The log, newest first</div><h2>Lately, in the log.</h2></div><div class="searchbar" style="min-width:min(100%,360px)"><svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><circle cx="10.5" cy="10.5" r="6.5"/><path d="m16 16 5 5"/></svg><label for="log-q" class="visually-hidden">Filter the log</label><input id="log-q" data-filter-input="log" placeholder="Filter: a card, a date, a word" autocomplete="off" spellcheck="false"><span class="small" data-filter-count="log"></span></div></div>
|
||||
<div class="record-grid" data-filter-list="log">${log}</div>
|
||||
<p class="empty-state" data-filter-empty="log" hidden>Nothing in the log matches that.</p>
|
||||
<p class="note">Every entry is a dated heading of <a href="/bench">the engineering log</a>, where the commands and the hardware are. The phases and their gates are the litepaper’s <a href="/litepaper#roadmap">roadmap</a>.</p>`,
|
||||
active: '',
|
||||
after: onward([['/bench', 'The engineering log'], ['/evidence', 'Every claim and its status'], ['/live', 'The live devnet']]),
|
||||
}));
|
||||
built.push('journey.html (' + (j.phases || []).length + ' phases, ' + (j.log || []).length + ' entries)');
|
||||
}
|
||||
console.log('built: ' + built.join(', '));
|
||||
// the header rule: every served page carries the full nav (tools/ci/site-nav-check.mjs); the build fails on a shorter one
|
||||
// (the gate builds a copy of site/ alone and runs the check as its own line, so a missing tools/ is not a failure here)
|
||||
|
|
|
|||
216
site/claims.html
Normal file
216
site/claims.html
Normal file
|
|
@ -0,0 +1,216 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
||||
<title>What Igneum does not claim</title>
|
||||
<meta name="description" content="The limits of Igneum, stated first: proof times, chips, income, finality in the first month, the review it has not had yet. From the litepaper, with the ledger behind it.">
|
||||
<link rel="canonical" href="https://igneum.network/claims">
|
||||
<meta name="theme-color" content="#0C0C0E">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:site_name" content="Igneum">
|
||||
<meta property="og:title" content="What Igneum does not claim">
|
||||
<meta property="og:description" content="The limits of Igneum, stated first: proof times, chips, income, finality in the first month, the review it has not had yet. From the litepaper, with the ledger behind it.">
|
||||
<meta property="og:url" content="https://igneum.network/claims">
|
||||
<meta property="og:image" content="https://igneum.network/og.png?v=3">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="What Igneum does not claim">
|
||||
<meta name="twitter:description" content="The limits of Igneum, stated first: proof times, chips, income, finality in the first month, the review it has not had yet. From the litepaper, with the ledger behind it.">
|
||||
<meta name="twitter:image" content="https://igneum.network/og.png?v=3">
|
||||
<meta name="twitter:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Crect width='1024' height='1024' fill='%230C0C0E'/%3E%3Cg transform='translate(166.95 166.95) scale(6.901)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml">
|
||||
<link rel="icon" href="/favicon.ico" sizes="48x48">
|
||||
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
|
||||
<link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192">
|
||||
<link rel="icon" href="/icon-512.png" type="image/png" sizes="512x512">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
|
||||
<link rel="manifest" href="/site.webmanifest">
|
||||
<!-- head:start -->
|
||||
<link rel="preload" href="/fonts/unbounded-900.woff2" as="font" type="font/woff2" crossorigin>
|
||||
<link rel="preload" href="/fonts/plex-sans-400.woff2" as="font" type="font/woff2" crossorigin>
|
||||
<link rel="stylesheet" href="/site.css">
|
||||
<style>
|
||||
/* Shared by every page: the head partial, injected by the build between the head markers. Edit the partial, not the page. */
|
||||
/* Fonts, self-hosted (latin subsets, OFL): Unbounded 500/700/900, IBM Plex Sans 400/500/600, IBM Plex Mono 400/500. Fallbacks carry size and ascent overrides so the swap does not move the layout. The tokens, type and components are in /site.css (docs/plans/site-ui-3.md). */
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/unbounded-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/unbounded-700.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:900;font-display:swap;src:url(/fonts/unbounded-900.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-sans-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-sans-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/plex-sans-600.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-mono-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-mono-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded Fallback';src:local('Arial Black'),local('Arial-Black'),local('Impact');size-adjust:114%;ascent-override:87.5%;descent-override:21.5%;line-gap-override:0%}
|
||||
@font-face{font-family:'Plex Sans Fallback';src:local('Arial'),local('Helvetica Neue'),local('Helvetica');size-adjust:100.5%;ascent-override:102%;descent-override:27.4%;line-gap-override:0%}
|
||||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: the footer control stores "light" or "dark" under igneum-theme; nothing stored means the system setting */
|
||||
(function(){try{var t=localStorage.getItem("igneum-theme");if(t==="light"||t==="dark")document.documentElement.setAttribute("data-theme",t);}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
/* derived-page block (rendered by the build from its source page or document); tokens, type and components are in /site.css */
|
||||
[id]{scroll-margin-top:calc(var(--nav-h) + 16px)}
|
||||
.page-hero .lead{max-width:72ch}
|
||||
.derived{max-width:78ch;color:var(--ink-2)}
|
||||
.derived h2{font-size:var(--t-h3);margin:var(--s-6) 0 var(--s-3)}
|
||||
.derived h3{font-size:16px;margin:var(--s-5) 0 var(--s-2)}
|
||||
.derived ul,.derived ol{margin:0 0 var(--s-4);padding-left:22px}
|
||||
.derived li{margin-bottom:8px}
|
||||
.derived strong{color:var(--bone);font-weight:600}
|
||||
.derived p,.derived li{overflow-wrap:anywhere}
|
||||
.derived .tbl{margin:var(--s-4) 0 var(--s-5)}
|
||||
.derived .pull{margin:var(--s-5) 0;padding:var(--s-4) var(--s-5);border-left:2px solid var(--ember);background:var(--row);border-radius:0 var(--r-row) var(--r-row) 0;font:500 var(--t-lg)/1.45 var(--f-sans);color:var(--bone)}
|
||||
.derived .src{margin:calc(-1 * var(--s-2)) 0 var(--s-5);font:400 13px/1.5 var(--f-mono);color:var(--ash)}
|
||||
.derived .src b{font-weight:500;color:var(--ink-2)}
|
||||
.onward{display:flex;flex-wrap:wrap;gap:var(--s-3);margin-top:var(--s-6);padding-top:var(--s-5);border-top:1px solid var(--line)}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- nav:start -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
<nav class="nav" aria-label="Main">
|
||||
<div class="wrap">
|
||||
<a href="/" class="brand" aria-label="Igneum home">
|
||||
<svg class="mark" viewBox="0 0 1024 1024" width="28" height="28" aria-hidden="true"><rect width="1024" height="1024" rx="160" fill="#0C0C0E"></rect><g transform="translate(166.95 166.95) scale(6.901)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></g></svg>
|
||||
<span class="word">IGNEUM</span>
|
||||
</a>
|
||||
<div class="links" id="nav-links">
|
||||
<a href="/litepaper" data-nav="litepaper" aria-current="page">Litepaper</a>
|
||||
<a href="/miner" data-nav="miner">Miner</a>
|
||||
<a href="/app" data-nav="app">App</a>
|
||||
<a href="/wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/live" data-nav="live">Live devnet</a>
|
||||
<a href="/ledger" data-nav="ledger">Ledger</a>
|
||||
</div>
|
||||
<a href="/miner#get" class="btn primary small cta">Download</a>
|
||||
<button class="burger" id="nav-burger" type="button" aria-expanded="false" aria-controls="nav-sheet" aria-label="Open the menu" aria-haspopup="true"><span class="bars" aria-hidden="true"></span></button>
|
||||
<div class="nav-sheet" id="nav-sheet">
|
||||
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
|
||||
<a href="/miner" data-nav="miner">Miner</a>
|
||||
<a href="/app" data-nav="app">App</a>
|
||||
<a href="/wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/live" data-nav="live">Live devnet</a>
|
||||
<a href="/ledger" data-nav="ledger">Ledger</a>
|
||||
<a href="/miner#get" class="btn primary">Download</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<script>
|
||||
(function(){
|
||||
// the menu: open on the button, closed by any link, Escape (focus back on the button) or a resize past 900 px
|
||||
var n=document.querySelector('.nav'),b=document.getElementById('nav-burger'),s=document.getElementById('nav-sheet');if(!n||!b||!s)return;
|
||||
function set(o){n.classList.toggle('open',o);b.setAttribute('aria-expanded',o?'true':'false');b.setAttribute('aria-label',o?'Close the menu':'Open the menu');document.documentElement.style.overflow=o?'hidden':'';}
|
||||
b.addEventListener('click',function(){set(!n.classList.contains('open'));});
|
||||
s.addEventListener('click',function(e){if(e.target.closest('a'))set(false);});
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&n.classList.contains('open')){set(false);b.focus();}});
|
||||
var mq=window.matchMedia('(min-width:901px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
})();
|
||||
</script>
|
||||
<!-- nav:end -->
|
||||
<main id="main">
|
||||
<section class="page-hero">
|
||||
<div class="wrap">
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>What Igneum does not claim</span></div>
|
||||
<div class="eyebrow"><span class="line"></span>The limits, stated first</div>
|
||||
<h1>What Igneum does not claim.</h1>
|
||||
<p class="lead">Every limit we know of, written down here before anyone else writes it. The same text as the litepaper’s last section; the ledger carries every criticism in full.</p>
|
||||
</div>
|
||||
</section>
|
||||
<section class="sec compact">
|
||||
<div class="wrap">
|
||||
<div class="derived"><p>Here are the limits, stated before anyone else states them.</p>
|
||||
<ul>
|
||||
<li><strong>A proof in seconds.</strong> Not at launch. Proving a full block today needs a cluster of 100 to 200 consumer GPUs, approximate, so Igneum launches with proofs within about a minute and tightens as hardware improves. Users still see their transaction land in one second.</li>
|
||||
<li><strong>A chip is impossible.</strong> No. A chip wired for one program is a bad bet, because the program moves before it ships. A programmable chip is not stopped by the moving target: everything it needs is public at genesis and every drawn parameter is firmware to it (an address permute, a rotator, an immediate table), so the defence against it is the latency-shadow work (class v4) and the price per joule, not the schedule (the Horizon lane analysis, 6 October 2026, section 5.4; ledger M32). The published model (5 October 2026) prices the strongest chip we can name, one with the whole cache on-die computing dataset items on the fly, at 0.92x the hash rate of an RTX 5090 per unit of silicon with a 3x fixed-function allowance, approximate. The same model, drawn out to the chip that stores the dataset (6 October 2026): The strongest recompute chip we can price, holding the whole 256 MiB cache on-die, reaches under 1x per chip against an RTX 5090. A memory-controller chip that stores the whole dataset reaches 1.2x per chip and, in our model, 5x to 9x per joule; the Ethash chips of this class reached 2.1x to 4.8x. The lever against it, program work in the latency shadow, is measured and in its gates: it brings the chip to 2.1x to 3.9x, the range running from a chip core as costly per operation as the GPU’s (k = 1) to the core Bitmain claimed for its withdrawn Antminer X9 (k about 0.33, never measured); the ladder’s second rung takes that bracket to about 2.8x. Sources: the chip model analysis (6 October 2026); the Ethash rows of the ASIC history (Linzhi Phoenix 2020, Jasminer X4 2021, Antminer E9 2022); Counter ASIC 3.0 item 8 (100,000 ops per hash: the chip's per-joule edge over the RTX 5090 falls from 5.6x to 2.1x on GDDR7 at a chip core equal to the GPU's (k = 1) and to 3.9x at the X9’s claimed core (k about 0.33, never measured), the 5090 at 0.2% less rate, gates G1 to G6 in progress). No hash has stayed free of chips forever; Igneum does not claim to. Monero’s RandomX has held for about seven years; the one chip announced against it, Bitmain’s Antminer X9, was withdrawn in mid-May 2026 before any unit shipped, its claimed core (k about 0.33) never measured. That record says nothing about the price of a chip with the 256 MB cache on its die; that price is a cost model, not a measurement.</li>
|
||||
<li><strong>A guaranteed income floor.</strong> No. External proving is a small market today. Igneum's miners' electricity cost in it is close to power, but the price they must charge is the subsidy they forgo, which falls as one over network hash: an edge at scale and nothing more.</li>
|
||||
<li><strong>A memory-hard prototype on every vendor.</strong> Not yet. The 256 MB cache closed the shortcut on Apple silicon (computing items runs 4.8x slower than loading them, measured 3 October 2026). The same ratio on NVIDIA and on a discrete AMD card is Open.</li>
|
||||
<li><strong>Finality in the first month.</strong> No. No checkpoint locks until the 30-day window has 30 days of history. The first month of mainnet is proof of work with a 12-hour depth, and the text above says so wherever a day count appears.</li>
|
||||
<li><strong>A cryptography team.</strong> Not yet. One founder working with AI systems wrote the design and the code; external reviewers are named and paid before gate 3, and every security claim here is a design claim until then.</li>
|
||||
<li><strong>Finality that no amount of hardware can break.</strong> No. A miner holding a third of the last 30 days of blocks can split finality during a network partition, and two thirds can lock a bad checkpoint for a double-spend bounded by the 12-hour finality depth. Reaching a third takes at least ten days of producing every block on the chain, in public; an attacker matching the honest network needs twenty days for a third and never reaches two thirds. That is harder than attacking Bitcoin, where a majority can reorganise at once, and it is the limit of proof of work without stake or an outside chain. Igneum chose those limits on purpose. The floor is also bounded in time: an honest partition that lasts long enough for each side's own new blocks to reach two thirds of its window locks on both sides, about ten days of a 30-day window at an even split, and an operator must then resolve it (measured on a test network, 4 October 2026).</li>
|
||||
<li><strong>Finality that never pauses.</strong> No. A lock needs two thirds of all 30-day mining weight. Whenever less than two thirds of that weight is connected and signing, finality pauses until it returns or ages out of the window, up to 30 days. The chain keeps running on proof of work and the node reports the pause.</li>
|
||||
<li><strong>A finished protocol.</strong> The sustained-mining finality rule is the newest piece and the one that external review will try hardest to break. The specification, the review and the benchmarks are published as they happen.</li>
|
||||
</ul>
|
||||
<p>Everything in this document is subject to the gates on the roadmap. Nothing in it is an offer to sell anything. Found an error, or a criticism this document does not answer? Email <a href="mailto:hello@igneum.network">hello@igneum.network</a>, or open an issue on the public specification repository: <a href="https://github.com/igneum-network/spec/issues" rel="noopener">github.com/igneum-network/spec/issues</a>. Post reaches Igneum Labs LTD, Unit IH-00-01-01-OF-01, Level 01, Innovation One, Dubai International Financial Centre.</p></div>
|
||||
<div class="onward"><a href="/ledger" class="btn">The ledger: every criticism</a><a href="/evidence" class="btn">The evidence page</a><a href="/litepaper#limits" class="btn">Read it in the litepaper</a></div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<!-- footer:start -->
|
||||
<footer class="foot">
|
||||
<div class="wrap">
|
||||
<div class="foot-grid">
|
||||
<div class="foot-brand">
|
||||
<a href="/" class="brand" aria-label="Igneum home"><svg class="mark" viewBox="0 0 1024 1024" width="26" height="26" aria-hidden="true"><rect width="1024" height="1024" rx="160" fill="#0C0C0E"></rect><g transform="translate(166.95 166.95) scale(6.901)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></g></svg><span class="word">IGNEUM</span></a>
|
||||
<p>Mined by GPUs. Proven by fire.</p>
|
||||
<div class="social" aria-label="Igneum elsewhere">
|
||||
<a href="https://github.com/igneum-network/spec" target="_blank" rel="noopener" aria-label="Igneum on GitHub: the spec, the vectors and the issues"><svg viewBox="0 0 24 24" width="22" height="22" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2.1c-3.2.7-3.9-1.4-3.9-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2.9-.3 1.9-.4 2.9-.4s2 .1 2.9.4c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.2c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"></path></svg></a>
|
||||
<a href="https://discord.gg/igneum" target="_blank" rel="noopener" aria-label="The Igneum Discord"><svg viewBox="0 0 24 24" width="22" height="22" fill="currentColor" aria-hidden="true"><path d="M19.6 5.3A17 17 0 0 0 15.4 4l-.2.4a15.6 15.6 0 0 1 3.9 1.9 13.6 13.6 0 0 0-14.2 0A15.6 15.6 0 0 1 8.8 4.4L8.6 4a17 17 0 0 0-4.2 1.3C1.8 9.2 1.1 13 1.4 16.7a17.1 17.1 0 0 0 5.2 2.6l1.1-1.8a10.8 10.8 0 0 1-1.7-.8l.4-.3a12.2 12.2 0 0 0 11.2 0l.4.3-1.7.8 1.1 1.8a17 17 0 0 0 5.2-2.6c.4-4.3-.7-8-3-11.4zM8.7 14.4c-1 0-1.8-.9-1.8-2.1s.8-2.1 1.8-2.1 1.9 1 1.8 2.1c0 1.2-.8 2.1-1.8 2.1zm6.6 0c-1 0-1.8-.9-1.8-2.1s.8-2.1 1.8-2.1 1.9 1 1.8 2.1c0 1.2-.8 2.1-1.8 2.1z"></path></svg></a>
|
||||
<a data-social="reddit" href="https://www.reddit.com/user/Igneum_network/" target="_blank" rel="noopener" aria-label="Igneum on Reddit"><svg viewBox="0 0 24 24" width="22" height="22" fill="currentColor" aria-hidden="true"><path d="M22 12.1a2.2 2.2 0 0 0-3.7-1.6 10.8 10.8 0 0 0-5.8-1.8l1-4.6 3.2.7a1.5 1.5 0 1 0 .2-.9l-3.6-.8a.5.5 0 0 0-.5.4l-1.1 5.2a10.8 10.8 0 0 0-5.9 1.8A2.2 2.2 0 1 0 3.4 14a4.3 4.3 0 0 0 0 .7c0 3.4 3.9 6.1 8.6 6.1s8.6-2.7 8.6-6.1a4.3 4.3 0 0 0 0-.7 2.2 2.2 0 0 0 1.4-1.9zM7 13.6a1.5 1.5 0 1 1 1.5 1.5A1.5 1.5 0 0 1 7 13.6zm8.6 4.1a5.7 5.7 0 0 1-3.6 1.1 5.7 5.7 0 0 1-3.6-1.1.4.4 0 0 1 .6-.6 4.9 4.9 0 0 0 3 .9 4.9 4.9 0 0 0 3-.9.4.4 0 0 1 .6.6zm-.3-2.6a1.5 1.5 0 1 1 1.5-1.5 1.5 1.5 0 0 1-1.5 1.5z"></path></svg></a>
|
||||
</div>
|
||||
</div>
|
||||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
<a href="/miner">The miner</a>
|
||||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
<div class="eyebrow">Contact</div>
|
||||
<a href="mailto:hello@igneum.network">hello@igneum.network</a>
|
||||
<a href="https://github.com/igneum-network/spec/issues" rel="noopener">An issue on the spec</a>
|
||||
<span class="foot-note">Report a flaw by either. Nobody from Igneum will ask for your seed.</span>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="foot-base">
|
||||
<span class="foot-imprint">Igneum Labs LTD · Unit IH-00-01-01-OF-01, Level 01, Innovation One, Dubai International Financial Centre</span>
|
||||
<span class="foot-state"><span class="dot off" id="foot-dot"></span><span id="foot-state">devnet</span></span>
|
||||
<span class="theme" role="group" aria-label="Theme"><button type="button" data-theme-set="system" aria-pressed="true">System</button><button type="button" data-theme-set="light" aria-pressed="false">Light</button><button type="button" data-theme-set="dark" aria-pressed="false">Dark</button></span>
|
||||
<span class="mono foot-copy">© 2026 Igneum · not an offer to sell anything</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
(function(){
|
||||
// theme control: stores light or dark under igneum-theme; system clears it. The head applied the stored value before paint.
|
||||
var bs=document.querySelectorAll('[data-theme-set]');if(!bs.length)return;
|
||||
function cur(){try{var t=localStorage.getItem('igneum-theme');return t==='light'||t==='dark'?t:'system';}catch(e){return 'system';}}
|
||||
function paint(){var c=cur();bs.forEach(function(b){b.setAttribute('aria-pressed',b.getAttribute('data-theme-set')===c?'true':'false');});}
|
||||
bs.forEach(function(b){b.addEventListener('click',function(){var v=b.getAttribute('data-theme-set');try{if(v==='system')localStorage.removeItem('igneum-theme');else localStorage.setItem('igneum-theme',v);}catch(e){}
|
||||
if(v==='system')document.documentElement.removeAttribute('data-theme');else document.documentElement.setAttribute('data-theme',v);paint();});});
|
||||
paint();
|
||||
// the network state word in the footer: one read of the observer per page view
|
||||
var fs=document.getElementById('foot-state'),fd=document.getElementById('foot-dot');if(fs&&fd){fetch('/api/live?window=30',{cache:'no-store'}).then(function(r){return r.json();}).then(function(d){var on=d&&d.ok&&d.state&&!d.state.stale;fs.textContent=on?'devnet live':'devnet, observer stale';fd.className='dot '+(on?'live':'off');}).catch(function(){fs.textContent='devnet';});}
|
||||
})();
|
||||
</script>
|
||||
<!-- footer:end -->
|
||||
<script src="/ui.js" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
227
site/dev-fee.html
Normal file
227
site/dev-fee.html
Normal file
|
|
@ -0,0 +1,227 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
||||
<title>The Ember dev fee, in full view</title>
|
||||
<meta name="description" content="The protocol carries no fee. The Ember software takes an optional 1% dev fee, the norm for GPU miners, visible in the app and off with one flag. Where it is, how it was measured, how to turn it off.">
|
||||
<link rel="canonical" href="https://igneum.network/dev-fee">
|
||||
<meta name="theme-color" content="#0C0C0E">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:site_name" content="Igneum">
|
||||
<meta property="og:title" content="The Ember dev fee, in full view">
|
||||
<meta property="og:description" content="The protocol carries no fee. The Ember software takes an optional 1% dev fee, the norm for GPU miners, visible in the app and off with one flag. Where it is, how it was measured, how to turn it off.">
|
||||
<meta property="og:url" content="https://igneum.network/dev-fee">
|
||||
<meta property="og:image" content="https://igneum.network/og.png?v=3">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="The Ember dev fee, in full view">
|
||||
<meta name="twitter:description" content="The protocol carries no fee. The Ember software takes an optional 1% dev fee, the norm for GPU miners, visible in the app and off with one flag. Where it is, how it was measured, how to turn it off.">
|
||||
<meta name="twitter:image" content="https://igneum.network/og.png?v=3">
|
||||
<meta name="twitter:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Crect width='1024' height='1024' fill='%230C0C0E'/%3E%3Cg transform='translate(166.95 166.95) scale(6.901)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml">
|
||||
<link rel="icon" href="/favicon.ico" sizes="48x48">
|
||||
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
|
||||
<link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192">
|
||||
<link rel="icon" href="/icon-512.png" type="image/png" sizes="512x512">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
|
||||
<link rel="manifest" href="/site.webmanifest">
|
||||
<!-- head:start -->
|
||||
<link rel="preload" href="/fonts/unbounded-900.woff2" as="font" type="font/woff2" crossorigin>
|
||||
<link rel="preload" href="/fonts/plex-sans-400.woff2" as="font" type="font/woff2" crossorigin>
|
||||
<link rel="stylesheet" href="/site.css">
|
||||
<style>
|
||||
/* Shared by every page: the head partial, injected by the build between the head markers. Edit the partial, not the page. */
|
||||
/* Fonts, self-hosted (latin subsets, OFL): Unbounded 500/700/900, IBM Plex Sans 400/500/600, IBM Plex Mono 400/500. Fallbacks carry size and ascent overrides so the swap does not move the layout. The tokens, type and components are in /site.css (docs/plans/site-ui-3.md). */
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/unbounded-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/unbounded-700.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:900;font-display:swap;src:url(/fonts/unbounded-900.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-sans-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-sans-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/plex-sans-600.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-mono-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-mono-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded Fallback';src:local('Arial Black'),local('Arial-Black'),local('Impact');size-adjust:114%;ascent-override:87.5%;descent-override:21.5%;line-gap-override:0%}
|
||||
@font-face{font-family:'Plex Sans Fallback';src:local('Arial'),local('Helvetica Neue'),local('Helvetica');size-adjust:100.5%;ascent-override:102%;descent-override:27.4%;line-gap-override:0%}
|
||||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: the footer control stores "light" or "dark" under igneum-theme; nothing stored means the system setting */
|
||||
(function(){try{var t=localStorage.getItem("igneum-theme");if(t==="light"||t==="dark")document.documentElement.setAttribute("data-theme",t);}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
/* derived-page block (rendered by the build from its source page or document); tokens, type and components are in /site.css */
|
||||
[id]{scroll-margin-top:calc(var(--nav-h) + 16px)}
|
||||
.page-hero .lead{max-width:72ch}
|
||||
.derived{max-width:78ch;color:var(--ink-2)}
|
||||
.derived h2{font-size:var(--t-h3);margin:var(--s-6) 0 var(--s-3)}
|
||||
.derived h3{font-size:16px;margin:var(--s-5) 0 var(--s-2)}
|
||||
.derived ul,.derived ol{margin:0 0 var(--s-4);padding-left:22px}
|
||||
.derived li{margin-bottom:8px}
|
||||
.derived strong{color:var(--bone);font-weight:600}
|
||||
.derived p,.derived li{overflow-wrap:anywhere}
|
||||
.derived .tbl{margin:var(--s-4) 0 var(--s-5)}
|
||||
.derived .pull{margin:var(--s-5) 0;padding:var(--s-4) var(--s-5);border-left:2px solid var(--ember);background:var(--row);border-radius:0 var(--r-row) var(--r-row) 0;font:500 var(--t-lg)/1.45 var(--f-sans);color:var(--bone)}
|
||||
.derived .src{margin:calc(-1 * var(--s-2)) 0 var(--s-5);font:400 13px/1.5 var(--f-mono);color:var(--ash)}
|
||||
.derived .src b{font-weight:500;color:var(--ink-2)}
|
||||
.onward{display:flex;flex-wrap:wrap;gap:var(--s-3);margin-top:var(--s-6);padding-top:var(--s-5);border-top:1px solid var(--line)}
|
||||
.feecard{display:grid;grid-template-columns:1fr;gap:var(--s-4)}@media (min-width:900px){.feecard{grid-template-columns:minmax(0,1.1fr) minmax(0,.9fr);align-items:start}}pre b{color:var(--molten-text);font-weight:500}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- nav:start -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
<nav class="nav" aria-label="Main">
|
||||
<div class="wrap">
|
||||
<a href="/" class="brand" aria-label="Igneum home">
|
||||
<svg class="mark" viewBox="0 0 1024 1024" width="28" height="28" aria-hidden="true"><rect width="1024" height="1024" rx="160" fill="#0C0C0E"></rect><g transform="translate(166.95 166.95) scale(6.901)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></g></svg>
|
||||
<span class="word">IGNEUM</span>
|
||||
</a>
|
||||
<div class="links" id="nav-links">
|
||||
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
|
||||
<a href="/miner" data-nav="miner" aria-current="page">Miner</a>
|
||||
<a href="/app" data-nav="app">App</a>
|
||||
<a href="/wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/live" data-nav="live">Live devnet</a>
|
||||
<a href="/ledger" data-nav="ledger">Ledger</a>
|
||||
</div>
|
||||
<a href="/miner#get" class="btn primary small cta">Download</a>
|
||||
<button class="burger" id="nav-burger" type="button" aria-expanded="false" aria-controls="nav-sheet" aria-label="Open the menu" aria-haspopup="true"><span class="bars" aria-hidden="true"></span></button>
|
||||
<div class="nav-sheet" id="nav-sheet">
|
||||
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
|
||||
<a href="/miner" data-nav="miner">Miner</a>
|
||||
<a href="/app" data-nav="app">App</a>
|
||||
<a href="/wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/live" data-nav="live">Live devnet</a>
|
||||
<a href="/ledger" data-nav="ledger">Ledger</a>
|
||||
<a href="/miner#get" class="btn primary">Download</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<script>
|
||||
(function(){
|
||||
// the menu: open on the button, closed by any link, Escape (focus back on the button) or a resize past 900 px
|
||||
var n=document.querySelector('.nav'),b=document.getElementById('nav-burger'),s=document.getElementById('nav-sheet');if(!n||!b||!s)return;
|
||||
function set(o){n.classList.toggle('open',o);b.setAttribute('aria-expanded',o?'true':'false');b.setAttribute('aria-label',o?'Close the menu':'Open the menu');document.documentElement.style.overflow=o?'hidden':'';}
|
||||
b.addEventListener('click',function(){set(!n.classList.contains('open'));});
|
||||
s.addEventListener('click',function(e){if(e.target.closest('a'))set(false);});
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&n.classList.contains('open')){set(false);b.focus();}});
|
||||
var mq=window.matchMedia('(min-width:901px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
})();
|
||||
</script>
|
||||
<!-- nav:end -->
|
||||
<main id="main">
|
||||
<section class="page-hero">
|
||||
<div class="wrap">
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>The dev fee</span></div>
|
||||
<div class="eyebrow"><span class="line"></span>The dev fee</div>
|
||||
<h1>The fee, in full view.</h1>
|
||||
<p class="lead">The protocol carries no fee: no dev fund, no fee to any team, foundation or fund. The software fee is the miner app’s, like every other GPU miner’s, and one flag turns it off.</p>
|
||||
</div>
|
||||
</section>
|
||||
<section class="sec compact">
|
||||
<div class="wrap">
|
||||
<div class="wrap">
|
||||
|
||||
<div class="feecard">
|
||||
<div class="card">
|
||||
<p>The <span data-product="name">Ember</span> software takes a visible, switchable 1% dev fee, the norm for GPU miners. One block template in 100 is requested with the dev payout address instead of yours. The fee goes to Igneum Labs LTD, the company that ships the software.</p>
|
||||
<div class="tbl"><table style="min-width:0">
|
||||
<thead><tr><th>Where</th><th>Off with</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>The app, Earnings</td><td>the Dev fee switch under the money rows</td></tr>
|
||||
<tr><td>The command line</td><td class="mono">--dev-fee 0</td></tr>
|
||||
<tr><td>HiveOS, extra config</td><td class="mono">DEV_FEE=0</td></tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
<p class="note">Measured on a test network, 4 Oct 2026: 9 fee blocks in the 785 blocks of two fee-paying miners (1.146%); the control miner at <span class="mono">--dev-fee 0</span> paid none; the miners’ counters and both nodes agree. <a href="/bench">The log</a>.</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="eyebrow">Earnings, as the app shows it</div>
|
||||
<div class="switch"><span class="track"></span><span>Dev fee: 1 block in 100 pays the people who make this app</span></div>
|
||||
<p class="note">The network itself takes nothing. This is the app’s fee, the same way every mining app takes one. This switch turns it off.</p>
|
||||
<div class="eyebrow" style="margin-top:var(--s-5)">What the miner prints at start</div>
|
||||
<pre>dev fee 1% (1 block in 100) to 0x<address>; --dev-fee 0 turns it off</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="onward"><a href="/miner#get" class="btn">Get the miner</a><a href="/litepaper#economics" class="btn">The economics</a><a href="/bench" class="btn">The engineering log</a></div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<!-- footer:start -->
|
||||
<footer class="foot">
|
||||
<div class="wrap">
|
||||
<div class="foot-grid">
|
||||
<div class="foot-brand">
|
||||
<a href="/" class="brand" aria-label="Igneum home"><svg class="mark" viewBox="0 0 1024 1024" width="26" height="26" aria-hidden="true"><rect width="1024" height="1024" rx="160" fill="#0C0C0E"></rect><g transform="translate(166.95 166.95) scale(6.901)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></g></svg><span class="word">IGNEUM</span></a>
|
||||
<p>Mined by GPUs. Proven by fire.</p>
|
||||
<div class="social" aria-label="Igneum elsewhere">
|
||||
<a href="https://github.com/igneum-network/spec" target="_blank" rel="noopener" aria-label="Igneum on GitHub: the spec, the vectors and the issues"><svg viewBox="0 0 24 24" width="22" height="22" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2.1c-3.2.7-3.9-1.4-3.9-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2.9-.3 1.9-.4 2.9-.4s2 .1 2.9.4c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.2c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"></path></svg></a>
|
||||
<a href="https://discord.gg/igneum" target="_blank" rel="noopener" aria-label="The Igneum Discord"><svg viewBox="0 0 24 24" width="22" height="22" fill="currentColor" aria-hidden="true"><path d="M19.6 5.3A17 17 0 0 0 15.4 4l-.2.4a15.6 15.6 0 0 1 3.9 1.9 13.6 13.6 0 0 0-14.2 0A15.6 15.6 0 0 1 8.8 4.4L8.6 4a17 17 0 0 0-4.2 1.3C1.8 9.2 1.1 13 1.4 16.7a17.1 17.1 0 0 0 5.2 2.6l1.1-1.8a10.8 10.8 0 0 1-1.7-.8l.4-.3a12.2 12.2 0 0 0 11.2 0l.4.3-1.7.8 1.1 1.8a17 17 0 0 0 5.2-2.6c.4-4.3-.7-8-3-11.4zM8.7 14.4c-1 0-1.8-.9-1.8-2.1s.8-2.1 1.8-2.1 1.9 1 1.8 2.1c0 1.2-.8 2.1-1.8 2.1zm6.6 0c-1 0-1.8-.9-1.8-2.1s.8-2.1 1.8-2.1 1.9 1 1.8 2.1c0 1.2-.8 2.1-1.8 2.1z"></path></svg></a>
|
||||
<a data-social="reddit" href="https://www.reddit.com/user/Igneum_network/" target="_blank" rel="noopener" aria-label="Igneum on Reddit"><svg viewBox="0 0 24 24" width="22" height="22" fill="currentColor" aria-hidden="true"><path d="M22 12.1a2.2 2.2 0 0 0-3.7-1.6 10.8 10.8 0 0 0-5.8-1.8l1-4.6 3.2.7a1.5 1.5 0 1 0 .2-.9l-3.6-.8a.5.5 0 0 0-.5.4l-1.1 5.2a10.8 10.8 0 0 0-5.9 1.8A2.2 2.2 0 1 0 3.4 14a4.3 4.3 0 0 0 0 .7c0 3.4 3.9 6.1 8.6 6.1s8.6-2.7 8.6-6.1a4.3 4.3 0 0 0 0-.7 2.2 2.2 0 0 0 1.4-1.9zM7 13.6a1.5 1.5 0 1 1 1.5 1.5A1.5 1.5 0 0 1 7 13.6zm8.6 4.1a5.7 5.7 0 0 1-3.6 1.1 5.7 5.7 0 0 1-3.6-1.1.4.4 0 0 1 .6-.6 4.9 4.9 0 0 0 3 .9 4.9 4.9 0 0 0 3-.9.4.4 0 0 1 .6.6zm-.3-2.6a1.5 1.5 0 1 1 1.5-1.5 1.5 1.5 0 0 1-1.5 1.5z"></path></svg></a>
|
||||
</div>
|
||||
</div>
|
||||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
<a href="/miner">The miner</a>
|
||||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
<div class="eyebrow">Contact</div>
|
||||
<a href="mailto:hello@igneum.network">hello@igneum.network</a>
|
||||
<a href="https://github.com/igneum-network/spec/issues" rel="noopener">An issue on the spec</a>
|
||||
<span class="foot-note">Report a flaw by either. Nobody from Igneum will ask for your seed.</span>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="foot-base">
|
||||
<span class="foot-imprint">Igneum Labs LTD · Unit IH-00-01-01-OF-01, Level 01, Innovation One, Dubai International Financial Centre</span>
|
||||
<span class="foot-state"><span class="dot off" id="foot-dot"></span><span id="foot-state">devnet</span></span>
|
||||
<span class="theme" role="group" aria-label="Theme"><button type="button" data-theme-set="system" aria-pressed="true">System</button><button type="button" data-theme-set="light" aria-pressed="false">Light</button><button type="button" data-theme-set="dark" aria-pressed="false">Dark</button></span>
|
||||
<span class="mono foot-copy">© 2026 Igneum · not an offer to sell anything</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
(function(){
|
||||
// theme control: stores light or dark under igneum-theme; system clears it. The head applied the stored value before paint.
|
||||
var bs=document.querySelectorAll('[data-theme-set]');if(!bs.length)return;
|
||||
function cur(){try{var t=localStorage.getItem('igneum-theme');return t==='light'||t==='dark'?t:'system';}catch(e){return 'system';}}
|
||||
function paint(){var c=cur();bs.forEach(function(b){b.setAttribute('aria-pressed',b.getAttribute('data-theme-set')===c?'true':'false');});}
|
||||
bs.forEach(function(b){b.addEventListener('click',function(){var v=b.getAttribute('data-theme-set');try{if(v==='system')localStorage.removeItem('igneum-theme');else localStorage.setItem('igneum-theme',v);}catch(e){}
|
||||
if(v==='system')document.documentElement.removeAttribute('data-theme');else document.documentElement.setAttribute('data-theme',v);paint();});});
|
||||
paint();
|
||||
// the network state word in the footer: one read of the observer per page view
|
||||
var fs=document.getElementById('foot-state'),fd=document.getElementById('foot-dot');if(fs&&fd){fetch('/api/live?window=30',{cache:'no-store'}).then(function(r){return r.json();}).then(function(d){var on=d&&d.ok&&d.state&&!d.state.stale;fs.textContent=on?'devnet live':'devnet, observer stale';fd.className='dot '+(on?'live':'off');}).catch(function(){fs.textContent='devnet';});}
|
||||
})();
|
||||
</script>
|
||||
<!-- footer:end -->
|
||||
<script src="/ui.js" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -126,8 +126,9 @@ td.mono{font-family:var(--f-mono);font-size:12.5px;min-width:180px}td.iv{color:v
|
|||
<!-- nav:end -->
|
||||
<main id="main" class="wrap">
|
||||
<div class="head">
|
||||
<div class="eyebrow">31 claims · 5 labels · 7 Oct 2026</div>
|
||||
<h1>Evidence</h1>
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>Evidence</span></div>
|
||||
<div class="eyebrow"><span class="line"></span>31 claims · 5 labels · 7 Oct 2026</div>
|
||||
<h1>Evidence<span class="accent">.</span></h1>
|
||||
</div>
|
||||
<p class="note">Every claim the homepage and the litepaper make, one row each, with one of five labels: <b>designed</b> (a decision, no code), <b>implemented</b> (code with passing test vectors), <b>tested by the team</b> (measured by the project on a named machine, in the engineering log), <b>reproduced externally</b> (a third party ran the published command and got the published result) and <b>reviewed independently</b> (a named outside reviewer published a finding on that version). Nothing on this chain has been reproduced externally or reviewed independently; every row says so. A label belongs to the exact version in the row, and an audit of one version never covers a newer one. The 12-node cloud network of 4 October 2026 is the project's own, so its rows are tested by the team, not reproduced externally.</p>
|
||||
<div class="labels">
|
||||
|
|
@ -201,11 +202,12 @@ td.mono{font-family:var(--f-mono);font-size:12.5px;min-width:180px}td.iv{color:v
|
|||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
|
|
@ -213,15 +215,15 @@ td.mono{font-family:var(--f-mono);font-size:12.5px;min-width:180px}td.iv{color:v
|
|||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/litepaper#roadmap">Journey</a>
|
||||
<a href="/metamask">Add to MetaMask</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
|
|
|
|||
|
|
@ -136,9 +136,10 @@ main{padding-bottom:var(--sec)}
|
|||
<!-- nav:end -->
|
||||
<main id="main" class="wrap">
|
||||
<div class="head">
|
||||
<div class="eyebrow">devnet, last 24 hours</div>
|
||||
<h1>Explorer</h1>
|
||||
<p>Every block the devnet made in the last day, read from a node by the observer. Paste a block hash, a transaction hash, a chain block number or an address.</p>
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>Explorer</span></div>
|
||||
<div class="eyebrow"><span class="line"></span>devnet, last 24 hours</div>
|
||||
<h1>Explorer<span class="accent">.</span></h1>
|
||||
<p>Every block the devnet made in the last day, read from a node by the observer. Paste a block hash, a transaction hash, a chain block number or an address, or click any row.</p>
|
||||
<form class="search" id="search" role="search">
|
||||
<input id="q" type="search" autocomplete="off" spellcheck="false" placeholder="block hash, transaction hash, chain block number, 0x address or igneumdev:… address" aria-label="Search the explorer">
|
||||
<button class="btn primary" type="submit">Search</button>
|
||||
|
|
@ -193,11 +194,12 @@ main{padding-bottom:var(--sec)}
|
|||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
|
|
@ -205,15 +207,15 @@ main{padding-bottom:var(--sec)}
|
|||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/litepaper#roadmap">Journey</a>
|
||||
<a href="/metamask">Add to MetaMask</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
|
|
|
|||
|
|
@ -118,15 +118,16 @@ dt{color:var(--ash)}dd{margin:0;font-family:var(--f-mono);font-size:14px;overflo
|
|||
<!-- nav:end -->
|
||||
<main id="main" class="wrap">
|
||||
<div class="head">
|
||||
<div class="eyebrow">Testnet faucet</div>
|
||||
<h1>10 IGN a day, for testing.</h1>
|
||||
<p>Paste an address. The faucet sends 10 testnet IGN and shows the transaction hash. Once per address per day, once per connection per day. No account, no sign-in.</p>
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>Testnet faucet</span></div>
|
||||
<div class="eyebrow"><span class="line"></span>Testnet faucet</div>
|
||||
<h1>10 IGN a day, <span class="accent">for testing.</span></h1>
|
||||
<p>Paste an address. The faucet sends 10 testnet IGN and shows you the transaction hash. Once per address per day, once per connection per day. No account, no sign-in, nothing to install.</p>
|
||||
<p data-testnet-notice class="notice">Public testnet: not yet open. The faucet is prepared on the devnet and answers "not open yet" until the testnet starts.</p>
|
||||
</div>
|
||||
<div class="grid">
|
||||
<section class="card" aria-labelledby="ask">
|
||||
<h2 id="ask">Ask for 10 IGN</h2>
|
||||
<p>An Ethereum-style address: 0x and 40 hex characters. The one the miner made for you, or any wallet set to the Igneum testnet.</p>
|
||||
<p>An Ethereum-style address: 0x and 40 hex characters. The one the miner made for you, or any wallet you have pointed at the Igneum testnet.</p>
|
||||
<form id="faucet-form" novalidate>
|
||||
<label for="address">Address</label>
|
||||
<input id="address" name="address" inputmode="text" autocomplete="off" spellcheck="false" placeholder="0x…" required pattern="^0x[0-9a-fA-F]{40}$" aria-describedby="status">
|
||||
|
|
@ -166,11 +167,12 @@ dt{color:var(--ash)}dd{margin:0;font-family:var(--f-mono);font-size:14px;overflo
|
|||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
|
|
@ -178,15 +180,15 @@ dt{color:var(--ash)}dd{margin:0;font-family:var(--f-mono);font-size:14px;overflo
|
|||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/litepaper#roadmap">Journey</a>
|
||||
<a href="/metamask">Add to MetaMask</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
|
|
|
|||
136
site/hero-scene.js
Normal file
136
site/hero-scene.js
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
/* The home hero's GPU illustration (7 Oct 2026, from the redesign package's HardwareScene, rebuilt to run continuously).
|
||||
* An illustration, never telemetry: nothing here reads the chain. The loop never idles while the hero is in view: the
|
||||
* fans turn, the pulses travel the traces, the block breathes and drifts, the shards orbit, the lock cage shimmers.
|
||||
* It stops only under reduced motion, a hidden tab or the hero scrolled out of view, and resumes where it left off
|
||||
* (the clock advances by frame delta, never by wall time, so there is no jump on return). The still parts (the grid,
|
||||
* the board, the traces, the card body) are painted once into two cached layers and redrawn per frame with drawImage;
|
||||
* only the moving parts are drawn each frame, so an idle hero costs a few percent of a core at 60 fps.
|
||||
* IgneumHero.mount(canvas, { steps, status, detail }) returns { setStage, destroy }. */
|
||||
(function (root) {
|
||||
'use strict';
|
||||
var TAU = Math.PI * 2;
|
||||
function clamp(v, a, b) { return Math.max(a, Math.min(b, v)); }
|
||||
var LABELS = [['01 / Mining', 'The card runs this hour’s program. A block comes out.'], ['02 / Proving', 'The same card proves the block in shards.'], ['03 / Locking', 'Two thirds of the weight sign. The checkpoint locks.']];
|
||||
var CONNECTIONS = [[-205,-93,-173,-93,-173,-68],[-210,77,-174,77,-174,49],[80,91,80,115,190,115],[184,-74,214,-74,214,-28],[-105,97,-105,125,-157,125],[144,71,201,71,201,107]];
|
||||
function mount(canvas, opts) {
|
||||
opts = opts || {};
|
||||
var ctx = canvas.getContext('2d'); if (!ctx) throw new Error('A 2D canvas context is required.');
|
||||
var w = 0, h = 0, dpr = 1, raf = 0, disposed = false, inView = true, last = 0, clock = 0;
|
||||
var stage = 0, prevStage = 0, stageAt = 0, manualAt = -1e9, AUTO = 7000, HOLD = 25000;
|
||||
var reduced = root.matchMedia ? root.matchMedia('(prefers-reduced-motion: reduce)') : { matches: false, addEventListener: function () {} };
|
||||
var base = null, card = null, cardKey = '', pal = null;
|
||||
function theme() {
|
||||
var cs = getComputedStyle(document.documentElement), light = document.documentElement.getAttribute('data-theme') === 'light' || (!document.documentElement.getAttribute('data-theme') && root.matchMedia && root.matchMedia('(prefers-color-scheme: light)').matches);
|
||||
pal = { light: light, ember: cs.getPropertyValue('--ember').trim() || '#F2541B', gold: cs.getPropertyValue('--molten').trim() || '#FFB35C', bone: cs.getPropertyValue('--bone').trim() || '#F4F1EC', ash: cs.getPropertyValue('--ash').trim() || '#9A9A9E', line: cs.getPropertyValue('--line').trim() || '#2A2A30' };
|
||||
base = null; card = null; cardKey = '';
|
||||
}
|
||||
function geom() { var s = Math.min(w / 590, h / 490), cx = w * .51, cy = h * .52; return { s: s, cx: cx, cy: cy, p: function (x, y, z) { z = z || 0; return { x: cx + (x * .91 - y * .86) * s, y: cy + (x * .42 + y * .43 - z) * s }; } }; }
|
||||
function layer(fn) { var c = document.createElement('canvas'); c.width = Math.max(1, Math.round(w * dpr)); c.height = Math.max(1, Math.round(h * dpr)); var k = c.getContext('2d'); k.setTransform(dpr, 0, 0, dpr, 0, 0); fn(k, geom()); return c; }
|
||||
function poly(c, ps, fill, stroke, lw) { c.beginPath(); ps.forEach(function (a, i) { i ? c.lineTo(a.x, a.y) : c.moveTo(a.x, a.y); }); c.closePath(); if (fill) { c.fillStyle = fill; c.fill(); } if (stroke) { c.strokeStyle = stroke; c.lineWidth = lw || 1; c.stroke(); } }
|
||||
function stroke(c, ps, col, lw) { c.beginPath(); ps.forEach(function (a, i) { i ? c.lineTo(a.x, a.y) : c.moveTo(a.x, a.y); }); c.strokeStyle = col; c.lineWidth = lw || 1; c.stroke(); }
|
||||
function box(c, g, x, y, z, ww, hh, dep, top, edge) {
|
||||
var p = g.p, light = pal.light;
|
||||
poly(c, [p(x, y + hh, z), p(x + ww, y + hh, z), p(x + ww, y + hh, z - dep), p(x, y + hh, z - dep)], light ? '#e8e2d9' : '#0d0d10', edge);
|
||||
poly(c, [p(x + ww, y, z), p(x + ww, y + hh, z), p(x + ww, y + hh, z - dep), p(x + ww, y, z - dep)], light ? '#d6d0c9' : '#17171b', edge);
|
||||
poly(c, [p(x, y, z), p(x + ww, y, z), p(x + ww, y + hh, z), p(x, y + hh, z)], top, edge);
|
||||
}
|
||||
function plane(c, g, z, fn) { c.save(); c.transform(.91 * g.s, .42 * g.s, -.86 * g.s, .43 * g.s, g.cx, g.cy - z * g.s); fn(); c.restore(); }
|
||||
// layer A: the grid, the glow, the board, the routed traces and their pads, the screws. Still.
|
||||
function paintBase(c, g) {
|
||||
var p = g.p, light = pal.light, j;
|
||||
for (j = -6; j <= 6; j++) { stroke(c, [p(-245, j * 29, -60), p(245, j * 29, -60)], light ? '#d9d2c666' : '#35313955', .7); stroke(c, [p(j * 40, -155, -60), p(j * 40, 155, -60)], light ? '#d9d2c666' : '#35313955', .7); }
|
||||
var gr = c.createRadialGradient(g.cx, g.cy + 15 * g.s, 5, g.cx, g.cy + 15 * g.s, 235 * g.s); gr.addColorStop(0, light ? '#F2541B16' : '#F2541B14'); gr.addColorStop(1, '#F2541B00'); c.fillStyle = gr; c.fillRect(0, 0, w, h);
|
||||
box(c, g, -223, -112, -40, 446, 224, 8, light ? '#ede8e0' : '#101013', light ? '#c8c1b6' : '#383139');
|
||||
CONNECTIONS.forEach(function (a, i) { var pts = [p(a[0], a[1], -38), p(a[2], a[3], -38), p(a[4], a[5], -38)]; stroke(c, pts, i % 2 ? (light ? '#af795a77' : '#a5613655') : (light ? '#be59208c' : '#f2541b66'), 1.1); var q = pts[2]; c.fillStyle = i % 2 ? pal.gold : pal.ember; c.fillRect(q.x - 2, q.y - 2, 4, 4); });
|
||||
[[-200, -85], [181, -85], [-200, 89], [181, 89]].forEach(function (xy) { box(c, g, xy[0], xy[1], -36, 16, 10, 3, light ? '#e2dbd0' : '#24232a', pal.line); });
|
||||
var q = p(-203, 90, -34); c.strokeStyle = pal.line; c.lineWidth = 1; c.beginPath(); c.moveTo(q.x, q.y); c.lineTo(q.x - 24 * g.s, q.y + 20 * g.s); c.lineTo(q.x - 52 * g.s, q.y + 20 * g.s); c.stroke();
|
||||
}
|
||||
// layer B: the backplate, the fins, the shroud, the fan housings, the chip and the labels, at one lift. Rebuilt only while the lift moves.
|
||||
function paintCard(c, g, top) {
|
||||
var p = g.p, light = pal.light, x;
|
||||
box(c, g, -187, -61, top - 18, 374, 122, 17, light ? '#b7b0a7' : '#19191f', light ? '#888279' : '#444149');
|
||||
for (x = -180; x < 180; x += 7) stroke(c, [p(x, 61, top - 20), p(x, 61, top - 32)], light ? '#6b655b' : '#48434a', 1);
|
||||
box(c, g, -197, -67, top, 394, 134, 17, light ? '#d0c9bf' : '#222127', light ? '#898176' : '#62504b');
|
||||
stroke(c, [p(-196, 68, top - 6), p(198, 68, top - 6)], pal.ember, 2.5);
|
||||
plane(c, g, top + 1, function () {
|
||||
var i; c.strokeStyle = light ? '#827a71' : '#555158'; c.lineWidth = 1;
|
||||
for (i = 0; i < 12; i++) { x = -178 + i * 31; c.beginPath(); c.moveTo(x, -62); c.lineTo(x + 24, -62); c.stroke(); }
|
||||
[-112, 112].forEach(function (fx) { c.beginPath(); c.arc(fx, 0, 54, 0, TAU); c.fillStyle = light ? '#a29b91' : '#101015'; c.fill(); c.strokeStyle = light ? '#6c655b' : '#4e464b'; c.stroke(); c.beginPath(); c.arc(fx, 0, 48, 0, TAU); c.strokeStyle = light ? '#756d63' : '#353039'; c.stroke(); });
|
||||
c.fillStyle = light ? '#a99d8e' : '#17161b'; c.fillRect(-40, -45, 80, 90); c.strokeStyle = light ? '#9a8268' : '#8c4b2d'; c.strokeRect(-40, -45, 80, 90); c.fillStyle = pal.ember; c.fillRect(-27, -30, 54, 60); c.fillStyle = light ? '#f5e6d5' : '#261610'; c.fillRect(-23, -26, 46, 52); c.strokeStyle = pal.gold; c.strokeRect(-19, -22, 38, 44);
|
||||
for (var a = -30; a <= 30; a += 8) { c.fillStyle = pal.gold; c.fillRect(-44, a, 4, 2); c.fillRect(40, a, 4, 2); }
|
||||
c.fillStyle = pal.gold; c.font = '500 7px IBM Plex Mono, Plex Mono Fallback, monospace'; c.textAlign = 'center'; c.fillText('IGNEUM', 0, -4); c.font = '6px IBM Plex Mono, Plex Mono Fallback, monospace'; c.fillText('COMPUTE', 0, 9);
|
||||
c.font = '500 7px IBM Plex Mono, Plex Mono Fallback, monospace'; c.textAlign = 'left'; c.fillStyle = light ? '#3f362b' : '#bcaaa0'; c.fillText('EMBER / GPU WORKER', -176, 60);
|
||||
[[-184, -56], [183, -56], [-184, 54], [183, 54]].forEach(function (xy) { c.beginPath(); c.arc(xy[0], xy[1], 2, 0, TAU); c.fillStyle = light ? '#6a6057' : '#878087'; c.fill(); });
|
||||
});
|
||||
}
|
||||
function ease(t) { return 1 - Math.pow(1 - clamp(t, 0, 1), 3); }
|
||||
function lerp(a, b, t) { return a + (b - a) * t; }
|
||||
function liftOf(st) { return st === 1 ? 15 : st === 2 ? 8 : 0; }
|
||||
function paint(t) {
|
||||
if (!w || !h || disposed) return; if (!pal) theme();
|
||||
var g = geom(), p = g.p, s = g.s, light = pal.light, tr = ease((t - stageAt) / 950), bump = Math.sin(clamp((t - stageAt) / 950, 0, 1) * Math.PI);
|
||||
var lift = lerp(liftOf(prevStage), liftOf(stage), tr), top = 18 - lift, key = Math.round(lift * 4);
|
||||
if (!base) base = layer(paintBase);
|
||||
if (!card || cardKey !== String(key)) { card = layer(function (c, gg) { paintCard(c, gg, top); }); cardKey = String(key); }
|
||||
ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
||||
ctx.drawImage(base, 0, 0, w, h);
|
||||
// pulses travel the traces all the time, each on its own phase; a little faster while a block is being mined
|
||||
var speed = stage === 0 ? 1.25 : 1;
|
||||
CONNECTIONS.forEach(function (a, i) { var pts = [p(a[0], a[1], -38), p(a[2], a[3], -38), p(a[4], a[5], -38)], u = ((t * .00045 * speed) + i * .37) % 1, seg = u < .5 ? 0 : 1, v = (u % .5) * 2, pt = { x: pts[seg].x + (pts[seg + 1].x - pts[seg].x) * v, y: pts[seg].y + (pts[seg + 1].y - pts[seg].y) * v }; ctx.beginPath(); ctx.arc(pt.x, pt.y, 2.2, 0, TAU); ctx.fillStyle = i % 2 ? pal.gold : pal.ember; ctx.globalAlpha = .55 + .45 * Math.sin(u * Math.PI); ctx.fill(); ctx.globalAlpha = 1; });
|
||||
ctx.drawImage(card, 0, 0, w, h);
|
||||
// the fans: always turning, faster while mining, a slow idle while proving and locking
|
||||
var rpm = stage === 0 ? .0062 : .0032, rot = t * rpm;
|
||||
plane(ctx, g, top + 1, function () {
|
||||
[-112, 112].forEach(function (fx, fi) {
|
||||
var i; for (i = 0; i < 11; i++) { ctx.save(); ctx.translate(fx, 0); ctx.rotate(i * TAU / 11 + rot * (fi ? -1 : 1)); ctx.beginPath(); ctx.moveTo(10, -4); ctx.bezierCurveTo(22, -21, 39, -23, 45, -8); ctx.quadraticCurveTo(25, -9, 15, 6); ctx.closePath(); ctx.fillStyle = light ? '#8f877c' : '#3a3540'; ctx.fill(); ctx.strokeStyle = light ? '#8d8478' : '#51454a'; ctx.lineWidth = .6; ctx.stroke(); ctx.restore(); }
|
||||
ctx.beginPath(); ctx.arc(fx, 0, 13, 0, TAU); ctx.fillStyle = light ? '#ddd4c8' : '#2d272e'; ctx.fill(); ctx.strokeStyle = pal.ember; ctx.lineWidth = 1.4; ctx.stroke(); ctx.beginPath(); ctx.arc(fx, 0, 3, 0, TAU); ctx.fillStyle = pal.ember; ctx.fill();
|
||||
});
|
||||
});
|
||||
// the block: lifted off the card, breathing and drifting a little, never still
|
||||
var bob = Math.sin(t * .0013) * 3 + Math.sin(t * .0007) * 1.5, z = lerp(prevStage === 0 ? 105 : 135, stage === 0 ? 105 : 135, tr) + bob, px = 50 + Math.sin(t * .0005) * 2, py = -23 + Math.cos(t * .0006) * 2, blockS = lerp(prevStage === 2 ? 33 : 28, stage === 2 ? 33 : 28, tr), i;
|
||||
var below = p(px, py, top + 7), above = p(px, py, z - 10); stroke(ctx, [below, above], light ? '#b7734580' : '#f2541b60', 1);
|
||||
ctx.setLineDash([3, 5]); ctx.lineDashOffset = -t * .02; stroke(ctx, [p(-112, 0, top + 8), p(-112, 0, top + 39), p(px, py, z - 10)], light ? '#b78b6866' : '#d18e4750', .8); stroke(ctx, [p(112, 0, top + 8), p(112, 0, top + 36), p(px, py, z - 10)], light ? '#b78b6866' : '#d18e4750', .8); ctx.setLineDash([]); ctx.lineDashOffset = 0;
|
||||
var glow = .55 + .45 * Math.sin(t * .0021);
|
||||
for (i = 0; i < 3; i++) box(ctx, g, px - blockS, py - blockS, z + i * 9, blockS * 2, blockS * 2, 6, light ? '#efe4d7' : '#221a19', i === 2 ? pal.ember : (light ? '#b2825d' : '#8d4428'));
|
||||
plane(ctx, g, z + 20, function () { ctx.strokeStyle = pal.gold; ctx.lineWidth = 1; ctx.strokeRect(px - 17, py - 17, 34, 34); ctx.fillStyle = light ? 'rgba(188,101,53,' + (.5 + .4 * glow) + ')' : 'rgba(242,84,27,' + (.12 + .25 * glow) + ')'; ctx.fillRect(px - 13, py - 13, 26, 26); if (stage > 0 && tr > .4) { ctx.strokeStyle = pal.gold; ctx.lineWidth = 2; ctx.beginPath(); ctx.moveTo(px - 7, py); ctx.lineTo(px - 2, py + 5); ctx.lineTo(px + 9, py - 7); ctx.stroke(); } else { ctx.fillStyle = pal.ember; ctx.fillRect(px - 2, py - 2, 4, 4); } });
|
||||
// the shards: four, orbiting the block slowly while proving and locking
|
||||
var shardA = stage >= 1 ? ease((t - stageAt) / 950) : (prevStage >= 1 ? 1 - ease((t - stageAt) / 950) : 0);
|
||||
if (shardA > .01) { var orbit = t * .00035; for (i = 0; i < 4; i++) { var angle = i * TAU / 4 + .25 + orbit, r = 85 * shardA, x = px + Math.cos(angle) * r, y = py + Math.sin(angle) * r, zz = z + 12 + Math.sin(t * .0015 + i) * 4; ctx.globalAlpha = shardA; stroke(ctx, [p(x, y, zz), p(px, py, z + 10)], light ? '#b6774799' : '#b8773e80', 1); box(ctx, g, x - 9, y - 9, zz, 18, 18, 5, stage === 2 ? (light ? '#deba8e' : '#75502c') : (light ? '#ddab89' : '#5a2d1d'), pal.gold); ctx.globalAlpha = 1; } }
|
||||
// the lock cage: drawn while locking, its edges shimmering
|
||||
var cageA = stage === 2 ? ease((t - stageAt) / 950) : (prevStage === 2 ? 1 - ease((t - stageAt) / 950) : 0);
|
||||
if (cageA > .01) { var z0 = z - 8, z1 = z + 50, v = 42, sh = .6 + .4 * Math.sin(t * .003); ctx.globalAlpha = cageA * sh; [z0, z1].forEach(function (zz) { poly(ctx, [p(px - v, py - v, zz), p(px + v, py - v, zz), p(px + v, py + v, zz), p(px - v, py + v, zz)], null, pal.gold, .9); }); [[-v, -v], [v, -v], [v, v], [-v, v]].forEach(function (xy) { stroke(ctx, [p(px + xy[0], py + xy[1], z0), p(px + xy[0], py + xy[1], z1)], pal.gold, .9); }); var a = p(px, py, z1 + 12); ctx.strokeStyle = pal.gold; ctx.lineWidth = 1.2; ctx.strokeRect(a.x - 5 * s, a.y, 10 * s, 8 * s); ctx.beginPath(); ctx.arc(a.x, a.y, 3.4 * s, Math.PI, 0); ctx.stroke(); ctx.globalAlpha = 1; }
|
||||
// a ripple at every beat change, and a slow breathing ring between beats
|
||||
var ring = ((t - stageAt) % 3200) / 3200, pos = p(px, py, z + 18); ctx.save(); ctx.translate(pos.x, pos.y); ctx.scale(1, .5); ctx.beginPath(); ctx.arc(0, 0, (40 + ring * 75) * s, 0, TAU); ctx.strokeStyle = light ? '#b86b35' : '#ffb35c'; ctx.globalAlpha = (1 - ring) * (bump > 0 ? .8 : .3); ctx.lineWidth = 1; ctx.stroke(); ctx.restore(); ctx.globalAlpha = 1;
|
||||
}
|
||||
function setStage(n, manual) {
|
||||
n = clamp(n | 0, 0, 2); if (n === stage) { if (manual) manualAt = clock; return; }
|
||||
prevStage = stage; stage = n; stageAt = clock; if (manual) manualAt = clock;
|
||||
if (opts.steps) Array.prototype.forEach.call(opts.steps, function (b) { b.setAttribute('aria-pressed', String(Number(b.getAttribute('data-stage')) === n)); });
|
||||
if (opts.status) opts.status.textContent = LABELS[n][0];
|
||||
if (opts.detail) opts.detail.textContent = LABELS[n][1];
|
||||
if (!raf) paint(clock);
|
||||
}
|
||||
function frame(ts) {
|
||||
raf = 0; if (disposed) return;
|
||||
if (document.hidden || !inView || reduced.matches) { last = 0; return; }
|
||||
var dt = last ? Math.min(ts - last, 50) : 16; last = ts; clock += dt;
|
||||
if (clock - stageAt > AUTO && clock - manualAt > HOLD) setStage((stage + 1) % 3, false);
|
||||
paint(clock);
|
||||
raf = requestAnimationFrame(frame);
|
||||
}
|
||||
function kick() { if (raf || disposed || document.hidden || !inView || reduced.matches) return; last = 0; raf = requestAnimationFrame(frame); }
|
||||
function stop() { if (raf) cancelAnimationFrame(raf); raf = 0; last = 0; }
|
||||
function resize() { var nw = canvas.clientWidth, nh = canvas.clientHeight, nd = Math.min(root.devicePixelRatio || 1, 2); if (!nw || !nh) return; if (nw === w && nh === h && nd === dpr) return; w = nw; h = nh; dpr = nd; canvas.width = Math.round(w * dpr); canvas.height = Math.round(h * dpr); base = null; card = null; cardKey = ''; paint(clock); kick(); }
|
||||
theme(); // before the observers: a ResizeObserver may fire before the first explicit paint
|
||||
var ro = root.ResizeObserver ? new ResizeObserver(resize) : null; if (ro) ro.observe(canvas); else root.addEventListener('resize', resize);
|
||||
var io = root.IntersectionObserver ? new IntersectionObserver(function (e) { inView = e[0].isIntersecting; if (inView) kick(); else stop(); }, { threshold: 0.02 }) : null; if (io) io.observe(canvas);
|
||||
var mo = root.MutationObserver ? new MutationObserver(function () { theme(); paint(clock); }) : null; if (mo) mo.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] });
|
||||
var scheme = root.matchMedia ? root.matchMedia('(prefers-color-scheme: light)') : null; function onScheme() { theme(); paint(clock); } if (scheme && scheme.addEventListener) scheme.addEventListener('change', onScheme);
|
||||
function vis() { if (document.hidden) stop(); else kick(); } document.addEventListener('visibilitychange', vis);
|
||||
function onReduce() { stop(); paint(clock); kick(); } if (reduced.addEventListener) reduced.addEventListener('change', onReduce);
|
||||
if (opts.steps) Array.prototype.forEach.call(opts.steps, function (b) { b.addEventListener('click', function () { setStage(Number(b.getAttribute('data-stage')), true); }); });
|
||||
resize(); paint(0); kick();
|
||||
return { setStage: function (n) { setStage(n, true); }, destroy: function () { disposed = true; stop(); if (ro) ro.disconnect(); if (io) io.disconnect(); if (mo) mo.disconnect(); document.removeEventListener('visibilitychange', vis); if (reduced.removeEventListener) reduced.removeEventListener('change', onReduce); if (scheme && scheme.removeEventListener) scheme.removeEventListener('change', onScheme); } };
|
||||
}
|
||||
root.IgneumHero = { mount: mount, LABELS: LABELS };
|
||||
})(window);
|
||||
229
site/index.html
229
site/index.html
|
|
@ -32,7 +32,6 @@
|
|||
<script type="application/ld+json">
|
||||
{"@context":"https://schema.org","@type":"Organization","name":"Igneum","url":"https://igneum.network/","logo":"https://igneum.network/icon-512.png","sameAs":["https://github.com/igneum-network"]}
|
||||
</script>
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin>
|
||||
<!-- head:start -->
|
||||
<link rel="preload" href="/fonts/unbounded-900.woff2" as="font" type="font/woff2" crossorigin>
|
||||
<link rel="preload" href="/fonts/plex-sans-400.woff2" as="font" type="font/woff2" crossorigin>
|
||||
|
|
@ -58,32 +57,19 @@
|
|||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
/* home page block (docs/plans/site-ui-3.md section 3, redrawn 6 Oct 2026: the scene is the page; restored 7 Oct 2026 on the owner's word, with the X31 to X35 wording kept); tokens and components are in /site.css */
|
||||
/* the header on this page only: the wordmark, Litepaper, Live and Download, 56 px, transparent over the hero */
|
||||
.nav{position:absolute;left:0;right:0;top:0;background:transparent;border-bottom:0;backdrop-filter:none;-webkit-backdrop-filter:none;z-index:40}
|
||||
.nav .wrap{height:56px}
|
||||
.nav .cta{min-height:40px;padding:8px 14px;font-size:14px}
|
||||
.hero{padding:calc(56px + var(--s-6)) 0 0}
|
||||
.hero .wrap{text-align:center}
|
||||
.hero h1{font-size:clamp(26px,3.6vw,44px);font-weight:700;line-height:1.15;letter-spacing:-.01em;max-width:24ch;margin:0 auto var(--s-5)}
|
||||
.hero .cta{justify-content:center;margin-bottom:var(--s-5)}
|
||||
.bleed{width:100%;padding:0 var(--gutter)}
|
||||
.bleed .scene{position:relative;max-width:1400px;margin:0 auto}
|
||||
.bleed canvas{width:100%;height:min(54vh,520px);min-height:300px;display:block;border-radius:var(--r-card);background:var(--row);border:1px solid var(--line);touch-action:pan-y}
|
||||
.tip{position:absolute;left:0;top:0;pointer-events:none;background:var(--graphite);border:1px solid var(--line-2);border-radius:6px;padding:10px 12px;font:400 12px/1.5 var(--f-mono);color:var(--ink-2);z-index:5}
|
||||
.tip[hidden]{display:none}.tip b{display:block;color:var(--bone);margin-bottom:2px}
|
||||
.legend-row{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 18px;max-width:1400px;margin:var(--s-3) auto 0;padding:0 4px;font:400 11px/1.4 var(--f-mono);color:var(--ash)}
|
||||
.legend-row .lg{display:flex;flex-wrap:wrap;gap:8px 16px}
|
||||
.legend-row .lg span{display:inline-flex;align-items:center;gap:7px;color:var(--ink-2);font-family:var(--f-sans);font-size:12px}
|
||||
.lgi{width:10px;height:10px;border-radius:3px;display:inline-block;flex:none;position:relative}
|
||||
.lgi.tick::after{content:"\2713";position:absolute;left:0;top:-4px;font-size:11px;color:var(--bone)}
|
||||
#steps-caption{color:var(--bone);text-align:left;min-width:0}#steps-caption.muted{color:var(--ash)}
|
||||
/* home page block (7 Oct 2026, the redesign: the GPU hero, the live graph, the reasons, the economics, the downloads, the ledger line); tokens and components are in /site.css */
|
||||
.hero{padding:calc(var(--s-6) + 12px) 0 0;overflow:hidden}
|
||||
.facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-4)}
|
||||
.fact{background:var(--graphite);border:1px solid var(--line);border-radius:var(--r-card);padding:var(--s-5);display:flex;flex-direction:column;gap:var(--s-2);min-width:0}
|
||||
.fact{background:var(--row);border:1px solid var(--line);border-radius:var(--r-card);padding:var(--s-5);display:flex;flex-direction:column;gap:var(--s-2);min-width:0}
|
||||
.fact .v{font:700 var(--t-num)/1 var(--f-display);color:var(--bone);letter-spacing:-.02em;overflow-wrap:anywhere}
|
||||
.fact .v.state{font:500 var(--t-base)/1.3 var(--f-mono);color:var(--ash)}
|
||||
.fact p{margin:0;color:var(--ink-2);font-size:var(--t-base)}
|
||||
.fact .k{font:500 var(--t-sm)/1.4 var(--f-mono);letter-spacing:.14em;text-transform:uppercase;color:var(--ash)}
|
||||
.tip{position:absolute;left:0;top:0;pointer-events:none;background:var(--graphite);border:1px solid var(--line-2);border-radius:6px;padding:10px 12px;font:400 12px/1.5 var(--f-mono);color:var(--ink-2);z-index:5}
|
||||
.tip[hidden]{display:none}.tip b{display:block;color:var(--bone);margin-bottom:2px}
|
||||
.lgi{width:10px;height:10px;border-radius:3px;display:inline-block;flex:none;position:relative;margin-right:7px}
|
||||
.lgi.tick::after{content:"\2713";position:absolute;left:0;top:-4px;font-size:11px;color:var(--bone)}
|
||||
#steps-caption{color:var(--bone);min-width:0;overflow-wrap:anywhere}#steps-caption.muted{color:var(--ash)}
|
||||
.dl-row{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-3)}
|
||||
.dl-row a{display:grid;grid-template-columns:28px minmax(0,1fr);grid-template-rows:auto auto;column-gap:14px;row-gap:2px;align-items:center;padding:14px 16px;border:1px solid var(--line);border-radius:var(--r-row);background:var(--graphite);color:var(--bone);font-weight:600;min-width:0}
|
||||
.dl-row a:hover{text-decoration:none;border-color:var(--line-2);background:var(--hover)}
|
||||
|
|
@ -93,12 +79,9 @@
|
|||
.dl-row a b{font-weight:600;grid-column:2}
|
||||
.dl-row a .osmark{grid-row:1/3;grid-column:1}
|
||||
.dl-row a.primary .osmark{color:#fff}
|
||||
.notice{font-size:var(--t-base);color:var(--ink-2);margin:var(--s-3) 0 0}
|
||||
.notice b{color:var(--bone);font-weight:600}
|
||||
.ledger-line{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:var(--s-3);border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:var(--s-4) 0}
|
||||
.ledger-line p{margin:0;color:var(--ink-2)}
|
||||
@media (max-width:900px){.facts,.dl-row{grid-template-columns:1fr}.hero{padding-top:calc(56px + var(--s-5))}.bleed canvas{height:300px}}
|
||||
@media (max-width:720px){.hero .cta .btn{width:100%}}
|
||||
@media (max-width:900px){.facts,.dl-row{grid-template-columns:1fr}}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
|
@ -149,23 +132,35 @@
|
|||
|
||||
<header class="hero" id="top">
|
||||
<div class="wrap">
|
||||
<h1>A proof-of-work chain for graphics cards, whose miners prove the blocks.</h1>
|
||||
<div class="cta">
|
||||
<a href="#get" class="btn primary">Download the miner</a>
|
||||
<a href="/litepaper" class="btn">Read the litepaper</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bleed">
|
||||
<div class="scene"><canvas id="dag" aria-label="The live devnet's block graph: time-aligned miner lanes, every parent connection, the selected chain as one path, checkpoint bands as the observer reports them"></canvas><div class="tip" id="dag-tip" hidden></div><div class="chip-zoom" id="dag-chip" hidden>scroll to zoom · Esc to release</div></div>
|
||||
<div class="legend-row">
|
||||
<div class="lg">
|
||||
<span><i class="lgi" style="border:1.5px solid var(--included)"></i>Included</span>
|
||||
<span><i class="lgi" style="border:1.5px solid var(--excluded)"></i>Excluded</span>
|
||||
<span><i class="lgi" style="border:1.5px solid var(--ember);background:var(--ember-12)"></i>Selected chain</span>
|
||||
<span><i class="lgi tick"></i>Proven</span>
|
||||
<span><i class="lgi" style="border:1.5px solid var(--ember);border-radius:50%"></i>Locked checkpoint</span>
|
||||
<div class="hero-grid">
|
||||
<div class="hero-copy">
|
||||
<div class="eyebrow"><span class="line"></span><em>Built for GPU miners</em> / devnet live</div>
|
||||
<h1>Your GPU has <span class="accent">more to give.</span></h1>
|
||||
<p class="lead">You already own the card. Igneum gives it a job worth doing: mine the block, prove it, watch it lock. One click installs the node, the miner and the prover.</p>
|
||||
<div class="actions">
|
||||
<a href="/miner#get" class="btn primary glow-button">Download the miner<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3v12m-5-5 5 5 5-5M5 16v4h14v-4"/></svg></a>
|
||||
<a href="/live" class="btn ghost">Watch the devnet<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
|
||||
</div>
|
||||
<div class="hero-footnote"><svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="m12 3 8 4v6c0 5-8 9-8 9s-8-4-8-9V7l8-4Z"/><path d="m8 12 3 3 5-6"/></svg>Devnet build. Coins have no value. The chain may reset.</div>
|
||||
</div>
|
||||
<span id="steps-caption" class="mono" aria-live="polite">Connecting to the devnet observer.</span>
|
||||
<div class="hero-scene">
|
||||
<canvas id="hero-gpu" aria-label="An illustration of a graphics card: a block lifts off it, four proof shards gather round the block, then a checkpoint cage locks it. The scene is drawn, not measured."></canvas>
|
||||
<div class="scene-corner tl"><strong>IGNEUM / EMBER</strong>Your card becomes the network</div>
|
||||
<div class="scene-corner tr"><strong id="scene-status">01 / Mining</strong>Illustration</div>
|
||||
<div class="scene-corner bl"><strong id="scene-detail">The card runs this hour’s program. A block comes out.</strong>Drawn, not live telemetry. The live graph is below.</div>
|
||||
<div class="scene-corner br">GPU > BLOCK > PROOF > LOCK</div>
|
||||
<div class="scene-steps" role="group" aria-label="Step through the work cycle" id="scene-steps">
|
||||
<button class="scene-step" type="button" data-stage="0" aria-pressed="true">01 Mine</button>
|
||||
<button class="scene-step" type="button" data-stage="1" aria-pressed="false">02 Prove</button>
|
||||
<button class="scene-step" type="button" data-stage="2" aria-pressed="false">03 Lock</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hero-bottom">
|
||||
<div class="principle"><svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><rect x="6" y="6" width="12" height="12" rx="2"/><rect x="9" y="9" width="6" height="6"/><path d="M9 2v4m6-4v4M9 18v4m6-4v4M2 9h4m-4 6h4m12-6h4m-4 6h4"/></svg><div><strong>Graphics cards only</strong><small>A new mining program every hour</small></div></div>
|
||||
<div class="principle"><svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="m12 3 8 4v6c0 5-8 9-8 9s-8-4-8-9V7l8-4Z"/><path d="m8 12 3 3 5-6"/></svg><div><strong>The miners are the provers</strong><small>Same card, two jobs, 80/20 of every block</small></div></div>
|
||||
<div class="principle"><svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M7 17 17 7"/></svg><div><strong>No premine, no stake</strong><small>No fee to any team in the protocol</small></div></div>
|
||||
<div class="principle"><svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="m8 6-6 6 6 6m8-12 6 6-6 6M14 3l-4 18"/></svg><div><strong>Every claim has a status</strong><small><a href="/evidence">The evidence page</a> says how far each one is tested</small></div></div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
|
@ -181,27 +176,140 @@
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section id="follow" class="sec">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<div><div class="eyebrow"><span class="line"></span>See what your card joins</div><h2>Follow the work.<br>See the chain grow.</h2></div>
|
||||
<a href="/live" class="text-link">Open the observatory<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
|
||||
</div>
|
||||
<div class="panel live-peek">
|
||||
<div class="panel-head"><div class="eyebrow"><em>BLOCKDAG</em> / the live devnet, one lane per miner</div><span class="state" id="dag-state"><span class="dot off"></span>connecting to the devnet observer</span></div>
|
||||
<div class="scene"><canvas id="dag" aria-label="The live devnet's block graph: time-aligned miner lanes, every parent connection, the selected chain as one path, checkpoint bands as the observer reports them"></canvas><div class="tip" id="dag-tip" hidden></div><div class="chip-zoom" id="dag-chip" hidden>scroll to zoom · Esc to release</div></div>
|
||||
<div class="panel-footer">
|
||||
<div class="legend">
|
||||
<span><i class="lgi" style="border:1.5px solid var(--included)"></i>Included</span>
|
||||
<span><i class="lgi" style="border:1.5px solid var(--excluded)"></i>Excluded</span>
|
||||
<span><i class="lgi" style="border:1.5px solid var(--ember);background:var(--ember-12)"></i>Selected chain</span>
|
||||
<span><i class="lgi tick"></i>Proven</span>
|
||||
<span><i class="lgi" style="border:1.5px solid var(--ember);border-radius:50%"></i>Locked checkpoint</span>
|
||||
</div>
|
||||
<span id="steps-caption" class="mono" aria-live="polite">Connecting to the devnet observer.</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="label-below"><span>Every square is a real block, read from one node every 2 s. Nothing here is a replay.</span><a href="/explorer" class="text-link">Look a block up in the explorer<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="why" class="sec">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<div><div class="eyebrow"><span class="line"></span>Built around your card</div><h2>Three reasons to power on.</h2></div>
|
||||
<p>From the first install to a block you can point at and say: mine.</p>
|
||||
</div>
|
||||
<div class="grid-3">
|
||||
<article class="fcard reveal">
|
||||
<div class="number">01<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><rect x="6" y="6" width="12" height="12" rx="2"/><rect x="9" y="9" width="6" height="6"/><path d="M9 2v4m6-4v4M9 18v4m6-4v4M2 9h4m-4 6h4m12-6h4m-4 6h4"/></svg></div>
|
||||
<h3>A program that never holds still.</h3>
|
||||
<div class="feature-graphic"><div class="chip-grid" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></div></div>
|
||||
<p>Every hour the chain draws a new mining program and your card compiles it. A chip wired for one program is out of date before it ships. The limits are measured and published, not promised.</p>
|
||||
<a href="/litepaper#mining" class="text-link">How mining works<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
|
||||
</article>
|
||||
<article class="fcard reveal">
|
||||
<div class="number">02<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="m12 3 8 4v6c0 5-8 9-8 9s-8-4-8-9V7l8-4Z"/><path d="m8 12 3 3 5-6"/></svg></div>
|
||||
<h3>Work you can see.</h3>
|
||||
<p>Watch your block land. Open its proof shards. Follow a checkpoint from pending to locked. Each state is its own word and none of them is guessed from a block’s age.</p>
|
||||
<a href="/live" class="text-link">Follow a block<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
|
||||
</article>
|
||||
<article class="fcard reveal">
|
||||
<div class="number">03<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 2c1 5 6 7 6 12a6 6 0 0 1-12 0c0-3 2-5 3-7 0 3 2 4 2 4s3-4 1-9Z"/></svg></div>
|
||||
<h3>One click, and it mines.</h3>
|
||||
<p>Pick your platform, run the installer, press Start. <span data-product="full">Igneum Ember</span> sets up the node, the miner and the prover, makes your wallet, and tunes each card for the most hashes per watt.</p>
|
||||
<a href="/miner#get" class="text-link">Meet Ember<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="economics" class="sec">
|
||||
<div class="wrap">
|
||||
<div class="split-section">
|
||||
<div>
|
||||
<div class="eyebrow"><span class="line"></span>The economic design, as published</div>
|
||||
<h2>Made for the people running the hardware.</h2>
|
||||
<p class="lead">Every block pays the card that found it and the cards that prove it. The protocol carves out nothing for a team, a foundation or a fund. No premine, no stake.</p>
|
||||
<div class="actions">
|
||||
<a href="/litepaper#economics" class="btn ghost">Read the economics<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
|
||||
<a href="/dev-fee" class="text-link">The software’s dev fee, in full view<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel reward-bars reveal">
|
||||
<div class="reward-row"><span class="mini-title muted">Each block, by the rule</span><svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="m12 3 9 5-9 5-9-5 9-5ZM3 8v9l9 5 9-5V8M12 13v9"/></svg></div>
|
||||
<div class="reward-row"><strong>100<span class="accent">%</span></strong><span class="small">to miners and provers</span></div>
|
||||
<div class="reward-bar" aria-label="80 percent to the miner, 20 percent to the proving pool"><i></i><i></i></div>
|
||||
<div class="reward-key">
|
||||
<div><strong><span class="accent">80%</span> Mining</strong><span>to the card that found the block</span></div>
|
||||
<div><strong><span class="molten">20%</span> Proving</strong><span>to the cards that prove it</span></div>
|
||||
<div><strong>0% Treasury</strong><span>nothing to any team</span></div>
|
||||
</div>
|
||||
<p class="reward-note">The protocol rule, not an income forecast. Cap 4,000,000,000 IGN, halving every two years. Devnet coins have no value.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="explore" class="sec">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<div><div class="eyebrow"><span class="line"></span>Find your place</div><h2>A whole network to look round.</h2></div>
|
||||
</div>
|
||||
<div class="tools-grid">
|
||||
<article class="tool-card"><svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M20 8V4H5a3 3 0 0 0 0 6h15v10H5a3 3 0 0 1-3-3V7m18 5h-6v5h6"/><path d="M16 14.5h1"/></svg><h3>Keep what you earned.</h3><p>A desktop wallet that checks finality itself. Block rewards and proving payouts in one history.</p><a href="/wallet" class="text-link">The wallet<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a></article>
|
||||
<article class="tool-card"><svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M3 3v18h18M7 16l4-5 4 2 6-8"/></svg><h3>See what your card does here.</h3><p>Measured hash rates per card, with the watts, the date and the log entry behind each number.</p><a href="/miners" class="text-link">The bench table<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a></article>
|
||||
<article class="tool-card"><svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5C9 3 5 3 2 4v15c3-1 7-1 10 1 3-2 7-2 10-1V4c-3-1-7-1-10 1v15"/></svg><h3>Understand the design.</h3><p>Mining, proving, finality, the economics and the open questions, in one readable paper.</p><a href="/litepaper" class="text-link">Read the litepaper<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a></article>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="get" class="sec">
|
||||
<div class="wrap">
|
||||
<div class="sec-head">
|
||||
<div class="eyebrow"><span data-product="full">Igneum Ember</span> · one click</div>
|
||||
<h2 id="mine">Install. Start. The card mines.</h2>
|
||||
<div class="section-head">
|
||||
<div><div class="eyebrow"><span class="line"></span><span data-product="full">Igneum Ember</span> · one click</div><h2>Install. Start. The card mines.</h2></div>
|
||||
<a href="/miner" class="text-link">Everything about the miner<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
|
||||
</div>
|
||||
<div class="dl-row">
|
||||
<a data-dl="miner-windows" href="https://dl.igneum.network/public/igneum-miner-windows.exe" class="primary"><svg class="osmark" viewBox="0 0 24 24" width="28" height="28" fill="currentColor" aria-hidden="true"><path d="M3 5.5l7.5-1v7H3zM11.5 4.3L21 3v8.5h-9.5zM3 12.5h7.5v7L3 18.5zM11.5 12.5H21V21l-9.5-1.3z"/></svg><b>Windows</b> <span data-dl-meta="miner-windows">v0.3.18 · 62.6 MB</span></a>
|
||||
<a data-dl="miner-mac" href="https://dl.igneum.network/public/igneum-miner-mac.dmg"><svg class="osmark" viewBox="0 0 24 24" width="28" height="28" fill="currentColor" aria-hidden="true"><path d="M16.4 12.6c0-2.3 1.9-3.4 2-3.5-1.1-1.6-2.8-1.8-3.4-1.8-1.4-.1-2.8.8-3.5.8-.7 0-1.8-.8-3-.8-1.5 0-3 .9-3.8 2.3-1.6 2.8-.4 7 1.2 9.3.8 1.1 1.7 2.4 2.9 2.3 1.2 0 1.6-.7 3-.7s1.8.7 3 .7c1.3 0 2-1.1 2.8-2.3.9-1.3 1.2-2.6 1.3-2.6-.1 0-2.5-.9-2.5-3.7zM14.1 5.8c.6-.8 1.1-1.9.9-3-.9 0-2 .6-2.7 1.4-.6.7-1.1 1.8-1 2.9 1.1.1 2.1-.5 2.8-1.3z"/></svg><b>macOS</b> <span data-dl-meta="miner-mac">v0.3.18 · 42.0 MB</span></a>
|
||||
<a data-dl="miner-windows" href="https://dl.igneum.network/public/igneum-miner-windows.exe" class="primary"><svg class="osmark" viewBox="0 0 24 24" width="28" height="28" fill="currentColor" aria-hidden="true"><path d="M3 5.5l7.5-1v7H3zM11.5 4.3L21 3v8.5h-9.5zM3 12.5h7.5v7L3 18.5zM11.5 12.5H21V21l-9.5-1.3z"/></svg><b>Windows</b> <span data-dl-meta="miner-windows">v0.3.19 · 62.7 MB</span></a>
|
||||
<a data-dl="miner-mac" href="https://dl.igneum.network/public/igneum-miner-mac.dmg"><svg class="osmark" viewBox="0 0 24 24" width="28" height="28" fill="currentColor" aria-hidden="true"><path d="M16.4 12.6c0-2.3 1.9-3.4 2-3.5-1.1-1.6-2.8-1.8-3.4-1.8-1.4-.1-2.8.8-3.5.8-.7 0-1.8-.8-3-.8-1.5 0-3 .9-3.8 2.3-1.6 2.8-.4 7 1.2 9.3.8 1.1 1.7 2.4 2.9 2.3 1.2 0 1.6-.7 3-.7s1.8.7 3 .7c1.3 0 2-1.1 2.8-2.3.9-1.3 1.2-2.6 1.3-2.6-.1 0-2.5-.9-2.5-3.7zM14.1 5.8c.6-.8 1.1-1.9.9-3-.9 0-2 .6-2.7 1.4-.6.7-1.1 1.8-1 2.9 1.1.1 2.1-.5 2.8-1.3z"/></svg><b>macOS</b> <span data-dl-meta="miner-mac">v0.3.19 · 42.1 MB</span></a>
|
||||
<a href="/miner#get"><svg class="osmark" viewBox="0 0 24 24" width="28" height="28" fill="currentColor" aria-hidden="true"><path d="M12 2c-2.4 0-4 1.9-4 4.6 0 1.2.2 2 0 2.8-.6 1.4-2.1 2.9-2.6 4.9-.3 1.1-.1 2 .3 2.6-.6.4-1.3 1-1.1 1.7.3 1 2.1 1.2 3.2 1.8.7.4 1.5.6 2.1.1.6.2 1.3.3 2.1.3s1.5-.1 2.1-.3c.6.5 1.4.3 2.1-.1 1.1-.6 2.9-.8 3.2-1.8.2-.7-.5-1.3-1.1-1.7.4-.6.6-1.5.3-2.6-.5-2-2-3.5-2.6-4.9-.2-.8 0-1.6 0-2.8C16 3.9 14.4 2 12 2zm-1.4 4.2c.5 0 .8.5.8 1.2s-.3 1.2-.8 1.2-.8-.5-.8-1.2.3-1.2.8-1.2zm2.8 0c.5 0 .8.5.8 1.2s-.3 1.2-.8 1.2-.8-.5-.8-1.2.3-1.2.8-1.2zM12 9.3c.9 0 1.9.5 1.9 1s-1 1.2-1.9 1.2-1.9-.7-1.9-1.2 1-1 1.9-1zm0 3.4c2.2 0 3.6 2.6 3.6 4.4 0 1.5-1.6 2.3-3.6 2.3s-3.6-.8-3.6-2.3c0-1.8 1.4-4.4 3.6-4.4z"/></svg><b>Linux · HiveOS</b> <span>on the miner page</span></a>
|
||||
</div>
|
||||
<p class="notice" data-devnet-notice><b>Devnet.</b> Coins have no value and the chain may be reset.</p>
|
||||
<p class="notice" data-testnet-notice>Public testnet: not yet open; the devnet build is here for people who want to look. The public testnet is weeks away: three seed nodes and the public RPC are up, and it opens when the go checklist closes.</p>
|
||||
<p class="notice"><a href="/miner">Read more about the miner</a>. The protocol carries no fee. The one payment to the project is the Ember software's optional 1% dev fee, like other GPU miners, off with one flag. Download only from this domain. Nobody from Igneum will ask for your seed. Questions: <a href="https://discord.gg/igneum" rel="noopener">the Discord</a>.</p>
|
||||
<p class="notice"><a href="/miner">Read more about the miner</a>. The protocol carries no fee. The one payment to the project is the Ember software’s optional 1% dev fee, like other GPU miners, off with one flag. Download only from this domain. Nobody from Igneum will ask for your seed. Questions: <a href="https://discord.gg/igneum" rel="noopener">the Discord</a>.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="ledger" class="sec">
|
||||
<section class="sec compact" id="next">
|
||||
<div class="wrap">
|
||||
<div class="cta-band reveal">
|
||||
<div>
|
||||
<div class="eyebrow"><span class="line"></span>Your next block starts here</div>
|
||||
<h2>Give your GPU something to do.</h2>
|
||||
<p>Download Ember, watch the devnet, and tell us what breaks. The people on the Discord run cards like yours.</p>
|
||||
</div>
|
||||
<div>
|
||||
<div class="actions">
|
||||
<a href="/miner#get" class="btn primary glow-button">Get the miner<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3v12m-5-5 5 5 5-5M5 16v4h14v-4"/></svg></a>
|
||||
<a href="/live" class="btn ghost">Watch the devnet<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
|
||||
</div>
|
||||
<p class="small">Experimental software. No promise of earnings.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="ledger" class="sec compact">
|
||||
<div class="wrap">
|
||||
<div class="ledger-line">
|
||||
<p>Every criticism, answered or conceded, and <a href="/litepaper#limits">what Igneum does not claim</a>.</p>
|
||||
<p>Every criticism, answered or conceded, and <a href="/claims">what Igneum does not claim</a>.</p>
|
||||
<a href="/ledger" class="btn">The ledger</a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -224,11 +332,12 @@
|
|||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
|
|
@ -236,15 +345,15 @@
|
|||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/litepaper#roadmap">Journey</a>
|
||||
<a href="/metamask">Add to MetaMask</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
|
|
@ -283,13 +392,16 @@
|
|||
<!-- journey:end -->
|
||||
<script src="/scenes/feed.js"></script>
|
||||
<script src="/live-dag.js"></script>
|
||||
<script src="/hero-scene.js"></script>
|
||||
<script src="/ui.js" defer></script>
|
||||
<script>
|
||||
(function(){
|
||||
var fmtN=function(v){return v===null||v===undefined?'pending':Number(v).toLocaleString('en-GB');};
|
||||
function fmtHash(h){if(h===null||h===undefined||!(h>0))return 'pending';return h>=1e9?(h/1e9).toFixed(1)+' GH/s':(h/1e6).toFixed(1)+' MH/s';}
|
||||
var cap=document.getElementById('steps-caption');
|
||||
var cap=document.getElementById('steps-caption'),st=document.getElementById('dag-state');
|
||||
// the feed's state is the caption while the feed is not live; the scene writes the caption while it is
|
||||
function onState(s,r){if(s==='live')return;cap.classList.add('muted');cap.textContent=s==='connecting'?'Connecting to the devnet observer.':s==='stale'?(r.charAt(0).toUpperCase()+r.slice(1))+'. The scene holds the last stored blocks.':'Live feed unavailable. The scene holds its last blocks; the live page shows the last stored state.';}
|
||||
function onState(s,r){st.className='state '+(s==='live'?'live':s==='failed'?'bad':'');st.innerHTML='<span class="dot '+(s==='live'?'live':s==='failed'?'bad':'off')+'"></span>'+(s==='live'?'live devnet':s==='connecting'?'connecting to the devnet observer':r||s);
|
||||
if(s==='live')return;cap.classList.add('muted');cap.textContent=s==='connecting'?'Connecting to the devnet observer.':s==='stale'?(r.charAt(0).toUpperCase()+r.slice(1))+'. The scene holds the last stored blocks.':'Live feed unavailable. The scene holds its last blocks; the live page shows the last stored state.';}
|
||||
function onData(d){var s=d.state,pv=d.proving;
|
||||
document.getElementById('f-hash').textContent=fmtHash(s.hashes_per_second_estimate);
|
||||
document.getElementById('f-keys').textContent=fmtN(s.miners_10m!==null&&s.miners_10m!==undefined?s.miners_10m:(d.miners||[]).length);
|
||||
|
|
@ -303,6 +415,9 @@
|
|||
var c=document.getElementById('dag'),dag=null;
|
||||
if(c&&window.IgneumFeed&&window.IgneumDag){dag=IgneumDag.mount(c,{poll:false,window:60,fps:60,tooltip:document.getElementById('dag-tip'),chip:document.getElementById('dag-chip')});
|
||||
IgneumFeed.start({window:300,subs:[dag],onState:onState,onData:function(d){onData(d);caption(d);}});}
|
||||
// the hero illustration: continuous, labelled as drawn, never fed by the chain
|
||||
var hc=document.getElementById('hero-gpu');
|
||||
if(hc&&window.IgneumHero)IgneumHero.mount(hc,{steps:document.querySelectorAll('#scene-steps [data-stage]'),status:document.getElementById('scene-status'),detail:document.getElementById('scene-detail')});
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
|
|
|
|||
252
site/journey.html
Normal file
252
site/journey.html
Normal file
|
|
@ -0,0 +1,252 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
||||
<title>The Igneum journey: six phases, four gates</title>
|
||||
<meta name="description" content="Where Igneum is: six phases from the specification to a fair launch, each closing at a published gate, and the engineering log’s latest entries. No calendar dates.">
|
||||
<link rel="canonical" href="https://igneum.network/journey">
|
||||
<meta name="theme-color" content="#0C0C0E">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:site_name" content="Igneum">
|
||||
<meta property="og:title" content="The Igneum journey: six phases, four gates">
|
||||
<meta property="og:description" content="Where Igneum is: six phases from the specification to a fair launch, each closing at a published gate, and the engineering log’s latest entries. No calendar dates.">
|
||||
<meta property="og:url" content="https://igneum.network/journey">
|
||||
<meta property="og:image" content="https://igneum.network/og.png?v=3">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="The Igneum journey: six phases, four gates">
|
||||
<meta name="twitter:description" content="Where Igneum is: six phases from the specification to a fair launch, each closing at a published gate, and the engineering log’s latest entries. No calendar dates.">
|
||||
<meta name="twitter:image" content="https://igneum.network/og.png?v=3">
|
||||
<meta name="twitter:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Crect width='1024' height='1024' fill='%230C0C0E'/%3E%3Cg transform='translate(166.95 166.95) scale(6.901)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml">
|
||||
<link rel="icon" href="/favicon.ico" sizes="48x48">
|
||||
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
|
||||
<link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192">
|
||||
<link rel="icon" href="/icon-512.png" type="image/png" sizes="512x512">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
|
||||
<link rel="manifest" href="/site.webmanifest">
|
||||
<!-- head:start -->
|
||||
<link rel="preload" href="/fonts/unbounded-900.woff2" as="font" type="font/woff2" crossorigin>
|
||||
<link rel="preload" href="/fonts/plex-sans-400.woff2" as="font" type="font/woff2" crossorigin>
|
||||
<link rel="stylesheet" href="/site.css">
|
||||
<style>
|
||||
/* Shared by every page: the head partial, injected by the build between the head markers. Edit the partial, not the page. */
|
||||
/* Fonts, self-hosted (latin subsets, OFL): Unbounded 500/700/900, IBM Plex Sans 400/500/600, IBM Plex Mono 400/500. Fallbacks carry size and ascent overrides so the swap does not move the layout. The tokens, type and components are in /site.css (docs/plans/site-ui-3.md). */
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/unbounded-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/unbounded-700.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:900;font-display:swap;src:url(/fonts/unbounded-900.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-sans-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-sans-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/plex-sans-600.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-mono-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-mono-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded Fallback';src:local('Arial Black'),local('Arial-Black'),local('Impact');size-adjust:114%;ascent-override:87.5%;descent-override:21.5%;line-gap-override:0%}
|
||||
@font-face{font-family:'Plex Sans Fallback';src:local('Arial'),local('Helvetica Neue'),local('Helvetica');size-adjust:100.5%;ascent-override:102%;descent-override:27.4%;line-gap-override:0%}
|
||||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: the footer control stores "light" or "dark" under igneum-theme; nothing stored means the system setting */
|
||||
(function(){try{var t=localStorage.getItem("igneum-theme");if(t==="light"||t==="dark")document.documentElement.setAttribute("data-theme",t);}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
/* derived-page block (rendered by the build from its source page or document); tokens, type and components are in /site.css */
|
||||
[id]{scroll-margin-top:calc(var(--nav-h) + 16px)}
|
||||
.page-hero .lead{max-width:72ch}
|
||||
.derived{max-width:78ch;color:var(--ink-2)}
|
||||
.derived h2{font-size:var(--t-h3);margin:var(--s-6) 0 var(--s-3)}
|
||||
.derived h3{font-size:16px;margin:var(--s-5) 0 var(--s-2)}
|
||||
.derived ul,.derived ol{margin:0 0 var(--s-4);padding-left:22px}
|
||||
.derived li{margin-bottom:8px}
|
||||
.derived strong{color:var(--bone);font-weight:600}
|
||||
.derived p,.derived li{overflow-wrap:anywhere}
|
||||
.derived .tbl{margin:var(--s-4) 0 var(--s-5)}
|
||||
.derived .pull{margin:var(--s-5) 0;padding:var(--s-4) var(--s-5);border-left:2px solid var(--ember);background:var(--row);border-radius:0 var(--r-row) var(--r-row) 0;font:500 var(--t-lg)/1.45 var(--f-sans);color:var(--bone)}
|
||||
.derived .src{margin:calc(-1 * var(--s-2)) 0 var(--s-5);font:400 13px/1.5 var(--f-mono);color:var(--ash)}
|
||||
.derived .src b{font-weight:500;color:var(--ink-2)}
|
||||
.onward{display:flex;flex-wrap:wrap;gap:var(--s-3);margin-top:var(--s-6);padding-top:var(--s-5);border-top:1px solid var(--line)}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- nav:start -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
<nav class="nav" aria-label="Main">
|
||||
<div class="wrap">
|
||||
<a href="/" class="brand" aria-label="Igneum home">
|
||||
<svg class="mark" viewBox="0 0 1024 1024" width="28" height="28" aria-hidden="true"><rect width="1024" height="1024" rx="160" fill="#0C0C0E"></rect><g transform="translate(166.95 166.95) scale(6.901)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></g></svg>
|
||||
<span class="word">IGNEUM</span>
|
||||
</a>
|
||||
<div class="links" id="nav-links">
|
||||
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
|
||||
<a href="/miner" data-nav="miner">Miner</a>
|
||||
<a href="/app" data-nav="app">App</a>
|
||||
<a href="/wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/live" data-nav="live">Live devnet</a>
|
||||
<a href="/ledger" data-nav="ledger">Ledger</a>
|
||||
</div>
|
||||
<a href="/miner#get" class="btn primary small cta">Download</a>
|
||||
<button class="burger" id="nav-burger" type="button" aria-expanded="false" aria-controls="nav-sheet" aria-label="Open the menu" aria-haspopup="true"><span class="bars" aria-hidden="true"></span></button>
|
||||
<div class="nav-sheet" id="nav-sheet">
|
||||
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
|
||||
<a href="/miner" data-nav="miner">Miner</a>
|
||||
<a href="/app" data-nav="app">App</a>
|
||||
<a href="/wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/live" data-nav="live">Live devnet</a>
|
||||
<a href="/ledger" data-nav="ledger">Ledger</a>
|
||||
<a href="/miner#get" class="btn primary">Download</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<script>
|
||||
(function(){
|
||||
// the menu: open on the button, closed by any link, Escape (focus back on the button) or a resize past 900 px
|
||||
var n=document.querySelector('.nav'),b=document.getElementById('nav-burger'),s=document.getElementById('nav-sheet');if(!n||!b||!s)return;
|
||||
function set(o){n.classList.toggle('open',o);b.setAttribute('aria-expanded',o?'true':'false');b.setAttribute('aria-label',o?'Close the menu':'Open the menu');document.documentElement.style.overflow=o?'hidden':'';}
|
||||
b.addEventListener('click',function(){set(!n.classList.contains('open'));});
|
||||
s.addEventListener('click',function(e){if(e.target.closest('a'))set(false);});
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&n.classList.contains('open')){set(false);b.focus();}});
|
||||
var mq=window.matchMedia('(min-width:901px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
})();
|
||||
</script>
|
||||
<!-- nav:end -->
|
||||
<main id="main">
|
||||
<section class="page-hero">
|
||||
<div class="wrap">
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>The journey</span></div>
|
||||
<div class="eyebrow"><span class="line"></span>Six phases · updated 6 Oct 2026</div>
|
||||
<h1>The journey.</h1>
|
||||
<p class="lead">Six phases from the specification to a fair launch. Each closes at its gate, a measurement published whether it passes or fails, so there is no date to slip. Below the phases, the latest entries of the engineering log.</p>
|
||||
</div>
|
||||
</section>
|
||||
<section class="sec compact">
|
||||
<div class="wrap">
|
||||
<div class="timeline"><div class="milestone current" id="phase-1"><div class="when">Under way; closes when the specification is out for external review</div><div><span class="badge warm">Under way</span><h3>1. Specification</h3><p>Mining generator, shard proving, finality rules, written for external review</p></div></div>
|
||||
<div class="milestone current" id="phase-2"><div class="when">Under way; closes at its gate</div><div><span class="badge warm">Under way</span><h3>2. Prove the proving</h3><p>Mining program proven on Apple, NVIDIA and AMD; shard proving benchmark on consumer cards still to run</p><p class="gate"><b>Gate:</b> A fixed published workload, job received to accepted proof on a declared consumer card, sustained with no growing backlog, reproduced by three independent operators</p></div></div>
|
||||
<div class="milestone current" id="phase-3"><div class="when">Live since 3 October 2026; closes at its gate</div><div><span class="badge warm">Under way</span><h3>3. Devnet</h3><p>BlockDAG node mining on the new program, GPU miners on three vendors, EVM execution in build</p><p class="gate"><b>Gate:</b> 1 block a second held with proofs under 60 s behind the tip</p></div></div>
|
||||
<div class="milestone next" id="phase-4"><div class="when">Closes when the finality design passes external review and one rollup signs for the testnet</div><div><span class="badge">Next</span><h3>4. Finality and job market</h3><p>Sustained-mining finality, external proving jobs, miner client with auto-switching</p><p class="gate"><b>Gate:</b> Finality design passes external review and one rollup signs for testnet</p></div></div>
|
||||
<div class="milestone next" id="phase-5"><div class="when">Weeks away: when the go checklist closes</div><div><span class="badge">Next</span><h3>5. Public testnet</h3><p>Three seed nodes and the public RPC are up; the one-click miner app on Windows, macOS and Linux, HiveOS, pools, the first rollup as a proving customer, no coin yet</p><p class="gate"><b>Gate:</b> 1,000 independent miners run 30 days and rollup proofs are delivered on time</p></div></div>
|
||||
<div class="milestone next" id="phase-6"><div class="when">After the testnet has passed its gate: 1,000 independent miners for 30 days and rollup proofs on time</div><div><span class="badge">Next</span><h3>6. Mainnet fair launch</h3><p>Genesis with no premine, 30-day ramp. No listing is arranged, promised or sought by the project</p></div></div></div>
|
||||
<div class="section-head" style="margin-top:var(--sec)"><div><div class="eyebrow"><span class="line"></span>The log, newest first</div><h2>Lately, in the log.</h2></div><div class="searchbar" style="min-width:min(100%,360px)"><svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><circle cx="10.5" cy="10.5" r="6.5"/><path d="m16 16 5 5"/></svg><label for="log-q" class="visually-hidden">Filter the log</label><input id="log-q" data-filter-input="log" placeholder="Filter: a card, a date, a word" autocomplete="off" spellcheck="false"><span class="small" data-filter-count="log"></span></div></div>
|
||||
<div class="record-grid" data-filter-list="log"><article class="record"><div class="record-top"><time datetime="2026-10-06">6 Oct 2026</time><span class="badge">log</span></div><h3>16:01Z: Ember run 6 on the three-card Windows rig</h3></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-06">6 Oct 2026</time><span class="badge">log</span></div><h3>Counter ASIC 3.0 item 2</h3><p>Counter ASIC 3.0 item 2: the per-day derivation</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-06">6 Oct 2026</time><span class="badge">log</span></div><h3>Counter ASIC 3.0 item 8</h3><p>Counter ASIC 3.0 item 8: program work in the latency shadow</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-06">6 Oct 2026</time><span class="badge">log</span></div><h3>Counter ASIC 3.0 item 6</h3><p>Counter ASIC 3.0 item 6: the reserve families' step costs</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-06">6 Oct 2026</time><span class="badge">log</span></div><h3>Counter ASIC 3.0 gate run, the hash side</h3></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-06">6 Oct 2026</time><span class="badge">log</span></div><h3>16:01Z: Ember run 6 on the three-card Windows rig (RTX 5090, RTX 4070</h3><p>16:01Z: Ember run 6 on the three-card Windows rig (RTX 5090, RTX 4070, RX 9070 XT)</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-06">6 Oct 2026</time><span class="badge">log</span></div><h3>00:4xZ, the empty `/api/state` reply</h3></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-06">6 Oct 2026</time><span class="badge">log</span></div><h3>07:12Z to 07:17Z, the host's chain mode with --save-shards records…</h3><p>07:12Z to 07:17Z, the host's chain mode with --save-shards records and --prev, on the Apple M5 Max's CPU</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-06">6 Oct 2026</time><span class="badge">log</span></div><h3>07:52Z to 08:24Z, the segment-aligned prover beside the miner on the…</h3><p>07:52Z to 08:24Z, the segment-aligned prover beside the miner on the RTX 5090 Windows rig's RTX 5090</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-06">6 Oct 2026</time><span class="badge">log</span></div><h3>08:26Z to 08:35Z, the fast-time harness on the fresh-record rule</h3></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-06">6 Oct 2026</time><span class="badge">log</span></div><h3>12:25 to 13:20Z, the finality route: why 26 fresh nodes lost the…</h3><p>12:25 to 13:20Z, the finality route: why 26 fresh nodes lost the seed every checkpoint</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>Ember Tune: the two-knob efficiency tune, the fleet prior</h3><p>Ember Tune: the two-knob efficiency tune, the fleet prior, and what the three-card Windows rig could measure tonight</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>The SP1 CPU prover on the three-card Windows rig beside the miners,…</h3><p>The SP1 CPU prover on the three-card Windows rig beside the miners, and the backend survey: no zkVM proves on AMD</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>The 9070 XT on the eGPU</h3><p>The 9070 XT on the eGPU: why 17.9 MH/s, and what moved</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>Ember Tune: the two-knob efficiency tune, the fleet prior</h3><p>Ember Tune: the two-knob efficiency tune, the fleet prior, and what the three-card Windows rig (RTX 5090, RTX 4070, RX 9070 XT) could measure tonight</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>Read width of the lottery hash</h3><p>Read width of the lottery hash: 4, 16 and 64-byte loads, a per-load mix, a written scratch; three cards</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>The hot table on the M5 Max</h3><p>The hot table on the M5 Max: a second table sized to GPU cache beside the 1 GiB dataset</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>Mixer x4 and the cache growth rule</h3><p>Mixer x4 and the cache growth rule: the class v3 dataset construction, with the x8 candidate</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>The SP1 CPU prover on the three-card Windows rig (RTX 5090, RTX…</h3><p>The SP1 CPU prover on the three-card Windows rig (RTX 5090, RTX 4070, RX 9070 XT) beside the miners, and the backend survey: no zkVM proves on AMD</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>Proving v1: segment records, the chain rule</h3><p>Proving v1: segment records, the chain rule, the unproven rule; what was measured tonight</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>Dp4a-class throughput on the M5 Max</h3><p>Dp4a-class throughput on the M5 Max: the dot4 emulation against the ALU chain</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>Layer 3 scratch soundness</h3></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>Epoch length as an era parameter</h3><p>Epoch length as an era parameter : the Apple M5 Max's compile-ahead per program</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>Aggregation cost on the RTX 5090</h3><p>Aggregation cost on the RTX 5090: what a per-block aggregation spends and what each lever gives</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>The C4 fix: certificate-driven reorg</h3></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>EVM transaction relay</h3><p>EVM transaction relay: three nodes in a chain, every transaction sent to one end included by the other two miners</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>The prover carries both fee tables and the height switch</h3><p>The prover carries both fee tables and the height switch: one pinned guest on either side of DAA 210,000</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>FUD ledger sweep round 6</h3></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>Live devnet: real transactions, the first non-empty shard proven and…</h3><p>Live devnet: real transactions, the first non-empty shard proven and paid, and the exporter's block structure fixed</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>The program id split</h3><p>The program id split: why the Apple M5 Max rejected the RTX 5090 Windows rig's proofs, and the verifier at 114 s</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>Live devnet: the first shards proven, verified and paid</h3></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>One-click Windows workers</h3><p>One-click Windows workers: what the Apple M5 Max could measure</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>First live finality lock: 77.4% of weight, 17 voters</h3><p>First finality lock on the live devnet: checkpoint 242 at 77.4% of all weight, two hours after genesis</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>The gfx1036 worker fault and what the Apple M5 Max could and could…</h3><p>The gfx1036 worker fault and what the Apple M5 Max could and could not reproduce</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>A node 60 s behind the clock is silently dead</h3></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>First machine on the one-click app: a 5090 at 118 MH/s</h3><p>First machine on the Igneum Miner app: the RTX 5090 Windows rig's RTX 5090 at 118 MH/s, via Setup.exe</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>Difficulty rule v2</h3><p>Difficulty rule v2: the live oscillation, its cause, the DAG replay, the fix behind a height switch</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>The observer stored nothing for 78 minutes, then 7,022 blocks in two…</h3><p>The observer stored nothing for 78 minutes, then 7,022 blocks in two minutes</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>The RTX 5090 Windows rig at the 14</h3><p>The RTX 5090 Windows rig at the 14:20 boundary: a worker stuck on the previous epoch</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>Shard layer on the RTX 5090: a full shard proven in 10.9 s, a block aggregated in 2.2 s</h3><p>Shard proving on the RTX 5090: a full shard compressed in 10.9 s, a two-shard block aggregated in 2.2 s, all verified</p></article></div>
|
||||
<p class="empty-state" data-filter-empty="log" hidden>Nothing in the log matches that.</p>
|
||||
<p class="note">Every entry is a dated heading of <a href="/bench">the engineering log</a>, where the commands and the hardware are. The phases and their gates are the litepaper’s <a href="/litepaper#roadmap">roadmap</a>.</p>
|
||||
<div class="onward"><a href="/bench" class="btn">The engineering log</a><a href="/evidence" class="btn">Every claim and its status</a><a href="/live" class="btn">The live devnet</a></div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<!-- footer:start -->
|
||||
<footer class="foot">
|
||||
<div class="wrap">
|
||||
<div class="foot-grid">
|
||||
<div class="foot-brand">
|
||||
<a href="/" class="brand" aria-label="Igneum home"><svg class="mark" viewBox="0 0 1024 1024" width="26" height="26" aria-hidden="true"><rect width="1024" height="1024" rx="160" fill="#0C0C0E"></rect><g transform="translate(166.95 166.95) scale(6.901)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></g></svg><span class="word">IGNEUM</span></a>
|
||||
<p>Mined by GPUs. Proven by fire.</p>
|
||||
<div class="social" aria-label="Igneum elsewhere">
|
||||
<a href="https://github.com/igneum-network/spec" target="_blank" rel="noopener" aria-label="Igneum on GitHub: the spec, the vectors and the issues"><svg viewBox="0 0 24 24" width="22" height="22" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2.1c-3.2.7-3.9-1.4-3.9-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2.9-.3 1.9-.4 2.9-.4s2 .1 2.9.4c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.2c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"></path></svg></a>
|
||||
<a href="https://discord.gg/igneum" target="_blank" rel="noopener" aria-label="The Igneum Discord"><svg viewBox="0 0 24 24" width="22" height="22" fill="currentColor" aria-hidden="true"><path d="M19.6 5.3A17 17 0 0 0 15.4 4l-.2.4a15.6 15.6 0 0 1 3.9 1.9 13.6 13.6 0 0 0-14.2 0A15.6 15.6 0 0 1 8.8 4.4L8.6 4a17 17 0 0 0-4.2 1.3C1.8 9.2 1.1 13 1.4 16.7a17.1 17.1 0 0 0 5.2 2.6l1.1-1.8a10.8 10.8 0 0 1-1.7-.8l.4-.3a12.2 12.2 0 0 0 11.2 0l.4.3-1.7.8 1.1 1.8a17 17 0 0 0 5.2-2.6c.4-4.3-.7-8-3-11.4zM8.7 14.4c-1 0-1.8-.9-1.8-2.1s.8-2.1 1.8-2.1 1.9 1 1.8 2.1c0 1.2-.8 2.1-1.8 2.1zm6.6 0c-1 0-1.8-.9-1.8-2.1s.8-2.1 1.8-2.1 1.9 1 1.8 2.1c0 1.2-.8 2.1-1.8 2.1z"></path></svg></a>
|
||||
<a data-social="reddit" href="https://www.reddit.com/user/Igneum_network/" target="_blank" rel="noopener" aria-label="Igneum on Reddit"><svg viewBox="0 0 24 24" width="22" height="22" fill="currentColor" aria-hidden="true"><path d="M22 12.1a2.2 2.2 0 0 0-3.7-1.6 10.8 10.8 0 0 0-5.8-1.8l1-4.6 3.2.7a1.5 1.5 0 1 0 .2-.9l-3.6-.8a.5.5 0 0 0-.5.4l-1.1 5.2a10.8 10.8 0 0 0-5.9 1.8A2.2 2.2 0 1 0 3.4 14a4.3 4.3 0 0 0 0 .7c0 3.4 3.9 6.1 8.6 6.1s8.6-2.7 8.6-6.1a4.3 4.3 0 0 0 0-.7 2.2 2.2 0 0 0 1.4-1.9zM7 13.6a1.5 1.5 0 1 1 1.5 1.5A1.5 1.5 0 0 1 7 13.6zm8.6 4.1a5.7 5.7 0 0 1-3.6 1.1 5.7 5.7 0 0 1-3.6-1.1.4.4 0 0 1 .6-.6 4.9 4.9 0 0 0 3 .9 4.9 4.9 0 0 0 3-.9.4.4 0 0 1 .6.6zm-.3-2.6a1.5 1.5 0 1 1 1.5-1.5 1.5 1.5 0 0 1-1.5 1.5z"></path></svg></a>
|
||||
</div>
|
||||
</div>
|
||||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
<a href="/miner">The miner</a>
|
||||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
<div class="eyebrow">Contact</div>
|
||||
<a href="mailto:hello@igneum.network">hello@igneum.network</a>
|
||||
<a href="https://github.com/igneum-network/spec/issues" rel="noopener">An issue on the spec</a>
|
||||
<span class="foot-note">Report a flaw by either. Nobody from Igneum will ask for your seed.</span>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="foot-base">
|
||||
<span class="foot-imprint">Igneum Labs LTD · Unit IH-00-01-01-OF-01, Level 01, Innovation One, Dubai International Financial Centre</span>
|
||||
<span class="foot-state"><span class="dot off" id="foot-dot"></span><span id="foot-state">devnet</span></span>
|
||||
<span class="theme" role="group" aria-label="Theme"><button type="button" data-theme-set="system" aria-pressed="true">System</button><button type="button" data-theme-set="light" aria-pressed="false">Light</button><button type="button" data-theme-set="dark" aria-pressed="false">Dark</button></span>
|
||||
<span class="mono foot-copy">© 2026 Igneum · not an offer to sell anything</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
(function(){
|
||||
// theme control: stores light or dark under igneum-theme; system clears it. The head applied the stored value before paint.
|
||||
var bs=document.querySelectorAll('[data-theme-set]');if(!bs.length)return;
|
||||
function cur(){try{var t=localStorage.getItem('igneum-theme');return t==='light'||t==='dark'?t:'system';}catch(e){return 'system';}}
|
||||
function paint(){var c=cur();bs.forEach(function(b){b.setAttribute('aria-pressed',b.getAttribute('data-theme-set')===c?'true':'false');});}
|
||||
bs.forEach(function(b){b.addEventListener('click',function(){var v=b.getAttribute('data-theme-set');try{if(v==='system')localStorage.removeItem('igneum-theme');else localStorage.setItem('igneum-theme',v);}catch(e){}
|
||||
if(v==='system')document.documentElement.removeAttribute('data-theme');else document.documentElement.setAttribute('data-theme',v);paint();});});
|
||||
paint();
|
||||
// the network state word in the footer: one read of the observer per page view
|
||||
var fs=document.getElementById('foot-state'),fd=document.getElementById('foot-dot');if(fs&&fd){fetch('/api/live?window=30',{cache:'no-store'}).then(function(r){return r.json();}).then(function(d){var on=d&&d.ok&&d.state&&!d.state.stale;fs.textContent=on?'devnet live':'devnet, observer stale';fd.className='dot '+(on?'live':'off');}).catch(function(){fs.textContent='devnet';});}
|
||||
})();
|
||||
</script>
|
||||
<!-- footer:end -->
|
||||
<script src="/ui.js" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -51,40 +51,28 @@
|
|||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
/* ledger page block (7 Oct 2026, the redesign: the page hero, the count table, the entries as records); tokens, type and components are in /site.css */
|
||||
.entry p,.entry li,.entry .status{overflow-wrap:anywhere}.entry code{white-space:normal;overflow-wrap:anywhere}
|
||||
:root{--obsidian:#0C0C0E;--graphite:#16161A;--line:#2A2A30;--line-2:#3A3A42;--ember:#F2541B;--molten:#FFB35C;--bone:#F4F1EC;--ash:#9A9A9E;--ink-2:#C9C7C2;--max:1200px;--gutter:clamp(16px,4vw,32px);--sec:clamp(40px,6vw,72px)}
|
||||
*{box-sizing:border-box}
|
||||
body{margin:0;background:var(--obsidian);color:var(--bone);font-family:var(--f-sans);font-size:16px;line-height:1.55;-webkit-font-smoothing:antialiased;overflow-x:hidden}
|
||||
a{color:var(--ember);text-decoration:none}a:hover{color:var(--molten)}
|
||||
.wrap{max-width:var(--max);margin:0 auto;padding-inline:var(--gutter)}
|
||||
.eyebrow{font-family:var(--f-mono);font-size:12px;letter-spacing:.18em;text-transform:uppercase;color:var(--ash)}
|
||||
h1{font-family:var(--f-display);font-weight:900;font-size:clamp(30px,5vw,52px);line-height:1.08;margin:10px 0 18px}
|
||||
main h2{font-family:var(--f-display);font-weight:700;font-size:clamp(20px,2.6vw,28px);text-wrap:balance;margin:var(--sec) 0 16px;padding-top:8px;border-top:1px solid var(--line);scroll-margin-top:84px}
|
||||
main h2{font-size:var(--t-h3);margin:var(--sec) 0 16px;padding-top:8px;border-top:1px solid var(--line);scroll-margin-top:84px}
|
||||
h3{font-family:var(--f-sans);font-weight:600;font-size:17px;margin:0;flex:1 1 auto;min-width:0}
|
||||
.intro{font-size:17px;color:var(--ink-2);max-width:76ch;margin:0 0 24px}
|
||||
.tbl{overflow-x:auto;border:1px solid var(--line);border-radius:16px;background:var(--graphite);margin:0 0 20px}
|
||||
table{border-collapse:collapse;width:100%;font-size:15px;min-width:520px}
|
||||
th,td{padding:11px 14px;text-align:left;vertical-align:top;border-bottom:1px solid var(--line)}
|
||||
th{font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--ash);font-weight:500}
|
||||
tr:last-child td{border-bottom:0}
|
||||
td.num{font-family:var(--f-display);font-weight:700;font-size:22px;color:var(--ember);white-space:nowrap}
|
||||
.chip{background:none;border:1px solid var(--line-2);color:var(--bone);border-radius:999px;padding:6px 12px;font:inherit;font-size:14px;cursor:pointer}
|
||||
.chip:hover,.chip.on{border-color:var(--ember);color:var(--molten)}
|
||||
.counts td.num{font:700 22px/1.2 var(--f-display);color:var(--ember-text);white-space:nowrap}
|
||||
.chip{background:none;border:1px solid var(--line-2);color:var(--bone);border-radius:999px;padding:6px 12px;font:inherit;font-size:14px;cursor:pointer;min-height:36px}
|
||||
.chip:hover,.chip.on{border-color:var(--ember);color:var(--molten-text)}
|
||||
.toolbar{display:flex;flex-wrap:wrap;gap:8px 14px;align-items:center;margin:0 0 8px;font-size:14px;color:var(--ash)}
|
||||
.toolbar input{background:var(--graphite);border:1px solid var(--line-2);color:var(--bone);border-radius:10px;padding:8px 12px;font:inherit;font-size:14px;min-width:220px}
|
||||
.sections{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:14px;margin:0 0 8px}
|
||||
.entry{border:1px solid var(--line);border-radius:14px;background:var(--graphite);padding:16px 18px;margin:0 0 12px;scroll-margin-top:84px}
|
||||
.toolbar input{max-width:360px;min-width:220px}
|
||||
.entry{border:1px solid var(--line);border-radius:var(--r-row);background:var(--graphite);padding:16px 18px;margin:0 0 12px;scroll-margin-top:84px}
|
||||
.entry.hide{display:none}
|
||||
.head{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 12px}
|
||||
.id{font-family:var(--f-mono);font-size:13px;color:var(--molten);flex:0 0 auto}
|
||||
.entry .head{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 12px}
|
||||
.id{font-family:var(--f-mono);font-size:13px;color:var(--molten-text);flex:0 0 auto}
|
||||
.date{font-family:var(--f-mono);font-size:12px;color:var(--ash);flex:0 0 auto}
|
||||
blockquote{margin:10px 0;padding:10px 14px;border-left:3px solid var(--line-2);color:var(--ink-2);font-style:italic}
|
||||
.status{font-size:15px;color:var(--ink-2)}
|
||||
.status{font-size:15px;color:var(--ink-2);display:block;letter-spacing:0;text-transform:none;font-family:var(--f-sans)}
|
||||
.badge{display:inline-block;font-family:var(--f-mono);font-size:12px;letter-spacing:.06em;text-transform:uppercase;padding:3px 8px;border-radius:6px;border:1px solid var(--line-2);color:var(--bone);margin-right:6px;vertical-align:middle}
|
||||
.b-open{border-color:var(--ember);color:var(--ember)}.b-conceded{border-color:var(--molten);color:var(--molten)}.b-fixed-or-built{border-color:#5cb85c;color:#8fd48f}
|
||||
code{font-family:var(--f-mono);font-size:13px;color:var(--bone);background:#0C0C0E;padding:1px 5px;border-radius:5px}
|
||||
details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;color:var(--ash)}details p{margin:8px 0 0;color:var(--ink-2)}
|
||||
.foot{margin-top:var(--sec)}
|
||||
.b-open{border-color:var(--ember);color:var(--ember-text)}.b-conceded{border-color:var(--molten);color:var(--molten-text)}.b-fixed-or-built{border-color:#5cb85c;color:#3f9a3f}
|
||||
:root:not([data-theme="light"]) .b-fixed-or-built{color:#8fd48f}
|
||||
.entry details{margin-top:8px;font-size:14px;color:var(--ash);border:0}.entry details:last-of-type{border:0}.entry summary{padding:4px 0;color:var(--ash);font-weight:400}.entry details p{margin:8px 0 0;color:var(--ink-2)}
|
||||
.page-hero .lead{max-width:76ch}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
|
@ -129,13 +117,17 @@ details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;co
|
|||
})();
|
||||
</script>
|
||||
<!-- nav:end -->
|
||||
<main id="main" class="wrap">
|
||||
<header style="padding-block:clamp(40px,6vw,72px) 8px">
|
||||
<div class="eyebrow">Ledger · 183 entries · regenerated from the repository</div>
|
||||
<h1>Every criticism, answered or conceded</h1>
|
||||
<p class="intro">This is every criticism the project expects, in the critic's words, with what was done about it and the date. 183 entries since 3 October 2026. Entries are never deleted; a status that changes keeps its history on the line. Where the critic was right the entry says Conceded. Where nothing has been done it says Open and names what settles it. The founder mined through the GPU years. Ethereum's move to proof of stake in September 2022 ended that income and the miners' place in that chain. This is one person building, with AI systems doing the engineering, the coin he wanted to exist for miners: GPU-mined, the miners are the provers, no founder allocation, every cost stated. Help is welcome and a team is wanted: cryptographers, node engineers, miners who will test. This ledger is the application form: pick an open row and write to <a href="mailto:hello@igneum.network">hello@igneum.network</a> with its id.</p>
|
||||
</header>
|
||||
<div class="tbl"><table>
|
||||
<main id="main">
|
||||
<section class="page-hero">
|
||||
<div class="wrap">
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>The ledger</span></div>
|
||||
<div class="eyebrow"><span class="line"></span>Ledger · 183 entries · regenerated from the repository</div>
|
||||
<h1>Every criticism, answered or conceded.</h1>
|
||||
<p class="lead">This is every criticism the project expects, in the critic's words, with what was done about it and the date. 183 entries since 3 October 2026. Entries are never deleted; a status that changes keeps its history on the line. Where the critic was right the entry says Conceded. Where nothing has been done it says Open and names what settles it. The founder mined through the GPU years. Ethereum's move to proof of stake in September 2022 ended that income and the miners' place in that chain. This is one person building, with AI systems doing the engineering, the coin he wanted to exist for miners: GPU-mined, the miners are the provers, no founder allocation, every cost stated. Help is welcome and a team is wanted: cryptographers, node engineers, miners who will test. This ledger is the application form: pick an open row and write to <a href="mailto:hello@igneum.network">hello@igneum.network</a> with its id.</p>
|
||||
</div>
|
||||
</section>
|
||||
<div class="wrap">
|
||||
<div class="tbl counts"><table>
|
||||
<thead><tr><th>Count</th><th>Status</th><th>Meaning</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td class="num">7</td><td><button type="button" class="chip" data-filter="Open">Open</button></td><td>Nothing has settled it yet. The entry names what will</td></tr>
|
||||
|
|
@ -145,7 +137,7 @@ details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;co
|
|||
<tr><td class="num">13</td><td><button type="button" class="chip" data-filter="Answered with evidence">Answered with evidence</button></td><td>A measurement or a simulation exists and is named</td></tr>
|
||||
<tr><td class="num">13</td><td><button type="button" class="chip" data-filter="Answered by design">Answered by design</button></td><td>A design rule answers it; no measurement is possible yet</td></tr>
|
||||
<tr><td class="num">4</td><td><button type="button" class="chip" data-filter="Other">Other</button></td><td>A status outside the six above, read the line</td></tr>
|
||||
<tr><td class="num">183</td><td><button type="button" class="chip" data-filter="">All</button></td><td>Every entry. The sections: <a href="#m">Mining and chips</a>, <a href="#f">Finality and attacks</a>, <a href="#p">Proving and the zkEVM</a>, <a href="#e">Economics and the coin</a>, <a href="#g">Governance and the founders</a>, <a href="#c">Comparisons</a>, <a href="#l">Legal and regulatory</a>, <a href="#x">Launch and operations</a>, <a href="#d">Builders</a></td></tr>
|
||||
<tr><td class="num">183</td><td><button type="button" class="chip" data-filter="">All</button></td><td>Every entry. The sections: <a href="#m">Mining and chips</a>, <a href="#f">Finality and attacks</a>, <a href="#p">Proving and the zkEVM</a>, <a href="#e">Economics and the coin</a>, <a href="#g">Governance and the founders</a>, <a href="#c">Comparisons</a>, <a href="#l">Legal and regulatory</a>, <a href="#x">Launch and operations</a>, <a href="#d">Builders</a></td></tr>
|
||||
</tbody></table></div>
|
||||
<div class="toolbar"><input type="search" id="q" placeholder="Search the ledger" aria-label="Search the ledger"><span id="shown"></span></div>
|
||||
<h2 id="m">Mining and chips</h2>
|
||||
|
|
@ -635,7 +627,7 @@ details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;co
|
|||
<div class="status"><span class="badge b-answered-by-design">Answered by design</span></div>
|
||||
<details><summary>The answer as first written</summary><p>At launch jobs are paid on the customer's chain, in the customer's asset, by the customer's contract, to the prover's address; Igneum operates no custody and takes no cut off-chain. When the market settles on Igneum the fee split is consensus, not a company. Counsel confirms before phase 4.</p></details>
|
||||
</article>
|
||||
<h2 id="x">Launch and operations</h2>
|
||||
<h2 id="x">Launch and operations</h2>
|
||||
<article class="entry" id="X1" data-bucket="Conceded">
|
||||
<div class="head"><span class="id">X1</span><h3>"Reproducible from the repository" and the repository is private</h3><span class="date">5 October 2026</span></div>
|
||||
<blockquote>Your site links to github.com/igneum-network/igneum. It 404s. 'Every number above is measured, published, and reproducible from the repository' is false today.</blockquote>
|
||||
|
|
@ -859,7 +851,7 @@ details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;co
|
|||
<div class="status"><span class="badge b-fixed-or-built">Rule written</span> <span class="did">5 October 2026): spec 8.3 item 2; the control is unbuilt in the app. Was: Open, minor. Sweep (5 October 2026): the app carries no signalling control today (<code>grep -i signal a repository file</code>: none), so nothing is signalled on first run; the rule binds when the control is built.</span></div>
|
||||
<details><summary>The answer as first written</summary><p>Correct. Fix: first run signals nothing until the user chooses, shown in the interface.</p></details>
|
||||
</article>
|
||||
<h2 id="x">Launch and operations</h2>
|
||||
<h2 id="x">Launch and operations</h2>
|
||||
<article class="entry" id="X12" data-bucket="Fixed or built">
|
||||
<div class="head"><span class="id">X12</span><h3>Tonight's numbers are quoted before they are logged, and the worker efficiency gap is unexplained</h3><span class="date">5 October 2026</span></div>
|
||||
<blockquote>The 50x step, the trough near 9 million, 5.5 blocks a second and two-thirds efficiency over eight processes are in the brief and not in the bench-log. And the chain saw 70 to 83 MH/s from a card that benches 229, which is a third, not two thirds.</blockquote>
|
||||
|
|
@ -937,7 +929,7 @@ details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;co
|
|||
<div class="status"><span class="badge b-closed-by-rule-or-decided">Decided</span> <span class="did">4 October 2026, 08:20 UTC): the specification subset is public as <code>igneum-network/spec</code> (<code>a repository file</code>), labelled; the node fork, the proving code and the harnesses stay private until the benchmark. Was: Open, decision for the owner.</span></div>
|
||||
<details><summary>The answer as first written</summary><p>The fact is conceded in X1 (the repository is private and the site says reproducible) and the pre-publication steps are in <code>a repository file</code> section 5 (ledger out of the tree, the project rules file rewritten, history rewritten, licence). The reviewer asks for an earlier date than January 2027 and a narrower scope: the benchmark harnesses, the test vectors, the simulators and <code>a repository file/</code>, each labelled experimental, with the node fork following when the gate-2 work is in. the owner decides which components, under which licence, and when; section 5 runs first in any case. The reviewer's companion advice, one proof-request workflow and one reference application before any broader app set, is the same decision's scope: the genesis-app list (G4, O-5.4) is not a prerequisite for the benchmark or the testnet.</p></details>
|
||||
</article>
|
||||
<h2 id="x">Launch and operations</h2>
|
||||
<h2 id="x">Launch and operations</h2>
|
||||
<article class="entry" id="X13" data-bucket="Closed by rule or decided">
|
||||
<div class="head"><span class="id">X13</span><h3>One paying customer for a stated reason</h3><span class="date">6 October 2026</span></div>
|
||||
<blockquote>'One rollup signs for testnet' is a letter of intent with no money. A customer who pays once, pays again without a rebate, and then a second unrelated customer, is evidence. A signature is not.</blockquote>
|
||||
|
|
@ -1051,7 +1043,7 @@ details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;co
|
|||
<div class="status"><span class="badge b-conceded">Conceded, contained by rule, reviewed</span> <span class="did">5 October 2026, night): <code>a repository file</code>. Next step: the three devnet checks of that review's section 6 (containment under a deliberately broken verifier; the version gate and the overlap; the callback boundary), on the phase 4 devnet once the precompile of design 6 exists (design 10.3 item 5). Was: Conceded, contained by rule, review scheduled. Sweep (5 October 2026): a review item (R12 with the cryptographer); nothing runnable.</span></div>
|
||||
<details><summary>The answer as first written</summary><p>Correct. Design 6 says it in those words. The containment: a job output cannot mint IGN or touch system contracts (R12), jobs are gated behind the proof-system version with the three-month overlap and the 90% signal (design 5.6), and the emergency path for a live soundness bug is the version bump of spec 5.7. The rule for an app, the same one the customer brief gives rollups: anything that acts irreversibly on a job output keeps its own fallback. R12 is reviewed with the cryptographer before devnet v2.</p></details>
|
||||
</article>
|
||||
<h2 id="x">Launch and operations</h2>
|
||||
<h2 id="x">Launch and operations</h2>
|
||||
<article class="entry" id="X23" data-bucket="Fixed or built">
|
||||
<div class="head"><span class="id">X23</span><h3>One shipped key is an administrator channel to the founder's PCs</h3><span class="date">5 October 2026</span></div>
|
||||
<blockquote>Your relay accepts either the URL token or the <code>x-igneum-key</code> header for everything, including queuing PowerShell that the PC agent runs as administrator. The key is the log intake key, a literal in six tracked files and inside every Windows and prover package you have handed out. And the zip with both relay secrets sits on the downloads host behind the dl token, which is in your git history and in every installed app. One token, four hops, no privilege boundary.</blockquote>
|
||||
|
|
@ -1107,7 +1099,7 @@ details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;co
|
|||
<div class="status"><span class="badge b-closed-by-rule-or-decided">Decided</span> <span class="did">6 October 2026, 17:25 UTC, by the owner; decisions item 8): the history rewrite runs the morning after the last of the close's branches merges, with every worktree removed first and both secrets rotated regardless. Was: Fixed on a branch, pending merge (5 October 2026, night), the tooling part: ledger-relay 28c028b, tests 47 of 47 (relay, 6 suites) + 16 of 16 (a repository file) + 2 CI class checks. Decision owner: the owner for the rewrite date (<code>a repository file</code>). Was: Open (4 October 2026); extends <code>a repository file</code> section 5.</span></div>
|
||||
<details><summary>The answer as first written</summary><p>Correct, count-only. The key: <code>a repository file</code>, <code>a repository file</code>, <code>a repository file</code>, <code>prove-shard.sh</code>, <code>a repository file</code>, <code>a repository file</code>, commits <code>78df757</code> to <code>4c9810f</code>. The token: <code>a repository file</code>, commit <code>c47ff03</code>. <code>git check-ignore</code> returns nothing for the ledger, fixes and review files. The CI identity grep covers the public export list, by design. Fix: both secrets join section 5 step 4's rewrite list (and are rotated regardless); <code>TZ=UTC</code> in the commit path now. Review ids R4.4.8, R4.5.3, R4.5.4.</p></details>
|
||||
</article>
|
||||
<h2 id="x">Launch and operations</h2>
|
||||
<h2 id="x">Launch and operations</h2>
|
||||
<article class="entry" id="X18" data-bucket="Fixed or built">
|
||||
<div class="head"><span class="id">X18</span><h3>Two nodes with two override files connect, and only some mismatches fork</h3><span class="date">5 October 2026</span></div>
|
||||
<blockquote>Your handshake compares the network name and nothing else. A PoW or difficulty mismatch forks and bans; a <code>finality</code> mismatch is a WARN; <code>rollout-v2.sh</code> throws the finality block away when it writes the file; the app rewrites the packaged file on every start.</blockquote>
|
||||
|
|
@ -1133,7 +1125,7 @@ details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;co
|
|||
<div class="status"><span class="badge b-fixed-or-built">Fixed</span> <span class="did">rolled out 5 October 2026, 0.3.5: both harness libraries reached master with the <code>fud-consensus</code> merge 7abce72 of the 0.3.5 cut; the sweep of 5 October ran <code>run.mjs s4</code> and <code>s5 --fast-time</code>, <code>fud.mjs</code> and tonight's <code>c4.mjs</code> through them, every node started). Was: Fixed in both harnesses (4 October 2026, night: <code>a repository file</code> kept the sentinels as BigInt through the merge since the v3 runner of the evening; <code>a repository file</code> got the same reviver on branch <code>fud-memory</code>, merged into <code>fud-consensus</code>); the stale timestamp criterion of scenario 2 is not touched. Was: Open (4 October 2026, red-team run). Tooling, low severity: no consensus effect, but every fast-time attack run is blind until it is fixed.</span></div>
|
||||
<details><summary>The answer as first written</summary><p>Correct, measured. The red-team run's first scenario errored on it (<code>a repository file</code>, "Tooling defect"); <code>a repository file</code> already edits the file as text for this reason. Scenario 2 live probe: past floor pmt+1, future flip between +130.00 and +130.01 s of the probe's own offsets, every stamp from +10 s rejected; the node is right, the criterion is stale. Smallest fix: in <code>a repository file</code> and <code>a repository file</code> <code>overrideParams</code>, drop the two sentinel fields before <code>stringify</code> (absent means never) or splice the extra fields into the file text; in <code>a repository file</code>, probe <code>max(pmt + 1, parent - 10 s)</code> and the +10 s bound. Also stale: <code>a repository file</code> waits for an over-budget transaction to be included and skipped with <code>BlockProvingBudget</code>; since F-exec-B the mempool refuses it with the metered pgas, so the check should accept <code>ProvingGasAboveBlockLimit</code> from the pool (<code>a repository file</code> row 28). And <code>a repository file</code> scenario 5 compares the burster's share of the weight window with its share of the whole run, which only agree when the run is shorter than the window (row 17).</p></details>
|
||||
</article>
|
||||
<h2 id="x">Launch and operations</h2>
|
||||
<h2 id="x">Launch and operations</h2>
|
||||
<article class="entry" id="X19" data-bucket="Fixed or built">
|
||||
<div class="head"><span class="id">X19</span><h3>Operational knobs and silences in the shipped node</h3><span class="date">5 October 2026</span></div>
|
||||
<blockquote>A slow-clock node disconnects every peer on every relayed block and never says why; the handshake's <code>time_offset</code> is computed and unused; <code>IGNEUM_ATTACK_TS_OFFSET_MS</code> and <code>IGNEUM_POW_STRIKES</code> are compiled into the live binary; <code>timestamp_deviation_tolerance</code> is dead and still accepted.</blockquote>
|
||||
|
|
@ -1171,7 +1163,7 @@ details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;co
|
|||
<div class="status"><span class="badge b-fixed-or-built">Fixed on a branch, pending merge</span> <span class="did">5 October 2026, night): fork branch <code>ledger-fixes-0311</code> fbb0082a (miner; 3d4ec451 rebased onto the 0.3.11 fork tip 89dfcb95 in round 3) and branch <code>ledger-fork</code> (workers), suites the Windows machine jobs <code>build-20261005-200049</code> (kaspa-consensus 95 passed, 0 failed, 3 ignored) and <code>build-20261005-200606</code> (kaspa-consensus-core 101/0, kaspa-mining 52/0, igneum-exec 13/0, igneum-miner 17/0, kaspa-p2p-flows 32 passed 1 failed: the new clock-skew test's own arithmetic, corrected in bd1b676a and 33/0 on the Apple M5 Max), both on 815c7d64; the tip is fbb0082a. Was: Open, minor (4 October 2026). The writer is the local miner and the directory is the user's own, so no privilege boundary is crossed. Sweep (5 October 2026): no kernel hash in <code>program.json</code> on any branch (<code>git grep -i 'kernel_hash|program_hash'</code> on <code>miner-reliability</code> finds nothing); the tampered-pack test needs a GPU worker. Fix row in section 2.5.</span></div>
|
||||
<details><summary>The answer as first written</summary><p>Correct. <code>packfile.h:~262-283, 306-345</code>; <code>worker.cpp:414-416, 596-620</code>; <code>emu/test.sh:57-66</code>. The CPU re-check (<code>main.rs:1250-1256</code>) stops a wrong program from earning, not from running. Fix: a hash of the emitted kernel in <code>program.json</code>, derived from the seed by the miner and checked by both workers; one sentence in the docs that the chain commits to the seed, not the text. Review id R4.2.4.</p></details>
|
||||
</article>
|
||||
<h2 id="x">Launch and operations</h2>
|
||||
<h2 id="x">Launch and operations</h2>
|
||||
<article class="entry" id="X21" data-bucket="Fixed or built">
|
||||
<div class="head"><span class="id">X21</span><h3>A wrong program burns power with a green rate</h3><span class="date">5 October 2026</span></div>
|
||||
<blockquote>The CPU re-check counts mismatches and does nothing: no threshold, no stop. The app reads <code>hash</code>, <code>now</code>, <code>template_age</code> and <code>synced</code> from STATUS and nothing else, so <code>mismatched=</code> and <code>WORKER FAULT</code> never reach the card.</blockquote>
|
||||
|
|
@ -1230,7 +1222,7 @@ details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;co
|
|||
<div class="status"><span class="badge b-answered-by-design">Answered by design and with evidence</span> <span class="did">4 October 2026, evening; the owner's decision of that evening, branch <code>dev-fee</code> in both repositories).</span></div>
|
||||
<details><summary>The answer as first written</summary><p>The fee exists and is disclosed; the rest is wrong in three places. (1) It is software-level, not protocol-level: no consensus rule, coinbase rule or emission rule knows of it. The chain pays whatever payout address a block template names, and the miner software names the dev address for one template in 100. A different client, or the same client with <code>--dev-fee 0</code> (a switch in the app's Settings, <code>DEV_FEE=0</code> on HiveOS), pays nothing and the chain treats its blocks exactly the same. That is the norm for GPU miners (lolMiner, T-Rex, approximate as to their percentages) and the litepaper says so beside the words "the protocol carries no fee". (2) It is auditable, not hidden: the choice is a template counter, not a random draw. Template n (from 0) is a fee template when floor((n + 1) p / 100) > floor(n p / 100), which at p = 1 is exactly the templates 99, 199, 299, ...; the source is one function (<code>fee_slot</code>, <code>a repository file</code>, section "Software dev fee"), the miner prints <code>dev fee 1% (1 block in 100) to 0x<address>; --dev-fee 0 turns it off</code> at start, logs <code>dev-fee block <hash></code> for each one and counts <code>fee=N</code> in its status line, and <code>igneum-miner payouts <node></code> reads the chain back and lists blocks per payout address with the dev address tagged. (3) It takes nothing from anyone else's security: a fee block keeps the user's vote key, so the user's finality weight is unchanged; only the execution-layer payout of that block moves.</p></details>
|
||||
</article>
|
||||
<h2 id="x">Launch and operations</h2>
|
||||
<h2 id="x">Launch and operations</h2>
|
||||
<article class="entry" id="X29" data-bucket="Closed by rule or decided">
|
||||
<div class="head"><span class="id">X29</span><h3>Host and file hygiene, minor</h3><span class="date">6 October 2026</span></div>
|
||||
<blockquote>The Mac's live node binds its gRPC to every interface. Four secrets or pointers in <code>a config file</code> are world-readable, one token is a filename, and the intake key rides on <code>curl</code>'s command line. The manifest answers CORS <code>*</code> and the clock source is a cacheable page's Date header.</blockquote>
|
||||
|
|
@ -1288,6 +1280,7 @@ details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;co
|
|||
</article>
|
||||
|
||||
<p class="intro" style="margin-top:var(--sec)">Source: the project's criticism ledger, a file in the repository, rendered to this page at build time; the repository is published at the public testnet. A criticism that is not here, or that shows an entry is wrong, is added with credit if wanted: <a href="mailto:hello@igneum.network">hello@igneum.network</a> or <a href="https://github.com/igneum-network/spec/issues" rel="noopener">an issue on the specification repository</a>.</p>
|
||||
</div>
|
||||
</main>
|
||||
<!-- footer:start -->
|
||||
<footer class="foot">
|
||||
|
|
@ -1305,11 +1298,12 @@ details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;co
|
|||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
|
|
@ -1317,15 +1311,15 @@ details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;co
|
|||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/litepaper#roadmap">Journey</a>
|
||||
<a href="/metamask">Add to MetaMask</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@
|
|||
<style>
|
||||
/* litepaper block (docs/plans/site-ui-3.md section 4); tokens, type and components are in /site.css */
|
||||
[id]{scroll-margin-top:var(--lp-off,84px)}
|
||||
.cover{padding:calc(var(--sec) * .6) 0 var(--s-6);border-bottom:1px solid var(--line);display:flex;flex-wrap:wrap;gap:var(--s-6);align-items:flex-end;justify-content:space-between}
|
||||
.cover{padding:calc(var(--s-6) + 8px) 0 var(--s-6);border-bottom:1px solid var(--line);display:flex;flex-wrap:wrap;gap:var(--s-6);align-items:flex-end;justify-content:space-between}
|
||||
.cover h1{margin:var(--s-3) 0 var(--s-3)}
|
||||
.cover .tag{font-size:var(--t-lg);line-height:1.5;color:var(--ink-2);max-width:44ch}
|
||||
.meta{display:flex;flex-direction:column;gap:6px;font:400 13px/1.5 var(--f-mono);color:var(--ash);text-align:right}
|
||||
|
|
@ -174,7 +174,8 @@ body.all .pager{display:none}
|
|||
<main id="main" class="wrap">
|
||||
<header class="cover">
|
||||
<div>
|
||||
<div class="eyebrow">Litepaper · version 0.2</div>
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>The litepaper</span></div>
|
||||
<div class="eyebrow"><span class="line"></span>Litepaper · version 0.2</div>
|
||||
<h1>Mined by GPUs.<br>Proven by fire.</h1>
|
||||
<div class="tag">A proof-of-work chain whose miners also prove every block, run Ethereum's apps, and are protected from specialised chips by a program that changes every hour.</div>
|
||||
</div>
|
||||
|
|
@ -727,11 +728,12 @@ body.all .pager{display:none}
|
|||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
|
|
@ -739,15 +741,15 @@ body.all .pager{display:none}
|
|||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/litepaper#roadmap">Journey</a>
|
||||
<a href="/metamask">Add to MetaMask</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
|
|
|
|||
|
|
@ -245,9 +245,10 @@ details.tablebar summary{display:flex;align-items:center}
|
|||
<main id="main" class="wrap obs">
|
||||
<header class="obs-head" id="top">
|
||||
<div>
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>Live devnet</span></div>
|
||||
<div class="eyebrow"><i></i>Network observatory</div>
|
||||
<h1>Live devnet<b>.</b></h1>
|
||||
<p>Every block has a story. Follow the connections.</p>
|
||||
<p>Every block has a story. Follow the connections, and find your own.</p>
|
||||
</div>
|
||||
<div class="side">
|
||||
<div class="cta"><a href="/miner#get" class="btn primary">Download the miner</a><a href="/explorer" class="btn">Open the explorer</a></div>
|
||||
|
|
@ -385,11 +386,12 @@ details.tablebar summary{display:flex;align-items:center}
|
|||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
|
|
@ -397,15 +399,15 @@ details.tablebar summary{display:flex;align-items:center}
|
|||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/litepaper#roadmap">Journey</a>
|
||||
<a href="/metamask">Add to MetaMask</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
|
|
|
|||
|
|
@ -117,8 +117,9 @@ ol{margin:0 0 14px;padding-left:22px}li{margin-bottom:6px}
|
|||
<!-- nav:end -->
|
||||
<main id="main" class="wrap">
|
||||
<div class="head">
|
||||
<div class="eyebrow">Wallets · chain id · RPC</div>
|
||||
<h1>Add Igneum to MetaMask</h1>
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>Add Igneum to MetaMask</span></div>
|
||||
<div class="eyebrow"><span class="line"></span>Wallets · chain id · RPC</div>
|
||||
<h1>Add Igneum to MetaMask<span class="accent">.</span></h1>
|
||||
</div>
|
||||
<p class="note">Igneum runs the Ethereum virtual machine, so MetaMask and every other Ethereum wallet work unchanged. The wallet needs four things: the chain id, an RPC URL, the symbol <b>IGN</b> and <b>18</b> decimals. The button below sends them to the wallet with the standard <code>wallet_addEthereumChain</code> request; the wallet shows them to you and asks before adding anything. Nothing on this page asks for a seed phrase or a key. Nobody from Igneum will ask for your seed.</p>
|
||||
|
||||
|
|
@ -199,11 +200,12 @@ ol{margin:0 0 14px;padding-left:22px}li{margin-bottom:6px}
|
|||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
|
|
@ -211,15 +213,15 @@ ol{margin:0 0 14px;padding-left:22px}li{margin-bottom:6px}
|
|||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/litepaper#roadmap">Journey</a>
|
||||
<a href="/metamask">Add to MetaMask</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
|
|
|
|||
198
site/miner.html
198
site/miner.html
|
|
@ -53,7 +53,7 @@
|
|||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
/* miner page block (7 Oct 2026: the product page for the installers); tokens and components are in /site.css */
|
||||
/* miner page block (7 Oct 2026, the redesign: the product page for the installers; the fee section is the source of /dev-fee); tokens and components are in /site.css */
|
||||
.cards td:first-child{white-space:nowrap;color:var(--bone);font-weight:600}
|
||||
.cards .eta{color:var(--molten-text);font-family:var(--f-mono)}
|
||||
.fair{margin:var(--s-4) 0 0;color:var(--ink-2);max-width:72ch}
|
||||
|
|
@ -62,6 +62,9 @@
|
|||
@media (min-width:900px){.feecard{grid-template-columns:minmax(0,1.1fr) minmax(0,.9fr);align-items:start}}
|
||||
pre b{color:var(--molten-text);font-weight:500}
|
||||
.hive code{overflow-wrap:anywhere}
|
||||
.platform-body .hive-sheet{margin-top:var(--s-4);font-size:var(--t-base);color:var(--ink-2)}
|
||||
.platform-body .hive-sheet code{overflow-wrap:anywhere}
|
||||
.platform-body .sha{font:400 var(--t-xs)/1.5 var(--f-mono);color:var(--ash);overflow-wrap:anywhere;margin-top:var(--s-3)}
|
||||
</style>
|
||||
</head>
|
||||
<body class="has-dl-bar">
|
||||
|
|
@ -109,30 +112,94 @@ pre b{color:var(--molten-text);font-weight:500}
|
|||
<!-- nav:end -->
|
||||
|
||||
<main id="main">
|
||||
<header class="phero" id="top">
|
||||
<section class="page-hero" id="top">
|
||||
<div class="wrap">
|
||||
<div>
|
||||
<div class="eyebrow ember"><span data-product="full">Igneum Ember</span> · one click</div>
|
||||
<h1>Install. Start. The card mines.</h1>
|
||||
<p class="lead">One click installs the node, the miner and the prover, and makes your wallet. Every card mines: NVIDIA, AMD and Apple silicon. A 24 GB NVIDIA card proves as well.</p>
|
||||
<div class="cta"><a href="#get" class="btn primary">Download the miner</a><a href="/app" class="btn">See the app</a></div>
|
||||
<div class="os"><span>Windows</span><span>macOS</span><span>Linux · HiveOS</span><span>NVIDIA · AMD · Apple silicon</span></div>
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>Ember, the miner</span></div>
|
||||
<div class="page-heading">
|
||||
<div>
|
||||
<div class="eyebrow"><span class="line"></span><span data-product="full">Igneum Ember</span> · one click</div>
|
||||
<h1>Install. Start. <span class="accent">The card mines.</span></h1>
|
||||
<p class="lead">One click installs the node, the miner and the prover, and makes your wallet. Every card mines: NVIDIA, AMD and Apple silicon. A 24 GB NVIDIA card proves as well.</p>
|
||||
</div>
|
||||
<div class="actions"><a href="#get" class="btn primary">Download the miner<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3v12m-5-5 5 5 5-5M5 16v4h14v-4"/></svg></a><a href="/app" class="btn ghost">See the app</a></div>
|
||||
</div>
|
||||
<figure class="frame glow">
|
||||
<div class="bar"><i></i><i></i><i></i><b><span data-product="app">Igneum Miner</span></b></div>
|
||||
<img src="/img/miner-dashboard.webp" width="2880" height="1800" class="img-dark" alt="The Mine page of Igneum Miner 0.3.14 on a three-card rig: the Stop mining button, 169 MH/s at 532 W, 84 blocks this run, and one row per card: an RTX 5090 at 122 MH/s and 222 W, an RTX 4070 at 28.7 MH/s and 76 W, an RX 9070 XT at 18.9 MH/s, each with its tune line, Tune button and switch" fetchpriority="high" decoding="async">
|
||||
<img src="/img/app-overview-light.webp" width="1440" height="912" class="img-light" alt="The Overview page of 0.3.16 in light mode: an RTX 5090 at 103 MH/s and 317 W, 0.32 MH/W, 62 blocks this run, the chain drawn live with this rig's blocks ringed" fetchpriority="high" decoding="async">
|
||||
<figcaption><span class="cap-dark">The shipped app, mining on the three-card Windows rig: an RTX 5090, an RTX 4070 and an RX 9070 XT, live devnet, 6 October 2026.</span><span class="cap-light">0.3.16, rendered from the RTX 5090 Windows rig’s live state at 23:33 UK, 6 October 2026.</span></figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
</header>
|
||||
</section>
|
||||
|
||||
<section id="card" class="sec">
|
||||
<section class="sec compact" id="meet">
|
||||
<div class="wrap">
|
||||
<div class="sec-head">
|
||||
<div class="eyebrow">Your card</div>
|
||||
<h2>What your card does here</h2>
|
||||
<p>Measured rates from the bench table, and how often each card finds a block at the network’s hash rate right now. One block a second is the target, so the wait is the network’s rate over yours.</p>
|
||||
<div class="download-layout">
|
||||
<div>
|
||||
<div class="tag-row" style="margin-bottom:var(--s-5)"><span class="pill">Windows · macOS · Linux · HiveOS</span><span class="pill">NVIDIA · AMD · Apple silicon</span></div>
|
||||
<h2>The miner built around your card.</h2>
|
||||
<p class="lead">Your rate, your watts, what it costs a day at your price, and the chain drawn live with your own blocks ringed. Every card is one row. Ember Tune finds each card’s best hashes per watt and keeps it there.</p>
|
||||
<div class="actions"><a href="#get" class="btn primary">Choose your platform<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3v12m-5-5 5 5 5-5M5 16v4h14v-4"/></svg></a><a href="/miners" class="text-link">Find your card in the bench table<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a></div>
|
||||
<p class="source-note">The window on the right is the shipped app, photographed on a real rig. Nothing on this page is a mock-up.</p>
|
||||
</div>
|
||||
<figure class="frame glow reveal">
|
||||
<div class="bar"><i></i><i></i><i></i><b><span data-product="app">Igneum Miner</span></b></div>
|
||||
<img src="/img/miner-dashboard.webp" width="2880" height="1800" class="img-dark" alt="The Mine page of Igneum Miner 0.3.14 on a three-card rig: the Stop mining button, 169 MH/s at 532 W, 84 blocks this run, and one row per card: an RTX 5090 at 122 MH/s and 222 W, an RTX 4070 at 28.7 MH/s and 76 W, an RX 9070 XT at 18.9 MH/s, each with its tune line, Tune button and switch" fetchpriority="high" decoding="async">
|
||||
<img src="/img/app-overview-light.webp" width="1440" height="912" class="img-light" alt="The Overview page of 0.3.16 in light mode: an RTX 5090 at 103 MH/s and 317 W, 0.32 MH/W, 62 blocks this run, the chain drawn live with this rig's blocks ringed" fetchpriority="high" decoding="async">
|
||||
<figcaption><span class="cap-dark">The shipped app, mining on the three-card Windows rig: an RTX 5090, an RTX 4070 and an RX 9070 XT, live devnet, 6 October 2026.</span><span class="cap-light">0.3.16, rendered from the RTX 5090 Windows rig’s live state at 23:33 UK, 6 October 2026.</span></figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="get" class="sec rule">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<div><div class="eyebrow"><span class="line"></span>Downloads</div><h2>Get the miner.</h2></div>
|
||||
<p>Download only from this domain. Nobody from Igneum will ask for your seed. Every file is the one the app’s signed manifest names, with its version and size.</p>
|
||||
</div>
|
||||
<div class="grid-2">
|
||||
<div class="panel download-card">
|
||||
<div class="ptabs" role="tablist" aria-label="Your platform">
|
||||
<button type="button" role="tab" data-platform="windows" id="tab-windows" aria-controls="panel-windows" aria-selected="true">Windows</button>
|
||||
<button type="button" role="tab" data-platform="mac" id="tab-mac" aria-controls="panel-mac" aria-selected="false" tabindex="-1">macOS</button>
|
||||
<button type="button" role="tab" data-platform="hive" id="tab-hive" aria-controls="panel-hive" aria-selected="false" tabindex="-1">Linux / HiveOS</button>
|
||||
</div>
|
||||
<div class="platform-body" id="panel-windows" role="tabpanel" aria-labelledby="tab-windows" data-platform-panel="windows">
|
||||
<div class="download-platform"><svg class="osmark" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M3 5.5l7.5-1v7H3zM11.5 4.3L21 3v8.5h-9.5zM3 12.5h7.5v7L3 18.5zM11.5 12.5H21V21l-9.5-1.3z"/></svg><div><h3>Ember for Windows</h3><p>the installer, from the signed manifest</p></div></div>
|
||||
<p class="download-note">Run the installer, press Start. NVIDIA and AMD cards both mine. Setting an NVIDIA power cap asks for administrator rights once.</p>
|
||||
<a data-dl="miner-windows" href="https://dl.igneum.network/public/igneum-miner-windows.exe" class="btn primary"><svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3v12m-5-5 5 5 5-5M5 16v4h14v-4"/></svg>Download for Windows <span data-dl-meta="miner-windows" style="font-weight:400;opacity:.85">v0.3.19 · 62.7 MB</span></a>
|
||||
<div class="download-detail"><span>from dl.igneum.network</span><span>sha256 <span data-dl-sha="miner-windows">fb693e841bcd99dc580900b2d0b2560c8431fce29bc630561566fef08e9e0772</span></span></div>
|
||||
</div>
|
||||
<div class="platform-body" id="panel-mac" role="tabpanel" aria-labelledby="tab-mac" data-platform-panel="mac" hidden>
|
||||
<div class="download-platform"><svg class="osmark" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M16.4 12.6c0-2.3 1.9-3.4 2-3.5-1.1-1.6-2.8-1.8-3.4-1.8-1.4-.1-2.8.8-3.5.8-.7 0-1.8-.8-3-.8-1.5 0-3 .9-3.8 2.3-1.6 2.8-.4 7 1.2 9.3.8 1.1 1.7 2.4 2.9 2.3 1.2 0 1.6-.7 3-.7s1.8.7 3 .7c1.3 0 2-1.1 2.8-2.3.9-1.3 1.2-2.6 1.3-2.6-.1 0-2.5-.9-2.5-3.7zM14.1 5.8c.6-.8 1.1-1.9.9-3-.9 0-2 .6-2.7 1.4-.6.7-1.1 1.8-1 2.9 1.1.1 2.1-.5 2.8-1.3z"/></svg><div><h3>Ember for macOS</h3><p>a disk image, Apple silicon, Metal</p></div></div>
|
||||
<p class="download-note">Open the disk image, drag the app across, press Start. A Mac mines on its GPU at about a fifth of a flagship card and proves on its CPU, slowly.</p>
|
||||
<a data-dl="miner-mac" href="https://dl.igneum.network/public/igneum-miner-mac.dmg" class="btn primary"><svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3v12m-5-5 5 5 5-5M5 16v4h14v-4"/></svg>Download for macOS <span data-dl-meta="miner-mac" style="font-weight:400;opacity:.85">v0.3.19 · 42.1 MB</span></a>
|
||||
<div class="download-detail"><span>from dl.igneum.network</span><span>sha256 <span data-dl-sha="miner-mac">9ed3c4f754bb736e13e93013de856d86197638e1ae44464d7481f46b00b84fe0</span></span></div>
|
||||
</div>
|
||||
<div class="platform-body" id="panel-hive" role="tabpanel" aria-labelledby="tab-hive" data-platform-panel="hive" hidden>
|
||||
<div class="download-platform"><svg class="osmark" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 2c-2.4 0-4 1.9-4 4.6 0 1.2.2 2 0 2.8-.6 1.4-2.1 2.9-2.6 4.9-.3 1.1-.1 2 .3 2.6-.6.4-1.3 1-1.1 1.7.3 1 2.1 1.2 3.2 1.8.7.4 1.5.6 2.1.1.6.2 1.3.3 2.1.3s1.5-.1 2.1-.3c.6.5 1.4.3 2.1-.1 1.1-.6 2.9-.8 3.2-1.8.2-.7-.5-1.3-1.1-1.7.4-.6.6-1.5.3-2.6-.5-2-2-3.5-2.6-4.9-.2-.8 0-1.6 0-2.8C16 3.9 14.4 2 12 2zm-1.4 4.2c.5 0 .8.5.8 1.2s-.3 1.2-.8 1.2-.8-.5-.8-1.2.3-1.2.8-1.2zm2.8 0c.5 0 .8.5.8 1.2s-.3 1.2-.8 1.2-.8-.5-.8-1.2.3-1.2.8-1.2zM12 9.3c.9 0 1.9.5 1.9 1s-1 1.2-1.9 1.2-1.9-.7-1.9-1.2 1-1 1.9-1zm0 3.4c2.2 0 3.6 2.6 3.6 4.4 0 1.5-1.6 2.3-3.6 2.3s-3.6-.8-3.6-2.3c0-1.8 1.4-4.4 3.6-4.4z"/></svg><div><h3>Ember for Linux and HiveOS</h3><p>a tarball for rigs and Hive flight sheets</p></div></div>
|
||||
<p class="download-note">For the rig people. One tarball, the miner and the node inside, the same signed manifest as the desktop apps.</p>
|
||||
<a data-dl="miner-hive" href="https://dl.igneum.network/public/igneum-miner-hive.tar.gz" class="btn primary"><svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3v12m-5-5 5 5 5-5M5 16v4h14v-4"/></svg>Download the tarball <span data-dl-meta="miner-hive" style="font-weight:400;opacity:.85">v0.3.17 · 24.7 MB</span></a>
|
||||
<div class="hive-sheet" id="hive"><b>HiveOS Flight Sheet.</b> Miner: <b>Custom</b>. Installation URL: <code data-dl-url="miner-hive">https://dl.igneum.network/dl/public/igneum-hive-0.3.17.tar.gz</code>. Miner name <code>igneum</code>, wallet and worker <code>0x<your 40-hex payout address>.%WORKER_NAME%</code>. Hive itself is untested on our side: tell us what breaks.</div>
|
||||
<p class="sha">sha256 <span data-dl-sha="miner-hive">b283ba0c506bdbd002b512157834a3a242717aa5ea0f410517dffb8e685f642d</span></p>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="step-list">
|
||||
<div class="step-item"><span class="step-index">01</span><div><h3>Check your card.</h3><p>Any 4 GB card mines at launch. A 24 GB NVIDIA card proves the full shard as well; a 32 GB card mines and proves at once. <a href="#card">What your card does here</a> has the measured rates.</p></div></div>
|
||||
<div class="step-item"><span class="step-index">02</span><div><h3>Install the official build.</h3><p>Only from this domain. The app makes your wallet address on first start and shows you its seed phrase once. Keep it to yourself. This site never asks for it.</p></div></div>
|
||||
<div class="step-item"><span class="step-index">03</span><div><h3>Press Start, then tell us.</h3><p>Watch your blocks ring on the chain. Let Ember Tune pick each card’s point. When something breaks, say so on <a href="https://discord.gg/igneum" rel="noopener">the Discord</a> or by email.</p></div></div>
|
||||
</div>
|
||||
<p class="yourcard" data-yourcard style="margin-top:var(--s-4)">Your card: pending</p>
|
||||
<p class="notice" data-devnet-notice><b>Devnet.</b> Coins have no value and the chain may be reset.</p>
|
||||
<p class="notice" data-testnet-notice>Public testnet: not yet open; the devnet build is here for people who want to look. The public testnet is weeks away: three seed nodes and the public RPC are up, and it opens when the go checklist closes.</p>
|
||||
<p class="notice">The protocol carries no fee. The one payment to the project is the Ember software’s optional 1% dev fee, like other GPU miners, off with one flag: <a href="#fee">the fee, in full view</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="note">Testnet coin for testing: <a href="/faucet">the faucet</a> sends 10 IGN per address per day. Any 4 GB card at launch. The dataset starts at 2 GB and grows on a schedule fixed at the testnet genesis (2 GB, doubling at years 4, 12 and 28), so a 4 GB card mines about four years and an 8 GB card about twelve, approximate.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="card" class="sec rule">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<div><div class="eyebrow"><span class="line"></span>Your card</div><h2>What your card does here.</h2></div>
|
||||
<p>Measured rates from the bench table, and how often each card finds a block at the network’s hash rate right now. One block a second is the target, so the wait is the network’s rate over yours.</p>
|
||||
</div>
|
||||
<div class="tbl cards"><table>
|
||||
<thead><tr><th>Card</th><th class="num">Measured</th><th class="num">Watts</th><th class="num">A block about every</th><th>Measured on</th></tr></thead>
|
||||
|
|
@ -150,11 +217,10 @@ pre b{color:var(--molten-text);font-weight:500}
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section id="how" class="sec">
|
||||
<section id="how" class="sec rule">
|
||||
<div class="wrap">
|
||||
<div class="sec-head">
|
||||
<div class="eyebrow">Hash, prove, get paid</div>
|
||||
<h2>One client. Three jobs.</h2>
|
||||
<div class="section-head">
|
||||
<div><div class="eyebrow"><span class="line"></span>Hash, prove, get paid</div><h2>One client. Three jobs.</h2></div>
|
||||
</div>
|
||||
<ul class="lines">
|
||||
<li><strong>01 · The card hashes</strong>A new random program every hour, compiled on your machine. 80% of each block to the card that finds it.</li>
|
||||
|
|
@ -164,42 +230,11 @@ pre b{color:var(--molten-text);font-weight:500}
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section id="get" class="sec">
|
||||
<section id="fee" class="sec rule">
|
||||
<div class="wrap">
|
||||
<div class="sec-head">
|
||||
<div class="eyebrow">Downloads</div>
|
||||
<h2>Get the miner</h2>
|
||||
<p>Download only from this domain. Nobody from Igneum will ask for your seed. Every file is the one the app’s signed manifest names, with its version and size.</p>
|
||||
</div>
|
||||
<div class="grid c2">
|
||||
<div>
|
||||
<div class="dl-list">
|
||||
<a data-dl="miner-windows" href="https://dl.igneum.network/public/igneum-miner-windows.exe" class="primary"><svg class="osmark" viewBox="0 0 24 24" width="28" height="28" fill="currentColor" aria-hidden="true"><path d="M3 5.5l7.5-1v7H3zM11.5 4.3L21 3v8.5h-9.5zM3 12.5h7.5v7L3 18.5zM11.5 12.5H21V21l-9.5-1.3z"/></svg><b>Windows</b><span data-dl-meta="miner-windows">v0.3.18 · 62.6 MB</span></a>
|
||||
<a data-dl="miner-mac" href="https://dl.igneum.network/public/igneum-miner-mac.dmg"><svg class="osmark" viewBox="0 0 24 24" width="28" height="28" fill="currentColor" aria-hidden="true"><path d="M16.4 12.6c0-2.3 1.9-3.4 2-3.5-1.1-1.6-2.8-1.8-3.4-1.8-1.4-.1-2.8.8-3.5.8-.7 0-1.8-.8-3-.8-1.5 0-3 .9-3.8 2.3-1.6 2.8-.4 7 1.2 9.3.8 1.1 1.7 2.4 2.9 2.3 1.2 0 1.6-.7 3-.7s1.8.7 3 .7c1.3 0 2-1.1 2.8-2.3.9-1.3 1.2-2.6 1.3-2.6-.1 0-2.5-.9-2.5-3.7zM14.1 5.8c.6-.8 1.1-1.9.9-3-.9 0-2 .6-2.7 1.4-.6.7-1.1 1.8-1 2.9 1.1.1 2.1-.5 2.8-1.3z"/></svg><b>macOS</b><span data-dl-meta="miner-mac">v0.3.18 · 42.0 MB</span></a>
|
||||
<a data-dl="miner-hive" href="https://dl.igneum.network/public/igneum-miner-hive.tar.gz"><svg class="osmark" viewBox="0 0 24 24" width="28" height="28" fill="currentColor" aria-hidden="true"><path d="M12 2c-2.4 0-4 1.9-4 4.6 0 1.2.2 2 0 2.8-.6 1.4-2.1 2.9-2.6 4.9-.3 1.1-.1 2 .3 2.6-.6.4-1.3 1-1.1 1.7.3 1 2.1 1.2 3.2 1.8.7.4 1.5.6 2.1.1.6.2 1.3.3 2.1.3s1.5-.1 2.1-.3c.6.5 1.4.3 2.1-.1 1.1-.6 2.9-.8 3.2-1.8.2-.7-.5-1.3-1.1-1.7.4-.6.6-1.5.3-2.6-.5-2-2-3.5-2.6-4.9-.2-.8 0-1.6 0-2.8C16 3.9 14.4 2 12 2zm-1.4 4.2c.5 0 .8.5.8 1.2s-.3 1.2-.8 1.2-.8-.5-.8-1.2.3-1.2.8-1.2zm2.8 0c.5 0 .8.5.8 1.2s-.3 1.2-.8 1.2-.8-.5-.8-1.2.3-1.2.8-1.2zM12 9.3c.9 0 1.9.5 1.9 1s-1 1.2-1.9 1.2-1.9-.7-1.9-1.2 1-1 1.9-1zm0 3.4c2.2 0 3.6 2.6 3.6 4.4 0 1.5-1.6 2.3-3.6 2.3s-3.6-.8-3.6-2.3c0-1.8 1.4-4.4 3.6-4.4z"/></svg><b>Linux · HiveOS</b><span data-dl-meta="miner-hive">v0.3.17 · 24.7 MB</span></a>
|
||||
</div>
|
||||
<p class="notice" data-devnet-notice><b>Devnet.</b> Coins have no value and the chain may be reset.</p>
|
||||
<p class="notice" data-testnet-notice>Public testnet: not yet open; the devnet build is here for people who want to look. The public testnet is weeks away: three seed nodes and the public RPC are up, and it opens when the go checklist closes.</p>
|
||||
<p class="notice">The protocol carries no fee. The one payment to the project is the Ember software’s optional 1% dev fee, like other GPU miners, off with one flag: <a href="#fee">the fee, in full view</a>. Questions: <a href="https://discord.gg/igneum" rel="noopener">the Discord</a>.</p>
|
||||
</div>
|
||||
<div class="card hive" id="hive">
|
||||
<div class="eyebrow">HiveOS · Flight Sheet</div>
|
||||
<h3>Install on a Hive rig</h3>
|
||||
<p>Miner: <b>Custom</b>. Installation URL: <code data-dl-url="miner-hive">https://dl.igneum.network/dl/public/igneum-hive-0.3.17.tar.gz</code>. Miner name <code>igneum</code>, wallet and worker <code>0x<your 40-hex payout address>.%WORKER_NAME%</code>. Hive itself is untested: report what breaks.</p>
|
||||
<p class="note" style="margin:0">sha256 <span class="mono" data-dl-sha="miner-hive" style="overflow-wrap:anywhere">b283ba0c506bdbd002b512157834a3a242717aa5ea0f410517dffb8e685f642d</span></p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="yourcard" data-yourcard style="margin-top:var(--s-5)">Your card: pending</p>
|
||||
<p class="note">Testnet coin for testing: <a href="/faucet">the faucet</a> sends 10 IGN per address per day. Any 4 GB card at launch. The dataset starts at 2 GB and grows on a schedule fixed at the testnet genesis (2 GB, doubling at years 4, 12 and 28), so a 4 GB card mines about four years and an 8 GB card about twelve, approximate.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="fee" class="sec">
|
||||
<div class="wrap">
|
||||
<div class="sec-head">
|
||||
<div class="eyebrow">The dev fee</div>
|
||||
<h2>The fee, in full view</h2>
|
||||
<p>The protocol carries no fee: no dev fund, no fee to any team, foundation or fund. The software fee is the miner app’s, like every other GPU miner’s, and one flag turns it off.</p>
|
||||
<div class="section-head">
|
||||
<div><div class="eyebrow"><span class="line"></span>The dev fee</div><h2>The fee, in full view.</h2></div>
|
||||
<p>The protocol carries no fee: no dev fund, no fee to any team, foundation or fund. The software fee is the miner app’s, like every other GPU miner’s, and one flag turns it off.</p>
|
||||
</div>
|
||||
<div class="feecard">
|
||||
<div class="card">
|
||||
|
|
@ -212,12 +247,12 @@ pre b{color:var(--molten-text);font-weight:500}
|
|||
<tr><td>HiveOS, extra config</td><td class="mono">DEV_FEE=0</td></tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
<p class="note">Measured on a test network, 4 Oct 2026: 9 fee blocks in the 785 blocks of two fee-paying miners (1.146%); the control miner at <span class="mono">--dev-fee 0</span> paid none; the miners’ counters and both nodes agree. <a href="/bench">The log</a>.</p>
|
||||
<p class="note">Measured on a test network, 4 Oct 2026: 9 fee blocks in the 785 blocks of two fee-paying miners (1.146%); the control miner at <span class="mono">--dev-fee 0</span> paid none; the miners’ counters and both nodes agree. <a href="/bench">The log</a>.</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="eyebrow">Earnings, as the app shows it</div>
|
||||
<div class="switch"><span class="track"></span><span>Dev fee: 1 block in 100 pays the people who make this app</span></div>
|
||||
<p class="note">The network itself takes nothing. This is the app’s fee, the same way every mining app takes one. This switch turns it off.</p>
|
||||
<p class="note">The network itself takes nothing. This is the app’s fee, the same way every mining app takes one. This switch turns it off.</p>
|
||||
<div class="eyebrow" style="margin-top:var(--s-5)">What the miner prints at start</div>
|
||||
<pre>dev fee 1% (1 block in 100) to 0x<address>; --dev-fee 0 turns it off</pre>
|
||||
</div>
|
||||
|
|
@ -225,11 +260,10 @@ pre b{color:var(--molten-text);font-weight:500}
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section id="shots" class="sec">
|
||||
<section id="shots" class="sec rule">
|
||||
<div class="wrap">
|
||||
<div class="sec-head">
|
||||
<div class="eyebrow">The app</div>
|
||||
<h2>Four pages. Every card is one row.</h2>
|
||||
<div class="section-head">
|
||||
<div><div class="eyebrow"><span class="line"></span>The app</div><h2>Four pages. Every card is one row.</h2></div>
|
||||
<p>Your rate, what it costs a day, and the chain drawn live with your own blocks ringed. <a href="/app">Every page of the app</a>, light and dark.</p>
|
||||
</div>
|
||||
<div class="shots3">
|
||||
|
|
@ -237,13 +271,13 @@ pre b{color:var(--molten-text);font-weight:500}
|
|||
<div class="bar"><i></i><i></i><i></i><b><span class="cap-dark">Overview</span><span class="cap-light">Earnings</span></b></div>
|
||||
<img src="/img/app-overview-dark.webp" width="1440" height="912" class="img-dark" alt="The Overview page of 0.3.16: an RTX 5090 at 103 MH/s and 317 W, 0.32 MH/W, 62 blocks this run and 91,521 lifetime, the Stop mining button, the chain drawn live with this rig's blocks ringed and locked checkpoints, the node synced with 5 peers" loading="lazy" decoding="async">
|
||||
<img src="/img/app-earnings-light.webp" width="1440" height="908" class="img-light" alt="The Earnings page of 0.3.16 in light mode: pounds earned with the devnet reason, IGN from proofs, blocks lifetime, the dev fee switch and the rewards address" loading="lazy" decoding="async">
|
||||
<figcaption><span class="cap-dark">0.3.16, rendered from the RTX 5090 Windows rig’s live state at 23:33 UK, 6 October 2026.</span><span class="cap-light">0.3.16 on the team’s Apple M5 Max, paused, 6 October 2026. Pounds earned reads 0.00 on devnet and says why.</span></figcaption>
|
||||
<figcaption><span class="cap-dark">0.3.16, rendered from the RTX 5090 Windows rig’s live state at 23:33 UK, 6 October 2026.</span><span class="cap-light">0.3.16 on the team’s Apple M5 Max, paused, 6 October 2026. Pounds earned reads 0.00 on devnet and says why.</span></figcaption>
|
||||
</figure>
|
||||
<figure class="frame">
|
||||
<div class="bar"><i></i><i></i><i></i><b>Cards</b></div>
|
||||
<img src="/img/app-cards-dark.webp" width="1440" height="1381" class="img-dark" alt="The Cards page: Ember Tune with Efficiency, Balanced and Maximum goals; one row per card with its rate, watts, hashes per watt, cost a day and temperature; the RTX 5090's details open with its power cap, goal, Retune and the tune curve" loading="lazy" decoding="async">
|
||||
<img src="/img/app-cards-light.webp" width="1440" height="912" class="img-light" alt="The Cards page of 0.3.16 in light mode: Ember Tune, the RTX 5090 at 103 MH/s, 322 to 317 W, 68 degrees, its tune line and Retune button; the integrated AMD graphics off" loading="lazy" decoding="async">
|
||||
<figcaption><span class="cap-dark">The Cards page, from the app in development.</span><span class="cap-light">0.3.16, rendered from the RTX 5090 Windows rig’s live state at 23:33 UK, 6 October 2026.</span></figcaption>
|
||||
<figcaption><span class="cap-dark">The Cards page, from the app in development.</span><span class="cap-light">0.3.16, rendered from the RTX 5090 Windows rig’s live state at 23:33 UK, 6 October 2026.</span></figcaption>
|
||||
</figure>
|
||||
<figure class="frame">
|
||||
<div class="bar"><i></i><i></i><i></i><b>Overview · Mac</b></div>
|
||||
|
|
@ -254,6 +288,22 @@ pre b{color:var(--molten-text);font-weight:500}
|
|||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="faq" class="sec rule">
|
||||
<div class="wrap">
|
||||
<div class="section-head">
|
||||
<div><div class="eyebrow"><span class="line"></span>Before you start</div><h2>The questions worth asking.</h2></div>
|
||||
</div>
|
||||
<div class="faq">
|
||||
<details><summary>Does this website use my GPU to mine?</summary><p>No. The pictures on the home page are drawn, not mined. Mining happens only in the app you install, and only when you press Start.</p></details>
|
||||
<details><summary>Does my card mine and prove?</summary><p>Every card mines. Proving the full shard needs a 24 GB NVIDIA card; a 32 GB card does both at once. Apple silicon proves on the CPU, slowly. The Prove page of the app says in one sentence what your card can do.</p></details>
|
||||
<details><summary>Is the devnet paying real money?</summary><p>No. Devnet coins have no value and the chain may reset. The app’s pounds row reads 0.00 on devnet and says why. The public testnet opens when the go checklist closes; mainnet comes after the testnet passes its gate.</p></details>
|
||||
<details id="fee-faq"><summary>Is there a fee?</summary><p>Not in the protocol: no dev fund, no fee to any team. The app takes an optional 1% software fee, the norm for GPU miners, and one flag turns it off. <a href="#fee">The fee, in full view.</a></p></details>
|
||||
<details><summary>Can I run it on a rig or in a pool?</summary><p>The Linux and HiveOS tarball is above, with the flight sheet. Pools are part of the public testnet; until then every machine mines solo on its own keys, and a card runs several.</p></details>
|
||||
<details><summary>Where do the numbers on this page come from?</summary><p>Every rate has a row in <a href="/miners">the bench table</a> and an entry in <a href="/bench">the engineering log</a> with the command and the hardware. Nothing here is estimated earnings.</p></details>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<div class="band">
|
||||
|
|
@ -266,7 +316,7 @@ pre b{color:var(--molten-text);font-weight:500}
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<a class="dl-bar" href="#get"><b>Download the miner</b><span data-dl-meta="miner-windows">v0.3.18 · 62.6 MB</span></a>
|
||||
<a class="dl-bar" href="#get"><b>Download the miner</b><span data-dl-meta="miner-windows">v0.3.19 · 62.7 MB</span></a>
|
||||
|
||||
<!-- footer:start -->
|
||||
<footer class="foot">
|
||||
|
|
@ -284,11 +334,12 @@ pre b{color:var(--molten-text);font-weight:500}
|
|||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
|
|
@ -296,15 +347,15 @@ pre b{color:var(--molten-text);font-weight:500}
|
|||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/litepaper#roadmap">Journey</a>
|
||||
<a href="/metamask">Add to MetaMask</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
|
|
@ -339,6 +390,7 @@ pre b{color:var(--molten-text);font-weight:500}
|
|||
<!-- footer:end -->
|
||||
|
||||
<script src="/yourcard.js" defer></script>
|
||||
<script src="/ui.js" defer></script>
|
||||
<script>
|
||||
(function(){
|
||||
// the card table: a block about every N at the network's hash rate, read every 15 s with the your-card line
|
||||
|
|
|
|||
|
|
@ -53,32 +53,24 @@
|
|||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
/* generated-page block (the engineering log, the bench table, the evidence table); tokens, type and components are in /site.css */
|
||||
/* generated-page block (the engineering log, the bench table, the provenance table): the page hero, the contents rail, the sections; tokens, type and components are in /site.css */
|
||||
[id]{scroll-margin-top:calc(var(--nav-h) + 16px)}
|
||||
.head{padding-top:calc(var(--sec) * .6)}
|
||||
.head h1{margin:var(--s-3) 0}
|
||||
.head .note{max-width:72ch;margin:0 0 var(--s-6)}
|
||||
.layout{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--s-6)}
|
||||
@media(min-width:960px){.layout{grid-template-columns:260px minmax(0,1fr);gap:56px}}
|
||||
.toc{align-self:start;font-size:14px;border:1px solid var(--line);border-radius:var(--r-row);background:var(--graphite);padding:8px}
|
||||
.toc .lbl{font:500 var(--t-xs)/1.4 var(--f-mono);letter-spacing:.12em;text-transform:uppercase;color:var(--ash);padding:6px 10px 8px}
|
||||
.toc ol{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1px;counter-reset:s;max-height:40vh;overflow:auto;overscroll-behavior:contain;scrollbar-width:thin}
|
||||
@media(min-width:960px){.toc{position:sticky;top:calc(var(--nav-h) + 20px)}.toc ol{max-height:calc(100vh - var(--nav-h) - 96px)}}
|
||||
.toc a{display:flex;gap:10px;padding:7px 10px;border-radius:8px;color:var(--ink-2);counter-increment:s;line-height:1.35}
|
||||
.toc a::before{content:counter(s,decimal-leading-zero);font-family:var(--f-mono);font-size:11px;color:var(--ash);min-width:20px;padding-top:2px}
|
||||
.toc a:hover{background:var(--row);text-decoration:none;color:var(--bone)}
|
||||
article{max-width:78ch;min-width:0;color:var(--ink-2)}
|
||||
.page-hero .lead{max-width:72ch}
|
||||
article h1{display:none}
|
||||
article h2{font-size:var(--t-h3);margin:44px 0 12px;padding-top:24px;border-top:1px solid var(--line)}
|
||||
article h2:first-of-type{margin-top:0;padding-top:0;border-top:0}
|
||||
article{color:var(--ink-2)}
|
||||
article h2{font-size:var(--t-h3);margin:0 0 12px}
|
||||
article h3{font-size:16px;margin:26px 0 8px}
|
||||
article h4{font:600 15px/1.4 var(--f-sans);margin:20px 0 6px;color:var(--bone)}
|
||||
article p{margin:0 0 14px}article ul,article ol{margin:0 0 14px;padding-left:22px}article li{margin-bottom:6px}
|
||||
article p,article li,article h2,article h3{overflow-wrap:anywhere}
|
||||
article pre{margin:0 0 var(--s-4)}
|
||||
.doc-section:last-child{border-bottom:0}
|
||||
.doc-section[hidden]{display:none}
|
||||
.tbl{margin:var(--s-4) 0 var(--s-5)}
|
||||
table{min-width:560px}
|
||||
.gen{color:var(--ash);font-size:13px;margin:40px 0 0;max-width:72ch}
|
||||
.doc-tools{margin:0 0 var(--s-5)}
|
||||
.doc-tools .searchbar{max-width:560px}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
|
@ -123,30 +115,38 @@ table{min-width:560px}
|
|||
})();
|
||||
</script>
|
||||
<!-- nav:end -->
|
||||
<main id="main" class="wrap">
|
||||
<div class="head">
|
||||
<div class="eyebrow">6 measured rows, 0 fleet tuning models</div>
|
||||
<main id="main">
|
||||
<section class="page-hero">
|
||||
<div class="wrap">
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>GPU bench table</span></div>
|
||||
<div class="eyebrow"><span class="line"></span>6 measured rows, 0 fleet tuning models</div>
|
||||
<h1>GPU bench table</h1>
|
||||
<p class="note">Measured hash rates per card on the Igneum lottery hash, with the generator version, the miner version, the date and the log entry behind each number.</p>
|
||||
<p class="lead">Measured hash rates per card on the Igneum lottery hash, with the generator version, the miner version, the date and the log entry behind each number.</p>
|
||||
</div>
|
||||
<div class="layout">
|
||||
<nav class="toc" aria-label="Contents"><div class="lbl">Contents</div><ol><li><a href="#table">The table</a></li><li><a href="#how">How a row gets here</a></li><li><a href="#priors">Fleet tuning priors</a></li></ol></nav>
|
||||
<article><h2 id="table">The table</h2>
|
||||
</section>
|
||||
<div class="wrap">
|
||||
<div class="doc-tools"><div class="searchbar"><svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><circle cx="10.5" cy="10.5" r="6.5"/><path d="m16 16 5 5"/></svg><label for="doc-q" class="visually-hidden">Filter the sections</label><input id="doc-q" data-filter-input="miners" placeholder="Filter the sections: a card, a date, a word" autocomplete="off" spellcheck="false"><span class="small" data-filter-count="miners"></span></div></div>
|
||||
<div class="docs-layout">
|
||||
<nav class="doc-nav" aria-label="Contents"><div class="eyebrow">Contents</div><a href="#table">The table</a><a href="#how">How a row gets here</a><a href="#priors">Fleet tuning priors</a></nav>
|
||||
<article class="doc-body" data-filter-list="miners"><section class="doc-section"><h2 id="table">The table</h2>
|
||||
<p>One row per card, generator version and miner version. The rate is the best one measured. Integrated GPUs are not listed. Prototype rows are bench numbers from before the devnet and say so in the miner column.</p>
|
||||
<div class="tbl"><table><thead><tr><th>Card</th><th>Generator</th><th>Best MH/s</th><th>MH per watt</th><th>Miner</th><th>Date</th><th>Source</th><th>Who measured it</th></tr></thead><tbody><tr><td>Apple M5 Max (40 GPU cores, Metal)</td><td>v1</td><td>45.2</td><td>not measured</td><td>proto-metal bench (prototype, not mining)</td><td>2026-10-03</td><td>bench log: 3 October 2026, RTX 5090 first run (the Apple row of the same table)</td><td>measured by the team. genesis program, 1 GiB dataset</td></tr><tr><td>Apple M5 Max (40 GPU cores, Metal)</td><td>v2</td><td>26.7</td><td>not measured</td><td>igneum-miner devnet v4, Metal worker with prepare</td><td>2026-10-04</td><td>bench log: 4 October 2026, first hourly program swap on the live devnet: compile-ahead, no pause, two cards</td><td>measured by the team. live devnet v4, unbroken through the hour boundary</td></tr><tr><td>Apple silicon laptop (model not reported)</td><td>v2</td><td>24.3</td><td>not measured</td><td>Igneum Miner 0.3.1 (DMG)</td><td>2026-10-04</td><td>bench log: 4 October 2026, first outside machine on the devnet: an Apple silicon laptop through the Igneum Miner app</td><td>reported by the fleet. 21.0 MH/s average over 7 minutes, 24.3 MH/s at the moment of the report, 33 accepted blocks</td></tr><tr><td>NVIDIA RTX 5090 (32 GB)</td><td>v1</td><td>229</td><td>not measured</td><td>proto-cuda bench (prototype, not mining)</td><td>2026-10-03</td><td>bench log: 3 October 2026, RTX 5090, memory-hard dataset (pack igneum-genesis-mh)</td><td>measured by the team. genesis program, 104 loads per hash, 1 GiB dataset</td></tr><tr><td>NVIDIA RTX 5090 (32 GB)</td><td>v1</td><td>185.3</td><td>not measured</td><td>proto-cuda bench (prototype, not mining)</td><td>2026-10-03</td><td>bench log: 3 October 2026, RTX 5090 first run, dataset sweep and second program</td><td>measured by the team. hourly program, 128 loads per hash, 1 GiB dataset</td></tr><tr><td>NVIDIA RTX 5090 (32 GB)</td><td>v2</td><td>124.2</td><td>not measured</td><td>Igneum Miner 0.3.0 package, prebuilt NVRTC worker</td><td>2026-10-04</td><td>bench log: 4 October 2026, the gfx1036 worker fault and what the Apple M5 Max could and could not reproduce</td><td>measured by the team. live devnet v4, 128 loads per hash, CPU re-check clean, 0 rejected</td></tr></tbody></table></div>
|
||||
<h2 id="how">How a row gets here</h2>
|
||||
</section>
|
||||
<section class="doc-section"><h2 id="how">How a row gets here</h2>
|
||||
<p>Every row names the engineering log entry or the job it came from. "Measured by the team" means our own hardware and our own log. "Reported by the fleet" means a machine we do not own, read from the status lines its miner uploads.</p>
|
||||
<p>MH per watt needs the card's power draw during the run. The app reads it on NVIDIA cards through the driver. Rows get the figure when a run records it.</p>
|
||||
<p>There is no other Igneum miner to compare with yet, so this table compares cards, not miners. The app that produces these rows: <a href="/miner">the miner page</a>.</p>
|
||||
<p>Rows: 6. Each row names the engineering log entry it came from.</p>
|
||||
<h2 id="priors">Fleet tuning priors</h2>
|
||||
</section>
|
||||
<section class="doc-section"><h2 id="priors">Fleet tuning priors</h2>
|
||||
<p>Ember Tune runs on every card the app mines with: the power limit and the core clock are stepped on the live program and the card keeps the point with the best MH per watt within 1% of its top rate. Every finished tune is reported back without anything that identifies the owner, and the fleet's median point per card model, driver major and program class comes back down inside the signed update manifest as the starting point for the next card of that model. A model needs 5 reports before its prior is used.</p>
|
||||
<p>No tune reports yet. The first rows appear once five machines with the same card model have reported.</p>
|
||||
<h3 id="team">Measured by the team</h3>
|
||||
<ul><li><b>NVIDIA GeForce RTX 5090</b> (driver 617, class l128w0, 2026-10-06, job <code>ember-tune-pc1-6</code>): 1854 MHz core cap, power limit 100% (575 W). 84 W saved for 0.15% of rate: 127.71 MH/s at 226.8 W (0.563 MH/W) against 127.9 MH/s at 311 W untuned (0.411 MH/W), 37% more hashes per watt. The chosen clock is the ladder's floor (60% of the maximum), not the optimum; the next cut's ladder goes to 45% and the climb walks on from here.</li><li><b>NVIDIA GeForce RTX 4070</b> (driver 617, class l128w0, 2026-10-06, job <code>ember-tune-pc1-6</code>): 1863 MHz core cap, power limit 50% (100 W). 30 W saved for no rate lost: 28.78 MH/s at 75.6 W (0.381 MH/W) against 28.72 MH/s at 106 W untuned (0.271 MH/W), 41% more hashes per watt. The chosen clock is the ladder's floor (60% of the maximum), not the optimum; the next cut's ladder goes to 45%.</li></ul>
|
||||
<p>Rows: 0. Written from the fleet's tune records at build time.</p></article>
|
||||
<p>Rows: 0. Written from the fleet's tune records at build time.</p></section></article>
|
||||
</div>
|
||||
<p class="gen">Generated from the repository at build time. Times are UTC. Machine names are model names.</p>
|
||||
</div>
|
||||
</main>
|
||||
<!-- footer:start -->
|
||||
<footer class="foot">
|
||||
|
|
@ -164,11 +164,12 @@ table{min-width:560px}
|
|||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
|
|
@ -176,15 +177,15 @@ table{min-width:560px}
|
|||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/litepaper#roadmap">Journey</a>
|
||||
<a href="/metamask">Add to MetaMask</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
|
|
@ -217,5 +218,6 @@ table{min-width:560px}
|
|||
})();
|
||||
</script>
|
||||
<!-- footer:end -->
|
||||
<script src="/ui.js" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -13,11 +13,12 @@
|
|||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
|
|
@ -25,15 +26,15 @@
|
|||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/litepaper#roadmap">Journey</a>
|
||||
<a href="/metamask">Add to MetaMask</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
|
|
|
|||
224
site/provenance.html
Normal file
224
site/provenance.html
Normal file
File diff suppressed because one or more lines are too long
218
site/randomx.html
Normal file
218
site/randomx.html
Normal file
|
|
@ -0,0 +1,218 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
||||
<title>Igneum and RandomX</title>
|
||||
<meta name="description" content="Monero’s random-program idea, rebuilt for graphics cards: a program per hour instead of a program per hash, a dataset that grows, and what RandomX’s record does and does not say about Igneum.">
|
||||
<link rel="canonical" href="https://igneum.network/randomx">
|
||||
<meta name="theme-color" content="#0C0C0E">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:site_name" content="Igneum">
|
||||
<meta property="og:title" content="Igneum and RandomX">
|
||||
<meta property="og:description" content="Monero’s random-program idea, rebuilt for graphics cards: a program per hour instead of a program per hash, a dataset that grows, and what RandomX’s record does and does not say about Igneum.">
|
||||
<meta property="og:url" content="https://igneum.network/randomx">
|
||||
<meta property="og:image" content="https://igneum.network/og.png?v=3">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Igneum and RandomX">
|
||||
<meta name="twitter:description" content="Monero’s random-program idea, rebuilt for graphics cards: a program per hour instead of a program per hash, a dataset that grows, and what RandomX’s record does and does not say about Igneum.">
|
||||
<meta name="twitter:image" content="https://igneum.network/og.png?v=3">
|
||||
<meta name="twitter:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
||||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'%3E%3Crect width='1024' height='1024' fill='%230C0C0E'/%3E%3Cg transform='translate(166.95 166.95) scale(6.901)'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3Cpolygon points='50,42 59,58 50,82 41,58' fill='%230C0C0E'/%3E%3C/g%3E%3C/svg%3E" type="image/svg+xml">
|
||||
<link rel="icon" href="/favicon.ico" sizes="48x48">
|
||||
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
|
||||
<link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192">
|
||||
<link rel="icon" href="/icon-512.png" type="image/png" sizes="512x512">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
|
||||
<link rel="manifest" href="/site.webmanifest">
|
||||
<!-- head:start -->
|
||||
<link rel="preload" href="/fonts/unbounded-900.woff2" as="font" type="font/woff2" crossorigin>
|
||||
<link rel="preload" href="/fonts/plex-sans-400.woff2" as="font" type="font/woff2" crossorigin>
|
||||
<link rel="stylesheet" href="/site.css">
|
||||
<style>
|
||||
/* Shared by every page: the head partial, injected by the build between the head markers. Edit the partial, not the page. */
|
||||
/* Fonts, self-hosted (latin subsets, OFL): Unbounded 500/700/900, IBM Plex Sans 400/500/600, IBM Plex Mono 400/500. Fallbacks carry size and ascent overrides so the swap does not move the layout. The tokens, type and components are in /site.css (docs/plans/site-ui-3.md). */
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/unbounded-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/unbounded-700.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded';font-style:normal;font-weight:900;font-display:swap;src:url(/fonts/unbounded-900.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-sans-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-sans-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/plex-sans-600.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-mono-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-mono-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
||||
@font-face{font-family:'Unbounded Fallback';src:local('Arial Black'),local('Arial-Black'),local('Impact');size-adjust:114%;ascent-override:87.5%;descent-override:21.5%;line-gap-override:0%}
|
||||
@font-face{font-family:'Plex Sans Fallback';src:local('Arial'),local('Helvetica Neue'),local('Helvetica');size-adjust:100.5%;ascent-override:102%;descent-override:27.4%;line-gap-override:0%}
|
||||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: the footer control stores "light" or "dark" under igneum-theme; nothing stored means the system setting */
|
||||
(function(){try{var t=localStorage.getItem("igneum-theme");if(t==="light"||t==="dark")document.documentElement.setAttribute("data-theme",t);}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
/* derived-page block (rendered by the build from its source page or document); tokens, type and components are in /site.css */
|
||||
[id]{scroll-margin-top:calc(var(--nav-h) + 16px)}
|
||||
.page-hero .lead{max-width:72ch}
|
||||
.derived{max-width:78ch;color:var(--ink-2)}
|
||||
.derived h2{font-size:var(--t-h3);margin:var(--s-6) 0 var(--s-3)}
|
||||
.derived h3{font-size:16px;margin:var(--s-5) 0 var(--s-2)}
|
||||
.derived ul,.derived ol{margin:0 0 var(--s-4);padding-left:22px}
|
||||
.derived li{margin-bottom:8px}
|
||||
.derived strong{color:var(--bone);font-weight:600}
|
||||
.derived p,.derived li{overflow-wrap:anywhere}
|
||||
.derived .tbl{margin:var(--s-4) 0 var(--s-5)}
|
||||
.derived .pull{margin:var(--s-5) 0;padding:var(--s-4) var(--s-5);border-left:2px solid var(--ember);background:var(--row);border-radius:0 var(--r-row) var(--r-row) 0;font:500 var(--t-lg)/1.45 var(--f-sans);color:var(--bone)}
|
||||
.derived .src{margin:calc(-1 * var(--s-2)) 0 var(--s-5);font:400 13px/1.5 var(--f-mono);color:var(--ash)}
|
||||
.derived .src b{font-weight:500;color:var(--ink-2)}
|
||||
.onward{display:flex;flex-wrap:wrap;gap:var(--s-3);margin-top:var(--s-6);padding-top:var(--s-5);border-top:1px solid var(--line)}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- nav:start -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
<nav class="nav" aria-label="Main">
|
||||
<div class="wrap">
|
||||
<a href="/" class="brand" aria-label="Igneum home">
|
||||
<svg class="mark" viewBox="0 0 1024 1024" width="28" height="28" aria-hidden="true"><rect width="1024" height="1024" rx="160" fill="#0C0C0E"></rect><g transform="translate(166.95 166.95) scale(6.901)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></g></svg>
|
||||
<span class="word">IGNEUM</span>
|
||||
</a>
|
||||
<div class="links" id="nav-links">
|
||||
<a href="/litepaper" data-nav="litepaper" aria-current="page">Litepaper</a>
|
||||
<a href="/miner" data-nav="miner">Miner</a>
|
||||
<a href="/app" data-nav="app">App</a>
|
||||
<a href="/wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/live" data-nav="live">Live devnet</a>
|
||||
<a href="/ledger" data-nav="ledger">Ledger</a>
|
||||
</div>
|
||||
<a href="/miner#get" class="btn primary small cta">Download</a>
|
||||
<button class="burger" id="nav-burger" type="button" aria-expanded="false" aria-controls="nav-sheet" aria-label="Open the menu" aria-haspopup="true"><span class="bars" aria-hidden="true"></span></button>
|
||||
<div class="nav-sheet" id="nav-sheet">
|
||||
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
|
||||
<a href="/miner" data-nav="miner">Miner</a>
|
||||
<a href="/app" data-nav="app">App</a>
|
||||
<a href="/wallet" data-nav="wallet">Wallet</a>
|
||||
<a href="/live" data-nav="live">Live devnet</a>
|
||||
<a href="/ledger" data-nav="ledger">Ledger</a>
|
||||
<a href="/miner#get" class="btn primary">Download</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<script>
|
||||
(function(){
|
||||
// the menu: open on the button, closed by any link, Escape (focus back on the button) or a resize past 900 px
|
||||
var n=document.querySelector('.nav'),b=document.getElementById('nav-burger'),s=document.getElementById('nav-sheet');if(!n||!b||!s)return;
|
||||
function set(o){n.classList.toggle('open',o);b.setAttribute('aria-expanded',o?'true':'false');b.setAttribute('aria-label',o?'Close the menu':'Open the menu');document.documentElement.style.overflow=o?'hidden':'';}
|
||||
b.addEventListener('click',function(){set(!n.classList.contains('open'));});
|
||||
s.addEventListener('click',function(e){if(e.target.closest('a'))set(false);});
|
||||
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&n.classList.contains('open')){set(false);b.focus();}});
|
||||
var mq=window.matchMedia('(min-width:901px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
||||
})();
|
||||
</script>
|
||||
<!-- nav:end -->
|
||||
<main id="main">
|
||||
<section class="page-hero">
|
||||
<div class="wrap">
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>Igneum vs RandomX</span></div>
|
||||
<div class="eyebrow"><span class="line"></span>Monero’s idea, finished for GPUs</div>
|
||||
<h1>Monero’s idea.<br>Finished for GPUs.</h1>
|
||||
<p class="lead">Random-program mining is the idea Igneum borrowed. Here is what changed when it was rebuilt for graphics cards, and what RandomX’s seven years say and do not say about this chain. The same text as the litepaper’s section.</p>
|
||||
</div>
|
||||
</section>
|
||||
<section class="sec compact">
|
||||
<div class="wrap">
|
||||
<div class="derived"><p>RandomX has kept chips off Monero since 2019 (approximate) by making the mining program random, so the hardware that runs it well is the hardware everyone already owns. The one chip announced against it, Bitmain’s Antminer X9 (pre-orders from 26 December 2025 at 1 MH/s and 2,472 W, about USD 5,600), was withdrawn in mid-May 2026 before any unit shipped; RandomX 2.0 shipped on 25 March 2026 (monero-project/monero issue 10270). Igneum takes the same principle to graphics cards and adds what RandomX never had.</p>
|
||||
<div class="tbl"><table>
|
||||
<thead><tr><th>Property</th><th>RandomX, Monero</th><th>Igneum</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>Hardware it is built for</td><td>CPUs. GPUs run it badly on purpose</td><td>GPUs. Any card, any vendor. Bit-exact on Apple, NVIDIA and AMD, measured</td></tr>
|
||||
<tr><td>Random program</td><td>Per hash, interpreted in a virtual machine</td><td>Per hour, compiled to native GPU code. Per hash, the 128 dataset addresses change with the nonce</td></tr>
|
||||
<tr><td>Dataset</td><td>About 2 GB, the same size since 2019, approximate</td><td>2 GB, growing (the proposed schedule, fixed at the testnet genesis: 2 GB, doubling at years 4, 12 and 28); a 4 GB card mines about four years, an 8 GB card about twelve, approximate</td></tr>
|
||||
<tr><td>Light verification</td><td>256 MB cache on a CPU, milliseconds</td><td>256 MB cache on a CPU (512 MB from year 4), one warp under 10 ms, the gate. Measured 2.1 ms on one Apple M5 Max core for class v3 (3.4x class v2's 0.61 ms); a 2019-class core not yet</td></tr>
|
||||
<tr><td>Changes over time</td><td>None. A fixed design, unchanged for seven years</td><td>A new program every hour, its memory pattern with it; era draws and reserved families on a schedule fixed at genesis. Nobody touches it</td></tr>
|
||||
<tr><td>Seed grinding</td><td>Not applicable, the program comes from the hash input</td><td>Closed by a verifiable delay between seed and program</td></tr>
|
||||
<tr><td>Useful work</td><td>None. Hashing only</td><td>Every NVIDIA card from 8 GB proves; 12 GB and up mine and prove; 24 GB on the stock server (eleven rented cards, RTX 3060 to RTX 5090, 6 October 2026); they sell proofs to other chains. AMD and Apple cards mine, and a prover for them lands when a zkVM ships one</td></tr>
|
||||
<tr><td>Track record</td><td>About seven years without a shipped chip; the one announced, Bitmain’s Antminer X9, was withdrawn in May 2026 before launch</td><td>Zero years. Every number above is measured and logged with the commands that produced it. The specification, reference hash, test vectors and simulators are public now (github.com/igneum-network/spec). The node, the miner and the wallet are in a private repository until the public testnet</td></tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
<p>Measured so far: the same hourly program, generated on an Apple M5 Max, compiled by Apple's Metal and NVIDIA's CUDA on an RTX 5090, produced identical hashes on both, 192 of 192 across two programs. On a 1 GB dataset the 5090 ran at about 228 million hashes a second and the Mac at about 45 million, both bound by random memory access rather than arithmetic. Those are prototype figures, not mining rates. The first prototype dataset was a closed-form function, and a miner could compute items instead of loading them: measured 111x faster that way on the Mac. The 256 MB cache construction replaced it on 3 October 2026. With the cache, computing items on the fly runs 4.8x slower than loading them, measured on the Mac, and the honest rate is unchanged on both vendors. Open: the same shortcut ratio on NVIDIA and on a discrete AMD card, and the time-memory trade-off between the two measured points. Inside the 5090's 96 MB cache the same program ran nearly six times faster, which is why the dataset starts at 2 GB and grows. On 4 October 2026 the live devnet crossed an hourly program change on all three vendors with no pause and no rejected block: a Mac at 26.7 million hashes a second, an RTX 5090 at 123 million and an integrated AMD chip at 2.7 million, every hash doing 128 distinct reads of the memory-hard dataset.</p></div>
|
||||
<div class="onward"><a href="/litepaper#mining" class="btn">How mining works</a><a href="/litepaper#chip-model" class="btn">The chip model</a><a href="/provenance" class="btn">Built on the shoulders</a></div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<!-- footer:start -->
|
||||
<footer class="foot">
|
||||
<div class="wrap">
|
||||
<div class="foot-grid">
|
||||
<div class="foot-brand">
|
||||
<a href="/" class="brand" aria-label="Igneum home"><svg class="mark" viewBox="0 0 1024 1024" width="26" height="26" aria-hidden="true"><rect width="1024" height="1024" rx="160" fill="#0C0C0E"></rect><g transform="translate(166.95 166.95) scale(6.901)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></g></svg><span class="word">IGNEUM</span></a>
|
||||
<p>Mined by GPUs. Proven by fire.</p>
|
||||
<div class="social" aria-label="Igneum elsewhere">
|
||||
<a href="https://github.com/igneum-network/spec" target="_blank" rel="noopener" aria-label="Igneum on GitHub: the spec, the vectors and the issues"><svg viewBox="0 0 24 24" width="22" height="22" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2.1c-3.2.7-3.9-1.4-3.9-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2.9-.3 1.9-.4 2.9-.4s2 .1 2.9.4c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.2c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"></path></svg></a>
|
||||
<a href="https://discord.gg/igneum" target="_blank" rel="noopener" aria-label="The Igneum Discord"><svg viewBox="0 0 24 24" width="22" height="22" fill="currentColor" aria-hidden="true"><path d="M19.6 5.3A17 17 0 0 0 15.4 4l-.2.4a15.6 15.6 0 0 1 3.9 1.9 13.6 13.6 0 0 0-14.2 0A15.6 15.6 0 0 1 8.8 4.4L8.6 4a17 17 0 0 0-4.2 1.3C1.8 9.2 1.1 13 1.4 16.7a17.1 17.1 0 0 0 5.2 2.6l1.1-1.8a10.8 10.8 0 0 1-1.7-.8l.4-.3a12.2 12.2 0 0 0 11.2 0l.4.3-1.7.8 1.1 1.8a17 17 0 0 0 5.2-2.6c.4-4.3-.7-8-3-11.4zM8.7 14.4c-1 0-1.8-.9-1.8-2.1s.8-2.1 1.8-2.1 1.9 1 1.8 2.1c0 1.2-.8 2.1-1.8 2.1zm6.6 0c-1 0-1.8-.9-1.8-2.1s.8-2.1 1.8-2.1 1.9 1 1.8 2.1c0 1.2-.8 2.1-1.8 2.1z"></path></svg></a>
|
||||
<a data-social="reddit" href="https://www.reddit.com/user/Igneum_network/" target="_blank" rel="noopener" aria-label="Igneum on Reddit"><svg viewBox="0 0 24 24" width="22" height="22" fill="currentColor" aria-hidden="true"><path d="M22 12.1a2.2 2.2 0 0 0-3.7-1.6 10.8 10.8 0 0 0-5.8-1.8l1-4.6 3.2.7a1.5 1.5 0 1 0 .2-.9l-3.6-.8a.5.5 0 0 0-.5.4l-1.1 5.2a10.8 10.8 0 0 0-5.9 1.8A2.2 2.2 0 1 0 3.4 14a4.3 4.3 0 0 0 0 .7c0 3.4 3.9 6.1 8.6 6.1s8.6-2.7 8.6-6.1a4.3 4.3 0 0 0 0-.7 2.2 2.2 0 0 0 1.4-1.9zM7 13.6a1.5 1.5 0 1 1 1.5 1.5A1.5 1.5 0 0 1 7 13.6zm8.6 4.1a5.7 5.7 0 0 1-3.6 1.1 5.7 5.7 0 0 1-3.6-1.1.4.4 0 0 1 .6-.6 4.9 4.9 0 0 0 3 .9 4.9 4.9 0 0 0 3-.9.4.4 0 0 1 .6.6zm-.3-2.6a1.5 1.5 0 1 1 1.5-1.5 1.5 1.5 0 0 1-1.5 1.5z"></path></svg></a>
|
||||
</div>
|
||||
</div>
|
||||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
<a href="/miner">The miner</a>
|
||||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
<div class="eyebrow">Contact</div>
|
||||
<a href="mailto:hello@igneum.network">hello@igneum.network</a>
|
||||
<a href="https://github.com/igneum-network/spec/issues" rel="noopener">An issue on the spec</a>
|
||||
<span class="foot-note">Report a flaw by either. Nobody from Igneum will ask for your seed.</span>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="foot-base">
|
||||
<span class="foot-imprint">Igneum Labs LTD · Unit IH-00-01-01-OF-01, Level 01, Innovation One, Dubai International Financial Centre</span>
|
||||
<span class="foot-state"><span class="dot off" id="foot-dot"></span><span id="foot-state">devnet</span></span>
|
||||
<span class="theme" role="group" aria-label="Theme"><button type="button" data-theme-set="system" aria-pressed="true">System</button><button type="button" data-theme-set="light" aria-pressed="false">Light</button><button type="button" data-theme-set="dark" aria-pressed="false">Dark</button></span>
|
||||
<span class="mono foot-copy">© 2026 Igneum · not an offer to sell anything</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
(function(){
|
||||
// theme control: stores light or dark under igneum-theme; system clears it. The head applied the stored value before paint.
|
||||
var bs=document.querySelectorAll('[data-theme-set]');if(!bs.length)return;
|
||||
function cur(){try{var t=localStorage.getItem('igneum-theme');return t==='light'||t==='dark'?t:'system';}catch(e){return 'system';}}
|
||||
function paint(){var c=cur();bs.forEach(function(b){b.setAttribute('aria-pressed',b.getAttribute('data-theme-set')===c?'true':'false');});}
|
||||
bs.forEach(function(b){b.addEventListener('click',function(){var v=b.getAttribute('data-theme-set');try{if(v==='system')localStorage.removeItem('igneum-theme');else localStorage.setItem('igneum-theme',v);}catch(e){}
|
||||
if(v==='system')document.documentElement.removeAttribute('data-theme');else document.documentElement.setAttribute('data-theme',v);paint();});});
|
||||
paint();
|
||||
// the network state word in the footer: one read of the observer per page view
|
||||
var fs=document.getElementById('foot-state'),fd=document.getElementById('foot-dot');if(fs&&fd){fetch('/api/live?window=30',{cache:'no-store'}).then(function(r){return r.json();}).then(function(d){var on=d&&d.ok&&d.state&&!d.state.stale;fs.textContent=on?'devnet live':'devnet, observer stale';fd.className='dot '+(on?'live':'off');}).catch(function(){fs.textContent='devnet';});}
|
||||
})();
|
||||
</script>
|
||||
<!-- footer:end -->
|
||||
<script src="/ui.js" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -146,11 +146,12 @@
|
|||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
|
|
@ -158,15 +159,15 @@
|
|||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/litepaper#roadmap">Journey</a>
|
||||
<a href="/metamask">Add to MetaMask</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
|
|
|
|||
239
site/site.css
239
site/site.css
|
|
@ -303,3 +303,242 @@ input:focus,select:focus,textarea:focus{border-color:var(--line-2)}
|
|||
.switch{display:inline-flex;align-items:center;gap:12px;font-size:var(--t-base);color:var(--bone)}
|
||||
.switch .track{width:44px;height:26px;border-radius:13px;background:var(--ember);position:relative;flex:0 0 44px}
|
||||
.switch .track::after{content:"";position:absolute;top:3px;right:3px;width:20px;height:20px;border-radius:50%;background:var(--bone)}
|
||||
|
||||
/* ---------- 10. the redesign vocabulary (7 Oct 2026, the full-site redesign package on our tokens and fonts) ----------
|
||||
The package's layouts, restated on the tokens above: page hero with a breadcrumb, the home hero grid and the GPU scene,
|
||||
section heads, panels, feature cards, tool cards, the split section, the CTA band, step lists, FAQ, platform tabs,
|
||||
the stat grid, record cards, filters, the timeline, the compare table and the docs layout. Fonts stay self-hosted. */
|
||||
.eyebrow .line{display:inline-block;width:24px;height:1px;background:var(--ember);vertical-align:middle;margin-right:10px}
|
||||
.eyebrow em{font-style:normal;color:var(--ember-text)}
|
||||
.accent{color:var(--ember-text)}
|
||||
.molten{color:var(--molten-text)}
|
||||
.text-link{display:inline-flex;align-items:center;gap:8px;color:var(--ink-2);font-size:15px;font-weight:500}
|
||||
.text-link:hover{color:var(--ember-text);text-decoration:none}
|
||||
.text-link .icon{width:16px;height:16px}
|
||||
.icon{display:inline-block;width:20px;height:20px;vertical-align:middle;fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
|
||||
.btn .icon{width:18px;height:18px}
|
||||
.btn.ghost{background:transparent}
|
||||
.actions{display:flex;gap:12px;flex-wrap:wrap;margin-top:var(--s-5)}
|
||||
@media (max-width:720px){.actions .btn{width:100%}}
|
||||
.small{font-size:13px;color:var(--ash)}
|
||||
.rule{border-top:1px solid var(--line)}
|
||||
.sec.compact{padding:var(--s-6) 0}
|
||||
/* page hero: breadcrumb, eyebrow, h1, lead, optional actions on the right */
|
||||
.page-hero{padding:calc(var(--s-6) + 8px) 0 var(--s-6)}
|
||||
.page-hero h1{max-width:22ch}
|
||||
.page-hero .lead{margin-top:var(--s-4);max-width:62ch}
|
||||
.breadcrumb{display:flex;flex-wrap:wrap;gap:10px;font:400 var(--t-xs)/1.4 var(--f-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--ash);margin-bottom:var(--s-5)}
|
||||
.breadcrumb a{color:var(--ash)}.breadcrumb a:hover{color:var(--ember-text);text-decoration:none}
|
||||
.page-heading{display:flex;justify-content:space-between;align-items:flex-end;gap:var(--s-6)}
|
||||
.page-heading .actions{margin:0;flex-shrink:0}
|
||||
@media (max-width:860px){.page-heading{flex-direction:column;align-items:flex-start;gap:var(--s-4)}}
|
||||
/* the home hero */
|
||||
.hero-grid{display:grid;grid-template-columns:1.05fr 1fr;align-items:center;gap:var(--s-5);min-height:500px}
|
||||
.hero-copy{position:relative;z-index:1;min-width:0}
|
||||
.hero-copy h1{font-size:var(--t-hero);line-height:1.04;letter-spacing:-.03em;max-width:12ch}
|
||||
.hero-copy h1 .accent{display:inline-block}
|
||||
.hero-copy .lead{margin-top:var(--s-5);max-width:44ch}
|
||||
.hero-footnote{display:flex;align-items:center;gap:9px;margin-top:var(--s-5);font:400 var(--t-xs)/1.6 var(--f-mono);letter-spacing:.04em;color:var(--ash)}
|
||||
.hero-footnote .icon{width:14px;height:14px;color:var(--ember-text)}
|
||||
.hero-scene{height:500px;position:relative;isolation:isolate;min-width:0}
|
||||
.hero-scene::before{content:"";position:absolute;inset:20px -50px 0;background:radial-gradient(ellipse at 58% 48%,var(--ember-12),transparent 65%);z-index:-1;pointer-events:none}
|
||||
.hero-scene canvas{display:block;width:100%;height:100%;border:0;background:transparent}
|
||||
.scene-corner{position:absolute;font:400 var(--t-xs)/1.5 var(--f-mono);color:var(--ash);letter-spacing:.05em;pointer-events:none}
|
||||
.scene-corner.tl{left:12px;top:18px}.scene-corner.tr{right:12px;top:18px;text-align:right}.scene-corner.bl{left:12px;bottom:26px}.scene-corner.br{right:12px;bottom:26px;text-align:right}
|
||||
.scene-corner strong{display:block;color:var(--ink-2);font-weight:500;margin-bottom:3px}
|
||||
.scene-steps{position:absolute;left:50%;bottom:66px;transform:translateX(-50%);display:flex;gap:4px;border:1px solid var(--line);padding:4px;border-radius:10px;background:var(--top-bg);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}
|
||||
.scene-step{background:transparent;border:0;color:var(--ash);font:500 var(--t-xs)/1 var(--f-mono);letter-spacing:.06em;padding:10px 13px;border-radius:7px;white-space:nowrap;cursor:pointer;min-height:36px}
|
||||
.scene-step[aria-pressed="true"]{background:var(--ember-12);color:var(--ember-text)}
|
||||
.scene-step:hover{color:var(--bone)}
|
||||
.hero-bottom{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));border-top:1px solid var(--line);padding-top:var(--s-5);margin-top:var(--s-5);gap:var(--s-5)}
|
||||
.principle{display:flex;gap:12px;align-items:flex-start;min-width:0}
|
||||
.principle .icon{color:var(--ember-text);width:18px;height:18px;margin-top:2px}
|
||||
.principle strong{font-size:14px;font-weight:600;display:block;color:var(--bone)}
|
||||
.principle small{font-size:13px;color:var(--ash);display:block;margin-top:3px;line-height:1.45}
|
||||
@media (max-width:1100px){.hero-grid{grid-template-columns:1.06fr 1fr;gap:0}.hero-scene{height:420px}}
|
||||
@media (max-width:860px){.hero-grid{grid-template-columns:1fr;min-height:0;gap:var(--s-4)}.hero-copy{max-width:640px}.hero-copy h1{max-width:14ch}.hero-scene{max-width:660px;width:100%;height:440px;margin:0 auto}.hero-bottom{grid-template-columns:1fr 1fr;gap:var(--s-4)}}
|
||||
@media (max-width:560px){.hero-scene{height:335px;margin-top:var(--s-3)}.scene-corner{font-size:9px}.scene-corner.tl{left:0;top:6px}.scene-corner.tr{right:0;top:6px}.scene-corner.bl{left:0;bottom:6px}.scene-corner.br{display:none}.scene-steps{bottom:44px;padding:3px;gap:2px}.scene-step{padding:8px 9px;font-size:10px}.hero-bottom{gap:var(--s-4) var(--s-3)}}
|
||||
/* section head: eyebrow + h2 on the left, a line or a link on the right */
|
||||
.section-head{display:flex;justify-content:space-between;align-items:flex-end;gap:var(--s-6);margin-bottom:var(--s-6)}
|
||||
.section-head h2{max-width:22ch}
|
||||
.section-head>p{color:var(--ash);max-width:42ch;font-size:16px;margin:0}
|
||||
.section-head .eyebrow{margin-bottom:var(--s-3)}
|
||||
@media (max-width:860px){.section-head{align-items:flex-start;flex-direction:column;gap:var(--s-3)}}
|
||||
/* panels */
|
||||
.panel{background:var(--row);border:1px solid var(--line);border-radius:var(--r-card);overflow:hidden;min-width:0}
|
||||
.panel-head{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:18px 22px;border-bottom:1px solid var(--line);flex-wrap:wrap}
|
||||
.panel-head .eyebrow{margin:0}
|
||||
.panel-footer{display:flex;align-items:center;justify-content:space-between;padding:14px 22px;gap:12px;border-top:1px solid var(--line);font:400 var(--t-xs)/1.7 var(--f-mono);color:var(--ash);flex-wrap:wrap}
|
||||
.panel .legend{margin:0;font-size:12px}
|
||||
.legend i{display:inline-block;width:8px;height:8px;border-radius:2px;background:var(--ember);margin-right:7px;flex:none}
|
||||
.legend i.your{background:var(--molten)}.legend i.included{background:var(--included)}.legend i.excluded{background:var(--excluded)}
|
||||
.live-peek{position:relative}
|
||||
.live-peek .scene{position:relative}
|
||||
.live-peek canvas{display:block;height:300px;width:100%;background:var(--row);touch-action:pan-y}
|
||||
.label-below{font-size:13px;color:var(--ash);margin-top:var(--s-3);display:flex;justify-content:space-between;gap:var(--s-5);flex-wrap:wrap}
|
||||
@media (max-width:560px){.panel-head{padding:14px 16px}.panel-footer{padding:12px 16px;flex-direction:column;align-items:flex-start}.live-peek canvas{height:225px}}
|
||||
/* feature cards (the package's .feature card; ours is a grid, so this is .fcard) */
|
||||
.grid-3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-4)}
|
||||
.grid-2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--s-5)}
|
||||
.grid-3>*,.grid-2>*,.tools-grid>*,.record-grid>*,.hero-grid>*,.download-layout>*,.split-section>*,.wallet-hero>*,.docs-layout>*,.console-layout>*{min-width:0}
|
||||
.fcard{position:relative;padding:var(--s-6) var(--s-5);background:var(--row);border:1px solid var(--line);border-radius:var(--r-card);overflow:hidden;display:flex;flex-direction:column}
|
||||
.fcard::after{content:"";position:absolute;width:72px;height:1px;top:0;left:var(--s-5);background:var(--ember);opacity:.75}
|
||||
.fcard .number{font:500 var(--t-xs)/1 var(--f-mono);letter-spacing:.1em;color:var(--ember-text);margin-bottom:var(--s-6);display:flex;align-items:center;justify-content:space-between}
|
||||
.fcard .number .icon{width:24px;height:24px;color:var(--ash)}
|
||||
.fcard h3{margin-bottom:var(--s-3)}
|
||||
.fcard p{color:var(--ink-2);font-size:var(--t-base);margin:0}
|
||||
.fcard .text-link{margin-top:auto;padding-top:var(--s-5)}
|
||||
.feature-graphic{height:110px;width:100%;margin:var(--s-3) 0 var(--s-4);display:flex;align-items:center;justify-content:center}
|
||||
.chip-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:5px;width:100%;max-width:260px;transform:perspective(400px) rotateX(30deg) rotateZ(-7deg)}
|
||||
.chip-grid i{display:block;height:10px;border:1px solid var(--line-2);border-radius:2px}
|
||||
.chip-grid i:nth-child(3n),.chip-grid i:nth-child(7n){background:var(--ember-12);border-color:var(--ember-40)}
|
||||
.tools-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-4)}
|
||||
.tool-card{border:1px solid var(--line);border-radius:var(--r-card);padding:var(--s-5);background:var(--row);transition:border-color .2s,transform .2s;display:flex;flex-direction:column}
|
||||
.tool-card:hover{border-color:var(--line-2);transform:translateY(-3px)}
|
||||
.tool-card>.icon{color:var(--ember-text);width:26px;height:26px;margin-bottom:var(--s-5)}
|
||||
.tool-card h3{font-size:17px;margin-bottom:var(--s-3)}
|
||||
.tool-card p{color:var(--ink-2);font-size:var(--t-base);margin:0}
|
||||
.tool-card .text-link{margin-top:auto;padding-top:var(--s-5)}
|
||||
@media (max-width:860px){.grid-3,.tools-grid{grid-template-columns:1fr 1fr}.grid-3>.fcard:last-child{grid-column:1/-1}}
|
||||
@media (max-width:560px){.grid-3,.grid-2,.tools-grid{grid-template-columns:1fr}.grid-3>.fcard:last-child{grid-column:auto}.fcard{padding:var(--s-5)}.feature-graphic{height:85px}}
|
||||
@media (prefers-reduced-motion:reduce){.tool-card,.tool-card:hover{transform:none;transition:none}}
|
||||
/* the split section with the reward bars */
|
||||
.split-section{display:grid;grid-template-columns:1fr 1fr;gap:clamp(40px,8vw,100px);align-items:center}
|
||||
.split-section h2{max-width:19ch}
|
||||
.reward-bars{padding:var(--s-6)}
|
||||
.reward-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--s-4);gap:var(--s-3)}
|
||||
.reward-row strong{font:700 clamp(30px,3.5vw,40px)/1 var(--f-display);letter-spacing:-.03em;color:var(--bone)}
|
||||
.reward-row .icon{color:var(--ash)}
|
||||
.reward-bar{height:12px;background:var(--graphite);display:flex;border-radius:3px;overflow:hidden;gap:3px;margin:var(--s-5) 0}
|
||||
.reward-bar i:first-child{width:80%;background:var(--ember)}.reward-bar i:last-child{width:20%;background:var(--molten)}
|
||||
.reward-key{display:flex;justify-content:space-between;gap:var(--s-5);margin-top:var(--s-5);font-size:13px;flex-wrap:wrap}
|
||||
.reward-key strong{display:block;margin-bottom:4px;color:var(--bone)}
|
||||
.reward-key span{color:var(--ash)}
|
||||
.reward-note{margin:var(--s-5) 0 0;border-top:1px solid var(--line);padding-top:var(--s-4);font:400 var(--t-xs)/1.8 var(--f-mono);color:var(--ash)}
|
||||
.mini-title{font:500 var(--t-xs)/1.4 var(--f-mono);letter-spacing:.1em;text-transform:uppercase}
|
||||
@media (max-width:860px){.split-section{grid-template-columns:1fr;gap:var(--s-6)}.split-section h2{max-width:26ch}}
|
||||
@media (max-width:560px){.reward-bars{padding:var(--s-5)}.reward-key{gap:var(--s-4);font-size:12px}}
|
||||
/* the CTA band */
|
||||
.cta-band{position:relative;padding:clamp(32px,5vw,58px);border:1px solid var(--ember-40);border-radius:var(--r-card);background:linear-gradient(120deg,var(--ember-12),transparent 70%);display:flex;align-items:center;justify-content:space-between;gap:var(--s-6);overflow:hidden}
|
||||
.cta-band h2{max-width:20ch}
|
||||
.cta-band p{color:var(--ink-2);font-size:var(--t-base);margin:var(--s-3) 0 0;max-width:50ch}
|
||||
.cta-band .actions{margin:0;flex-shrink:0}
|
||||
.cta-band .small{margin:var(--s-3) 0 0}
|
||||
@media (max-width:860px){.cta-band{flex-direction:column;align-items:flex-start;gap:var(--s-5)}}
|
||||
.glow-button{position:relative}
|
||||
.glow-button::after{content:"";position:absolute;inset:-4px;border:1px solid var(--ember);border-radius:14px;opacity:0;pointer-events:none}
|
||||
.glow-button:hover::after{animation:btnSignal .7s ease-out}
|
||||
@keyframes btnSignal{from{transform:scale(.96);opacity:.45}to{transform:scale(1.06);opacity:0}}
|
||||
/* steps and FAQ */
|
||||
.step-list{display:grid}
|
||||
.step-item{display:grid;grid-template-columns:44px 1fr;gap:var(--s-5);padding:var(--s-5) 0;border-top:1px solid var(--line)}
|
||||
.step-item .step-index{font:700 14px/1 var(--f-display);color:var(--ember-text);border:1px solid var(--line-2);height:38px;width:38px;display:grid;place-items:center;border-radius:8px}
|
||||
.step-item h3{font-size:16px;margin-bottom:8px}
|
||||
.step-item p{font-size:var(--t-base);color:var(--ink-2);margin:0}
|
||||
@media (max-width:560px){.step-item{gap:var(--s-4);grid-template-columns:38px 1fr}}
|
||||
.faq details{border-top:1px solid var(--line)}
|
||||
.faq details:last-child{border-bottom:1px solid var(--line)}
|
||||
.faq summary{font-size:16px;padding:18px 0}
|
||||
.faq details p{padding-bottom:var(--s-5);color:var(--ink-2);font-size:var(--t-base);max-width:85ch;margin:0}
|
||||
/* platform tabs and the download card */
|
||||
.download-layout{display:grid;grid-template-columns:1.1fr 1fr;gap:clamp(30px,5vw,52px);align-items:center}
|
||||
@media (max-width:860px){.download-layout{grid-template-columns:1fr}}
|
||||
.ptabs{display:flex;gap:4px;border-bottom:1px solid var(--line);overflow-x:auto;scrollbar-width:thin}
|
||||
.ptabs button{background:none;border:0;border-bottom:2px solid transparent;padding:12px 15px;color:var(--ash);font:500 14px/1.3 var(--f-sans);white-space:nowrap;cursor:pointer;flex:1;min-height:44px;margin-bottom:-1px}
|
||||
.ptabs button[aria-selected="true"]{border-bottom-color:var(--ember);color:var(--bone)}
|
||||
.ptabs button:hover{color:var(--bone)}
|
||||
.download-card{padding:var(--s-5)}
|
||||
.platform-body{padding-top:var(--s-5)}
|
||||
.platform-body[hidden]{display:none}
|
||||
.download-platform{display:flex;gap:14px;align-items:center;margin:var(--s-2) 0 var(--s-4)}
|
||||
.download-platform .osmark{width:30px;height:30px;color:var(--bone);flex:none}
|
||||
.download-platform h3{font-size:18px}
|
||||
.download-platform p{font:400 var(--t-xs)/1.4 var(--f-mono);color:var(--ash);margin:5px 0 0}
|
||||
.platform-body .btn.primary{width:100%;margin-top:var(--s-4)}
|
||||
.platform-body .btn[data-dl-missing]{opacity:.55}
|
||||
.download-detail{display:flex;justify-content:space-between;gap:var(--s-3);font:400 var(--t-xs)/1.5 var(--f-mono);margin-top:var(--s-3);color:var(--ash);flex-wrap:wrap}
|
||||
.download-detail span{overflow-wrap:anywhere;min-width:0}
|
||||
.download-note{font-size:var(--t-base);color:var(--ink-2);margin:var(--s-4) 0 0;line-height:1.6}
|
||||
.download-note b{color:var(--bone);font-weight:600}
|
||||
.source-note{font:400 var(--t-xs)/1.8 var(--f-mono);color:var(--ash);margin-top:var(--s-5);padding-left:12px;border-left:2px solid var(--line-2)}
|
||||
.source-note a{color:var(--ink-2);text-decoration:underline;text-underline-offset:3px}
|
||||
.source-note a:hover{color:var(--ember-text)}
|
||||
.notice-box{display:flex;gap:14px;align-items:flex-start;border:1px solid var(--line-2);border-radius:var(--r-row);padding:18px 22px;font-size:var(--t-base);color:var(--ink-2);background:var(--row)}
|
||||
.notice-box .icon{color:var(--molten-text);width:19px;height:19px;margin-top:2px}
|
||||
.notice-box strong{color:var(--bone);display:block;margin-bottom:4px;font-weight:600}
|
||||
.notice-box p{margin:0}
|
||||
.tag-row{display:flex;gap:8px;flex-wrap:wrap}
|
||||
/* stat grid */
|
||||
.stat-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));border:1px solid var(--line);border-radius:var(--r-row);overflow:hidden;margin-bottom:var(--s-5);background:var(--row)}
|
||||
.stat{padding:20px 22px;border-right:1px solid var(--line);min-width:0}
|
||||
.stat:last-child{border-right:0}
|
||||
.stat .key{font:500 var(--t-xs)/1.4 var(--f-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--ash);margin-bottom:10px}
|
||||
.stat strong{font:700 clamp(21px,2.2vw,29px)/1.1 var(--f-display);letter-spacing:-.02em;color:var(--bone);overflow-wrap:anywhere}
|
||||
.stat .small{font:400 var(--t-xs)/1.5 var(--f-mono);margin-top:8px;display:block}
|
||||
@media (max-width:560px){.stat-grid{grid-template-columns:1fr 1fr}.stat:nth-child(2n){border-right:0}.stat:nth-child(-n+2){border-bottom:1px solid var(--line)}.stat{padding:16px}}
|
||||
/* records, filters, search */
|
||||
.searchbar{position:relative;display:flex;align-items:center;gap:12px;padding:10px 16px;border:1px solid var(--line-2);border-radius:var(--r-btn);background:var(--row)}
|
||||
.searchbar .icon{width:17px;height:17px;color:var(--ash)}
|
||||
.searchbar input{flex:1;min-width:0;border:0;outline:none;background:transparent;color:var(--bone);font-size:15px;padding:6px 0;border-radius:0}
|
||||
.searchbar input:focus{border:0}
|
||||
.searchbar input::placeholder{color:var(--ash)}
|
||||
.filter-row{display:flex;gap:8px;flex-wrap:wrap;margin:var(--s-4) 0}
|
||||
.filter{background:none;border:1px solid var(--line);border-radius:6px;padding:8px 13px;font:500 var(--t-xs)/1.3 var(--f-mono);letter-spacing:.04em;color:var(--ash);cursor:pointer;min-height:36px}
|
||||
.filter[aria-pressed="true"]{border-color:var(--ember);color:var(--ember-text);background:var(--ember-12)}
|
||||
.filter:hover{color:var(--bone)}
|
||||
.record-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--s-4)}
|
||||
.record{background:var(--row);border:1px solid var(--line);border-radius:var(--r-row);padding:var(--s-5);min-width:0}
|
||||
.record[hidden]{display:none}
|
||||
.record .record-top{display:flex;justify-content:space-between;gap:var(--s-3);align-items:center;margin-bottom:var(--s-4);flex-wrap:wrap}
|
||||
.record time{font:400 var(--t-xs)/1.4 var(--f-mono);color:var(--ash)}
|
||||
.record h3{font-size:16px;line-height:1.45;margin-bottom:var(--s-3)}
|
||||
.record p{font-size:var(--t-base);color:var(--ink-2);margin:0}
|
||||
.record-count{font:400 var(--t-xs)/1.4 var(--f-mono);color:var(--ash);margin:var(--s-4) 0}
|
||||
@media (max-width:860px){.record-grid{grid-template-columns:1fr}}
|
||||
.badge{display:inline-block;padding:4px 8px;border:1px solid var(--line-2);border-radius:5px;font:500 var(--t-xs)/1.3 var(--f-mono);color:var(--ink-2);white-space:nowrap}
|
||||
.badge.warm{border-color:var(--ember-40);color:var(--ember-text)}
|
||||
.badge.gold{border-color:var(--molten);color:var(--molten-text)}
|
||||
.empty-state{padding:var(--s-6) var(--s-5);text-align:center;color:var(--ash)}
|
||||
.empty-state h3{color:var(--bone);font-size:17px;margin-bottom:var(--s-3)}
|
||||
/* the timeline */
|
||||
.timeline{position:relative;margin-top:var(--s-6)}
|
||||
.milestone{display:grid;grid-template-columns:150px 1fr;gap:var(--s-6);position:relative;padding-bottom:var(--s-6)}
|
||||
.milestone::before{content:"";position:absolute;top:14px;bottom:0;left:166px;width:1px;background:var(--line)}
|
||||
.milestone:last-child::before{display:none}
|
||||
.milestone::after{content:"";width:9px;height:9px;border:1px solid var(--line-2);background:var(--obsidian);border-radius:2px;position:absolute;left:162px;top:10px}
|
||||
.milestone.current::after{background:var(--ember);border-color:var(--ember)}
|
||||
.milestone.done::after{background:var(--molten);border-color:var(--molten)}
|
||||
.milestone time,.milestone .when{font:400 var(--t-sm)/1.5 var(--f-mono);color:var(--ash);padding-top:4px;min-width:0;overflow-wrap:anywhere}
|
||||
.milestone h3{font-size:18px;margin-bottom:10px}
|
||||
.milestone p{color:var(--ink-2);font-size:var(--t-base);max-width:75ch;margin:0 0 8px}
|
||||
.milestone .badge{margin-bottom:10px}
|
||||
.milestone .gate{color:var(--ash);font-size:14px}
|
||||
.milestone .gate b{color:var(--bone);font-weight:600}
|
||||
@media (max-width:560px){.milestone{grid-template-columns:1fr;gap:6px;padding:0 0 var(--s-5) 22px}.milestone::before{left:4px;top:18px}.milestone::after{left:0;top:14px}.milestone time,.milestone .when{font-size:11px;padding-top:0}.milestone h3{font-size:16px}}
|
||||
/* compare table */
|
||||
.compare-table td:first-child{font-weight:600;color:var(--bone)}
|
||||
.compare-table th:last-child{color:var(--ember-text)}
|
||||
.compare-table td{white-space:normal;min-width:180px;vertical-align:top;line-height:1.6}
|
||||
.compare-table td:last-child{background:var(--ember-12)}
|
||||
/* the docs layout: a sticky contents rail, numbered sections */
|
||||
.docs-layout{display:grid;grid-template-columns:240px minmax(0,1fr);gap:56px;align-items:start}
|
||||
.doc-nav{position:sticky;top:calc(var(--nav-h) + 20px);max-height:calc(100vh - var(--nav-h) - 48px);overflow:auto;border-right:1px solid var(--line);padding-right:16px;scrollbar-width:thin}
|
||||
.doc-nav .eyebrow{margin-bottom:var(--s-3)}
|
||||
.doc-nav a{display:block;font-size:13px;color:var(--ash);padding:7px 10px;border-left:2px solid transparent;line-height:1.35}
|
||||
.doc-nav a:hover,.doc-nav a.active{color:var(--ember-text);background:var(--ember-12);border-left-color:var(--ember);text-decoration:none}
|
||||
.doc-body{max-width:78ch;min-width:0}
|
||||
.doc-section{padding-bottom:var(--s-6);margin-bottom:var(--s-6);border-bottom:1px solid var(--line)}
|
||||
.doc-section .section-number{font:500 var(--t-xs)/1 var(--f-mono);letter-spacing:.1em;color:var(--ember-text);margin-bottom:12px}
|
||||
.doc-notice{background:var(--ember-12);border:1px solid var(--ember-40);border-radius:var(--r-row);padding:18px 22px;margin-bottom:var(--s-6);font-size:14px;color:var(--ink-2)}
|
||||
.doc-notice strong{display:block;color:var(--molten-text);margin-bottom:6px;font-weight:600}
|
||||
@media (max-width:960px){.docs-layout{grid-template-columns:1fr;gap:var(--s-5)}.doc-nav{position:relative;top:0;max-height:190px;border:1px solid var(--line);border-radius:var(--r-row);padding:14px;display:grid;grid-template-columns:1fr 1fr}.doc-nav .eyebrow{grid-column:1/-1}}
|
||||
@media (max-width:560px){.doc-nav{grid-template-columns:1fr 1fr;max-height:200px;padding:10px}.doc-nav a{font-size:12px;padding:6px 8px}}
|
||||
/* reveal once, no scroll hijack; off under reduced motion */
|
||||
.reveal{opacity:1}
|
||||
.reveal.will-reveal{opacity:0;transform:translateY(16px);transition:opacity .6s ease,transform .6s ease}
|
||||
.reveal.visible{opacity:1;transform:none}
|
||||
@media (prefers-reduced-motion:reduce){.reveal.will-reveal{opacity:1;transform:none;transition:none}.glow-button:hover::after{animation:none}}
|
||||
/* the wallet hero: copy beside the window; the card slot takes the wallet redesign when it lands */
|
||||
.wallet-hero{display:grid;grid-template-columns:1fr 1fr;align-items:center;gap:clamp(32px,6vw,65px)}
|
||||
@media (max-width:860px){.wallet-hero{grid-template-columns:1fr}}
|
||||
.code-block{white-space:pre-wrap;overflow-wrap:anywhere;background:var(--row);border:1px solid var(--line);padding:18px;border-radius:var(--r-row);font:400 13px/1.8 var(--f-mono);margin:var(--s-4) 0}
|
||||
|
|
|
|||
|
|
@ -1,14 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url><loc>https://igneum.network/</loc><lastmod>2026-10-04</lastmod><changefreq>weekly</changefreq><priority>1.0</priority></url>
|
||||
<url><loc>https://igneum.network/litepaper</loc><lastmod>2026-10-04</lastmod><changefreq>monthly</changefreq><priority>0.9</priority></url>
|
||||
<url><loc>https://igneum.network/live</loc><lastmod>2026-10-04</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://igneum.network/bench</loc><lastmod>2026-10-04</lastmod><changefreq>weekly</changefreq><priority>0.6</priority></url>
|
||||
<url><loc>https://igneum.network/evidence</loc><lastmod>2026-10-04</lastmod><changefreq>weekly</changefreq><priority>0.6</priority></url>
|
||||
<url><loc>https://igneum.network/miners</loc><lastmod>2026-10-04</lastmod><changefreq>weekly</changefreq><priority>0.6</priority></url>
|
||||
<url><loc>https://igneum.network/wallet</loc><lastmod>2026-10-05</lastmod><changefreq>monthly</changefreq><priority>0.6</priority></url>
|
||||
<url><loc>https://igneum.network/metamask</loc><lastmod>2026-10-05</lastmod><changefreq>monthly</changefreq><priority>0.4</priority></url>
|
||||
<url><loc>https://igneum.network/</loc><lastmod>2026-10-07</lastmod><changefreq>weekly</changefreq><priority>1.0</priority></url>
|
||||
<url><loc>https://igneum.network/litepaper</loc><lastmod>2026-10-07</lastmod><changefreq>monthly</changefreq><priority>0.9</priority></url>
|
||||
<url><loc>https://igneum.network/miner</loc><lastmod>2026-10-07</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||
<url><loc>https://igneum.network/app</loc><lastmod>2026-10-07</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url>
|
||||
<url><loc>https://igneum.network/wallet</loc><lastmod>2026-10-07</lastmod><changefreq>monthly</changefreq><priority>0.6</priority></url>
|
||||
<url><loc>https://igneum.network/live</loc><lastmod>2026-10-07</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://igneum.network/explorer</loc><lastmod>2026-10-07</lastmod><changefreq>daily</changefreq><priority>0.5</priority></url>
|
||||
<url><loc>https://igneum.network/ledger</loc><lastmod>2026-10-07</lastmod><changefreq>weekly</changefreq><priority>0.6</priority></url>
|
||||
<url><loc>https://igneum.network/bench</loc><lastmod>2026-10-07</lastmod><changefreq>weekly</changefreq><priority>0.6</priority></url>
|
||||
<url><loc>https://igneum.network/evidence</loc><lastmod>2026-10-07</lastmod><changefreq>weekly</changefreq><priority>0.6</priority></url>
|
||||
<url><loc>https://igneum.network/miners</loc><lastmod>2026-10-07</lastmod><changefreq>weekly</changefreq><priority>0.6</priority></url>
|
||||
<url><loc>https://igneum.network/journey</loc><lastmod>2026-10-07</lastmod><changefreq>weekly</changefreq><priority>0.5</priority></url>
|
||||
<url><loc>https://igneum.network/claims</loc><lastmod>2026-10-07</lastmod><changefreq>monthly</changefreq><priority>0.5</priority></url>
|
||||
<url><loc>https://igneum.network/randomx</loc><lastmod>2026-10-07</lastmod><changefreq>monthly</changefreq><priority>0.5</priority></url>
|
||||
<url><loc>https://igneum.network/provenance</loc><lastmod>2026-10-07</lastmod><changefreq>monthly</changefreq><priority>0.4</priority></url>
|
||||
<url><loc>https://igneum.network/dev-fee</loc><lastmod>2026-10-07</lastmod><changefreq>monthly</changefreq><priority>0.4</priority></url>
|
||||
<url><loc>https://igneum.network/metamask</loc><lastmod>2026-10-07</lastmod><changefreq>monthly</changefreq><priority>0.4</priority></url>
|
||||
<url><loc>https://igneum.network/faucet</loc><lastmod>2026-10-07</lastmod><changefreq>monthly</changefreq><priority>0.4</priority></url>
|
||||
</urlset>
|
||||
|
|
|
|||
41
site/ui.js
Normal file
41
site/ui.js
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
/* Shared page behaviour for the redesign (7 Oct 2026): reveal-once on .reveal, the platform tabs on the download card,
|
||||
a text filter over [data-filter-list] records, and a details element opened when its id is the hash. No routing, no
|
||||
sample data, nothing that writes anywhere. */
|
||||
(function () {
|
||||
'use strict';
|
||||
var reduced = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
||||
// reveal once, no scroll hijack
|
||||
var els = document.querySelectorAll('.reveal');
|
||||
if (els.length && 'IntersectionObserver' in window && !reduced) {
|
||||
var io = new IntersectionObserver(function (es) { es.forEach(function (e) { if (e.isIntersecting) { e.target.classList.add('visible'); io.unobserve(e.target); } }); }, { threshold: .06 });
|
||||
els.forEach(function (el) { el.classList.add('will-reveal'); io.observe(el); });
|
||||
}
|
||||
// platform tabs: [role=tab][data-platform] buttons and [data-platform-panel] panels
|
||||
var tabs = Array.prototype.slice.call(document.querySelectorAll('[role="tab"][data-platform]'));
|
||||
function select(tab) {
|
||||
tabs.forEach(function (t) { var on = t === tab; t.setAttribute('aria-selected', String(on)); t.setAttribute('tabindex', on ? '0' : '-1'); });
|
||||
document.querySelectorAll('[data-platform-panel]').forEach(function (p) { p.hidden = p.getAttribute('data-platform-panel') !== tab.getAttribute('data-platform'); });
|
||||
}
|
||||
tabs.forEach(function (t) {
|
||||
t.addEventListener('click', function () { select(t); });
|
||||
t.addEventListener('keydown', function (e) { var i = tabs.indexOf(t), n = null; if (e.key === 'ArrowRight') n = tabs[(i + 1) % tabs.length]; if (e.key === 'ArrowLeft') n = tabs[(i - 1 + tabs.length) % tabs.length]; if (e.key === 'Home') n = tabs[0]; if (e.key === 'End') n = tabs[tabs.length - 1]; if (n) { e.preventDefault(); select(n); n.focus(); } });
|
||||
});
|
||||
if (tabs.length) { var pre = tabs.filter(function (t) { return t.getAttribute('aria-selected') === 'true'; })[0] || tabs[0]; select(pre); }
|
||||
// a text filter and category chips over a list of records
|
||||
document.querySelectorAll('[data-filter-list]').forEach(function (list) {
|
||||
var input = document.querySelector('[data-filter-input="' + list.getAttribute('data-filter-list') + '"]'), chips = document.querySelectorAll('[data-filter-chip="' + list.getAttribute('data-filter-list') + '"]'), count = document.querySelector('[data-filter-count="' + list.getAttribute('data-filter-list') + '"]'), empty = document.querySelector('[data-filter-empty="' + list.getAttribute('data-filter-list') + '"]'), cat = '';
|
||||
function apply() {
|
||||
var q = (input ? input.value : '').trim().toLowerCase(), n = 0;
|
||||
Array.prototype.forEach.call(list.children, function (el) { var ok = (!cat || el.getAttribute('data-category') === cat) && (!q || el.textContent.toLowerCase().indexOf(q) >= 0); el.hidden = !ok; if (ok) n++; });
|
||||
if (count) count.textContent = n + ' of ' + list.children.length;
|
||||
if (empty) empty.hidden = n > 0;
|
||||
chips.forEach(function (c) { c.setAttribute('aria-pressed', String((c.getAttribute('data-category') || '') === cat)); });
|
||||
}
|
||||
if (input) input.addEventListener('input', apply);
|
||||
chips.forEach(function (c) { c.addEventListener('click', function () { cat = c.getAttribute('data-category') || ''; apply(); }); });
|
||||
apply();
|
||||
});
|
||||
// a details element named by the hash opens on arrival
|
||||
function openHash() { var id = location.hash.slice(1); if (!id) return; var el = document.getElementById(id); if (el && el.tagName === 'DETAILS') el.open = true; }
|
||||
window.addEventListener('hashchange', openHash); openHash();
|
||||
})();
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
{
|
||||
"cleanUrls": true,
|
||||
"trailingSlash": false,
|
||||
"redirects": [],
|
||||
"rewrites": [{"source": "/block/:id", "destination": "/block"}, {"source": "/address/:addr", "destination": "/address"}],
|
||||
"redirects": [{"source": "/connect", "destination": "/metamask", "permanent": true}, {"source": "/gpu-benchmarks", "destination": "/miners", "permanent": true}],
|
||||
"rewrites": [{"source": "/block/:id", "destination": "/block"}, {"source": "/address/:addr", "destination": "/address"}, {"source": "/benchmarks", "destination": "/miners"}],
|
||||
"headers": [
|
||||
{"source": "/(.*)", "headers": [{"key": "X-Content-Type-Options", "value": "nosniff"}, {"key": "X-Frame-Options", "value": "DENY"}, {"key": "Referrer-Policy", "value": "strict-origin-when-cross-origin"}, {"key": "Strict-Transport-Security", "value": "max-age=63072000; includeSubDomains; preload"}]},
|
||||
{"source": "/fonts/(.*)", "headers": [{"key": "Cache-Control", "value": "public, max-age=31536000, immutable"}]},
|
||||
|
|
|
|||
224
site/wallet.html
224
site/wallet.html
|
|
@ -53,76 +53,32 @@
|
|||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
/* page block; tokens, type and components are in /site.css */
|
||||
--card-pad:clamp(18px,3vw,28px);--card-r:18px;--tile-pad:18px 20px;--tile-r:14px;--gap:24px;--gap-tile:12px;
|
||||
--fs-hero:clamp(32px,5.6vw,56px);--fs-h2:clamp(28px,4.2vw,44px);--fs-h3:clamp(18px,2vw,22px);--fs-tile:clamp(20px,2.2vw,26px)}
|
||||
section,[id]{scroll-margin-top:var(--sm)}section[id]{scroll-margin-top:calc(var(--sm) - var(--sec))}
|
||||
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
|
||||
img,svg{max-width:100%}
|
||||
.mono{font-family:var(--f-mono)}
|
||||
.eyebrow.ember{color:var(--ember)}
|
||||
h1,h2,h3{font-family:var(--f-display);margin:0;line-height:1.08;text-wrap:balance}
|
||||
.btn.primary:hover{background:#FF6A2B;border-color:#FF6A2B;color:var(--ember-ink)}
|
||||
.reveal{opacity:0;transform:translateY(18px);transition:opacity .7s ease,transform .7s ease}
|
||||
.reveal.in{opacity:1;transform:none}
|
||||
@media (prefers-reduced-motion:reduce){.reveal{opacity:1;transform:none;transition:none}}
|
||||
section{padding-block:var(--sec)}
|
||||
section+section{padding-top:0;scroll-margin-top:var(--sm)}
|
||||
.sec-head{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:16px;margin-bottom:32px}
|
||||
.sec-head p{font-size:16px;color:var(--ash);max-width:46ch}
|
||||
.pt{font-size:15px;color:var(--ash);max-width:64ch}
|
||||
.lp{display:inline-block;margin-top:24px;color:var(--ember);font-weight:600;font-size:15px}
|
||||
.cta{display:flex;flex-wrap:wrap;gap:12px}
|
||||
.hero{position:relative;padding-block:clamp(48px,8vw,96px) clamp(40px,6vw,72px);overflow:hidden}
|
||||
.hero::before{content:'';position:absolute;inset:auto -10% -30% 40%;height:70%;background:radial-gradient(closest-side,rgba(242,84,27,.18),rgba(242,84,27,0));pointer-events:none}
|
||||
.hero .wrap{position:relative;display:grid;gap:36px;grid-template-columns:1fr;align-items:center}
|
||||
@media (min-width:980px){.hero .wrap{grid-template-columns:.9fr 1.1fr;gap:32px 56px}}
|
||||
.hero-copy{display:flex;flex-direction:column;gap:22px}
|
||||
.hero p.lead{font-size:clamp(17px,2vw,20px);color:var(--ink-2);max-width:52ch}
|
||||
.hero .os{display:flex;flex-wrap:wrap;gap:8px 18px;font-size:14px;color:var(--ash)}
|
||||
.shot{position:relative;min-width:0}
|
||||
@media (max-width:720px){.shot::before{display:none}}
|
||||
.shot::before{content:'';position:absolute;inset:12% -6% -8% -6%;background:radial-gradient(closest-side,rgba(242,84,27,.22),rgba(242,84,27,0));filter:blur(12px);pointer-events:none}
|
||||
.frame{position:relative;border:1px solid var(--line-2);border-radius:16px;background:#0C0C0E;box-shadow:0 30px 80px rgba(0,0,0,.55);overflow:hidden}
|
||||
.frame .bar{height:32px;display:flex;align-items:center;gap:7px;padding:0 14px;border-bottom:1px solid var(--line);background:#121215}
|
||||
.frame .bar i{width:10px;height:10px;border-radius:50%;background:#2A2A30;display:block}
|
||||
.frame .bar b{margin-left:auto;font:500 11px/1 var(--f-mono);letter-spacing:.12em;color:var(--ash);text-transform:uppercase}
|
||||
.frame img{display:block;width:100%;height:auto}
|
||||
.frame figcaption{padding:10px 14px;font-size:13px;color:var(--ash);border-top:1px solid var(--line)}
|
||||
/* the three finality states */
|
||||
.states{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--gap-tile);position:relative}
|
||||
.state{border:1px solid var(--line);border-radius:var(--tile-r);padding:var(--tile-pad);background:var(--graphite);display:flex;flex-direction:column;gap:8px;position:relative;min-width:0}
|
||||
.state .pill{display:inline-flex;align-items:center;gap:8px;align-self:flex-start;font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform:uppercase;padding:6px 10px;border-radius:999px;border:1px solid var(--line-2);color:var(--ash)}
|
||||
.state .pill i{width:8px;height:8px;border-radius:50%;background:var(--ash);display:inline-block}
|
||||
.state.block .pill{border-color:rgba(255,179,92,.5);color:var(--molten)}.state.block .pill i{background:var(--molten)}
|
||||
.state.final .pill{border-color:var(--ember);background:var(--ember);color:var(--ember-ink)}.state.final .pill i{background:var(--ember-ink)}
|
||||
.state .t{font-family:var(--f-display);font-weight:700;font-size:var(--fs-h3)}
|
||||
.state p{font-size:14px;color:var(--ash);line-height:1.45}
|
||||
.state::after{content:'';position:absolute;right:-9px;top:50%;width:14px;height:14px;border-top:2px solid var(--line-2);border-right:2px solid var(--line-2);transform:translateY(-50%) rotate(45deg);z-index:1}
|
||||
.state:last-child::after{display:none}
|
||||
@media (max-width:640px){.states{grid-template-columns:1fr}.state::after{right:auto;left:50%;top:auto;bottom:-9px;transform:translateX(-50%) rotate(135deg)}}
|
||||
.group{display:grid;gap:var(--gap);grid-template-columns:1fr;margin-bottom:var(--sec)}
|
||||
/* wallet page block (7 Oct 2026, the redesign's wallet layout; the window slot takes the wallet redesign when it lands); tokens and components are in /site.css */
|
||||
.states{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-3);position:relative}
|
||||
.state-card{border:1px solid var(--line);border-radius:var(--r-row);padding:var(--s-4) var(--s-5);background:var(--graphite);display:flex;flex-direction:column;gap:8px;position:relative;min-width:0}
|
||||
.state-card .pill{align-self:flex-start;letter-spacing:.12em;text-transform:uppercase}
|
||||
.state-card .pill i{width:8px;height:8px;border-radius:50%;background:var(--ash);display:inline-block}
|
||||
.state-card.block .pill{border-color:var(--molten);color:var(--molten-text)}.state-card.block .pill i{background:var(--molten)}
|
||||
.state-card.final .pill{border-color:var(--ember);background:var(--ember);color:var(--ember-ink)}.state-card.final .pill i{background:var(--ember-ink)}
|
||||
.state-card .t{font:700 var(--t-h3)/1.25 var(--f-display);color:var(--bone)}
|
||||
.state-card p{font-size:14px;color:var(--ink-2);line-height:1.45;margin:0}
|
||||
.state-card::after{content:'';position:absolute;right:-9px;top:50%;width:14px;height:14px;border-top:2px solid var(--line-2);border-right:2px solid var(--line-2);transform:translateY(-50%) rotate(45deg);z-index:1}
|
||||
.state-card:last-child::after{display:none}
|
||||
@media (max-width:640px){.states{grid-template-columns:1fr}.state-card::after{right:auto;left:50%;top:auto;bottom:-9px;transform:translateX(-50%) rotate(135deg)}}
|
||||
.group{display:grid;gap:var(--s-5);grid-template-columns:1fr;margin-bottom:var(--sec)}
|
||||
@media (min-width:900px){.group{grid-template-columns:300px minmax(0,1fr);gap:48px}}
|
||||
.group:last-child{margin-bottom:0}
|
||||
.group .g-head{display:flex;flex-direction:column;gap:12px}
|
||||
.group .g-head p{font-size:15px;color:var(--ash)}
|
||||
.feats{display:grid;gap:var(--gap-tile);grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr))}
|
||||
.feat{background:var(--graphite);border:1px solid var(--line);border-radius:var(--tile-r);padding:var(--tile-pad);display:flex;flex-direction:column;gap:6px;min-width:0;transition:border-color .2s ease}
|
||||
.feat:hover{border-color:var(--line-2)}
|
||||
.feat b{font-weight:600;font-size:16px}
|
||||
.feat p{font-size:14px;color:var(--ash);line-height:1.45}
|
||||
.feat .src{font-family:var(--f-mono);font-size:11px;color:var(--ember);margin-top:4px}
|
||||
.feat.wide{grid-column:1/-1}
|
||||
td.num{font-variant-numeric:tabular-nums;white-space:nowrap}
|
||||
.ol{counter-reset:s;display:grid;gap:var(--gap-tile);grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));margin:0;padding:0;list-style:none}
|
||||
.ol li{counter-increment:s;background:var(--graphite);border:1px solid var(--line);border-radius:var(--tile-r);padding:var(--tile-pad);font-size:14px;color:var(--ink-2);line-height:1.45;min-width:0}
|
||||
.ol li::before{content:counter(s,decimal-leading-zero);display:block;font-family:var(--f-mono);font-size:11px;letter-spacing:.14em;color:var(--ember);margin-bottom:8px}
|
||||
.band{background:var(--ember);color:var(--ember-ink)}
|
||||
.band .wrap{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:24px;padding-block:56px}
|
||||
.band h2{font-weight:900;font-size:clamp(26px,3.5vw,36px)}
|
||||
.band p{font-size:16px;max-width:56ch}
|
||||
.btn.dark{background:var(--obsidian);color:var(--bone);border-color:var(--obsidian)}
|
||||
.btn.dark:hover{background:#222226;color:var(--bone)}
|
||||
.group .g-head p{font-size:15px;color:var(--ash);margin:0}
|
||||
.feats{display:grid;gap:var(--s-3);grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr))}
|
||||
.feat{background:var(--graphite);border:1px solid var(--line);border-radius:var(--r-row);padding:var(--s-4) var(--s-5);display:flex;flex-direction:column;gap:6px;min-width:0}
|
||||
.feat b{font-weight:600;font-size:16px;color:var(--bone)}
|
||||
.feat p{font-size:14px;color:var(--ink-2);line-height:1.45;margin:0}
|
||||
.ol{counter-reset:s;display:grid;gap:var(--s-3);grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));margin:0;padding:0;list-style:none}
|
||||
.ol li{counter-increment:s;background:var(--graphite);border:1px solid var(--line);border-radius:var(--r-row);padding:var(--s-4) var(--s-5);font-size:14px;color:var(--ink-2);line-height:1.45;min-width:0}
|
||||
.ol li::before{content:counter(s,decimal-leading-zero);display:block;font:400 11px/1 var(--f-mono);letter-spacing:.14em;color:var(--ember-text);margin-bottom:8px}
|
||||
.pt{font-size:15px;color:var(--ink-2);max-width:64ch}
|
||||
.wallet-hero .frame{margin:0}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
|
@ -169,20 +125,21 @@ td.num{font-variant-numeric:tabular-nums;white-space:nowrap}
|
|||
<!-- nav:end -->
|
||||
|
||||
<main id="main">
|
||||
<header class="hero" id="top">
|
||||
<section class="page-hero" id="top">
|
||||
<div class="wrap">
|
||||
<div class="hero-copy">
|
||||
<div class="eyebrow ember">Igneum Wallet · desktop</div>
|
||||
<h1>Your coins. Final means final.</h1>
|
||||
<p class="lead">A desktop wallet that holds the key the miner made for you, or one you make here from 24 words. It sends, receives and reads your history, and it verifies every finality certificate itself with the node's own code. No confirmation counts, no trusting the node.</p>
|
||||
<div class="cta">
|
||||
<a href="#get" class="btn primary">Download: public testnet</a>
|
||||
<a href="#finality" class="btn">How final works</a>
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>The wallet</span></div>
|
||||
<div class="wallet-hero">
|
||||
<div>
|
||||
<div class="eyebrow"><span class="line"></span>Igneum Wallet · desktop</div>
|
||||
<h1>Your coins. <span class="accent">Final means final.</span></h1>
|
||||
<p class="lead">A desktop wallet that holds the key the miner made for you, or one you make here from 24 words. It sends, receives and reads your history, and it checks every finality certificate itself with the node’s own code. No confirmation counts, no trusting the node.</p>
|
||||
<div class="actions">
|
||||
<a href="#get" class="btn primary">Download the wallet<svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3v12m-5-5 5 5 5-5M5 16v4h14v-4"/></svg></a>
|
||||
<a href="#finality" class="btn ghost">How final works</a>
|
||||
</div>
|
||||
<div class="tag-row" style="margin-top:var(--s-5)"><span class="pill">macOS first</span><span class="pill">Windows next</span><span class="pill">MetaMask export</span></div>
|
||||
</div>
|
||||
<div class="os"><span>macOS first</span><span>Windows next</span><span>MetaMask export</span></div>
|
||||
</div>
|
||||
<div class="shot reveal">
|
||||
<figure class="frame" style="margin:0">
|
||||
<figure class="frame glow reveal">
|
||||
<div class="bar"><i></i><i></i><i></i><b>Igneum Wallet</b></div>
|
||||
<img src="/img/wallet-home-dark.webp" width="2240" height="1560" class="img-dark" alt="The wallet window, Home: a balance of 31.6321 IGN with the devnet note that coins have no value, an example address with Copy, Send and Receive, the node line synced to the miner app's node and verified to a checkpoint, and the recent transfers with their state words" fetchpriority="high" decoding="async">
|
||||
<img src="/img/wallet-home-light.webp" width="2240" height="1560" class="img-light" alt="The wallet window, Home, in light mode: a balance of 31.6321 IGN, an example address with Copy, Send and Receive, the node line and the recent transfers" fetchpriority="high" decoding="async">
|
||||
|
|
@ -190,52 +147,50 @@ td.num{font-variant-numeric:tabular-nums;white-space:nowrap}
|
|||
</figure>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
</section>
|
||||
|
||||
<section id="finality">
|
||||
<section id="finality" class="sec">
|
||||
<div class="wrap">
|
||||
<div class="sec-head reveal">
|
||||
<h2>Three states, checked here</h2>
|
||||
<p>Every transfer in the history is pending, in a block, or final. The third one is the wallet's own verdict.</p>
|
||||
<div class="section-head reveal">
|
||||
<div><div class="eyebrow"><span class="line"></span>Pending, in a block, final</div><h2>Three states, checked here.</h2></div>
|
||||
<p>Every transfer in the history is pending, in a block, or final. The third one is the wallet’s own verdict.</p>
|
||||
</div>
|
||||
<div class="states reveal">
|
||||
<div class="state pending"><span class="pill"><i></i>pending</span><div class="t">Waiting for a block</div><p>Signed on this machine and handed to the node. Nothing has carried it yet.</p></div>
|
||||
<div class="state block"><span class="pill"><i></i>in a block</span><div class="t">Chain block 8</div><p>A block carries it and the chain's height passed it. It can still be reorganised until a checkpoint covers it.</p></div>
|
||||
<div class="state final"><span class="pill"><i></i>final · cp 5</span><div class="t">Under a verified checkpoint</div><p>Its block sits under a 30-second checkpoint whose certificate this wallet verified: the voter list, the aggregate BLS signature, two thirds of all weight.</p></div>
|
||||
<div class="state-card pending"><span class="pill"><i></i>pending</span><div class="t">Waiting for a block</div><p>Signed on this machine and handed to the node. Nothing has carried it yet.</p></div>
|
||||
<div class="state-card block"><span class="pill"><i></i>in a block</span><div class="t">Chain block 8</div><p>A block carries it and the chain’s height passed it. It can still be reorganised until a checkpoint covers it.</p></div>
|
||||
<div class="state-card final"><span class="pill"><i></i>final · cp 5</span><div class="t">Under a verified checkpoint</div><p>Its block sits under a 30-second checkpoint whose certificate this wallet verified: the voter list, the aggregate BLS signature, two thirds of all weight.</p></div>
|
||||
</div>
|
||||
<div class="shot reveal" style="margin-top:var(--gap);max-width:880px">
|
||||
<figure class="frame" style="margin:0">
|
||||
<div class="bar"><i></i><i></i><i></i><b>History</b></div>
|
||||
<img src="/img/wallet-history-dark.webp" width="2240" height="1560" class="img-dark" alt="The wallet's History page: every transfer with the node's word, pending, proven, executed, finalised under a checkpoint verified here, and one failed with the fee still paid" loading="lazy" decoding="async">
|
||||
<img src="/img/wallet-history-light.webp" width="2240" height="1560" class="img-light" alt="The wallet's History page in light mode: every transfer with the node's word, pending, proven, executed, finalised under a checkpoint verified here" loading="lazy" decoding="async">
|
||||
<figcaption>Every transfer with the node’s word: pending, proven, executed, finalised under a checkpoint this wallet verified. Igneum Wallet 0.1.5, rendered from its mock state with example keys, 7 October 2026.</figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
<div class="reveal" style="margin-top:var(--gap)">
|
||||
<figure class="frame reveal" style="margin:var(--s-5) 0 0;max-width:880px">
|
||||
<div class="bar"><i></i><i></i><i></i><b>History</b></div>
|
||||
<img src="/img/wallet-history-dark.webp" width="2240" height="1560" class="img-dark" alt="The wallet's History page: every transfer with the node's word, pending, proven, executed, finalised under a checkpoint verified here, and one failed with the fee still paid" loading="lazy" decoding="async">
|
||||
<img src="/img/wallet-history-light.webp" width="2240" height="1560" class="img-light" alt="The wallet's History page in light mode: every transfer with the node's word, pending, proven, executed, finalised under a checkpoint verified here" loading="lazy" decoding="async">
|
||||
<figcaption>Every transfer with the node’s word: pending, proven, executed, finalised under a checkpoint this wallet verified. Igneum Wallet 0.1.5, rendered from its mock state with example keys, 7 October 2026.</figcaption>
|
||||
</figure>
|
||||
<div class="reveal" style="margin-top:var(--s-5)">
|
||||
<div class="eyebrow" style="margin-bottom:12px">What the wallet checks before it says final</div>
|
||||
<ol class="ol">
|
||||
<li>The certificate as a block carried it: the finality section of the blocks after the checkpoint.</li>
|
||||
<li>The canonical voter list: every key above dust and not stripped, sorted by key hash, as many as the certificate says.</li>
|
||||
<li>The aggregate signature over the checkpoint, by the keys the bitmap names.</li>
|
||||
<li>The rule: signed weight at least two thirds of the active weight and of the total weight. Then the transfer's block must sit under the checkpoint on the chain.</li>
|
||||
<li>The rule: signed weight at least two thirds of the active weight and of the total weight. Then the transfer’s block must sit under the checkpoint on the chain.</li>
|
||||
</ol>
|
||||
<p class="pt" style="margin-top:16px">The same steps the browser verifier on the home page runs, with the node's own finality code compiled into the wallet. The node's own "locked" field is never read.</p>
|
||||
<p class="pt" style="margin-top:16px">The same steps the browser verifier on the home page runs, with the node’s own finality code compiled into the wallet. The node’s own "locked" field is never read.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="features">
|
||||
<section id="features" class="sec rule">
|
||||
<div class="wrap">
|
||||
<div class="sec-head reveal">
|
||||
<h2>Every feature, one line each</h2>
|
||||
<p>Version 1, built on the miner's bones: the same local server, the same signed update manifest, the same key code.</p>
|
||||
<div class="section-head reveal">
|
||||
<div><div class="eyebrow"><span class="line"></span>Version 1</div><h2>Every feature, one line each.</h2></div>
|
||||
<p>Built on the miner’s bones: the same local server, the same signed update manifest, the same key code.</p>
|
||||
</div>
|
||||
|
||||
<div class="group reveal" id="keys">
|
||||
<div class="g-head"><div class="eyebrow ember">01 · Your key</div><h3>Create or import, sealed on your disk</h3><p>The password is never written anywhere. The plaintext only ever exists in the engine's memory and is zeroed when the wallet locks.</p></div>
|
||||
<div class="g-head"><div class="eyebrow ember">01 · Your key</div><h3>Create or import, sealed on your disk</h3><p>The password is never written anywhere. The plaintext only ever exists in the engine’s memory and is zeroed when the wallet locks.</p></div>
|
||||
<div class="feats">
|
||||
<div class="feat"><b>Create: 24 words</b><p>256 bits of entropy from the operating system, as 24 English words. The wallet asks for three of them typed back before it goes on.</p></div>
|
||||
<div class="feat"><b>Import</b><p>Your 24 words, a raw private key, or the miner's own payout key file. One click brings the key the miner pays to into the wallet.</p></div>
|
||||
<div class="feat"><b>Import</b><p>Your 24 words, a raw private key, or the miner’s own payout key file. One click brings the key the miner pays to into the wallet.</p></div>
|
||||
<div class="feat"><b>Sealed with a password</b><p>Argon2id (64 MiB, 3 passes) turns the password into a key; XChaCha20-Poly1305 seals the secret under it. The vault is one file in your user folder.</p></div>
|
||||
<div class="feat"><b>The Ethereum path</b><p>Keys follow BIP-39 and BIP-44 at the Ethereum path, so the same 24 words open the same account in MetaMask.</p></div>
|
||||
</div>
|
||||
|
|
@ -248,25 +203,25 @@ td.num{font-variant-numeric:tabular-nums;white-space:nowrap}
|
|||
<div class="feat"><b>Send with the fee shown</b><p>An EIP-1559 transfer. The review shows the amount, the fee at most as base fee plus tip, and what leaves the wallet at most. The zero address and more than the balance are refused.</p></div>
|
||||
<div class="feat"><b>Receive by QR</b><p>The code is drawn on your machine as SVG. No image service, no call across the network.</p></div>
|
||||
<div class="feat"><b>History with rewards</b><p>Transfers in and out, block rewards from the execution records, one per blue block, and proving payouts when a block carries a proof record.</p></div>
|
||||
<div class="feat"><b>Finality per transaction</b><p>Pending, in a block, or final with the checkpoint index, verified here. <a href="#finality" style="color:var(--ember)">How it checks</a>.</p></div>
|
||||
<div class="feat"><b>Finality per transaction</b><p>Pending, in a block, or final with the checkpoint index, verified here. <a href="#finality">How it checks</a>.</p></div>
|
||||
<div class="feat"><b>Lock</b><p>One button locks the wallet and zeroes the key in memory. The password opens it again.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="group reveal" id="node">
|
||||
<div class="g-head"><div class="eyebrow ember">03 · Your node</div><h3>Reads the miner's node first</h3><p>When the miner is installed, the wallet uses its node on this machine. Nobody else sees your balance.</p></div>
|
||||
<div class="g-head"><div class="eyebrow ember">03 · Your node</div><h3>Reads the miner’s node first</h3><p>When the miner is installed, the wallet uses its node on this machine. Nobody else sees your balance.</p></div>
|
||||
<div class="feats">
|
||||
<div class="feat"><b>1 · The miner app's node</b><p>Found on this machine and used as it is. Nothing is started.</p></div>
|
||||
<div class="feat"><b>1 · The miner app’s node</b><p>Found on this machine and used as it is. Nothing is started.</p></div>
|
||||
<div class="feat"><b>2 · A public RPC</b><p>Balances, sending and history work without a local node. Finality verification needs a node, so transfers stay "in a block" until one is there, and the wallet says so.</p></div>
|
||||
<div class="feat"><b>3 · The bundled node</b><p>The wallet starts its own copy of the node on its own ports, no mining, and stops it when the wallet quits.</p></div>
|
||||
<div class="feat"><b>Updates, signed</b><p>The same Ed25519 key as the miner's manifest, checked an hour apart. The download is checked against the manifest's hash before Install now opens it.</p></div>
|
||||
<div class="feat"><b>Updates, signed</b><p>The same Ed25519 key as the miner’s manifest, checked an hour apart. The download is checked against the manifest’s hash before Install now opens it.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="group reveal" id="metamask">
|
||||
<div class="g-head"><div class="eyebrow ember">04 · MetaMask</div><h3>Export and add the network</h3><p>For people who already live in MetaMask. The key leaves this app only when you copy it.</p></div>
|
||||
<div class="feats">
|
||||
<div class="feat"><b>Add to MetaMask</b><p>One click adds the Igneum network with its chain id and RPC. Copy network settings puts the same values on the clipboard.</p></div>
|
||||
<div class="feat"><b>Add to MetaMask</b><p>One click adds the Igneum network with its chain id and RPC. Copy network settings puts the same values on the clipboard. <a href="/metamask">The same values, on this site</a>.</p></div>
|
||||
<div class="feat"><b>Export the key</b><p>Behind the password, behind a warning: a copied key can be stolen from the clipboard, a screenshot or a notes app. Paste it straight into MetaMask and clear the clipboard.</p></div>
|
||||
<div class="feat"><b>Desktop first</b><p>macOS now, as a disk image. The Windows host is written and untested. No browser extension and no phone app yet.</p></div>
|
||||
</div>
|
||||
|
|
@ -274,52 +229,51 @@ td.num{font-variant-numeric:tabular-nums;white-space:nowrap}
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section id="measured">
|
||||
<section id="measured" class="sec rule">
|
||||
<div class="wrap">
|
||||
<div class="sec-head reveal">
|
||||
<h2>The first run, timed</h2>
|
||||
<div class="section-head reveal">
|
||||
<div><div class="eyebrow"><span class="line"></span>Measured</div><h2>The first run, timed.</h2></div>
|
||||
<p>A private test network, 5 Oct 2026: one node, one CPU miner paying to wallet A, wallet A sending to wallet B. The log entry ships with the wallet.</p>
|
||||
</div>
|
||||
<div class="tbl reveal"><table>
|
||||
<thead><tr><th>Step</th><th>From the node's start</th><th>What was seen</th></tr></thead>
|
||||
<thead><tr><th>Step</th><th>From the node’s start</th><th>What was seen</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>Wallet A created, 24 words, three typed back</td><td class="num">0.3 s</td><td>an address</td></tr>
|
||||
<tr><td>Wallet B: a wrong word refused, then created</td><td class="num">0.4 to 0.5 s</td><td>"word 1 is not right"</td></tr>
|
||||
<tr><td>A's balance from block rewards</td><td class="num">3.5 s</td><td>10.14 IGN at block 4</td></tr>
|
||||
<tr><td>A’s balance from block rewards</td><td class="num">3.5 s</td><td>10.14 IGN at block 4</td></tr>
|
||||
<tr><td>Zero address, 999,999,999 IGN, a short address</td><td class="num">4.5 s</td><td>all three refused by the quote</td></tr>
|
||||
<tr><td>Quote for 1.5 IGN to B</td><td class="num">4.6 s</td><td>gas 25,380; base fee 1 gwei; tip 1 gwei; fee at most 0.00007614 IGN</td></tr>
|
||||
<tr><td>In a block</td><td class="num">5.6 s</td><td>chain block 8</td></tr>
|
||||
<tr><td>First locked checkpoint on the network</td><td class="num">about 170 s</td><td>index 5</td></tr>
|
||||
<tr><td>Final in wallet A</td><td class="num">175.2 s</td><td>under checkpoint 5, certificate verified by the wallet: 1 of 1 voters, 100% of total weight</td></tr>
|
||||
<tr><td>B's view of the same transfer</td><td class="num">175 s</td><td>1.5 IGN, final</td></tr>
|
||||
<tr><td>B’s view of the same transfer</td><td class="num">175 s</td><td>1.5 IGN, final</td></tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
<p class="pt reveal" style="margin-top:16px">Send to final: 170.6 s, all of it the network's first lock on a fresh chain. On the live devnet checkpoints lock every 30 seconds once the weight window is full. 13 unit tests cover the words, the path, the vault, the signing and the finality state machine.</p>
|
||||
<p class="pt reveal" style="margin-top:16px">Send to final: 170.6 s, all of it the network’s first lock on a fresh chain. On the live devnet checkpoints lock every 30 seconds once the weight window is full. 13 unit tests cover the words, the path, the vault, the signing and the finality state machine.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="get">
|
||||
<section id="get" class="sec rule">
|
||||
<div class="wrap">
|
||||
<div class="sec-head reveal">
|
||||
<h2>Get the wallet</h2>
|
||||
<p>Download only from this domain. Nobody from Igneum will ask for your seed. The file below is the one the wallet's signed manifest names, with its version and size.</p>
|
||||
<p data-testnet-notice style="margin-top:10px;font-weight:600;color:var(--molten)">Public testnet: not yet open; the devnet build is here for people who want to look.</p>
|
||||
<p data-devnet-notice style="margin-top:6px;font-weight:600;color:var(--molten)">Devnet: coins have no value and the chain may be reset.</p>
|
||||
<div class="section-head reveal">
|
||||
<div><div class="eyebrow"><span class="line"></span>Downloads</div><h2>Get the wallet.</h2></div>
|
||||
<p>Download only from this domain. Nobody from Igneum will ask for your seed. The file below is the one the wallet’s signed manifest names, with its version and size.</p>
|
||||
</div>
|
||||
<div class="cta reveal" style="align-items:center">
|
||||
<a data-dl="wallet-mac" href="https://dl.igneum.network/public/igneum-wallet-mac.dmg" class="btn primary"><svg viewBox="0 0 24 24" width="18" height="18" fill="currentColor" aria-hidden="true"><path d="M16.4 12.6c0-2.3 1.9-3.4 2-3.5-1.1-1.6-2.8-1.8-3.4-1.8-1.4-.1-2.8.8-3.5.8-.7 0-1.8-.8-3-.8-1.5 0-3 .9-3.8 2.3-1.6 2.8-.4 7 1.2 9.3.8 1.1 1.7 2.4 2.9 2.3 1.2 0 1.6-.7 3-.7s1.8.7 3 .7c1.3 0 2-1.1 2.8-2.3.9-1.3 1.2-2.6 1.3-2.6-.1 0-2.5-.9-2.5-3.7zM14.1 5.8c.6-.8 1.1-1.9.9-3-.9 0-2 .6-2.7 1.4-.6.7-1.1 1.8-1 2.9 1.1.1 2.1-.5 2.8-1.3z"/></svg>macOS <span data-dl-meta="wallet-mac" style="font-weight:400;opacity:.85">v0.1.5 · 20.1 MB</span></a>
|
||||
<span class="btn" aria-disabled="true" style="opacity:.7;cursor:default"><svg viewBox="0 0 24 24" width="18" height="18" fill="currentColor" aria-hidden="true"><path d="M3 5.5l7.5-1v7H3zM11.5 4.3L21 3v8.5h-9.5zM3 12.5h7.5v7L3 18.5zM11.5 12.5H21V21l-9.5-1.3z"/></svg>Windows <span style="font-weight:400;opacity:.85">next</span></span>
|
||||
<a href="#metamask" class="btn"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" aria-hidden="true"><path d="M4 4l5 3h6l5-3-1.5 7 1.5 5-3 4H7l-3-4 1.5-5z"/><path d="M9 13h2M13 13h2"/></svg>MetaMask</a>
|
||||
<a href="/metamask" class="btn"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" aria-hidden="true"><path d="M4 4l5 3h6l5-3-1.5 7 1.5 5-3 4H7l-3-4 1.5-5z"/><path d="M9 13h2M13 13h2"/></svg>Add to MetaMask</a>
|
||||
</div>
|
||||
<p class="pt reveal" style="margin-top:20px">The wallet reads this machine's node when the <a href="/miner" style="color:var(--ember)">miner</a> is installed. Without it, a public RPC for balances and sending, or the bundled node for everything.</p>
|
||||
<a href="/litepaper#miners" class="lp reveal">Read more in the litepaper</a>
|
||||
<p data-testnet-notice class="notice" style="margin-top:var(--s-4)">Public testnet: not yet open; the devnet build is here for people who want to look.</p>
|
||||
<p data-devnet-notice class="notice"><b>Devnet.</b> Coins have no value and the chain may be reset.</p>
|
||||
<p class="pt reveal" style="margin-top:var(--s-4)">The wallet reads this machine’s node when the <a href="/miner">miner</a> is installed. Without it, a public RPC for balances and sending, or the bundled node for everything. <a href="/litepaper#wallet">More in the litepaper</a>.</p>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<div class="band">
|
||||
<div class="wrap">
|
||||
<div style="display:flex;flex-direction:column;gap:8px">
|
||||
<div>
|
||||
<h2>The miner pays this wallet.</h2>
|
||||
<p>Install the miner, press Start, and the address it makes is the one this wallet imports with one click.</p>
|
||||
</div>
|
||||
|
|
@ -343,11 +297,12 @@ td.num{font-variant-numeric:tabular-nums;white-space:nowrap}
|
|||
<nav class="foot-col" aria-label="Read">
|
||||
<div class="eyebrow">Read</div>
|
||||
<a href="/litepaper">Litepaper</a>
|
||||
<a href="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/claims">What Igneum does not claim</a>
|
||||
<a href="/randomx">Igneum vs RandomX</a>
|
||||
<a href="/bench">Engineering log</a>
|
||||
<a href="/evidence">Evidence</a>
|
||||
<a href="/ledger">Ledger: every criticism</a>
|
||||
<a href="/provenance">Built on the shoulders</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Run">
|
||||
<div class="eyebrow">Run</div>
|
||||
|
|
@ -355,15 +310,15 @@ td.num{font-variant-numeric:tabular-nums;white-space:nowrap}
|
|||
<a href="/app">The app</a>
|
||||
<a href="/wallet">The wallet</a>
|
||||
<a href="/miners">GPU bench table</a>
|
||||
<a href="/miner#fee">The dev fee</a>
|
||||
<a href="/dev-fee">The dev fee</a>
|
||||
<a href="/faucet">Testnet faucet</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Follow">
|
||||
<div class="eyebrow">Follow</div>
|
||||
<a href="/live">Live devnet</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="/litepaper#roadmap">Journey</a>
|
||||
<a href="/metamask">Add to MetaMask</a>
|
||||
<a href="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="/miner#get">Downloads: devnet build</a>
|
||||
</nav>
|
||||
<nav class="foot-col" aria-label="Contact">
|
||||
|
|
@ -396,11 +351,6 @@ td.num{font-variant-numeric:tabular-nums;white-space:nowrap}
|
|||
})();
|
||||
</script>
|
||||
<!-- footer:end -->
|
||||
<script>
|
||||
(function(){
|
||||
var io=new IntersectionObserver(function(es){es.forEach(function(e){if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target);}});},{threshold:.12});
|
||||
document.querySelectorAll('.reveal').forEach(function(el){io.observe(el);});
|
||||
})();
|
||||
</script>
|
||||
<script src="/ui.js" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -82,6 +82,8 @@ tree_checks() {
|
|||
run "the Windows paths check's own self-test" bash tools/ci/windows-paths-check.sh --self-test
|
||||
run "the red watcher's own self-test (one line per run, posted once)" node tools/ci/red-watch.mjs --self-test
|
||||
run "faucet unit tests" node --test site/api/faucet.test.mjs
|
||||
run "redesign package data tests (the /api/live contract the pages read)" node tools/site-redesign/tests/data-tests.cjs
|
||||
run "the home hero's loop never idles in view, stops hidden, resumes without a jump" node tools/site-redesign/tests/hero-loop-test.cjs
|
||||
run "explorer, emission and public stats unit tests" node --test site/lib/explorer.test.mjs site/lib/emission.test.mjs site/api/public-stats.test.mjs
|
||||
run "ship tool self-test" node tools/ship-app.mjs --self-test
|
||||
run "relay unit tests" node --test relay/test/parse.test.mjs relay/test/auth.test.mjs relay/test/wake.test.mjs relay/test/ember.test.mjs
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ for (const l of lines) {
|
|||
else if (!cur.answer && s.startsWith('Answer:')) cur.answer = s.slice(7).trim();
|
||||
}
|
||||
|
||||
const SECTION = { M: 'Mining and chips', F: 'Finality and attacks', P: 'Proving and the zkEVM', E: 'Economics and the coin', G: 'Governance and the founders', C: 'Comparisons', L: 'Legal and regulatory', X: 'Launch and operations', D: 'Builders' };
|
||||
const SECTION = { M: 'Mining and chips', F: 'Finality and attacks', P: 'Proving and the zkEVM', E: 'Economics and the coin', G: 'Governance and the founders', C: 'Comparisons', L: 'Legal and regulatory', X: 'Launch and\u00a0operations', D: 'Builders' };
|
||||
|
||||
function bucket(status) {
|
||||
const s = status.toLowerCase();
|
||||
|
|
@ -149,53 +149,45 @@ const html = `<!doctype html>
|
|||
${HEAD}
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
/* ledger page block (7 Oct 2026, the redesign: the page hero, the count table, the entries as records); tokens, type and components are in /site.css */
|
||||
.entry p,.entry li,.entry .status{overflow-wrap:anywhere}.entry code{white-space:normal;overflow-wrap:anywhere}
|
||||
:root{--obsidian:#0C0C0E;--graphite:#16161A;--line:#2A2A30;--line-2:#3A3A42;--ember:#F2541B;--molten:#FFB35C;--bone:#F4F1EC;--ash:#9A9A9E;--ink-2:#C9C7C2;--max:1200px;--gutter:clamp(16px,4vw,32px);--sec:clamp(40px,6vw,72px)}
|
||||
*{box-sizing:border-box}
|
||||
body{margin:0;background:var(--obsidian);color:var(--bone);font-family:var(--f-sans);font-size:16px;line-height:1.55;-webkit-font-smoothing:antialiased;overflow-x:hidden}
|
||||
a{color:var(--ember);text-decoration:none}a:hover{color:var(--molten)}
|
||||
.wrap{max-width:var(--max);margin:0 auto;padding-inline:var(--gutter)}
|
||||
.eyebrow{font-family:var(--f-mono);font-size:12px;letter-spacing:.18em;text-transform:uppercase;color:var(--ash)}
|
||||
h1{font-family:var(--f-display);font-weight:900;font-size:clamp(30px,5vw,52px);line-height:1.08;margin:10px 0 18px}
|
||||
main h2{font-family:var(--f-display);font-weight:700;font-size:clamp(20px,2.6vw,28px);text-wrap:balance;margin:var(--sec) 0 16px;padding-top:8px;border-top:1px solid var(--line);scroll-margin-top:84px}
|
||||
main h2{font-size:var(--t-h3);margin:var(--sec) 0 16px;padding-top:8px;border-top:1px solid var(--line);scroll-margin-top:84px}
|
||||
h3{font-family:var(--f-sans);font-weight:600;font-size:17px;margin:0;flex:1 1 auto;min-width:0}
|
||||
.intro{font-size:17px;color:var(--ink-2);max-width:76ch;margin:0 0 24px}
|
||||
.tbl{overflow-x:auto;border:1px solid var(--line);border-radius:16px;background:var(--graphite);margin:0 0 20px}
|
||||
table{border-collapse:collapse;width:100%;font-size:15px;min-width:520px}
|
||||
th,td{padding:11px 14px;text-align:left;vertical-align:top;border-bottom:1px solid var(--line)}
|
||||
th{font-family:var(--f-mono);font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--ash);font-weight:500}
|
||||
tr:last-child td{border-bottom:0}
|
||||
td.num{font-family:var(--f-display);font-weight:700;font-size:22px;color:var(--ember);white-space:nowrap}
|
||||
.chip{background:none;border:1px solid var(--line-2);color:var(--bone);border-radius:999px;padding:6px 12px;font:inherit;font-size:14px;cursor:pointer}
|
||||
.chip:hover,.chip.on{border-color:var(--ember);color:var(--molten)}
|
||||
.counts td.num{font:700 22px/1.2 var(--f-display);color:var(--ember-text);white-space:nowrap}
|
||||
.chip{background:none;border:1px solid var(--line-2);color:var(--bone);border-radius:999px;padding:6px 12px;font:inherit;font-size:14px;cursor:pointer;min-height:36px}
|
||||
.chip:hover,.chip.on{border-color:var(--ember);color:var(--molten-text)}
|
||||
.toolbar{display:flex;flex-wrap:wrap;gap:8px 14px;align-items:center;margin:0 0 8px;font-size:14px;color:var(--ash)}
|
||||
.toolbar input{background:var(--graphite);border:1px solid var(--line-2);color:var(--bone);border-radius:10px;padding:8px 12px;font:inherit;font-size:14px;min-width:220px}
|
||||
.sections{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:14px;margin:0 0 8px}
|
||||
.entry{border:1px solid var(--line);border-radius:14px;background:var(--graphite);padding:16px 18px;margin:0 0 12px;scroll-margin-top:84px}
|
||||
.toolbar input{max-width:360px;min-width:220px}
|
||||
.entry{border:1px solid var(--line);border-radius:var(--r-row);background:var(--graphite);padding:16px 18px;margin:0 0 12px;scroll-margin-top:84px}
|
||||
.entry.hide{display:none}
|
||||
.head{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 12px}
|
||||
.id{font-family:var(--f-mono);font-size:13px;color:var(--molten);flex:0 0 auto}
|
||||
.entry .head{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 12px}
|
||||
.id{font-family:var(--f-mono);font-size:13px;color:var(--molten-text);flex:0 0 auto}
|
||||
.date{font-family:var(--f-mono);font-size:12px;color:var(--ash);flex:0 0 auto}
|
||||
blockquote{margin:10px 0;padding:10px 14px;border-left:3px solid var(--line-2);color:var(--ink-2);font-style:italic}
|
||||
.status{font-size:15px;color:var(--ink-2)}
|
||||
.status{font-size:15px;color:var(--ink-2);display:block;letter-spacing:0;text-transform:none;font-family:var(--f-sans)}
|
||||
.badge{display:inline-block;font-family:var(--f-mono);font-size:12px;letter-spacing:.06em;text-transform:uppercase;padding:3px 8px;border-radius:6px;border:1px solid var(--line-2);color:var(--bone);margin-right:6px;vertical-align:middle}
|
||||
.b-open{border-color:var(--ember);color:var(--ember)}.b-conceded{border-color:var(--molten);color:var(--molten)}.b-fixed-or-built{border-color:#5cb85c;color:#8fd48f}
|
||||
code{font-family:var(--f-mono);font-size:13px;color:var(--bone);background:#0C0C0E;padding:1px 5px;border-radius:5px}
|
||||
details{margin-top:8px;font-size:14px;color:var(--ash)}summary{cursor:pointer;color:var(--ash)}details p{margin:8px 0 0;color:var(--ink-2)}
|
||||
.foot{margin-top:var(--sec)}
|
||||
.b-open{border-color:var(--ember);color:var(--ember-text)}.b-conceded{border-color:var(--molten);color:var(--molten-text)}.b-fixed-or-built{border-color:#5cb85c;color:#3f9a3f}
|
||||
:root:not([data-theme="light"]) .b-fixed-or-built{color:#8fd48f}
|
||||
.entry details{margin-top:8px;font-size:14px;color:var(--ash);border:0}.entry details:last-of-type{border:0}.entry summary{padding:4px 0;color:var(--ash);font-weight:400}.entry details p{margin:8px 0 0;color:var(--ink-2)}
|
||||
.page-hero .lead{max-width:76ch}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- nav:start -->
|
||||
${NAV_LEDGER}
|
||||
<!-- nav:end -->
|
||||
<main id="main" class="wrap">
|
||||
<header style="padding-block:clamp(40px,6vw,72px) 8px">
|
||||
<div class="eyebrow">Ledger · ${entries.length} entries · regenerated from the repository</div>
|
||||
<h1>Every criticism, answered or conceded</h1>
|
||||
<p class="intro">${intro}</p>
|
||||
</header>
|
||||
<div class="tbl"><table>
|
||||
<main id="main">
|
||||
<section class="page-hero">
|
||||
<div class="wrap">
|
||||
<div class="breadcrumb"><a href="/">Igneum</a><span>/</span><span>The ledger</span></div>
|
||||
<div class="eyebrow"><span class="line"></span>Ledger · ${entries.length} entries · regenerated from the repository</div>
|
||||
<h1>Every criticism, answered or conceded.</h1>
|
||||
<p class="lead">${intro}</p>
|
||||
</div>
|
||||
</section>
|
||||
<div class="wrap">
|
||||
<div class="tbl counts"><table>
|
||||
<thead><tr><th>Count</th><th>Status</th><th>Meaning</th></tr></thead>
|
||||
<tbody>
|
||||
${countRows}
|
||||
|
|
@ -204,6 +196,7 @@ ${countRows}
|
|||
<div class="toolbar"><input type="search" id="q" placeholder="Search the ledger" aria-label="Search the ledger"><span id="shown"></span></div>
|
||||
${body}
|
||||
<p class="intro" style="margin-top:var(--sec)">Source: the project's criticism ledger, a file in the repository, rendered to this page at build time; the repository is published at the public testnet. A criticism that is not here, or that shows an entry is wrong, is added with credit if wanted: <a href="mailto:hello@igneum.network">hello@igneum.network</a> or <a href="https://github.com/igneum-network/spec/issues" rel="noopener">an issue on the specification repository</a>.</p>
|
||||
</div>
|
||||
</main>
|
||||
<!-- footer:start -->
|
||||
${FOOT}
|
||||
|
|
|
|||
9
tools/site-redesign/README.md
Normal file
9
tools/site-redesign/README.md
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
# The redesign package's feed adapter and its tests
|
||||
|
||||
`engine.js` is the full-site redesign package's observer adapter as delivered on 7 October 2026 (the `/api/live` contract
|
||||
validator, the read-only `Feed` with its backoff, and the package's explicit sample generator). The served site does not
|
||||
load it: the pages use `site/scenes/feed.js` and `site/live-dag.js` 2.0.2, which normalise the observer reply themselves,
|
||||
and no sample data is served anywhere. The file is kept here, unserved, so the package's contract tests keep running in
|
||||
the gate (`tools/ci/pre-push.sh`: "redesign package data tests") against the `/api/live` shape the site depends on.
|
||||
|
||||
node tools/site-redesign/tests/data-tests.cjs
|
||||
121
tools/site-redesign/engine.js
Normal file
121
tools/site-redesign/engine.js
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
/* Igneum site motion and data boundary. The demo generator is never used by real observer mode. */
|
||||
(function(root){
|
||||
'use strict';
|
||||
const TAU=Math.PI*2,clamp=(v,a,b)=>Math.max(a,Math.min(b,v)),MINE='a17f4c82';
|
||||
const clone=o=>JSON.parse(JSON.stringify(o));
|
||||
function random(seed){let a=seed>>>0;return()=>{a+=0x6D2B79F5;let t=a;t=Math.imul(t^t>>>15,t|1);t^=t+Math.imul(t^t>>>7,t|61);return((t^t>>>14)>>>0)/4294967296;};}
|
||||
function validateReply(raw){
|
||||
if(!raw||raw.ok!==true||!raw.state||typeof raw.state!=='object'||!Array.isArray(raw.blocks)||raw.blocks.length>6000)throw new Error('Unexpected observer response. Expected the existing /api/live contract.');
|
||||
if(raw.state.stale!=null&&typeof raw.state.stale!=='boolean')throw new Error('Invalid observer stale state.');
|
||||
if(raw.state.age_s!=null&&(!Number.isFinite(raw.state.age_s)||raw.state.age_s<0))throw new Error('Invalid observer age.');
|
||||
const seen=new Set();
|
||||
for(const b of raw.blocks){
|
||||
if(!b||typeof b.hash!=='string'||!/^[a-f0-9]{8,64}$/i.test(b.hash)||seen.has(b.hash))throw new Error('Invalid or repeated block hash in observer response.');
|
||||
seen.add(b.hash);
|
||||
for(const flag of ['chain','locked','final','proven'])if(b[flag]!=null&&typeof b[flag]!=='boolean')throw new Error('Invalid block flag: '+flag);
|
||||
if(b.color!=null&&!['blue','red','pending'].includes(b.color))throw new Error('Invalid inclusion colour.');
|
||||
for(const score of ['daa','blue_score'])if(b[score]!=null&&(!Number.isFinite(b[score])||b[score]<0))throw new Error('Invalid block score.');
|
||||
if(typeof b.ts!=='number'||!Number.isFinite(b.ts)||b.ts<1e12||b.ts>Date.now()+60000)throw new Error('Invalid block time in observer response.');
|
||||
if(!Array.isArray(b.parents)||b.parents.length>128||b.parents.some(p=>typeof p!=='string'||!/^[a-f0-9]{8,64}$/i.test(p)||p===b.hash))throw new Error('Invalid parent links in observer response.');
|
||||
if(b.miner!=null&&(typeof b.miner!=='string'||b.miner.length>128))throw new Error('Invalid miner identity.');
|
||||
if(b.shards!=null&&(!Array.isArray(b.shards)||b.shards.length>256||b.shards.some(s=>!s||!['planned','proving','verified','paid'].includes(s.state))))throw new Error('Invalid proof shard state.');
|
||||
}
|
||||
if(raw.finality?.checkpoints!=null&&(!Array.isArray(raw.finality.checkpoints)||raw.finality.checkpoints.length>500))throw new Error('Invalid checkpoint list.');
|
||||
for(const c of raw.finality?.checkpoints||[]){if(!c||!['locked','pending'].includes(c.state)||!Number.isFinite(c.blue_score)||c.blue_score<0)throw new Error('Invalid checkpoint record.');if(c.fraction_total!=null&&(!Number.isFinite(c.fraction_total)||c.fraction_total<0||c.fraction_total>1))throw new Error('Invalid checkpoint fraction.');}
|
||||
return clone(raw);
|
||||
}
|
||||
class Demo{
|
||||
constructor(now=Date.now(),seed=174){this.r=random(seed);this.blocks=[];this.cps=[];this.seq=247810;this.head=null;this.sides=[];this.events=[];this.keys=[MINE,'6b41e008','dd09a7f2','347ca21b','5de0c719','c378af06'];for(let t=now-145000;t<now-2000;t+=1850)this.create(t,false,false);this.update(now);this.events=[{type:'proof',title:'Sample proof shards verified',at:now-4000},{type:'mine',title:'Sample block joined the graph',at:now-8000},{type:'lock',title:'Sample checkpoint locked',at:now-13000}];}
|
||||
hash(){return Math.floor(this.r()*0xffffffff).toString(16).padStart(8,'0')+Math.floor(this.r()*0xffffffff).toString(16).padStart(8,'0');}
|
||||
create(now=Date.now(),own=false,announce=true){
|
||||
this.seq++;let red=!own&&this.seq%19===0,chain=own||(!red&&this.seq%4!==0);
|
||||
const b={hash:this.hash(),ts:now,blue_score:red?null:this.seq,daa:830000+this.seq,miner:own?MINE:this.keys[Math.floor(this.r()*this.keys.length)],parents:this.head?[this.head,...this.sides.slice(-1)]:[],chain,color:red?'red':'blue',locked:false,final:false,proven:false,shards:[{state:'planned'},{state:'planned'},{state:'planned'}],manual:0};
|
||||
this.blocks.push(b);if(chain){this.head=b.hash;this.sides=[];}else if(!red)this.sides.push(b.hash);
|
||||
if(chain&&this.seq%17===0)this.cps.push({index:Math.floor(this.seq/17),blue_score:b.blue_score,state:'pending',fraction_total:0,at:now,hash:b.hash});
|
||||
if(announce)this.event('mine',own?'Your sample block arrived':'A sample block arrived',now);return b;
|
||||
}
|
||||
event(type,title,at=Date.now()){this.events.unshift({type,title,at});this.events=this.events.slice(0,5);}
|
||||
update(now=Date.now()){
|
||||
const states=['planned','proving','verified','paid'];
|
||||
for(const b of this.blocks){b.shards.forEach((s,i)=>{const a=(now-b.ts)/1000-i*2.6;const n=b.color==='red'?0:Math.max(b.manual,a<3?0:a<10?1:a<22?2:3);s.state=states[n];});b.proven=b.shards.length>0&&b.shards.every(s=>s.state==='verified'||s.state==='paid');}
|
||||
// Explicit simulation fixtures only. Real mode never calls this method.
|
||||
for(const cp of this.cps){if(cp.forced||now-cp.at>17000){cp.state='locked';cp.fraction_total=.71;}else{cp.state='pending';cp.fraction_total=Math.min(.65,(now-cp.at)/17000*.65);}}
|
||||
const locked=this.cps.filter(c=>c.state==='locked'),max=locked.reduce((n,c)=>Math.max(n,c.blue_score),0),hashes=new Set(locked.map(c=>c.hash));
|
||||
for(const b of this.blocks){b.locked=hashes.has(b.hash);b.final=b.color==='blue'&&b.blue_score<=max;}
|
||||
this.blocks=this.blocks.filter(b=>b.ts>now-320000);this.cps=this.cps.slice(-12);
|
||||
}
|
||||
trigger(kind){let target=null,now=Date.now();if(kind==='mine'){target=this.create(now,true);}
|
||||
if(kind==='proof'){target=[...this.blocks].reverse().find(b=>b.miner===MINE&&!b.proven)||this.create(now,true,false);target.manual=2;this.event('proof','Your sample proof completed');}
|
||||
if(kind==='lock'){target=[...this.blocks].reverse().find(b=>b.chain&&now-b.ts>3500);if(target){this.cps.push({index:Math.floor(this.seq/17)+1,blue_score:target.blue_score,state:'locked',fraction_total:.71,at:now,hash:target.hash,forced:true});this.event('lock','A sample checkpoint locked');}}
|
||||
this.update();return target;
|
||||
}
|
||||
snapshot(now=Date.now()){this.update(now);return{ok:true,state:{stale:false,age_s:0,height:this.seq,now},blocks:this.blocks.map(({manual,...b})=>clone(b)),finality:{checkpoints:this.cps.map(({at,hash,forced,...c})=>clone(c))},proving:{},_demo:true};}
|
||||
}
|
||||
class Feed{
|
||||
constructor(config){this.config=config;this.mode='demo';this.windowSec=120;this.demo=new Demo();this.reply=this.demo.snapshot();this.status={state:'demo',message:'Design demo / simulated blocks'};this.listeners=new Set();this.timer=0;this.pollTimer=0;this.controller=null;this.generation=0;this.destroyed=false;this.failures=0;this.lastReceipt=0;this.paused=false;this.visibility=()=>{if(!document.hidden&&this.mode==='observer')this.poll(this.generation);};document.addEventListener('visibilitychange',this.visibility);}
|
||||
subscribe(fn){this.listeners.add(fn);fn(this.reply,this.status);this.start();return()=>{this.listeners.delete(fn);if(!this.listeners.size)this.stopTimers();};}
|
||||
emit(){for(const fn of this.listeners){try{fn(this.reply,this.status);}catch(e){console.error('Feed subscriber failed',e);}}}
|
||||
start(){if(this.timer||!this.listeners.size)return;this.timer=setInterval(()=>{if(document.hidden)return;if(this.mode==='demo'){let n=Date.now(),last=this.demo.blocks[this.demo.blocks.length-1];if(!last||n-last.ts>1850)this.demo.create(n);this.reply=this.demo.snapshot();this.emit();}else if(this.lastReceipt&&Date.now()-this.lastReceipt>12000&&this.status.state==='live'){this.status={state:'stale',message:'Observer connection is stale. Last received data is held.'};this.emit();}},1000);if(this.mode==='observer')this.poll(this.generation);}
|
||||
stopTimers(){clearInterval(this.timer);this.timer=0;clearTimeout(this.pollTimer);this.pollTimer=0;if(this.controller){this.controller.abort();this.controller=null;}}
|
||||
setMode(mode){if(!['demo','observer'].includes(mode))return;this.generation++;this.stopTimers();this.mode=mode;this.lastReceipt=0;this.failures=0;this.reply=null;this.status={state:'connecting',message:'Connecting to the read-only observer...'};if(mode==='demo'){this.demo=new Demo();this.reply=this.demo.snapshot();this.status={state:'demo',message:'Design demo / simulated blocks'};}this.emit();this.start();}
|
||||
setWindow(seconds){const next=Math.round(clamp(Number(seconds)||120,30,300));if(next===this.windowSec)return;this.windowSec=next;if(this.mode==='observer')this.poll(this.generation);}
|
||||
trigger(kind){if(this.mode!=='demo')return null;const b=this.demo.trigger(kind);this.reply=this.demo.snapshot();this.emit();return b;}
|
||||
async poll(g){if(this.controller||!this.listeners.size||this.mode!=='observer'||document.hidden||g!==this.generation)return;clearTimeout(this.pollTimer);const controller=new AbortController();this.controller=controller;const timeout=setTimeout(()=>controller.abort(),8000);
|
||||
try{const url=new URL(this.config.observerUrl,location.href);if(url.protocol!=='https:'&&!['localhost','127.0.0.1'].includes(url.hostname))throw new Error('The observer URL must use HTTPS.');if(url.username||url.password)throw new Error('Credentials must not be placed in the observer URL.');url.searchParams.set('window',String(this.windowSec));
|
||||
const r=await fetch(url,{method:'GET',cache:'no-store',credentials:'omit',mode:'cors',redirect:'error',headers:{Accept:'application/json'},signal:controller.signal});if(!r.ok)throw new Error('Observer returned HTTP '+r.status+'.');if(Number(r.headers.get('content-length')||0)>2e6)throw new Error('Observer reply is too large.');const text=await r.text();if(text.length>2e6)throw new Error('Observer reply is too large.');const reply=validateReply(JSON.parse(text));if(g!==this.generation)return;this.lastReceipt=Date.now();this.failures=0;this.reply=reply;const stale=reply.state.stale===true||(typeof reply.state.age_s==='number'&&reply.state.age_s>30);this.status={state:stale?'stale':'live',message:stale?'Observer says its data is stale. No synthetic activity is substituted.':'Read-only observer connected. Data is reported by one observer, not independently verified.'};this.emit();
|
||||
}catch(e){if(g!==this.generation)return;this.failures++;this.status={state:'failed',message:(e.name==='AbortError'?'Observer request timed out.':e.message)+' No demo fallback is used. Check connectivity and CORS.'};this.emit();}
|
||||
finally{clearTimeout(timeout);if(this.controller===controller)this.controller=null;if(g===this.generation&&this.mode==='observer'&&this.listeners.size)this.pollTimer=setTimeout(()=>this.poll(g),Math.min(16000,Math.max(2000,this.config.observerIntervalMs||2000)*2**Math.min(this.failures,3)));}
|
||||
}
|
||||
destroy(){this.destroyed=true;this.generation++;this.stopTimers();this.listeners.clear();document.removeEventListener('visibilitychange',this.visibility);}
|
||||
}
|
||||
class HardwareScene{
|
||||
constructor(canvas){this.canvas=canvas;this.ctx=canvas.getContext('2d');this.stage=0;this.lastStage=-1;this.motion=true;this.disposed=false;this.inView=true;this.raf=0;this.stageAt=performance.now();this.last=0;this.w=0;this.h=0;this.reduced=matchMedia('(prefers-reduced-motion: reduce)');this.resize=()=>{this.w=canvas.clientWidth;this.h=canvas.clientHeight;this.dpr=Math.min(devicePixelRatio||1,2);canvas.width=Math.round(this.w*this.dpr);canvas.height=Math.round(this.h*this.dpr);this.paint(performance.now());};this.ro=new ResizeObserver(this.resize);this.ro.observe(canvas);this.io=new IntersectionObserver(e=>{this.inView=e[0].isIntersecting;if(this.inView)this.kick();else this.stop();});this.io.observe(canvas);this.mo=new MutationObserver(()=>this.paint(performance.now()));this.mo.observe(document.documentElement,{attributes:true,attributeFilter:['data-theme']});this.vis=()=>document.hidden?this.stop():this.kick();document.addEventListener('visibilitychange',this.vis);this.reduction=()=>{this.stop();this.paint(performance.now());this.kick();};this.reduced.addEventListener('change',this.reduction);this.resize();this.kick();}
|
||||
setStage(n){this.lastStage=this.stage;this.stage=n;this.stageAt=performance.now();this.kick();this.paint(this.stageAt);}
|
||||
setMotion(v){this.motion=v;this.stop();this.paint(performance.now());if(v)this.kick();}
|
||||
stop(){cancelAnimationFrame(this.raf);this.raf=0;}
|
||||
kick(){if(this.raf||this.disposed||document.hidden||!this.inView||this.reduced.matches||!this.motion)return;const frame=t=>{this.raf=0;if(this.disposed||document.hidden||!this.inView)return;if(t-this.last>32){this.paint(t);this.last=t;}if(t-this.stageAt<1000)this.raf=requestAnimationFrame(frame);};this.raf=requestAnimationFrame(frame);}
|
||||
paint(t){if(!this.w||!this.h||this.disposed)return;const c=this.ctx,w=this.w,h=this.h,d=this.dpr;c.setTransform(d,0,0,d,0,0);c.clearRect(0,0,w,h);const light=document.documentElement.dataset.theme==='light',cs=getComputedStyle(document.documentElement),ember=cs.getPropertyValue('--ember').trim(),gold=cs.getPropertyValue('--molten').trim(),bone=cs.getPropertyValue('--bone').trim(),ash=cs.getPropertyValue('--ash').trim(),line=cs.getPropertyValue('--line').trim();const s=Math.min(w/590,h/490),cx=w*.51,cy=h*.52,age=clamp((t-this.stageAt)/950,0,1),moving=this.motion&&!this.reduced.matches,ease=moving?1-Math.pow(1-age,3):1,pulse=moving?Math.sin(age*Math.PI):0;const p=(x,y,z=0)=>({x:cx+(x*.91-y*.86)*s,y:cy+(x*.42+y*.43-z)*s});
|
||||
const poly=(ps,fill,stroke,lw=1)=>{c.beginPath();ps.forEach((a,i)=>i?c.lineTo(a.x,a.y):c.moveTo(a.x,a.y));c.closePath();if(fill){c.fillStyle=fill;c.fill();}if(stroke){c.strokeStyle=stroke;c.lineWidth=lw;c.stroke();}};
|
||||
const stroke=(ps,col,lw=1)=>{c.beginPath();ps.forEach((a,i)=>i?c.lineTo(a.x,a.y):c.moveTo(a.x,a.y));c.strokeStyle=col;c.lineWidth=lw;c.stroke();};
|
||||
const box=(x,y,z,ww,hh,dep,top,edge)=>{poly([p(x,y+hh,z),p(x+ww,y+hh,z),p(x+ww,y+hh,z-dep),p(x,y+hh,z-dep)],light?'#e8e2d9':'#0d0d10',edge);poly([p(x+ww,y,z),p(x+ww,y+hh,z),p(x+ww,y+hh,z-dep),p(x+ww,y,z-dep)],light?'#d6d0c9':'#17171b',edge);poly([p(x,y,z),p(x+ww,y,z),p(x+ww,y+hh,z),p(x,y+hh,z)],top,edge);};
|
||||
// Quiet engineering grid under the hardware. It stays still between explained events.
|
||||
for(let j=-6;j<=6;j++){stroke([p(-245,j*29,-60),p(245,j*29,-60)],light?'#d9d2c666':'#35313955',.7);stroke([p(j*40,-155,-60),p(j*40,155,-60)],light?'#d9d2c666':'#35313955',.7);}
|
||||
let g=c.createRadialGradient(cx,cy+15*s,5,cx,cy+15*s,235*s);g.addColorStop(0,light?'#F2541B16':'#F2541B14');g.addColorStop(1,'#F2541B00');c.fillStyle=g;c.fillRect(0,0,w,h);
|
||||
// PCB carrier and routed connections.
|
||||
box(-223,-112,-40,446,224,8,light?'#ede8e0':'#101013',light?'#c8c1b6':'#383139');
|
||||
const connections=[[-205,-93,-173,-93,-173,-68],[-210,77,-174,77,-174,49],[80,91,80,115,190,115],[184,-74,214,-74,214,-28],[-105,97,-105,125,-157,125],[144,71,201,71,201,107]];
|
||||
for(let i=0;i<connections.length;i++){const a=connections[i],pts=[p(a[0],a[1],-38),p(a[2],a[3],-38),p(a[4],a[5],-38)];stroke(pts,i%2?light?'#af795a77':'#a5613655':light?'#be59208c':'#f2541b66',1.1);const q=pts[2];c.fillStyle=i%2?gold:ember;c.fillRect(q.x-2,q.y-2,4,4);if(pulse>.02){const u=age,seg=u<.5?0:1,v=(u%0.5)*2,pt={x:pts[seg].x+(pts[seg+1].x-pts[seg].x)*v,y:pts[seg].y+(pts[seg+1].y-pts[seg].y)*v};c.beginPath();c.arc(pt.x,pt.y,2.2,0,TAU);c.fillStyle=gold;c.fill();}}
|
||||
for(const [x,y] of [[-200,-85],[181,-85],[-200,89],[181,89]]){box(x,y,-36,16,10,3,light?'#e2dbd0':'#24232a',line);}
|
||||
const lift=this.stage===1?15*ease:this.stage===2?8:0,top=18-lift;
|
||||
// Finned aluminium backplate and GPU shroud. No brand mark is altered or illuminated.
|
||||
box(-187,-61,top-18,374,122,17,light?'#b7b0a7':'#19191f',light?'#888279':'#444149');
|
||||
for(let x=-180;x<180;x+=7)stroke([p(x,61,top-20),p(x,61,top-32)],light?'#6b655b':'#48434a',1);
|
||||
box(-197,-67,top,394,134,17,light?'#d0c9bf':'#222127',light?'#898176':'#62504b');
|
||||
stroke([p(-196,68,top-6),p(198,68,top-6)],ember,2.5);
|
||||
const plane=(z,fn)=>{c.save();c.transform(.91*s,.42*s,-.86*s,.43*s,cx,cy-z*s);fn();c.restore();};
|
||||
plane(top+1,()=>{
|
||||
c.strokeStyle=light?'#827a71':'#555158';c.lineWidth=1;
|
||||
for(let i=0;i<12;i++){const x=-178+i*31;c.beginPath();c.moveTo(x,-62);c.lineTo(x+24,-62);c.stroke();}
|
||||
for(const fx of [-112,112]){c.beginPath();c.arc(fx,0,54,0,TAU);c.fillStyle=light?'#a29b91':'#101015';c.fill();c.strokeStyle=light?'#6c655b':'#4e464b';c.stroke();c.beginPath();c.arc(fx,0,48,0,TAU);c.strokeStyle=light?'#756d63':'#353039';c.stroke();const rot=this.stage===0&&moving?ease*.9:0;
|
||||
for(let i=0;i<11;i++){c.save();c.translate(fx,0);c.rotate(i*TAU/11+rot);c.beginPath();c.moveTo(10,-4);c.bezierCurveTo(22,-21,39,-23,45,-8);c.quadraticCurveTo(25,-9,15,6);c.closePath();const g=c.createLinearGradient(10,0,45,-15);g.addColorStop(0,light?'#736c62':'#474149');g.addColorStop(1,light?'#c0b8ac':'#25212a');c.fillStyle=g;c.fill();c.strokeStyle=light?'#8d8478':'#51454a';c.lineWidth=.6;c.stroke();c.restore();}
|
||||
c.beginPath();c.arc(fx,0,13,0,TAU);c.fillStyle=light?'#ddd4c8':'#2d272e';c.fill();c.strokeStyle=ember;c.lineWidth=1.4;c.stroke();c.beginPath();c.arc(fx,0,3,0,TAU);c.fillStyle=ember;c.fill();
|
||||
}
|
||||
c.fillStyle=light?'#a99d8e':'#17161b';c.fillRect(-40,-45,80,90);c.strokeStyle=light?'#9a8268':'#8c4b2d';c.strokeRect(-40,-45,80,90);c.fillStyle=ember;c.fillRect(-27,-30,54,60);c.fillStyle=light?'#f5e6d5':'#261610';c.fillRect(-23,-26,46,52);c.strokeStyle=gold;c.strokeRect(-19,-22,38,44);for(let a=-30;a<=30;a+=8){c.fillStyle=gold;c.fillRect(-44,a,4,2);c.fillRect(40,a,4,2);}c.fillStyle=gold;c.font='500 7px IBM Plex Mono,monospace';c.textAlign='center';c.fillText('IGNEUM',0,-4);c.font='6px IBM Plex Mono,monospace';c.fillText('COMPUTE',0,9);
|
||||
c.font='500 7px IBM Plex Mono,monospace';c.textAlign='left';c.fillStyle=light?'#3f362b':'#bcaaa0';c.fillText('EMBER / GPU WORKER',-176,60);
|
||||
});
|
||||
for(const [x,y] of [[-184,-56],[183,-56],[-184,54],[183,54]])plane(top+1,()=>{c.beginPath();c.arc(x,y,2,0,TAU);c.fillStyle=light?'#6a6057':'#878087';c.fill();});
|
||||
// The sample block lifts from compute; proof shards are explicit illustrative stages.
|
||||
const z=this.stage===0?105:135,px=50,py=-23,blockS=this.stage===2?33:28;
|
||||
for(let i=0;i<3;i++)box(px-blockS,py-blockS,z+i*9,blockS*2,blockS*2,6,light?'#efe4d7':'#221a19',i===2?ember:light?'#b2825d':'#8d4428');
|
||||
plane(z+20,()=>{c.strokeStyle=gold;c.lineWidth=1;c.strokeRect(px-17,py-17,34,34);c.fillStyle=light?'#bc6535':'#f2541b33';c.fillRect(px-13,py-13,26,26);if(this.stage>0){c.strokeStyle=gold;c.lineWidth=2;c.beginPath();c.moveTo(px-7,py);c.lineTo(px-2,py+5);c.lineTo(px+9,py-7);c.stroke();}else{c.fillStyle=ember;c.fillRect(px-2,py-2,4,4);}});
|
||||
const below=p(px,py,top+7),above=p(px,py,z-10);stroke([below,above],light?'#b7734580':'#f2541b60',1);c.setLineDash([3,5]);stroke([p(-112,0,top+8),p(-112,0,top+39),p(px,py,z-10)],light?'#b78b6866':'#d18e4750',.8);stroke([p(112,0,top+8),p(112,0,top+36),p(px,py,z-10)],light?'#b78b6866':'#d18e4750',.8);c.setLineDash([]);
|
||||
if(this.stage>=1){for(let i=0;i<4;i++){const angle=i*TAU/4+.25,x=px+Math.cos(angle)*85,y=py+Math.sin(angle)*85,zz=z+12;stroke([p(x,y,zz),p(px,py,z+10)],light?'#b6774799':'#b8773e80',1);box(x-9,y-9,zz,18,18,5,this.stage===2?light?'#deba8e':'#75502c':light?'#ddab89':'#5a2d1d',gold);}}
|
||||
if(this.stage===2){const z0=z-8,z1=z+50,v=42;for(const zz of [z0,z1]){poly([p(px-v,py-v,zz),p(px+v,py-v,zz),p(px+v,py+v,zz),p(px-v,py+v,zz)],null,gold,.9);}for(const [x,y] of [[-v,-v],[v,-v],[v,v],[-v,v]])stroke([p(px+x,py+y,z0),p(px+x,py+y,z1)],gold,.9);const a=p(px,py,z1+12);c.strokeStyle=gold;c.lineWidth=1.2;c.strokeRect(a.x-5*s,a.y,10*s,8*s);c.beginPath();c.arc(a.x,a.y,3.4*s,Math.PI,0);c.stroke();}
|
||||
// Short, event-bound ripple. It rests after a single signal.
|
||||
if(pulse>.02){const pos=p(px,py,z+18);c.save();c.translate(pos.x,pos.y);c.scale(1,.5);c.beginPath();c.arc(0,0,(50+age*65)*s,0,TAU);c.strokeStyle=light?'#b86b3555':'#ffb35c66';c.globalAlpha=(1-age)*.8;c.lineWidth=1;c.stroke();c.restore();}
|
||||
const q=p(-203,90,-34);c.strokeStyle=line;c.lineWidth=1;c.beginPath();c.moveTo(q.x,q.y);c.lineTo(q.x-24*s,q.y+20*s);c.lineTo(q.x-52*s,q.y+20*s);c.stroke();
|
||||
}
|
||||
destroy(){this.disposed=true;this.stop();this.ro.disconnect();this.io.disconnect();this.mo.disconnect();document.removeEventListener('visibilitychange',this.vis);this.reduced.removeEventListener('change',this.reduction);}
|
||||
}
|
||||
root.IgneumSiteEngine={Demo,Feed,HardwareScene,validateReply,MINE};
|
||||
})(typeof window!=='undefined'?window:globalThis);
|
||||
36
tools/site-redesign/tests/data-tests.cjs
Normal file
36
tools/site-redesign/tests/data-tests.cjs
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
/* Pure unit tests: no network or browser dependencies. */
|
||||
const fs=require('node:fs'),vm=require('node:vm'),assert=require('node:assert/strict');
|
||||
const path=require('node:path');
|
||||
vm.runInThisContext(fs.readFileSync(path.join(__dirname,'../engine.js'),'utf8'));
|
||||
const {Demo,validateReply,MINE}=IgneumSiteEngine;const results=[];
|
||||
function check(name,fn){try{fn();results.push({name,pass:true});}catch(e){results.push({name,pass:false,error:e.message});}}
|
||||
const now=Date.now(),demo=new Demo(now),reply=demo.snapshot(now);
|
||||
const edit=fn=>{const r=JSON.parse(JSON.stringify(reply));fn(r);return r;};
|
||||
check('Seeded demo obeys observer contract',()=>assert.equal(validateReply(reply).ok,true));
|
||||
check('All hashes unique',()=>assert.equal(new Set(reply.blocks.map(b=>b.hash)).size,reply.blocks.length));
|
||||
check('Parent links are never self-links',()=>assert(reply.blocks.every(b=>!b.parents.includes(b.hash))));
|
||||
check('Parents precede children',()=>{const byHash=new Map(reply.blocks.map(b=>[b.hash,b]));assert(reply.blocks.every(b=>b.parents.every(h=>!byHash.has(h)||byHash.get(h).ts<=b.ts)));});
|
||||
check('Included, excluded, selected remain separate',()=>{assert(reply.blocks.some(b=>b.color==='red'));assert(reply.blocks.some(b=>b.color==='blue'&&!b.chain));});
|
||||
check('Proving completion does not implicitly become final',()=>{const x=demo.trigger('mine');demo.trigger('proof');assert(x.proven);assert(!x.final);assert(!x.locked);});
|
||||
check('Own block uses the tracked demo vote key',()=>assert.equal(demo.trigger('mine').miner,MINE));
|
||||
check('Checkpoint effect needs an explicit simulated checkpoint',()=>{const x=demo.trigger('lock');assert(demo.snapshot().finality.checkpoints.some(c=>c.state==='locked'&&c.blue_score===x.blue_score));});
|
||||
check('Validation does not age or promote observer proof',()=>{const r=edit(r=>{r.blocks[0].ts=now-1e8;r.blocks[0].shards=[{state:'planned'}];r.blocks[0].proven=false;r.blocks[0].final=false;r.blocks[0].locked=false;});const out=validateReply(r);assert.equal(out.blocks[0].shards[0].state,'planned');assert.equal(out.blocks[0].final,false);});
|
||||
check('Observer false finality remains false',()=>assert.equal(validateReply(edit(r=>{r.blocks[0].chain=true;r.blocks[0].proven=true;r.blocks[0].final=false;})).blocks[0].final,false));
|
||||
check('Payload is defensively cloned',()=>{const v=validateReply(reply);v.blocks[0].hash='changed';assert.notEqual(reply.blocks[0].hash,'changed');});
|
||||
function reject(name, mutate) { check(name, function(){ assert.throws(function(){validateReply(edit(mutate));});}); }
|
||||
reject('HTML hashes rejected', r => { r.blocks[0].hash='<img onerror=1>'; });
|
||||
reject('Repeated hashes rejected', r => { r.blocks.push(r.blocks[0]); });
|
||||
reject('Invalid parent rejected', r => { r.blocks[0].parents=['javascript:bad']; });
|
||||
reject('Self parent rejected', r => { r.blocks[0].parents=[r.blocks[0].hash]; });
|
||||
reject('Future time rejected', r => { r.blocks[0].ts=now+1e8; });
|
||||
reject('Seconds are not silently read as milliseconds', r => { r.blocks[0].ts=now/1000; });
|
||||
reject('Unknown proof state rejected', r => { r.blocks[0].shards=[{state:'jackpot'}]; });
|
||||
reject('String proof flag rejected', r => { r.blocks[0].proven='true'; });
|
||||
reject('String finality flag rejected', r => { r.blocks[0].final='false'; });
|
||||
reject('Invalid inclusion rejected', r => { r.blocks[0].color='winning'; });
|
||||
reject('Negative observer age rejected', r => { r.state.age_s=-1; });
|
||||
reject('Invalid checkpoint fraction rejected', r => { r.finality.checkpoints[0].fraction_total=2; });
|
||||
check('Empty observer window accepted',()=>assert.equal(validateReply({ok:true,state:{stale:false,age_s:0},blocks:[]}).blocks.length,0));
|
||||
check('Demo retained history is bounded',()=>{for(let i=0;i<1000;i++)demo.create(now+i*2000,false,false);demo.update(now+2000000);assert(demo.blocks.length<=161);assert(demo.cps.length<=12);});
|
||||
console.log(JSON.stringify({passed:results.filter(x=>x.pass).length,total:results.length,results},null,2));
|
||||
if(results.some(x=>!x.pass))process.exitCode=1;
|
||||
55
tools/site-redesign/tests/hero-loop-test.cjs
Normal file
55
tools/site-redesign/tests/hero-loop-test.cjs
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
/* The home hero's loop never idles while in view (the owner's call, 7 October 2026: "can we make the animations here not
|
||||
* pause like they do now? looks like a bug"). Loads site/hero-scene.js in a stub window with a fake requestAnimationFrame
|
||||
* and a 2D context that accepts every call, then checks: a frame is scheduled after every frame for as long as the hero
|
||||
* is in view; a hidden tab stops the loop and a visible one restarts it; the scene clock does not jump across the pause;
|
||||
* the stage advances on its own and on a button; reduced motion stops it. Known-finished and known-failed cases both run. */
|
||||
const fs = require('node:fs'), vm = require('node:vm'), assert = require('node:assert/strict'), path = require('node:path');
|
||||
const src = fs.readFileSync(path.join(__dirname, '..', '..', '..', 'site', 'hero-scene.js'), 'utf8');
|
||||
function world(opts) {
|
||||
opts = opts || {};
|
||||
const listeners = {}, docListeners = {};
|
||||
let rafQueue = [], rafId = 0, hidden = false, reduced = !!opts.reduced;
|
||||
const ctx = new Proxy({}, { get: (t, k) => k === 'canvas' ? canvas : (() => (k === 'createRadialGradient' || k === 'createLinearGradient' ? { addColorStop() {} } : undefined)), set: () => true });
|
||||
const canvas = { clientWidth: 600, clientHeight: 500, width: 0, height: 0, getContext: () => ctx, toDataURL: () => '' };
|
||||
const el = () => ({ textContent: '', setAttribute() {}, getAttribute: () => '0', addEventListener() {} });
|
||||
const document = {
|
||||
get hidden() { return hidden; }, documentElement: { getAttribute: () => null, style: {} },
|
||||
createElement: () => ({ width: 0, height: 0, getContext: () => ctx }), addEventListener(n, f) { (docListeners[n] = docListeners[n] || []).push(f); }, removeEventListener() {},
|
||||
};
|
||||
const window = {
|
||||
document, devicePixelRatio: 1, requestAnimationFrame: cb => { rafQueue.push(cb); return ++rafId; }, cancelAnimationFrame: id => { rafQueue = rafQueue.filter(() => false); },
|
||||
matchMedia: q => ({ matches: /reduced-motion/.test(q) ? reduced : false, addEventListener() {}, removeEventListener() {} }),
|
||||
ResizeObserver: class { constructor(f) { this.f = f; } observe() { this.f(); } disconnect() {} },
|
||||
IntersectionObserver: class { constructor(f) { window._io = f; } observe() {} disconnect() {} },
|
||||
MutationObserver: class { observe() {} disconnect() {} },
|
||||
addEventListener(n, f) { (listeners[n] = listeners[n] || []).push(f); },
|
||||
};
|
||||
const sandbox = { window, document, getComputedStyle: () => ({ getPropertyValue: () => '' }), performance: { now: () => 0 }, console };
|
||||
for (const k of ['requestAnimationFrame', 'cancelAnimationFrame', 'matchMedia', 'ResizeObserver', 'IntersectionObserver', 'MutationObserver', 'devicePixelRatio']) sandbox[k] = window[k];
|
||||
sandbox.requestAnimationFrame = window.requestAnimationFrame; sandbox.cancelAnimationFrame = window.cancelAnimationFrame;
|
||||
vm.createContext(sandbox); vm.runInContext(src, sandbox);
|
||||
const steps = [0, 1, 2].map(i => { const b = el(); b.getAttribute = () => String(i); return b; });
|
||||
const status = el();
|
||||
const scene = sandbox.window.IgneumHero.mount(canvas, { steps, status });
|
||||
let t = 0;
|
||||
function tick(ms) { t += ms; const q = rafQueue; rafQueue = []; q.forEach(cb => cb(t)); return q.length; }
|
||||
function hide(v) { hidden = v; (docListeners.visibilitychange || []).forEach(f => f()); }
|
||||
return { scene, tick, hide, status, pending: () => rafQueue.length, inView: v => window._io([{ isIntersecting: v }]), steps };
|
||||
}
|
||||
const results = [];
|
||||
function check(name, fn) { try { fn(); results.push({ name, pass: true }); } catch (e) { results.push({ name, pass: false, error: e.message }); } }
|
||||
check('a frame is scheduled after every frame for 600 frames in view (never idles)', () => { const w = world(); for (let i = 0; i < 600; i++) assert.equal(w.tick(16), 1, 'frame ' + i); assert.equal(w.pending(), 1); });
|
||||
check('the stage advances on its own inside the first 10 s and keeps cycling', () => { const w = world(); const seen = new Set(); for (let i = 0; i < 1500; i++) { w.tick(16); seen.add(w.status.textContent); } seen.delete(''); assert.equal(seen.size, 3, [...seen].join('|')); });
|
||||
check('a button advances the beat and the loop keeps running', () => { const w = world(); w.tick(16); w.scene.setStage(2); assert.equal(w.status.textContent, '03 / Locking'); assert.equal(w.tick(16), 1); assert.equal(w.pending(), 1); });
|
||||
check('a hidden tab stops the loop, a visible one restarts it without a clock jump', () => {
|
||||
const w = world(); for (let i = 0; i < 100; i++) w.tick(16);
|
||||
w.hide(true); w.tick(16); assert.equal(w.pending(), 0, 'frames while hidden');
|
||||
w.hide(false); assert.equal(w.pending(), 1, 'no restart on visible');
|
||||
// the clock advances by frame delta: 50 ms capped, so a 10 s wall gap arrives as one short step and the stage does not skip
|
||||
const before = w.status.textContent; w.tick(10000); w.tick(16); assert.equal(w.status.textContent, before, 'the stage jumped across the pause');
|
||||
});
|
||||
check('scrolled out of view stops the loop, back in view restarts it', () => { const w = world(); w.tick(16); w.inView(false); w.tick(16); assert.equal(w.pending(), 0); w.inView(true); assert.equal(w.pending(), 1); });
|
||||
check('reduced motion never schedules a frame', () => { const w = world({ reduced: true }); assert.equal(w.pending(), 0); w.tick(16); assert.equal(w.pending(), 0); });
|
||||
check('known failed case: a loop that idles is caught', () => { const w = world(); w.inView(false); assert.throws(() => { for (let i = 0; i < 5; i++) assert.equal(w.tick(16), 1); }); });
|
||||
console.log(JSON.stringify({ passed: results.filter(r => r.pass).length, total: results.length, results }, null, 2));
|
||||
if (results.some(r => !r.pass)) process.exitCode = 1;
|
||||
Loading…
Reference in a new issue