Merge remote-tracking branch 'origin/master' into attack-pass
# Conflicts: # docs/evidence.md
94
docs/analysis/income-tiers.md
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
# Mining income per tier on igneum-testnet-1
|
||||
|
||||
Generated by `tools/launch/income-tiers.mjs` from `tools/launch/income-tiers.json` (mission item 10, the consequences rule). Do not edit by hand: `node tools/launch/income-tiers.mjs` rewrites it and `--check` fails CI when the two disagree. Every rate and watt figure is a measurement with its source in the first table; nothing is estimated. Testnet coins have no value and the figures below say nothing about any price: the dollar columns are electricity, a cost the reader computes from a measured watt figure and a tariff they choose.
|
||||
|
||||
## The schedule the figures use
|
||||
|
||||
`EmissionSchedule::TESTNET_1` (the testnet genesis, decided 7 October 2026): 100 IGN a block at one block a second, a 90-day ramp from 10 percent, a monthly glide with a two-year half-life (each month pays 2^(-1/24) of the month before), then 1 percent of supply a year from about year 11.4. Of each block, 80 percent goes to the miner who found it and 20 percent to the proving pool. A miner whose key signs its checkpoints keeps the full 80 percent; an unsigned key gives a tenth of it to the proving pool.
|
||||
|
||||
| Moment | IGN a block to the miner | Of the launch figure |
|
||||
|---|---|---|
|
||||
| day 1 | 8.00 | 10.0% |
|
||||
| day 30 | 32.00 | 40.0% |
|
||||
| day 90 (ramp over) | 75.51 | 94.4% |
|
||||
| month 12 | 58.23 | 72.8% |
|
||||
| year 2 | 41.17 | 51.5% |
|
||||
|
||||
A solo card's expected income is its share of network hash times 86,400 blocks a day times the figure above. The tables use day 90, when the ramp is over. Before that, multiply by the ramp row; after that, by the glide row. A pool user gets the same expected amount minus the pool's fee (pool-0: 1 percent) with the variance taken out; the reference pool holds no balance and pays from the coinbase split.
|
||||
|
||||
## The cards, measured
|
||||
|
||||
6 October 2026, rented single-card Linux boxes (docs/analysis/prover-tiers-real-cards.md, bench log 'Prover tiers on real cards: the rented fleet, 6 October 2026'): the 0.3.12 miner on the ten-field override, the miner alone on the card, nvidia-smi power at the same second. The RX 9070 XT row is the telemetry run of 5 October 2026 on a Windows rig (bench log 'Power, heat, fans and clocks, measured'); the Apple row is the Metal bench of 4 October 2026 (site/miner-bench.json, class v4). The class v4 rates on the live devnet run lower than the ten-field rates on the same card (RTX 5090: 124.2 MH/s class v4 against 98.5 on the rented box under a different driver and container, docs/bench-log.md); the table is re-generated at the testnet cut from that class.
|
||||
|
||||
| Tier | Card | MH/s | W | MH/W | Source |
|
||||
|---|---|---|---|---|---|
|
||||
| 8 GB | NVIDIA RTX 4060 Ti 8 GB | 19.07 | 72.6 | 0.263 | docs/analysis/prover-tiers-real-cards.md, RTX 4060 Ti 8 GB row |
|
||||
| 8 GB | NVIDIA RTX 4060 | 17.07 | owed | owed | docs/analysis/prover-tiers-real-cards.md, RTX 4060 row (the sampler read 0.0 W on that host: power OWED) |
|
||||
| 12 GB | NVIDIA RTX 3060 | 23.78 | 103.7 | 0.229 | docs/analysis/prover-tiers-real-cards.md, RTX 3060 row |
|
||||
| 12 GB | NVIDIA RTX 4070 | 24.99 | 91.1 | 0.274 | docs/analysis/prover-tiers-real-cards.md, RTX 4070 row |
|
||||
| 12 GB | NVIDIA RTX 5070 | 41.89 | 137.0 | 0.306 | docs/analysis/prover-tiers-real-cards.md, RTX 5070 row |
|
||||
| 16 GB | NVIDIA RTX 4060 Ti 16 GB | 17.58 | 72.3 | 0.243 | docs/analysis/prover-tiers-real-cards.md, RTX 4060 Ti 16 GB row |
|
||||
| 16 GB | AMD RX 9070 XT | 18.60 | 199.0 | 0.093 | docs/bench-log.md, 'Power, heat, fans and clocks, measured' (5 October 2026): 18.6 to 19.2 MH/s, 199 W read by the ADLX helper at 100 percent busy |
|
||||
| 24 GB | NVIDIA RTX 3090 | 37.79 | 228.8 | 0.165 | docs/analysis/prover-tiers-real-cards.md, RTX 3090 row |
|
||||
| 24 GB | NVIDIA RTX 4090 | 52.25 | 183.1 | 0.285 | docs/analysis/prover-tiers-real-cards.md, RTX 4090 row |
|
||||
| 32 GB | NVIDIA RTX 5090 | 98.48 | 258.2 | 0.381 | docs/analysis/prover-tiers-real-cards.md, RTX 5090 row (the rented box; 124.2 MH/s class v4 on a desktop, site/miner-bench.json) |
|
||||
| Apple | Apple M5 Max (40 GPU cores) | 26.70 | owed | owed | site/miner-bench.json, Apple M5 Max class v4 row, 4 October 2026 (no power reading: OWED) |
|
||||
|
||||
## IGN a day per card, solo, after the ramp (day 90)
|
||||
|
||||
Three network sizes, because income is a share of the network and nobody knows the network before it exists. 1 GH/s, 10 GH/s, 100 GH/s are reference sizes, not forecasts. The live network's estimate is on /live; divide by it.
|
||||
|
||||
| Tier | Card | at 1 GH/s | at 10 GH/s | at 100 GH/s |
|
||||
|---|---|---|---|---|
|
||||
| 8 GB | NVIDIA RTX 4060 Ti 8 GB | 124,414 | 12,441 | 1,244.1 |
|
||||
| 8 GB | NVIDIA RTX 4060 | 111,366 | 11,137 | 1,113.7 |
|
||||
| 12 GB | NVIDIA RTX 3060 | 155,142 | 15,514 | 1,551.4 |
|
||||
| 12 GB | NVIDIA RTX 4070 | 163,036 | 16,304 | 1,630.4 |
|
||||
| 12 GB | NVIDIA RTX 5070 | 273,293 | 27,329 | 2,732.9 |
|
||||
| 16 GB | NVIDIA RTX 4060 Ti 16 GB | 114,693 | 11,469 | 1,146.9 |
|
||||
| 16 GB | AMD RX 9070 XT | 121,348 | 12,135 | 1,213.5 |
|
||||
| 24 GB | NVIDIA RTX 3090 | 246,544 | 24,654 | 2,465.4 |
|
||||
| 24 GB | NVIDIA RTX 4090 | 340,882 | 34,088 | 3,408.8 |
|
||||
| 32 GB | NVIDIA RTX 5090 | 642,489 | 64,249 | 6,424.9 |
|
||||
| Apple | Apple M5 Max (40 GPU cores) | 174,192 | 17,419 | 1,741.9 |
|
||||
| Rig | 6 x NVIDIA RTX 4070 | 978,217 | 97,822 | 9,782.2 |
|
||||
|
||||
## Electricity a day, and the electricity cost of one mined IGN
|
||||
|
||||
Electricity a day = measured watts x 24 h x the tariff. The cost of one IGN divides that by the day-90 figure at 10 GH/s; at another network size it scales with the network (ten times the network, ten times the cost per coin). The three tariffs: USD 0.05 a kWh is cheap industrial power, USD 0.10 is a US retail rate, USD 0.25 is a UK retail rate at today's level (each approximate; tariffs move, the watt figures do not).
|
||||
|
||||
| Tier | Card | USD/day at 0.05/kWh | USD/day at 0.1/kWh | USD/day at 0.25/kWh | USD per IGN at 0.05/kWh | USD per IGN at 0.1/kWh | USD per IGN at 0.25/kWh |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 8 GB | NVIDIA RTX 4060 Ti 8 GB | 0.087 | 0.174 | 0.436 | 0.000007 | 0.000014 | 0.000035 |
|
||||
| 8 GB | NVIDIA RTX 4060 | owed | owed | owed | owed | owed | owed |
|
||||
| 12 GB | NVIDIA RTX 3060 | 0.124 | 0.249 | 0.622 | 0.00000802 | 0.000016 | 0.0000401 |
|
||||
| 12 GB | NVIDIA RTX 4070 | 0.109 | 0.219 | 0.547 | 0.00000671 | 0.0000134 | 0.0000335 |
|
||||
| 12 GB | NVIDIA RTX 5070 | 0.164 | 0.329 | 0.822 | 0.00000602 | 0.000012 | 0.0000301 |
|
||||
| 16 GB | NVIDIA RTX 4060 Ti 16 GB | 0.087 | 0.174 | 0.434 | 0.00000756 | 0.0000151 | 0.0000378 |
|
||||
| 16 GB | AMD RX 9070 XT | 0.239 | 0.478 | 1.19 | 0.0000197 | 0.0000394 | 0.0000984 |
|
||||
| 24 GB | NVIDIA RTX 3090 | 0.275 | 0.549 | 1.37 | 0.0000111 | 0.0000223 | 0.0000557 |
|
||||
| 24 GB | NVIDIA RTX 4090 | 0.220 | 0.439 | 1.10 | 0.00000645 | 0.0000129 | 0.0000322 |
|
||||
| 32 GB | NVIDIA RTX 5090 | 0.310 | 0.620 | 1.55 | 0.00000482 | 0.00000964 | 0.0000241 |
|
||||
| Apple | Apple M5 Max (40 GPU cores) | owed | owed | owed | owed | owed | owed |
|
||||
| Rig | 6 x NVIDIA RTX 4070 (a six-card rig of the 12 GB card, the rig's own power is six times the card's plus the host (the host is not measured here)) | 0.656 | 1.31 | 3.28 | 0.00000671 | 0.0000134 | 0.0000335 |
|
||||
|
||||
## What it means per tier, and what is being done
|
||||
|
||||
- **One 8 GB card.** NVIDIA RTX 4060 Ti 8 GB: 19.1 MH/s at 73 W, 12,441 IGN a day at 10 GH/s after the ramp, electricity 0.174 a day at USD 0.10 a kWh. Mines; proves only core-only shards (docs/analysis/prover-tiers-real-cards.md). The record says this tier is first under power in every exit (docs/analysis/mission/past.md section 3): the glide never halves it overnight, and the card games when the income goes. Being done: the Cards screen shows the expected MH/s, W and blocks a day before the first share (mission item 6).
|
||||
- **One 12 GB card.** NVIDIA RTX 5070: 41.9 MH/s at 137 W, 27,329 IGN a day at 10 GH/s after the ramp, electricity 0.329 a day at USD 0.10 a kWh. Mines and proves beside the miner on the patched server. Being done: the same Cards line; the proving tier sentence names the shard size the card takes.
|
||||
- **One 16 GB card.** NVIDIA RTX 4060 Ti 16 GB: 17.6 MH/s at 72 W, 11,469 IGN a day at 10 GH/s after the ramp, electricity 0.174 a day at USD 0.10 a kWh. Mines and proves; the AMD row is the measured 9070 XT, 199 W for 18.6 MH/s, so per watt it is about a fifth of the NVIDIA cards of its tier and the electricity cost per coin is the highest in the table. Being done: the AMD read-width experiment (docs/plans/read-width.md); until it lands the AMD tier is told its per-watt figure before it buys.
|
||||
- **One 24 or 32 GB card.** NVIDIA RTX 5090: 98.5 MH/s at 258 W, 64,249 IGN a day at 10 GH/s after the ramp, electricity 0.620 a day at USD 0.10 a kWh. The last GPU standing in every exit on record, and the only tier that proves the full shard beside the miner. Being done: the proving pool is the second income for this tier and the Earnings screen shows shards and IGN beside blocks.
|
||||
- **A rig.** 6 x NVIDIA RTX 4070: cards times the card figure; the host's own draw is not measured and is owed. Rigs followed income across chains inside days on every chain in the record; Igneum expects no loyalty and pays staying keys a vote (30 days of blocks).
|
||||
- **A pool user.** The same expected IGN minus the pool's fee, variance removed; pool-0 holds no balance and the member's own key is in every block it finds, so a pool's vote is the member's weight. Being done: the pool finished (mission item 11).
|
||||
- **Windows, Linux, macOS.** The rates above are Linux containers (NVIDIA) and Windows (AMD); the Mac row is Metal on Apple silicon with no power reading. The same card on another operating system is within the driver's margin, not measured here: owed per platform at the testnet cut.
|
||||
|
||||
## Owed
|
||||
|
||||
- Intel discrete (Arc): no measurement; the tier is listed with no number until one exists
|
||||
- RTX 4060 and Apple M5 Max wall power: the rows carry the rate and no electricity column
|
||||
- every row at class v4 on the testnet cut: the rates above are the ten-field class of 6 October 2026 on rented boxes
|
||||
- a rig host's own draw: a rig row is cards times the card figure, host excluded
|
||||
|
||||
## Check
|
||||
|
||||
`node tools/launch/income-tiers.mjs --check` (in `tools/ci/pre-push.sh`): the file equals the generator's output. `node --test tools/launch/income-tiers.test.mjs`: the schedule arithmetic against the fork's constants (100 MH/s on 100 GH/s after the ramp = 6,912 IGN a day, the figure in docs/analysis/horizon-2026-10.md; day 1 pays 10 percent; one month step pays 97.153 percent of the one before).
|
||||
|
|
@ -41,7 +41,7 @@ Versions in the table: `igneum-pow` is the Rust crate at `igneum-pow/Cargo.toml`
|
|||
| 14 | Ethereum bytecode runs unchanged, with the documented differences of spec 7.1 | Homepage Build card; litepaper Building | tested by the team | as row 13; fixes `F-exec-A`, `F-exec-B` (spec 7.5) | `tools/evm-smoke/smoke.mjs`: deploy via viem, `increment`, `hashLoop`, `eth_estimateGas`, `eth_getLogs`; `tools/exec-attacks` scenarios 1 and 3; bench-log "execution layer attack fixes" | Deployment, calls, reverts, logs and gas estimates behave as viem expects; chain id 4463; the prototype pgas table gives 0.0095 to 0.028 pgas per gas, below the design's band before calibration, 3 October 2026. 4 October 2026: a transaction that would cross the block's proving budget is refused by the mempool and, if forced in, aborted and charged with its nonce advanced (25 of 25 checks; 30 of 30 malformed cases). Apple M5 Max. The `Prover` precompile, proof records and the shard planner are not in the node | none yet |
|
||||
| 15 | Every block is proven, with the proof landing within about a minute at launch | Homepage stats ("~60 s to a proof"); litepaper Proving; roadmap phase 3 gate | implemented | repo `d7e1f89` (GPU proof), `e01a3cc`, `292e800`, `eedd136` (`proving/igneum-prove`: shard cutter, MPT witnesses, shard and aggregator guests); SP1 6.8.1; spec 7.2, 7.6 | `proving/windows-wsl2` (SETUP-PROVER, PROVE-BLOCK) on the RTX 5090; `igneum-prove-host --mode block` on `proving/fixtures/`; bench-log "proving v0 on the RTX 5090" and "proving: devnet v4 shards" | First GPU proof of an Igneum block, 4 October 2026, RTX 5090 (WSL2, SP1 cuda, mining paused): fixture `block-78-increment` (2 transactions), core proof 1.4 s (7.3 MB, verify 0.221 s), compressed proof 2.7 s (1.27 MB, verify 0.038 s), post-state and receipts roots identical to the node's; 15.7x and 20.6x faster than a loaded M5 Max CPU. The same day on that CPU (load 38 to 47): a three-shard block proved shard by shard and aggregated by recursion, 19 min (1,139 s) end to end, 245 to 337 s per compressed shard proof, every proof verified. What is not there: no proof is produced, carried or checked on the chain (the devnet prover is a stub that signs claims), the proving pool pays nobody (row 21), the block proven is far below one shard, and the 60-second figure remains a design target; the pass mark is the standard in `docs/benchmarks/proving-e2e.md`. Second RTX 5090 run, 4 October 2026 evening (job run-20261004-173115): a full shard at the provisional S_p (6.75 M pgas, 60.8 M cycles) executed in 1.63 s, core proof 8.3 s (18.1 MB), compressed proof 10.9 s (1.27 MB, verify 0.040 s); a two-shard block (13.5 M pgas) proved shard by shard (11.7 s and 10.0 s) and aggregated in 2.2 s, 24 s of GPU stages end to end, every proof verified, six tampered witnesses rejected. The two host defects (an abort after the upload, an idle wait that turned out to be an unbuffered 18 MB proof save through the WSL2 file bridge, 24 minutes) are fixed (ledger P20) 5 October 2026, live devnet with real transactions (bench-log "real transactions, the first non-empty shard proven and paid"): block 72704 shard 0, 29 transfers, 5,800 pgas, proven on PC 2 in 34 s, verified on the Mac in 0.297 s and paid 1.7623 IGN, 53 s after the chain block executed; of about 1,400 blocks in the 20-minute window 36 were proven (the one prover takes the newest shard assigned to it), so "every block" is not yet true; a second content shard (72803, all copies skipped) failed the native-execution veto on the exporter's block structure, fixed with fixtures the same day, the node side pending the 0.3.9 rollout 5 October 2026, evening (bench-log "proving v1"): the aggregated segment record, the chain rule and the unproven rule are implemented behind `proving_v1_activation_daa` (branch proving-v1, not on the devnet before 0.3.11); on the RTX 5090 a chain of 8 consecutive live blocks proved and aggregated by recursion in 135.6 s with the miner on the card (17 s a block, one proof of 1,272,909 bytes attesting all 8, verified in 0.04 s); the 3-node fast-time harness paid a segment record 1.0 s after submission and refused a late one after its deadline (21 checks); the devnet itself, with one prover, carried proofs for 2.4% of blocks over 30 minutes at a block-to-record latency p50 44 s, p99 52 s. The "within about a minute" holds per proven block; "every block" needs 18 mining 5090s or 6 proving-only cards at empty blocks on the measured rates, and the mandatory rule stays off until the share is one | none yet |
|
||||
| 16 | A 12 GB card proves one shard in about 20 s (WITHDRAWN 5 October 2026: a 24 GB card proves a full shard at the adopted size in 4.3 s; 32 GB mines and proves) | Litepaper Proving ("The proving budget"); roadmap gate 2 | designed | spec 5.1 (Target), 7.6 (`S_p` provisional, 7,500,000 pgas = `B_p` / 4) | `PROVE-SHARD.bat` on the RTX 5090 (pending); the end-to-end standard in `docs/benchmarks/proving-e2e.md`; bench-log "proving: devnet v4 shards" | Measured on a 32 GB card, not yet on a 12 GB card. A shard at the provisional `S_p` is 60.8 M SP1 cycles on the prototype pgas table (9 cycles per pgas, 44 per EVM gas; the modexp entry about 100x its SP1 cost); on an RTX 5090 (4 October 2026 evening, job run-20261004-173115) it executed in 1.63 s and its compressed proof took 10.9 s, verified in 0.040 s, so the 32 GB card is inside the 20 s target with margin. Whether a 12 GB card proves it at all, and in what time, is the next measurement (an RTX 3060 and an RTX 5060 Ti 16 GB are on order). A per-shard time can be met by shrinking the shard, so the project does not use it as a pass mark 5 October 2026, evening (bench-log "proving v1", the S_p curve): measured on the RTX 5090 with SP1 6.8.1's GPU prover, the card to itself, 1-s nvidia-smi samples: an empty shard 13,874 MiB and 2.2 s; a full shard at the ADOPTED v1 budget (30,000 pgas, 4.7 M cycles) 20,434 MiB and 4.3 s; the full prototype shard (6.75 M pgas, 60 M cycles) 28,307 MiB and 10.8 s; beside the miner 15,670 and 30,039 MiB. No environment knob of SP1 moves the 13.9 GB floor and the GPU server has no options of its own, so on this build a 12 GB card proves nothing, a 16 GB card only empty shards, a 24 GB card the adopted full shard alone and beside the miner (22,210 MiB and 13.2 s, measured on the 32 GB card: the 5090's allocation pattern, not yet a run on a 24 GB card) and a 32 GB card the prototype shard beside the miner with 2.5 GB spare. The litepaper line now says so; the 12 GB gate returns when a prover build with a smaller floor is measured on a 12 GB card | none yet |
|
||||
| 17 | The chip resistance claim: the strongest recompute chip under 1x per chip against an RTX 5090; the stored-dataset chip 1.2x per chip and 5x to 9x per joule in the model (2.1x to 4.8x by the Ethash precedent); the latency-shadow lever, measured and in its gates, brings it to 2.1x per joule at k = 1 (the GDDR7 measured-anchor column), 3.9x at k about 0.33 as the pessimistic bound | Homepage hero and litepaper abstract (draft (a) of `docs/plans/counter-asic-3-status.md` section 6, chosen 6 October 2026), litepaper "What Igneum does not claim" | tested by the team (the model), designed (the target) | program class v3 (Counter ASIC 2.0, 5 October 2026): branches ca2-v3 d233fa1 and after, ca2-mixer 1ab8b21, ca2-era 78c0ee4; `docs/analysis/chip-model-v3.md`, `docs/analysis/sram-mirror.md`, `docs/analysis/scratch-soundness.md` | The m16 recompute model re-run on the measured v3 rates and verifier times; the on-die-cache chip row | The on-die-cache recompute chip against the RTX 5090's measured 136.1 MH/s: class v2 2.4x; class v3 (mixer x8) 0.31x bare, 0.92x with a 3x fixed-function allowance (approximate), 0.76x at equal silicon; margin 8% on the allowance, 9% on the budget. 5 October 2026, M5 Max, RTX 5090, RX 9070 XT. The 2x target is a target: no chip has been built; the bounty stands (O-1.17). The k about 0.33 bound is the implied core of Bitmain's Antminer X9 (RandomX; 1,000 KH/s, 2,472 W, 2.47 J per KH, USD 5,600; pre-orders 26 December 2025, shipments scheduled for July 2026), withdrawn in mid-May 2026 with buyers refunded before any unit shipped; no independent benchmark exists; the box was commodity Sophgo SG2044 server SoCs with an AES accelerator and 60-plus DRAM sticks, no tapeout. So k about 0.33 is a claimed, unmeasured figure carried as the pessimistic bound, not a calibration point (attack pass AP-F5-1, 7 October 2026) | none yet |
|
||||
| 17 | The chip resistance claim: the strongest chip in the public model reaches 5x to 9x per joule against an RTX 5090 today (modelled); class v4 brings it to 2.1x (k = 1) to 3.9x (k about 0.33, claimed by a withdrawn product) and its second rung to about 2.8x (modelled on measured watts); class v5 makes the dataset the chain's state so a stateless or stale chip is wrong on every item (designed, +0.2 ms verifier); the hot-set cache bounded at 1.067x at the ceiling (measured census of 1,024 programs) and the weak-day FPGA at most 12 percent on 12 days a century (measured census) are bounded and routed to the next class; datacentre silicon (H100 SXM, measured 7 October) does not change the question; a stored-dataset chip pays for itself only at about USD 100 M of market cap in two years (modelled) | The home page's chip line, the litepaper's chip model section, the miner page's line (the texts of `docs/plans/counter-asic-3-public-text-2026-10-07.md`) | tested by the team (every card, the verifier, the two attack-pass censuses, the H100), the chip itself modelled, class v5 and the ladder designed, the X9 core claimed and never measured | `docs/analysis/chip-model-v3.md` 5 and 6; `docs/analysis/latency-shadow-2026-10-06.md`; `docs/plans/counter-asic-3-status.md`; `docs/analysis/attack-pass/f8-uniform.md`, `f4-weakday.md`; `docs/design/class-v5-stored-state.md`; the H100 and market-cap rows of 7 October; `docs/plans/funding.md` (the three lots) | The chip model re-run on the measured class v3 and v4 rates, watts and verifier times; the hot-set census of 1,024 programs and the weak-day census of 2^24 days on the attack-pass branch; the H100 SXM bench row | 136 MH/s at 350 W (5090, bench) and 290 W (app); 27 MH/s at 21 W (M5 Max); 249 MH/s (H100 SXM) at 98 percent of its read ceiling, 1.78x hash, 1.15x MH/W, a third per rented dollar; 2.33 ms per warp; 5.1x to 9.2x; 2.1x, 3.9x, 2.8x; 1.067x at the ceiling; 12 percent on 12 days a century; 10.85 ms at rung 3; USD 100 M; 6 and 7 October 2026 The k about 0.33 bound is the implied core of Bitmain's Antminer X9 (RandomX; 1,000 KH/s, 2,472 W, 2.47 J per KH, USD 5,600; pre-orders 26 December 2025), withdrawn in mid-May 2026 with buyers refunded before any unit shipped, no independent benchmark, commodity Sophgo SG2044 server SoCs with an AES accelerator, no tapeout: a claimed, unmeasured figure carried as the pessimistic bound, not a calibration point (attack pass AP-F5-1, 7 October 2026). | none yet; the three cryptanalysis lots are the next test |
|
||||
| 18 | The chip resistance measurements: the program is latency-bound (random reads), not bandwidth-bound, on every card we own, and sits beyond a card's on-chip cache | Litepaper Mining ("waits on memory latency, not on maths or bandwidth"), vs RandomX; the numbers page | tested by the team | readwidth e752fc7 (`docs/plans/read-width.md`), ca2-era 78c0ee4, ca2-cache 2de19e5 (`docs/plans/hot-table.md`) | The dependent-read probes at 32 to 1,024 MiB and the hash rate per class on the three cards; the latency-bound share = rate over the probe ceiling per load | Latency-bound share at the 1 GiB dataset: RTX 5090 0.96 (v2) and 1.01 (v3), RX 9070 XT 0.87 and 0.95, M5 Max 1.01 and 1.06; wider reads do not close the AMD gap (the 9070 XT does 2.4 G dependent reads per second at every width; the 5090 goes bandwidth-bound at 64 B, share 0.58); a 32 to 96 MiB hot table is not kept resident by any card while the dataset streams (g 0.80 to 0.87 in the added form). 5 October 2026 | none yet |
|
||||
| 19 | The lottery hash is sound as a hash: uniform output, deterministic, no out-of-bounds read, fuzzed; class v3 bit-exact on the three vendors | Litepaper vs RandomX ("Every number above is measured and logged"), the numbers page | tested by the team | ca2-mixer 1ab8b21 (`tests/mixer.rs`, `tests/scratch.rs`), ca2-era 78c0ee4, ca2-soundness a465881 (`docs/analysis/scratch-soundness.md`), `igneum-pow/tests/packs.rs` | The crate suite (53 + 4 + 19 + 7), the Metal fuzz, edge, stats and determinism runs on the v3 construction, the pack vectors and 2^24 fingerprints on Metal, Apple OpenCL, the RTX 5090 and the RX 9070 XT, the 1,024-hash CPU re-check per card | Class v3 (mixer x8 + era): 200-program fuzz 200 of 200 on Metal, every tenth on Apple OpenCL; the pinned v3 packs 3/3 + 3/3 and 96 of 96 lanes on Metal and Apple OpenCL; the six era packs' fingerprints equal on the three vendors (PC 1 job run-ca2-era-pc1-20261005, 5 October 2026); the v2 exports byte-identical on the v3 crate; the final-class PC rows and the G2 re-check: job run-ca2-era-pc1b-20261005 (pending at the time of writing) | none yet |
|
||||
| 20 | No premine, no pre-sale, no allocation: every coin is minted by the schedule and every coin goes to the block producer (80%) and the proving pool (20%) | Homepage stats and Economics tiles; litepaper Supply, Economics | implemented | repo `6ac80a3`; fork "igneum-node devnet v0"; `consensus/core/src/igneum.rs`, `coinbase.rs` | `cargo test -p kaspa-consensus-core igneum` (8 pass: subsidy table, ramp, split, cap) and `cargo test -p kaspa-consensus coinbase` (8 pass); `igneum-miner inspect 40`; bench-log "igneum-node devnet v0" | Coinbases on the devnet: 80/20 exact on 39 of 39 single-payee blocks, the 20% to the `igneum-proving-pool-v0` output; the per-second schedule sums to under the 4,000,000,000 cap by less than 100 coins; 3,168,808,781 units per DAA second in years 0 to 2, halving at 63,115,200 DAA s. 3 October 2026, Apple M5 Max. The devnet genesis carries no allocation; the mainnet genesis does not exist yet, so the claim is about the code and the stated rule, not a launch that has happened | none yet |
|
||||
|
|
|
|||
232
docs/plans/launch-pack.md
Normal file
|
|
@ -0,0 +1,232 @@
|
|||
# The launch pack: gates and text, no protocol (mission item 10)
|
||||
|
||||
7 October 2026, 10:1x to 11:xx UK, the launch-pack lane (branch `launch-pack`, worktree `igneum-wt-launch-pack`, from master b92a5fd4). Mission item 10 of `docs/analysis/mission/mission.md` 2.10, built from `past.md` sections 3 and 4, `future.md` section 8, `reinvent.md` 3.1 and 4.1, `docs/plans/testnet-go.md` and the litepaper. This is an operations document: `docs/plans` is not on the public export list, so it may name the owner; the text handed to the site lane in section 4 may not, and `tools/ci/launch-gates-check.mjs` greps it.
|
||||
|
||||
the project lead's three decisions of this morning, written in everywhere below:
|
||||
|
||||
| Decision | the project lead's word (7 October 2026, 10:1x UK) | Where it lands |
|
||||
|---|---|---|
|
||||
| The proving customer | A signed proving customer IS a mainnet gate: one signed customer paying for proofs at a published rate, or a signed letter of intent with a volume, before mainnet, not before the testnet | `testnet-go.md` LG-11; the journey's phase 4 gate loses "one rollup signs for testnet" (section 4, item E); ledger X13 status (section 4, item F) |
|
||||
| The certificates | APPROVED: Windows EV Authenticode and an Apple Developer organisation account, both under Igneum Labs LTD, executed the day the entity exists | LG-3; the runbook in section 2; the signing step in 2.4 |
|
||||
| The disclosure prize | YES, USD 50,000; payer Igneum Labs LTD; staged until the entity address exists on its documents and the project lead's publish word (`docs/plans/cryptanalysis.md` 3.3, branch `cryptanalysis`, 43d9700b) | LG-13; nothing public until the word |
|
||||
|
||||
## 1. The gates
|
||||
|
||||
The thirteen gate rows are in `docs/plans/testnet-go.md`, section "Launch gates", each with its check, its state today and its owner. The check that keeps them honest: `node tools/ci/launch-gates-check.mjs` fails when a row has no check, when a check names a repository path that does not exist, when the handoff text in section 4 carries a served-page pattern or an em dash, or when one of the eight regulatory sentences is missing or out of order. Its `--self-test` fires on each of those. Both run in `tools/ci/pre-push.sh`.
|
||||
|
||||
What this lane built, and what each gate still needs:
|
||||
|
||||
| Gate | Built here | Still owed, by whom |
|
||||
|---|---|---|
|
||||
| LG-1 income per tier | `tools/launch/income-tiers.json` (the measured rows, each with its source), `tools/launch/income-tiers.mjs` (the generator, `--check`), `tools/launch/income-tiers.test.mjs`, `docs/analysis/income-tiers.md` (public) | re-generate at the 0.4.0 cut from class v4 rates (the shipper); the RTX 4060 and Apple wall power, an Intel row (the fleet lane) |
|
||||
| LG-2, LG-6, LG-7, LG-9, LG-10, LG-12 the hash-origin report | `tools/observer/hash-origin.mjs` (the job: `--dry`, `--write`, `--post`, `--fixture`), its fixture and test; ran read-only on the live devnet tables today | the Devnet 2 observer with a table prefix (fleet lane); the fleet registry's key file (fleet lane); the systemd timer (build-server lane); the two X5 columns (the observer owner); the pool statement format (the pool lane) |
|
||||
| LG-3 signed installers | the runbook (section 2) and the signing-step specification (2.4) | the project lead: the entity's documents, the two enrolments (section 5); the shipper: the step |
|
||||
| LG-4 first-share time | the measurement specification (2.5) | the fleet lane: `tools/fleet/first-share-time.sh` |
|
||||
| LG-5 the text | the handoff block (section 4) | the site lane: land it, rebuild, deploy |
|
||||
| LG-11 the customer | the gate line and its check | the project lead: the signature; the execution engineer: the paid job |
|
||||
| LG-13 the prize | the gate line pointing at the staged text | the project lead: escrow, the address, the word |
|
||||
|
||||
## 2. The certificate runbook
|
||||
|
||||
Two enrolments, both in the entity's name, both the day Igneum Labs LTD exists on paper. Neither names the founder publicly: an Apple Developer ID certificate reads `Developer ID Application: Igneum Labs LTD (TEAMID)` and an EV Authenticode certificate reads the entity's registered name; the person who enrols is known to Apple and to the certificate authority, not to the public.
|
||||
|
||||
### 2.1 Apple: the Developer Program as an organisation
|
||||
|
||||
| Item | Value | Source |
|
||||
|---|---|---|
|
||||
| Provider | Apple Developer Program, organisation membership | https://developer.apple.com/programs/ (read 7 October 2026 by lane 5: USD 99 a year, notarisation included) |
|
||||
| Cost | USD 99 a year | the same page |
|
||||
| What the entity supplies | (1) a D-U-N-S number for Igneum Labs LTD at its registered address (free from Dun and Bradstreet; Apple has its own D-U-N-S lookup and request form; a new entity's number can take days to weeks to issue, approximate); (2) the legal entity name exactly as the DIFC registrar records it; (3) a person with legal authority to bind the entity (a director) who enrols with an Apple ID on an entity mailbox (for example `developer@igneum.network`) with two-factor on; (4) a website on a domain the entity controls (igneum.network); (5) a phone number Apple can call for verification | Apple's enrolment requirements for organisations, from memory, approximate; the exact list is on the enrolment page at the time |
|
||||
| What comes out | A Team ID; a `Developer ID Application` certificate (and a `Developer ID Installer` certificate if a .pkg is ever shipped); notarisation through `notarytool` with an app-specific password or an App Store Connect API key | Apple's notarisation documentation, from memory |
|
||||
| Where the key lives | In the login keychain of the Mac that runs `packaging/mac/build-dmg.sh`, exported once to an encrypted .p12 kept with the entity's records; never on igneum-build-1 (CLAUDE.md: the box holds no secret that signs releases) | this lane |
|
||||
| Time | Enrolment review by Apple: days, approximate; D-U-N-S first | from memory, approximate |
|
||||
|
||||
### 2.2 Windows: an EV Authenticode certificate
|
||||
|
||||
| Item | Value | Source |
|
||||
|---|---|---|
|
||||
| Provider | One of the public CAs that issue EV code-signing certificates: DigiCert, Sectigo, GlobalSign, SSL.com (the four this lane knows; from memory). The choice that matters: the CI runner must sign, so pick one whose private key lives in the CA's cloud HSM with a client for Windows (SSL.com eSigner with its CodeSignTool, DigiCert KeyLocker with `smctl`; Sectigo and GlobalSign have hardware-token and cloud options; from memory, approximate). Azure Trusted Signing was considered and set aside: its public-trust tier wants three years of verifiable organisation history (from memory, approximate), which a new DIFC entity cannot show | lane 5 (`reinvent.md` 3.1) for the SmartScreen facts; this lane for the provider notes |
|
||||
| Cost | USD 300 to 700 a year for EV, approximate, from memory of list prices; cloud signing may add a monthly fee or a per-signature count | approximate |
|
||||
| Why EV and not OV | Both are hardware-bound since the CA/B Forum's June 2023 rule (private keys in a FIPS 140-2 level 2 token or an HSM; from memory). EV used to grant SmartScreen reputation at once; SSL.com's page says Microsoft "moved away from automatic instant reputation" (`reinvent.md` 3.1, read 7 October 2026), so even EV may show the interstitial until the file earns reputation. the project lead chose EV; the download page states the two clicks until the 1,000-download mark either way | `reinvent.md` 3.1 |
|
||||
| What the entity supplies | (1) the DIFC certificate of incorporation or commercial licence showing the registered name and address; (2) proof the address is the one on the registrar's record; (3) a telephone number the CA can verify (a public directory listing, or a letter from the entity's accountant or lawyer when there is none); (4) the government ID of the person signing the subscriber agreement and a director's letter authorising that person; (5) the D-U-N-S listing from 2.1, which shortens the CA's organisation check | the EV code-signing guidelines' identity requirements, from memory, approximate; the CA's own checklist governs |
|
||||
| What comes out | A certificate in the CA's HSM (or a USB token posted to the registered address), a signing account for CI with a short-lived credential, and a timestamp URL | approximate |
|
||||
| Where the key lives | In the CA's HSM; the CI credential in the repository's GitHub secrets (rotatable); a USB token, if that route is taken, stays with the Mac and signs through `osslsigncode` with a PKCS#11 module; never on igneum-build-1 | this lane |
|
||||
| Time | Validation 1 to 5 business days after the documents, approximate | from memory |
|
||||
|
||||
### 2.3 Mailboxes and records to create with the entity
|
||||
|
||||
| Item | Why |
|
||||
|---|---|
|
||||
| `developer@igneum.network` (or the name the project lead picks) | The Apple ID of the organisation account and the CA's subscriber contact |
|
||||
| `security@igneum.network` | The disclosure address of the prize (`cryptanalysis.md` 3.3; the project lead's call on the name) |
|
||||
| The D-U-N-S number | Apple requires it; the CA uses it |
|
||||
| An encrypted record of the Team ID, the certificate serials, the expiry dates and the renewal month | Renewal is a calendar item the way a domain is |
|
||||
|
||||
### 2.4 The signing step in the shipper's cut (specification; the shipper ae892a8b0f78fe31c implements)
|
||||
|
||||
Today `packaging/mac/build-dmg.sh` signs ad hoc (`codesign -s -`), the app strips its own quarantine on start, and the Windows exes and installer are unsigned (`.github/workflows/windows.yml`, step "installer"). The step below adds signing where each binary is built and verification where the shipper already verifies, so `tools/ship-app.mjs` keeps its step list (`preflight bump inputs commit ci fetch dmg copy mirror manifest deploy verify console`) and gains checks inside `fetch`, `dmg` and `verify` rather than a new step.
|
||||
|
||||
| Where | What changes | Check |
|
||||
|---|---|---|
|
||||
| `.github/workflows/windows.yml`, step "installer", before ISCC | Sign `igneum-app.exe`, `igneumd.exe`, `igneum-miner.exe`, the window host and the worker exes with `signtool sign /fd SHA256 /td SHA256 /tr <timestamp url>` through the CA's KSP (the cloud client logs in from two GitHub secrets: the account credential and the TOTP or API key the CA gives); then the Inno script's `SignTool=` directive signs the installer and its uninstaller with the same command. The secrets are absent on a fork or a pull request: the step then builds unsigned and marks the artefact `unsigned`, and the shipper refuses it (next row) | `signtool verify /pa /v dist\*.exe` in the same job prints the signer and the timestamp; the smoke-run step reads it |
|
||||
| `tools/ship-app.mjs`, `fetch` | After `packaging/windows/fetch-ci-artifacts.sh`, run `osslsigncode verify <installer>` on the Mac (Homebrew `osslsigncode`): the signer CN must equal `Igneum Labs LTD`, the digest SHA-256, a timestamp present; an unsigned or wrongly signed installer fails the step with the line | the step's own exit |
|
||||
| `packaging/mac/build-dmg.sh` | Replace `codesign -s - -f` with `codesign --force --options runtime --timestamp --sign "Developer ID Application: Igneum Labs LTD (TEAMID)"` on every binary under `Contents/Resources/bin` and `Contents/MacOS`, then the app bundle (with an entitlements file only if a binary needs one; none is known today); `xcrun notarytool submit <zip of the app> --keychain-profile igneum-notary --wait` must print `Accepted`; `xcrun stapler staple` the app, then build the DMG, then `xcrun stapler staple` the DMG; remove the app's own quarantine strip (it exists for the ad-hoc case only) | `spctl --assess --type execute -vv <app>` prints `accepted` and `source=Notarized Developer ID`; `codesign --verify --deep --strict <app>` exits 0 |
|
||||
| `packaging/ota/publish-manifest.sh` and the manifest | Two fields per platform file: `signed_by` (the signer CN as verified) and `notarized` (true or false); `publish-manifest.sh` refuses `--public` when either is missing | `tools/ship-app.mjs --check` and the manifest's signature check already run; add the field check there |
|
||||
| `tools/ship-app.mjs`, `verify` | Besides size and sha256: download the live installer and run `osslsigncode verify`; mount the live DMG and run `spctl --assess`; both results must match the manifest fields | the step's own exit |
|
||||
| The download page (`site/miner.html`, the site lane) and the Discord release post (`tools/community/discord-hooks.mjs release`) | Show "Signed by Igneum Labs LTD" and the sha256 only when the manifest says so; keep the "what your antivirus may say" line (`reinvent.md` 3.1) and the exact SmartScreen text and two clicks until the 1,000-download mark | `tools/ci/launch-gates-check.mjs` greps nothing here; the site's own build grep runs |
|
||||
| `tools/ci/signed-release-check.sh` (new, with the implementation) | A manifest in `dl/public/` without `signed_by` on every file fails; `--self-test` with a manifest missing the field | in `tools/ci/pre-push.sh` |
|
||||
|
||||
Order of work for the shipper once the certificates exist: the Mac side first (one machine, one keychain, one release), then the CI side (the cloud-signing client in the runner), then the manifest fields, then the download page. Until the certificates exist nothing in this table runs, and the 0.4.0 cut ships unsigned with the page saying so (`funding.md` section 2, the client audit row: "the one-click app ships at testnet unaudited and says so on the download page").
|
||||
|
||||
### 2.5 The first-share time, measured per release (specification; the fleet lane builds `tools/fleet/first-share-time.sh`)
|
||||
|
||||
`reinvent.md` 3.1: the time from download to the first accepted share has never been measured end to end on a fresh machine. The measurement is a Devnet 2 gate step, one run per platform per release:
|
||||
|
||||
| Step | What | Where |
|
||||
|---|---|---|
|
||||
| 1 | A fresh Windows 11 VM (Hyper-V on the RTX 5090 Windows rig, or a rented Windows box) and a fresh macOS VM (Tart or UTM on the Mac) from clean images; no Igneum files on them | the fleet lane's box library (`tools/fleet/lib/`) for the rented case; a Mac job for the macOS case |
|
||||
| 2 | The script downloads the release from the public URL, runs the installer (Windows) or opens the DMG and copies the app (macOS), starts the app with the Devnet 2 network setting, and reads the app's own log for three stamps: install done, node synced, dataset built, then the first accepted share or block | the app's log lines are the clock; the script never reads a reported rate |
|
||||
| 3 | One line into the gate log: `FIRST-SHARE <windows or mac> download=<s> sync=<s> dataset=<s> share=<s> version=<v>` | `~/Desktop/fleet/devnet2-gate-<stamp>.log`, the same file `devnet2-gate.sh` writes |
|
||||
| 4 | The numbers go to `/evidence` as a row per release ("download to first share, fresh Windows 11: N min M s; fresh macOS: N min M s"), with the date and the version | the site lane |
|
||||
| Gate | Under 10 minutes in 9 of 10 fresh Windows installs (mission item 6), measured across releases | the /evidence rows |
|
||||
|
||||
## 3. The hash-origin report: what it is and how it runs
|
||||
|
||||
`tools/observer/hash-origin.mjs`. Once a day, from the observer's tables, who found the blocks. It reads `live_blocks` (24 h: vote key, payout address, colour), `live_state` (the node's hash-rate estimate), `miner_logs` (the vote keys the project's intake-reporting workers logged) and, with `--fleet-keys <file>` or `IGNEUM_FLEET_KEYS_FILE`, the fleet registry's key list. It writes, only with `--write`, its own two tables (`hash_origin_days`: one row per key per day for the 30-day dust and independence counts; `hash_origin_reports`: the day's report as posted) and the jsonb column `hash_origin` on `live_state` for the site. With `--post` it posts to #numbers through `tools/community/discord-hooks.mjs`'s poster (its guard refuses any post with a machine id, a path, an IP or a 32-hex token; key `hash-origin:<date>`, so a day posts once).
|
||||
|
||||
| Command | What |
|
||||
|---|---|
|
||||
| `node tools/observer/hash-origin.mjs --fixture tools/observer/fixtures/hash-origin-day.json` | The fabricated day; no database |
|
||||
| `node tools/observer/hash-origin.mjs --dry [--go 2026-10-20]` | The live tables, read-only (ran today) |
|
||||
| `node tools/observer/hash-origin.mjs --dry --prefix dn2_` | The Devnet 2 observer's tables, once that observer runs with `LIVE_TABLE_PREFIX=dn2_` |
|
||||
| `node tools/observer/hash-origin.mjs --write --post --live --go <date>` | The daily run on the box |
|
||||
| `node --test tools/observer/hash-origin.test.mjs` | The known-finished and known-failed days; in `tools/ci/pre-push.sh` |
|
||||
|
||||
Today's read-only reading on the live devnet (7 October 2026, 11:xx UK), and what it means (the consequences rule):
|
||||
|
||||
| Line | Reading | What it means, and what is done about it |
|
||||
|---|---|---|
|
||||
| Keys | 113 with a block, 95 above the dust line, ten largest 45.0 percent | The devnet runs the project's machines with several identities each (ledger-decisions.md decision 13 moves the default to one key per machine), so 113 keys is not 113 miners; the independent count is the X5 definition and its two owed columns |
|
||||
| Fleet | 36 keys, 38.4 percent "fleet"; 77 keys, 61.6 percent "outside" | False: the rented boxes do not upload identity lines, so the job cannot see them as the project's. The fleet registry's key file fixes it (`IGNEUM_FLEET_KEYS_FILE`); until the fleet lane exports it, LG-7 is void and the report says so by its numbers |
|
||||
| Pools | 13 shared payout addresses (68.4 percent); attested pools 0 | A shared payout is a pool or one machine with several identities; the job counts a pool only when attested (the project's own, or an operator's signed key list), so no devnet machine is mistaken for an outside pool and LG-9 cannot pass on a multi-key machine |
|
||||
| Network | 0.76 GH/s, no yesterday | The step line needs two days of its own table; the first run with `--write` starts the series |
|
||||
|
||||
The runbook for the box (build-server lane; `infra/build-server/hands/` holds the observer's units):
|
||||
|
||||
| Item | Value |
|
||||
|---|---|
|
||||
| Unit | `igneum-hash-origin.service` (oneshot) and `igneum-hash-origin.timer`, `OnCalendar=*-*-* 08:30:00 UTC` (before the 09:00 UK digest), `Persistent=true` so a missed day runs at boot |
|
||||
| Command | `node tools/observer/hash-origin.mjs --write --post --live --go <go date>` from the box's checkout, as the observer user |
|
||||
| Environment | `EnvironmentFile=/srv/observer/env` (DATABASE_URL) and `/srv/discord-hooks/env` (the webhooks, already on the box by the 6 October exception); `IGNEUM_PROJECT_POOLS=<pool-0 payout address>`; `IGNEUM_KNOWN_POOLS=` (empty until a statement exists); `IGNEUM_FLEET_KEYS_FILE=/srv/observer/fleet-keys.txt` (written by the fleet lane's export, one 64-hex key per line, mode 600) |
|
||||
| Devnet 2 | The same unit with `LIVE_TABLE_PREFIX=dn2_` once the Devnet 2 observer runs; seven days of posts before step 10 is LG-2 |
|
||||
| 90 days | The timer runs for ever; LG-12 counts the first 90 days from the go in `hash_origin_reports` |
|
||||
| Gate | The unit is trusted after one run that posted and one run with the database string removed that failed loudly (the watcher rule) |
|
||||
|
||||
## 4. The text, handed to the site lane
|
||||
|
||||
Everything between the two markers is for the site lane (a4b202cabca2d95c0 deploys). It is written to the copy law and `tools/ci/launch-gates-check.mjs` greps it against `site/forbidden-strings.txt` and `tools/ci/forbidden-strings.txt`. The site lane lands it in `site/index.html`, `site/litepaper.html`, `site/journey.json`, rebuilds (`node site/build.mjs`) and pushes; the ledger owner takes item F into `docs/fud-ledger.md` (`tools/ledger-page.mjs` renders it).
|
||||
|
||||
<!-- handoff:start -->
|
||||
|
||||
### A. The front page: the three wants lead (`site/index.html`, the hero and the first block under it)
|
||||
|
||||
The miners' own words asked for three things (twenty posts and launch texts, 2018 to 2026, `docs/analysis/mission/past.md` section 2: hardware that keeps its value, 10 of 20; income above electricity that does not fall off a cliff, 6; a fair supply, 4). Nobody asked for finality, a DAG or proofs. The front page answers the three in order; finality moves to page two. The h1 stays as it is. Under it, three cards, each with one heading and three to four short lines:
|
||||
|
||||
**1. Your card stays a card.**
|
||||
The hash is a new random program every hour over a dataset the chain draws from its own state. No scheduled fork, no release a team must ship. The chip model and its number are published with every era on /evidence. When you stop, the card still games.
|
||||
|
||||
**2. Income with no cliff.**
|
||||
100 IGN a block, falling 2.9 percent a month. No halving day. Then 1 percent of supply a year, for ever. A block pays its miner whether or not anyone buys a proof that day. What each card mines, and what its electricity costs, is one table: the income page.
|
||||
|
||||
**3. A fair supply.**
|
||||
No premine. No fund, no foundation, no fee to any team. Nobody holds a coin before block one. The founders mine from genesis with disclosed addresses and the same software as everyone else. The first 90 days ramp from 10 percent, so the launch weeks are worth less to a private farm.
|
||||
|
||||
Under the three cards, one line and a link: "Blocks are final by miners alone, with no stake and no other chain. How, on page two." (the link is the litepaper's "Speed and finality" section).
|
||||
|
||||
The income page: render `docs/analysis/income-tiers.md` as `/income` (or link the public mirror's copy) and link it from card 2 and from `/miner`. The page is generated; the site lane does not edit its numbers.
|
||||
|
||||
### B. Page two: finality (`site/litepaper.html`, "Speed and finality")
|
||||
|
||||
No change to the section's text. The change is placement: the front page's hero no longer carries a finality claim; the "Igneum at a glance" block keeps its one finality line and links down to the section. The explorer and the wallet keep their finality state words.
|
||||
|
||||
### C. The block sentence (`site/litepaper.html`, "Three income streams, one balance", directly under the table)
|
||||
|
||||
"A block pays its miner whether or not anyone buys a proof that day. The lottery pays 80 percent of every block from emission; proving is the second income, never the only one. Every useful-work chain on record dropped its miners the day the work stopped paying; Igneum's miners are paid for the block first."
|
||||
|
||||
### D. The eight sentences (`site/litepaper.html`, a new short section "What the chain is, in law" at the end of Economics, under the label "Not legal advice; counsel is engaged")
|
||||
|
||||
Each sentence is `docs/analysis/mission/future.md` 8.3, verified against the file on 7 October 2026 and re-worded to the copy law where the file's own line was a note; the number in brackets is the file's. The heading sentence: "Not legal advice; counsel is engaged. These are the facts of the design that the rules of each region turn on; nothing here is a promotion of anything."
|
||||
|
||||
1. No issuer, no offeror, no sale. Every coin is created automatically as a reward for the maintenance of the distributed ledger or the validation of transactions, and in no other way. (8.3 sentence 1; the quoted words are MiCA Article 4(3)(b)'s, verbatim, as the file asks)
|
||||
2. The sustainability indicators of Delegated Regulation 2025/422 (energy in kWh a year from the network's hash rate and the measured microjoules per hash, intensity per transaction, the regional mix when it is known) are published by the project every era, so a service provider in the EU can list the coin without asking. (8.3 sentence 2)
|
||||
3. No financial promotion. No price, no "buy", no "invest", no return language anywhere. The earnings screen shows hash and IGN, never a currency. (8.3 sentence 3; the income page shows electricity in dollars as a cost, never the coin's price, which is this sentence kept)
|
||||
4. The reference pool never holds a member's balance. Payouts come straight from the coinbase split; the pool coordinates, it does not keep custody. (8.3 sentence 4)
|
||||
5. The job market settles peer to peer on the chain. There is no operator account and no dollar leg in the protocol: the dollar figure is a quote, the settlement is IGN. (8.3 sentence 5)
|
||||
6. The software is published under an open licence by a company that holds no coins by right and runs no service the chain's consensus depends on. There is no dev fund. (8.3 sentence 6; the file's line reads "runs no service the chain depends on"; "consensus" is added because the company does run seeds, a public RPC and a log intake, none of which consensus needs; counsel reads both)
|
||||
7. Mining may be restricted where you are; you are responsible for checking. The miner asks your region at first run and refuses the regions where mining is banned (the file's list on 7 October 2026: ten regions of Russia and Moscow from 15 August 2026, and China). (8.3 sentence 7)
|
||||
8. No privileged key. No key can mint, pause or upgrade the chain; the only way a rule changes is miners signalling for it, and nothing requires them to. (8.3 sentence 8)
|
||||
|
||||
### E. The journey (`site/journey.json`)
|
||||
|
||||
| Phase | Today | Change |
|
||||
|---|---|---|
|
||||
| phase-4, gate | "Finality design passes external review and one rollup signs for testnet" | "Finality design passes external review" |
|
||||
| phase-5, gate | "1,000 independent miners run 30 days and rollup proofs are delivered on time" | unchanged |
|
||||
| phase-6 (mainnet), when | "After the testnet has passed its gate: 1,000 independent miners for 30 days and rollup proofs on time" | "After the testnet has passed its gate (1,000 independent miners for 30 days, rollup proofs on time) and one proving customer has signed: a customer paying for proofs at a published rate, or a letter of intent with a volume" |
|
||||
|
||||
### F. The ledger rows (`docs/fud-ledger.md`; ids provisional, the ledger owner renumbers on merge)
|
||||
|
||||
**X13 (existing), status update.** Decided (7 October 2026, 10:1x UK, by the owner): a signed proving customer, paying for proofs at a published rate or a letter of intent with a volume, is a MAINNET gate (testnet-go.md LG-11). The phase 4 gate drops "one rollup signs for testnet". The pilot progression in the answer stands: a signature opens mainnet, repeat purchases and a second unrelated customer are the evidence after it.
|
||||
|
||||
**X37. Your installer is a warning screen.**
|
||||
"Windows says 'Windows protected your PC' and the Mac refuses to open it. A miner's first screen on your chain is an operating-system warning, and you call that one click."
|
||||
Status: Open, certificates approved (7 October 2026): an EV Authenticode certificate and an Apple Developer organisation account, both in the entity's name, enrolled the day the entity exists; the signing step is specified for the release tool and runs from the first signed cut. Until then the download page shows the exact warning text and the two clicks.
|
||||
Answer: True today. The DMG is signed ad hoc and the Windows installer is unsigned. SmartScreen warns on any file without reputation and reputation is use, so the interstitial may outlive the signature by some downloads; the page says so. The measured time from download to the first share on a fresh machine is published per release.
|
||||
Evidence: testnet-go.md LG-3 and LG-4; launch-pack.md section 2.
|
||||
|
||||
**X38. Nobody will know whose hash the launch is.**
|
||||
"On launch week your own rented cards will be most of the hash, and the chart will look like Nervos in 2020 or Iron Fish in 2023: a step nobody can explain."
|
||||
Status: Open, the report built (7 October 2026): a daily hash-origin report from the observer, posted in public for the first 90 days and on the staging chain for seven days before the go: keys with a block, keys above dust, the project's own fleet share, attested pools, the ten largest keys, and any 2x step in the estimate with the keys that carry it.
|
||||
Answer: Right that the first weeks are the project's own cards plus whoever shows up, and that a chart alone cannot tell them apart. The report names the project's share every day, from the project's own key list, so the step is explained the day it happens. What it cannot do yet: count independent miners (the autonomous-system and fingerprint columns are owed), or tell a pool from a machine with several keys without the pool's own signed statement.
|
||||
Evidence: testnet-go.md LG-2, LG-6, LG-7, LG-9, LG-12; tools/observer/hash-origin.mjs.
|
||||
|
||||
**E23. You will show a number that makes someone buy a card.**
|
||||
"Every GPU chain's launch page had an earnings number, and every one was wrong inside six months."
|
||||
Status: Stated (7 October 2026): the income page shows IGN a day per measured card at three network sizes, electricity a day at three tariffs, and the electricity cost of one mined IGN; no coin price appears, every rate is a measurement with its source, and the page says what each tier should expect from the record of other chains.
|
||||
Answer: Agreed, and the record is the argument: income halves within 60 to 120 days of a peak and falls under power within 6 to 18 months on every chain in the sample. The page shows the arithmetic the miner can redo with the live network figure, and nothing else.
|
||||
Evidence: docs/analysis/income-tiers.md; testnet-go.md LG-1.
|
||||
|
||||
**L10. The eight sentences.**
|
||||
"You say 'not legal advice' and then write eight sentences of it."
|
||||
Status: Open, counsel engaged (the owner, 6 October 2026); the eight sentences are the design facts the rules turn on, each cited to its regime in the research file, and they go to counsel with the litepaper before mainnet.
|
||||
Answer: The sentences state what the design does (no issuer, no custody in the pool, no dollar leg, no privileged key, the region refusal) and what the project publishes (the energy indicators); they do not say what any law concludes. Counsel decides the wording for each region.
|
||||
Evidence: docs/analysis/mission/future.md section 8; testnet-go.md LG-5.
|
||||
|
||||
<!-- handoff:end -->
|
||||
|
||||
## 5. What needs the project lead
|
||||
|
||||
| # | Item | What exactly | Blocks |
|
||||
|---|---|---|---|
|
||||
| 1 | The entity's documents | Igneum Labs LTD's certificate of incorporation or DIFC commercial licence, proof of the registered address, a director's government ID, a director's authorisation letter naming who enrols and signs | LG-3 (both certificates), LG-13 (the payer's address on the prize text) |
|
||||
| 2 | The D-U-N-S number | Request it for Igneum Labs LTD at the registered address (free; days to weeks, approximate) | the Apple enrolment; the CA's organisation check |
|
||||
| 3 | The Apple Developer Program enrolment | As an organisation, on an entity mailbox with two-factor, USD 99 a year, the project lead as the person with authority; Apple may call | LG-3 (the Mac side) |
|
||||
| 4 | The EV certificate order | Pick the CA (a cloud-HSM one so the CI runner signs: SSL.com eSigner or DigiCert KeyLocker, approximate), pay (USD 300 to 700 a year, approximate), take the validation call, receive the signing account; the CI credential goes into the repository's secrets | LG-3 (the Windows side) |
|
||||
| 5 | The proving customer's signature | One customer paying for proofs at a published rate, or a signed letter of intent with a volume (Taiko is the named first customer; the brief is ledger X13's) | LG-11, mainnet |
|
||||
| 6 | The prize | Escrow USD 50,000 with the entity; confirm the registered address on the staged text; give the publish word; pick the disclosure mailbox name | LG-13 |
|
||||
| 7 | Two mailboxes | `developer@igneum.network` (or the project lead's name for it) and `security@igneum.network` | items 3, 4 and 6 |
|
||||
| 8 | The three tariffs | DECIDED (the coordinator for the project lead, 7 October 2026, 11:xx UK): electricity tariffs per kWh, never a coin price; the triple is USD 0.05 (cheap industrial), 0.10 (US retail) and 0.25 (UK retail at today's rate), and the table was regenerated on it. Nothing left here | none |
|
||||
| 9 | Permission to post the first outside block | reinvent.md 4.1 G-C2: the "first outside block" post needs the owner's permission | LG-7's post, not its check |
|
||||
|
||||
## 6. Not done here, and why
|
||||
|
||||
| Item | Why not | Who |
|
||||
|---|---|---|
|
||||
| Any change to a live page or to `site/` | The site lane deploys; this lane hands text (section 4) | site lane |
|
||||
| The signing step's code | A specification only (2.4); the shipper implements when the certificates exist | shipper |
|
||||
| `tools/fleet/first-share-time.sh` | A specification only (2.5); it needs the fleet library and a Windows VM job | fleet lane |
|
||||
| The Devnet 2 observer and the fleet key file | Fleet-side; without them LG-2 and LG-7 cannot fire | fleet lane |
|
||||
| The systemd timer on the box | Box-side; the unit is specified in section 3 | build-server lane |
|
||||
| The X5 observer columns | The app-owner item of ledger-decisions.md section 3 | observer owner |
|
||||
| Ledger edits | Handed as rows (item F); the ledger owner merges and renumbers | ledger owner |
|
||||
| The litepaper artifact (the Claude doc) | The site's `litepaper.html` is the public copy the handoff targets; the doc follows the site | site lane |
|
||||
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.
|
||||
BIN
docs/plans/site-ui-4-shots/chrome/cards/home-1440-dark.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/cards/home-1440-light.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/cards/home-390-dark.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/cards/home-390-light.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/cards/miner-1440-dark.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/cards/miner-1440-light.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/cards/miner-390-dark.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/cards/miner-390-light.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/footer/home-1440-dark.png
Normal file
|
After Width: | Height: | Size: 146 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/footer/home-1440-light.png
Normal file
|
After Width: | Height: | Size: 147 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/footer/home-390-dark.png
Normal file
|
After Width: | Height: | Size: 139 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/footer/home-390-light.png
Normal file
|
After Width: | Height: | Size: 140 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/footer/miner-1440-dark.png
Normal file
|
After Width: | Height: | Size: 146 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/footer/miner-1440-light.png
Normal file
|
After Width: | Height: | Size: 147 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/footer/miner-390-dark.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/footer/miner-390-light.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/header/home-1440-dark-bar.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/header/home-1440-light-bar.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 155 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/header/home-390-dark-open.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 157 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/header/home-390-light-open.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 226 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/header/home-768-dark-open.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 230 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/header/home-768-light-open.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 22 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/header/live-1440-dark-bar.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/header/live-1440-light-bar.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 137 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/header/live-390-dark-open.png
Normal file
|
After Width: | Height: | Size: 133 KiB |
|
After Width: | Height: | Size: 135 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/header/live-390-light-open.png
Normal file
|
After Width: | Height: | Size: 131 KiB |
|
After Width: | Height: | Size: 214 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/header/live-768-dark-open.png
Normal file
|
After Width: | Height: | Size: 210 KiB |
|
After Width: | Height: | Size: 213 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/header/live-768-light-open.png
Normal file
|
After Width: | Height: | Size: 208 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/header/miner-1440-dark-bar.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 222 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/header/miner-390-dark-open.png
Normal file
|
After Width: | Height: | Size: 224 KiB |
|
After Width: | Height: | Size: 243 KiB |
|
After Width: | Height: | Size: 245 KiB |
|
After Width: | Height: | Size: 513 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/header/miner-768-dark-open.png
Normal file
|
After Width: | Height: | Size: 514 KiB |
|
After Width: | Height: | Size: 589 KiB |
|
After Width: | Height: | Size: 590 KiB |
3020
docs/plans/site-ui-4-shots/chrome/report.json
Normal file
BIN
docs/plans/site-ui-4-shots/chrome/scene/home-390-10s.webm
Normal file
BIN
docs/plans/site-ui-4-shots/chrome/scene/home-390-dark.png
Normal file
|
After Width: | Height: | Size: 154 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/scene/home-390-light.png
Normal file
|
After Width: | Height: | Size: 156 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/scene/live-390-10s.webm
Normal file
BIN
docs/plans/site-ui-4-shots/chrome/scene/live-390-dark.png
Normal file
|
After Width: | Height: | Size: 231 KiB |
BIN
docs/plans/site-ui-4-shots/chrome/scene/live-390-light.png
Normal file
|
After Width: | Height: | Size: 246 KiB |
BIN
docs/plans/site-ui-4-shots/dag/demo-feed-proven-1000-dark.jpg
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
docs/plans/site-ui-4-shots/dag/home-1440-dark-mid.jpg
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
docs/plans/site-ui-4-shots/dag/home-1440-light-mid.jpg
Normal file
|
After Width: | Height: | Size: 91 KiB |
BIN
docs/plans/site-ui-4-shots/dag/home-390-dark-mid.jpg
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
docs/plans/site-ui-4-shots/dag/home-390-light-mid.jpg
Normal file
|
After Width: | Height: | Size: 42 KiB |
595
docs/plans/site-ui-4-shots/dag/igneum-chain-scene.html
Normal file
BIN
docs/plans/site-ui-4-shots/dag/live-1440-dark-mid.jpg
Normal file
|
After Width: | Height: | Size: 84 KiB |
BIN
docs/plans/site-ui-4-shots/dag/live-1440-dark-selected.jpg
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
docs/plans/site-ui-4-shots/dag/live-1440-light-mid.jpg
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
docs/plans/site-ui-4-shots/dag/live-1440-light-selected.jpg
Normal file
|
After Width: | Height: | Size: 97 KiB |
BIN
docs/plans/site-ui-4-shots/dag/live-390-dark-mid.jpg
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
docs/plans/site-ui-4-shots/dag/live-390-dark-selected.jpg
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
docs/plans/site-ui-4-shots/dag/live-390-light-mid.jpg
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
docs/plans/site-ui-4-shots/dag/live-390-light-selected.jpg
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
docs/plans/site-ui-4-shots/dag/live-scene-10s.gif
Normal file
|
After Width: | Height: | Size: 3.8 MiB |
BIN
docs/plans/site-ui-4-shots/dag/live-scene-10s.mp4
Normal file
BIN
docs/plans/site-ui-4-shots/dag/live-scene-10s.webm
Normal file
BIN
docs/plans/site-ui-4-shots/dag/pack-preview.mp4
Normal file
BIN
docs/plans/site-ui-4-shots/dag/side-by-side-live-vs-demo.jpg
Normal file
|
After Width: | Height: | Size: 99 KiB |
BIN
docs/plans/site-ui-4-shots/live-1440-dark-fold.jpg
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
docs/plans/site-ui-4-shots/live-1440-dark-full.jpg
Normal file
|
After Width: | Height: | Size: 175 KiB |
BIN
docs/plans/site-ui-4-shots/live-1440-dark-inspector.jpg
Normal file
|
After Width: | Height: | Size: 109 KiB |
BIN
docs/plans/site-ui-4-shots/live-1440-light-fold.jpg
Normal file
|
After Width: | Height: | Size: 95 KiB |
BIN
docs/plans/site-ui-4-shots/live-1440-light-full.jpg
Normal file
|
After Width: | Height: | Size: 184 KiB |
BIN
docs/plans/site-ui-4-shots/live-390-dark-fold.jpg
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
docs/plans/site-ui-4-shots/live-390-dark-full.jpg
Normal file
|
After Width: | Height: | Size: 120 KiB |
BIN
docs/plans/site-ui-4-shots/live-390-light-fold.jpg
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
docs/plans/site-ui-4-shots/live-390-light-full.jpg
Normal file
|
After Width: | Height: | Size: 124 KiB |
330
docs/plans/site-ui-4-shots/pack/results.json
Normal file
|
|
@ -0,0 +1,330 @@
|
|||
{
|
||||
"passed": 73,
|
||||
"total": 73,
|
||||
"results": [
|
||||
{
|
||||
"test": "Standalone preview renders without JS errors",
|
||||
"passed": true,
|
||||
"evidence": []
|
||||
},
|
||||
{
|
||||
"test": "Standalone preview makes no network requests",
|
||||
"passed": true,
|
||||
"evidence": []
|
||||
},
|
||||
{
|
||||
"test": "Both renderers use the same block records",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Sample contains six miner keys",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Visible source label says simulated",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Original mount API is exposed",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Zoom-in control works",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Zoom-out control works",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Ordinary page scrolling is not captured",
|
||||
"passed": true,
|
||||
"evidence": {
|
||||
"prevented": false,
|
||||
"w": 90
|
||||
}
|
||||
},
|
||||
{
|
||||
"test": "Modified wheel zooms the graph",
|
||||
"passed": true,
|
||||
"evidence": {
|
||||
"prevented": true,
|
||||
"w": 103
|
||||
}
|
||||
},
|
||||
{
|
||||
"test": "Keyboard inspection updates the details",
|
||||
"passed": true,
|
||||
"evidence": "e231e4cf43678ba5"
|
||||
},
|
||||
{
|
||||
"test": "Escape clears selection",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Your-block filter is active",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Selected-chain filter is active",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Pause button updates state and accessibility",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Pause freezes displayed records while receiving data",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Pause freezes the rendered pixels",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Paused graph has no continuous RAF loop",
|
||||
"passed": true,
|
||||
"evidence": {
|
||||
"before": 16,
|
||||
"after": 16
|
||||
}
|
||||
},
|
||||
{
|
||||
"test": "Resume applies buffered block records",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Sample block control selects a new own block",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Sample proof control advances shard states",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Sample checkpoint control produces an explicit locked record",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Accessible table contains block records",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Table selection opens the matching block",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Light theme control works",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Manual reduced motion propagates to both visuals",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "System reduced-motion changes stop continuous drawing",
|
||||
"passed": true,
|
||||
"evidence": {
|
||||
"before": 70,
|
||||
"after": 70
|
||||
}
|
||||
},
|
||||
{
|
||||
"test": "Motion resumes when the system preference changes",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Offscreen main graph suspends animation",
|
||||
"passed": true,
|
||||
"evidence": {
|
||||
"before": 78,
|
||||
"after": 78
|
||||
}
|
||||
},
|
||||
{
|
||||
"test": "Main preview remains free of JS errors",
|
||||
"passed": true,
|
||||
"evidence": []
|
||||
},
|
||||
{
|
||||
"test": "Responsive layout 320px has no horizontal overflow",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Compact renderer draws when scrolled into view at 320px",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Responsive preview 320px has no JS errors",
|
||||
"passed": true,
|
||||
"evidence": []
|
||||
},
|
||||
{
|
||||
"test": "Responsive layout 390px has no horizontal overflow",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Compact renderer draws when scrolled into view at 390px",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Responsive preview 390px has no JS errors",
|
||||
"passed": true,
|
||||
"evidence": []
|
||||
},
|
||||
{
|
||||
"test": "Responsive layout 768px has no horizontal overflow",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Compact renderer draws when scrolled into view at 768px",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Responsive preview 768px has no JS errors",
|
||||
"passed": true,
|
||||
"evidence": []
|
||||
},
|
||||
{
|
||||
"test": "Responsive layout 1024px has no horizontal overflow",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Compact renderer draws when scrolled into view at 1024px",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Responsive preview 1024px has no JS errors",
|
||||
"passed": true,
|
||||
"evidence": []
|
||||
},
|
||||
{
|
||||
"test": "Responsive layout 1440px has no horizontal overflow",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Compact renderer draws when scrolled into view at 1440px",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Responsive preview 1440px has no JS errors",
|
||||
"passed": true,
|
||||
"evidence": []
|
||||
},
|
||||
{
|
||||
"test": "Valid observer payload is accepted",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Renderer does not mutate supplied records",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Age and selected-chain status do not imply proof or finality",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Existing records update miner, parents and header fields",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Malformed envelope is rejected without throwing",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Invalid block records are rejected without throwing",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Prototype-like hashes are safe map keys",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Tooltip treats incoming text as text, not markup",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Unknown shard state is not promoted to planned or verified",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Zoom has a 30-second lower bound",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Zoom has a 300-second upper bound",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "ResizeObserver tracks container-only resizes",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Checkpoint is not snapped to a different blue score",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Exact checkpoint score renders a pending marker",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Weight alone does not infer checkpoint lock",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Stale feed preserves records and reports stale",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Stale feed does not animate as fresh activity",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Mounting again destroys the previous instance",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Destroy stops animation and rejects future pushes",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Polling preserves existing endpoint query parameters",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Polling requests fresh data with an abort signal",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Overlapping polls are prevented",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Queued zoom request uses latest window",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Observer response reaches rendered model",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Destroy aborts an in-flight observer request",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "New module runs inside the supplied original HTML host",
|
||||
"passed": true,
|
||||
"evidence": []
|
||||
},
|
||||
{
|
||||
"test": "Original host pause control still works",
|
||||
"passed": true
|
||||
},
|
||||
{
|
||||
"test": "Original host theme control remains compatible",
|
||||
"passed": true,
|
||||
"evidence": []
|
||||
}
|
||||
],
|
||||
"scope": "Chromium headless; embedded standalone HTML; mocked read-only observer; original uploaded HTML host. Not a live devnet or native mining-engine test."
|
||||
}
|
||||
74
docs/plans/site-ui-4-shots/pack/verify-local.log
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
PASS Standalone preview renders without JS errors
|
||||
PASS Standalone preview makes no network requests
|
||||
PASS Both renderers use the same block records
|
||||
PASS Sample contains six miner keys
|
||||
PASS Visible source label says simulated
|
||||
PASS Original mount API is exposed
|
||||
PASS Zoom-in control works
|
||||
PASS Zoom-out control works
|
||||
PASS Ordinary page scrolling is not captured
|
||||
PASS Modified wheel zooms the graph
|
||||
PASS Keyboard inspection updates the details
|
||||
PASS Escape clears selection
|
||||
PASS Your-block filter is active
|
||||
PASS Selected-chain filter is active
|
||||
PASS Pause button updates state and accessibility
|
||||
PASS Pause freezes displayed records while receiving data
|
||||
PASS Pause freezes the rendered pixels
|
||||
PASS Paused graph has no continuous RAF loop
|
||||
PASS Resume applies buffered block records
|
||||
PASS Sample block control selects a new own block
|
||||
PASS Sample proof control advances shard states
|
||||
PASS Sample checkpoint control produces an explicit locked record
|
||||
PASS Accessible table contains block records
|
||||
PASS Table selection opens the matching block
|
||||
PASS Light theme control works
|
||||
PASS Manual reduced motion propagates to both visuals
|
||||
PASS System reduced-motion changes stop continuous drawing
|
||||
PASS Motion resumes when the system preference changes
|
||||
PASS Offscreen main graph suspends animation
|
||||
PASS Main preview remains free of JS errors
|
||||
PASS Responsive layout 320px has no horizontal overflow
|
||||
PASS Compact renderer draws when scrolled into view at 320px
|
||||
PASS Responsive preview 320px has no JS errors
|
||||
PASS Responsive layout 390px has no horizontal overflow
|
||||
PASS Compact renderer draws when scrolled into view at 390px
|
||||
PASS Responsive preview 390px has no JS errors
|
||||
PASS Responsive layout 768px has no horizontal overflow
|
||||
PASS Compact renderer draws when scrolled into view at 768px
|
||||
PASS Responsive preview 768px has no JS errors
|
||||
PASS Responsive layout 1024px has no horizontal overflow
|
||||
PASS Compact renderer draws when scrolled into view at 1024px
|
||||
PASS Responsive preview 1024px has no JS errors
|
||||
PASS Responsive layout 1440px has no horizontal overflow
|
||||
PASS Compact renderer draws when scrolled into view at 1440px
|
||||
PASS Responsive preview 1440px has no JS errors
|
||||
PASS Valid observer payload is accepted
|
||||
PASS Renderer does not mutate supplied records
|
||||
PASS Age and selected-chain status do not imply proof or finality
|
||||
PASS Existing records update miner, parents and header fields
|
||||
PASS Malformed envelope is rejected without throwing
|
||||
PASS Invalid block records are rejected without throwing
|
||||
PASS Prototype-like hashes are safe map keys
|
||||
PASS Tooltip treats incoming text as text, not markup
|
||||
PASS Unknown shard state is not promoted to planned or verified
|
||||
PASS Zoom has a 30-second lower bound
|
||||
PASS Zoom has a 300-second upper bound
|
||||
PASS ResizeObserver tracks container-only resizes
|
||||
PASS Checkpoint is not snapped to a different blue score
|
||||
PASS Exact checkpoint score renders a pending marker
|
||||
PASS Weight alone does not infer checkpoint lock
|
||||
PASS Stale feed preserves records and reports stale
|
||||
PASS Stale feed does not animate as fresh activity
|
||||
PASS Mounting again destroys the previous instance
|
||||
PASS Destroy stops animation and rejects future pushes
|
||||
PASS Polling preserves existing endpoint query parameters
|
||||
PASS Polling requests fresh data with an abort signal
|
||||
PASS Overlapping polls are prevented
|
||||
PASS Queued zoom request uses latest window
|
||||
PASS Observer response reaches rendered model
|
||||
PASS Destroy aborts an in-flight observer request
|
||||
PASS New module runs inside the supplied original HTML host
|
||||
PASS Original host pause control still works
|
||||
PASS Original host theme control remains compatible
|
||||
RESULT 73 / 73
|
||||
|
|
@ -115,3 +115,23 @@ NET=testnet ./install-rpc-from-mac.sh seed1.testnet # the public RPC again
|
|||
|
||||
The node binary for the seeds: `node tools/build-job.mjs run --node /Users/joshm/Projects/igneum/vendor/igneum-node-testnet-infra --target ae432dc7 --targets linux --no-tests`
|
||||
then `node tools/build-job.mjs fetch <id>` (lands in `infra/cross/out/`).
|
||||
|
||||
## Launch gates (mission item 10, 7 October 2026, 10:1x UK)
|
||||
|
||||
Added by the launch-pack lane (branch `launch-pack`) from `docs/analysis/mission/mission.md` 2.10, with the owner's three decisions of the same morning written in: a signed proving customer is a MAINNET gate (not a testnet gate); the code-signing certificates are approved (Windows EV Authenticode and an Apple Developer organisation account, both under Igneum Labs LTD, executed the day the entity exists); the USD 50,000 disclosure prize is YES, staged until the entity address exists and the owner gives the publish word (`docs/plans/cryptanalysis.md` 3.3 on branch `cryptanalysis`). The runbooks, the signing-step specification and the text handed to the site lane are in `docs/plans/launch-pack.md`. Every row has its check; `node tools/ci/launch-gates-check.mjs` (in `tools/ci/pre-push.sh`) fails when a row loses it or names a script that is not there. "When" says which go the gate holds: T = before the testnet go (steps 1 to 11 above), C = a community gate after the go with no date (`docs/analysis/mission/reinvent.md` 4.1), M = before the mainnet go.
|
||||
|
||||
| Gate | What must be true | Check | When | State at 10:1x UK, 7 October 2026 | Who |
|
||||
|---|---|---|---|---|---|
|
||||
| LG-1 Per-tier income at three tariffs | `docs/analysis/income-tiers.md` is published before the testnet: one 8, 12, 16, 24 or 32 GB card, a rig and a pool user, IGN a day at three network sizes from the measured bench rows and `EmissionSchedule::TESTNET_1`, electricity a day and per mined IGN at USD 0.05, 0.10 and 0.25 a kWh (cheap industrial, US retail, UK retail; decided 7 October 2026), each tier with what it means and what is being done (the consequences rule) | `node tools/launch/income-tiers.mjs --check` (the page equals its inputs) and `node --test tools/launch/income-tiers.test.mjs` (the schedule arithmetic: 6,912 IGN a day for 100 MH/s on 100 GH/s at the launch rate, day 1 at 10 percent, one month step at 2^(-1/24)); the page is in the public export and passes `tools/ci/identity-check.sh` | T | DONE on the branch from the 6 October rented-card rows (ten-field class). OWED: re-generate at the testnet cut from class v4 rates; the RTX 4060 and Apple wall power; an Intel row | launch-pack lane, then whoever cuts 0.4.0 |
|
||||
| LG-2 Hash-origin report on Devnet 2 for seven days before the go | The daily report (keys with a block, keys above dust, attested pools and shared payouts, the project fleet's share, the ten largest keys, the network step) posts from the Devnet 2 observer's tables on seven consecutive days before step 10 | `node tools/observer/hash-origin.mjs --prefix dn2_ --dry` prints a report; seven consecutive `hash-origin:<date>` keys in the poster's state for that prefix; `node --test tools/observer/hash-origin.test.mjs` (a known-finished day and a known-failed day) | T | The job exists and ran read-only on the live devnet tables today (113 keys, 0.76 GH/s). OWED: a Devnet 2 observer writing `dn2_live_*` (fleet lane), the fleet key file from the fleet registry, the systemd timer on the box (`docs/plans/launch-pack.md` section 3) | launch-pack lane (job), fleet lane (observer, key file), build-server lane (timer) |
|
||||
| LG-3 Signed and notarised installers | The 0.4.0 DMG is signed with a Developer ID certificate of Igneum Labs LTD, notarised and stapled, and opens on a fresh macOS machine with no Privacy and Security visit; the Windows installer and every exe inside it carry an EV Authenticode signature of Igneum Labs LTD with a timestamp | `spctl --assess --type execute -vv <app>` prints `accepted` and `source=Notarized Developer ID`; `osslsigncode verify <installer>` (or `signtool verify /pa /v`) prints the signer `Igneum Labs LTD` and a timestamp; the shipper's `verify` step writes both into the manifest (`signed_by`, `notarized`) and the download page shows the signer and the sha256 (`docs/plans/launch-pack.md` section 2.4) | T | NOT DONE: certificates approved 7 October; the entity's documents and the two enrolments are the owner's (section 2, items for the owner); the signing step is a specification for the shipper (`docs/plans/launch-pack.md` 2.4) | the owner (enrolments), the shipper (the step) |
|
||||
| LG-4 First-share time measured per release | Every release's Devnet 2 gate measures download to first accepted share on a fresh Windows 11 VM and a fresh macOS VM, as three timed steps (download and install, sync, dataset build), and the numbers are published on /evidence; the mission's bar is under 10 minutes in 9 of 10 fresh Windows installs | the gate log carries `FIRST-SHARE <platform> download=<s> sync=<s> dataset=<s> share=<s>` for both platforms (`docs/plans/launch-pack.md` 2.5 is the specification of the script that writes it, tools/fleet/first-share-time.sh, OWED: until it exists this row is OPEN); the /evidence row equals the log line | T | OWED: specification written, script not built; no fresh-machine time has been measured end to end (`docs/analysis/mission/reinvent.md` 3.1) | fleet lane with the shipper |
|
||||
| LG-5 The launch text on the site | The front page leads with the three wants (hardware that stays useful, income without a cliff, a fair supply) and finality moves to page two; the litepaper carries "A block pays its miner whether or not anyone buys a proof that day"; the eight regulatory sentences of `docs/analysis/mission/future.md` 8.3 are on the litepaper under "not legal advice; counsel is engaged"; the journey's phase 4 gate no longer says a rollup signs for the testnet | `node tools/ci/launch-gates-check.mjs` (the handoff block exists, carries no served-page pattern, no em dash, the eight sentences numbered in order); after the site lane lands it: `grep -c "whether or not anyone buys a proof" site/litepaper.html` is 1 and `grep -c "automatically created as a reward" site/litepaper.html` is 1 | T | Text handed over in `docs/plans/launch-pack.md` section 4 (branch `launch-pack`); nothing on the live site changed | site lane |
|
||||
| LG-6 First 100 keys | 100 distinct vote keys with a blue block in the last 24 h | the hash-origin report's `gates.first_100_keys` (`node tools/observer/hash-origin.mjs --dry --json`) | C | Devnet reading today: 113 keys with a block, most of them the project's multi-identity machines; the testnet counts from its own go | the report |
|
||||
| LG-7 First block from a card the project does not own | A blue block whose vote key is in neither the intake-reporting workers' identity lines nor the fleet registry's key file | the report's `gates.first_block_outside_fleet`, valid only with `IGNEUM_FLEET_KEYS_FILE` loaded (without the file the devnet reads its own rented boxes as outside: today 77 "outside" keys, which is the missing file, not outsiders); the post needs the owner's permission (reinvent.md 4.1 G-C2) | C | Void until the fleet key file exists (OWED, fleet lane) | the report, the fleet lane |
|
||||
| LG-8 First outside-reproduced benchmark | A row on /miners measured by someone outside the project, with driver, OS and version (`docs/benchmarks/repro.md`) | `grep -c '"by": "reported by a miner"' site/miner-bench.json` is at least 1 (today the rows are `measured by the team` and `reported by the fleet`) | C | No such row | the community lead (the bench-table ingest) |
|
||||
| LG-9 First pool not run by the project | An attested outside pool (its operator published the signed member-key list X5 asks for) with 10 percent of blue blocks for 7 consecutive days | the report's `gates.first_outside_pool` with the pool's payout address in `IGNEUM_KNOWN_POOLS`; a shared payout address nobody attested never passes it (the test's third case) | C | No attested outside pool; the devnet's 13 shared payout addresses are multi-identity machines and the project's pool-0 | the report, the pool lane (the statement format) |
|
||||
| LG-10 First 1,000 independent keys (X5) | N_ind of at least 1,000 over 30 days, independent in autonomous system, machine fingerprint and pool attestation, top-10 share of window weight under 50 percent (`docs/plans/ledger-decisions.md` section 3) | the report's `independent` block once the observer stores the autonomous system per announcing address and the fingerprint per key; until then the report prints the keys above dust as an upper bound and never passes the gate (`gates.first_1000_independent` is false by construction) | C, and the gate of mainnet genesis | The two observer columns are OWED (app-owner item, ledger-decisions.md section 3); today's upper bound on the devnet is 95 | the observer owner |
|
||||
| LG-11 A signed proving customer | One customer paying for proofs at a published rate, or a signed letter of intent with a volume, before mainnet (the owner, 7 October 2026: a mainnet gate, not a testnet gate; the weight of the Devnet 2 gate: mainnet does not open without it) | the contract or the letter in the entity's records, a redacted copy linked from `docs/evidence.md`, the rate on the site; for the paying case the job market's payout contract shows a paid job for that customer; `grep -c "rollup signs for testnet" site/journey.json` is 0 after the handoff lands | M | NOT DONE: Taiko is named as the first customer and nothing is signed; the brief and the pilot progression are ledger X13 | the owner (the signature), the execution engineer (the paid job) |
|
||||
| LG-12 Hash origin daily for 90 days | The report posts every day for the first 90 days from the go, with no gap | `SELECT count(*) FROM hash_origin_reports WHERE day >= '<go date>'` reaches 90 with consecutive days; the timer's journal on the box shows a run per day | C | The job and its `--go <date>` flag exist; the timer is OWED (section 3 of the pack) | build-server lane (timer), the report |
|
||||
| LG-13 The disclosure prize | USD 50,000 for a reproduced break of the published hash class, paid in fiat by Igneum Labs LTD, announced only when escrowed and only when the entity's registered address exists on its documents and the owner gives the publish word | `docs/plans/funding.md` rule 3 (escrow before announcement); the staged text in docs/plans/cryptanalysis.md 3.3 on branch `cryptanalysis` (43d9700b, not on master yet); until the word, `grep -ci "50,000" site/*.html` is 0 | M (the announcement may come earlier, on the word) | APPROVED by the owner at 09:5x UK on 7 October 2026; STAGED; nothing public mentions it | the owner (escrow, the word), the cryptanalysis lane (the announcement) |
|
||||
|
|
|
|||
|
|
@ -281,8 +281,9 @@ bs_remote_run() {
|
|||
BR_DIR="$dir" BR_LABEL="$label" BR_CMD="$cmd" BR_TOOL="${BS_TOOL:-build-remote}" BR_WT="$BS_WT" BR_CRATE="$BS_CRATE_REL" \
|
||||
BR_BRANCH="$BS_BRANCH" BR_SHA="$BS_SHA" BR_AGENT="$agent" BR_KIND="${BR_KIND:-other}" BR_COMMAND="${BR_COMMAND:-}" \
|
||||
BR_TARGET="${BR_TARGET:-}" BR_ARTEFACTS="${BR_ARTEFACTS:-}" BR_SDE="${BR_SDE:-}" BR_PAIRS_WITH="${BR_PAIRS_WITH:-}" \
|
||||
BR_NICE="${BR_NICE:-0}" BR_CORES="${BR_CORES:-0}" BR_JOBS_CAP="${BR_JOBS_CAP:-0}" BR_PRIORITY="${BR_PRIORITY:-normal}" \
|
||||
bash -c '
|
||||
for v in BR_DIR BR_LABEL BR_CMD BR_TOOL BR_WT BR_CRATE BR_BRANCH BR_SHA BR_AGENT BR_KIND BR_COMMAND BR_TARGET BR_ARTEFACTS BR_SDE BR_PAIRS_WITH; do
|
||||
for v in BR_DIR BR_LABEL BR_CMD BR_TOOL BR_WT BR_CRATE BR_BRANCH BR_SHA BR_AGENT BR_KIND BR_COMMAND BR_TARGET BR_ARTEFACTS BR_SDE BR_PAIRS_WITH BR_NICE BR_CORES BR_JOBS_CAP BR_PRIORITY; do
|
||||
printf "export %s=%q\n" "$v" "${!v}"
|
||||
done
|
||||
cat "$0"' "$(dirname "${BASH_SOURCE[0]}")/remote-run.sh" | bs_ssh 'bash -s'
|
||||
|
|
|
|||
|
|
@ -238,6 +238,7 @@ d = {
|
|||
"start": iso(e['BR_START']), "end": iso(e['BR_END']), "secs": num(e['BR_SECS']), "exit": num(e['BR_EXIT']),
|
||||
"compiles": num(e['BR_COMPILES']), "jobs": num(e.get('BR_JOBS')), "measure": (e.get('BR_MEASURE') == '1') or None,
|
||||
"source_date_epoch": num(e.get('BR_SDE')), "pairs_with": e.get('BR_PAIRS_WITH') or None,
|
||||
"nice": num(e.get('BR_NICE')) or 0, "cores": (num(e.get('BR_CORES')) or 0) or os.cpu_count(), "priority": e.get('BR_PRIORITY') or "normal",
|
||||
"class": e.get('BR_CLASS') or None, "run_log": e.get('BR_RUN_LOG') or None,
|
||||
}
|
||||
sc = {k: num(e[v]) for k, v in (("hits", "BR_HITS"), ("misses", "BR_MISSES"), ("hits_total", "BR_HITS_T"), ("misses_total", "BR_MISSES_T"))}
|
||||
|
|
@ -321,6 +322,18 @@ else
|
|||
flock -s -w 7200 "$mfd" || give_up "the measurement to end"
|
||||
rm -f "$waitfile"; trap - EXIT
|
||||
fi
|
||||
# scheduling (main, 7 Oct 2026): a gate announces itself (gate-pending-<pid>) and takes the next free slot; a suite, bench or
|
||||
# other non-gate run that has not taken a slot yet yields while any gate-pending marker younger than 15 min exists
|
||||
gatefile=""
|
||||
if [ "${BR_PRIORITY:-normal}" = gate ]; then gatefile="$SLOTS_DIR/gate-pending-$BR_PID"; holder_line 0 > "$gatefile"; trap 'rm -f "$gatefile"' EXIT
|
||||
else
|
||||
yt0=$(date +%s)
|
||||
while pending=$(find "$SLOTS_DIR" -maxdepth 1 -name 'gate-pending-*' -mmin -15 2>/dev/null | head -1) && [ -n "$pending" ]; do
|
||||
[ -f "$waitfile" ] || { echo "build-remote: a gate is queued ($(head -c 120 "$pending")), this ${BR_KIND:-run} yields" >&2; holder_line 0 > "$waitfile"; trap 'rm -f "$waitfile"' EXIT; }
|
||||
[ $(( $(date +%s) - yt0 )) -lt 7200 ] || give_up "the queued gate"
|
||||
sleep 5
|
||||
done
|
||||
fi
|
||||
got=""
|
||||
for k in $(seq 0 $((slots - 1))); do
|
||||
exec {fd}>>"$SLOTS_DIR/build-$k"
|
||||
|
|
@ -349,8 +362,11 @@ else
|
|||
exec {tfd}>&-
|
||||
done
|
||||
if [ "$held" -gt 1 ]; then BR_JOBS=$JOBS_SHARED; else BR_JOBS=$JOBS_ALONE; fi
|
||||
# the bounded classes cap the jobs (suite and bench: 32 unless the caller passed --priority gate)
|
||||
if [ "${BR_JOBS_CAP:-0}" -gt 0 ] && [ "$BR_JOBS" -gt "$BR_JOBS_CAP" ]; then BR_JOBS=$BR_JOBS_CAP; fi
|
||||
export CARGO_BUILD_JOBS="$BR_JOBS" BR_JOBS
|
||||
echo "build-remote: holding build-$got on $BR_HOST (waited $waited s; $held of $slots slots held, CARGO_BUILD_JOBS=$BR_JOBS)" >&2
|
||||
[ -n "$gatefile" ] && { rm -f "$gatefile"; trap - EXIT; }
|
||||
echo "build-remote: holding build-$got on $BR_HOST (waited $waited s; $held of $slots slots held, CARGO_BUILD_JOBS=$BR_JOBS, kind ${BR_KIND:-other}, nice ${BR_NICE:-0}, cores $( [ "${BR_CORES:-0}" = 0 ] && nproc || echo "$BR_CORES"))" >&2
|
||||
fi
|
||||
|
||||
release_slot() { if [ "$got" = measure ]; then : > "$SLOTS_DIR/measure"; else : > "$SLOTS_DIR/build-$got"; fi; }
|
||||
|
|
@ -403,7 +419,11 @@ t1=$(date +%s)
|
|||
# streams stay where they were for the Mac (stdout to stdout, stderr to stderr), each teed into the run log
|
||||
RUN_LOG_DIR="$LOG_DIR/runs"; mkdir -p "$RUN_LOG_DIR"
|
||||
BR_RUN_LOG="$RUN_LOG_DIR/$BR_HOST-$BR_T0-$BR_PID.log"; export BR_RUN_LOG
|
||||
( eval "$BR_CMD" ) > >(tee -a "$BR_RUN_LOG") 2> >(tee -a "$BR_RUN_LOG" >&2)
|
||||
# the class's nice and core set apply to the command's subshell and everything it starts (renice and taskset on the subshell's own
|
||||
# pid, BASHPID; cores are the LAST N of the box's set, so gates and builds keep the first ones to themselves)
|
||||
ncpu=$(nproc); cores_str="0-$((ncpu - 1))"
|
||||
if [ "${BR_CORES:-0}" -gt 0 ] && [ "${BR_CORES}" -lt "$ncpu" ]; then cores_str="$((ncpu - BR_CORES))-$((ncpu - 1))"; fi
|
||||
( [ "${BR_NICE:-0}" -gt 0 ] && renice -n "$BR_NICE" -p $BASHPID >/dev/null 2>&1; [ "$cores_str" != "0-$((ncpu - 1))" ] && taskset -cp "$cores_str" $BASHPID >/dev/null 2>&1; eval "$BR_CMD" ) > >(tee -a "$BR_RUN_LOG") 2> >(tee -a "$BR_RUN_LOG" >&2)
|
||||
rc=$?
|
||||
wait
|
||||
t2=$(date +%s); secs=$(( t2 - t1 ))
|
||||
|
|
@ -426,8 +446,8 @@ elif [[ "$BR_CMD" == cargo\ test* ]] && { [[ "$BR_CMD" == *" -- "* ]] || grep -q
|
|||
echo "build-remote: REFUSED after the run: the test filter matched no test in any binary (every 'running 0 tests'); check the name" >&2
|
||||
fi
|
||||
export BR_CLASS
|
||||
printf 'build-remote: RESULT rc=%s secs=%s compiles=%s sccache_hits=%s sccache_misses=%s sccache_hits_total=%s sccache_misses_total=%s jobs=%s load=%s class=%s\n' \
|
||||
"$rc" "$secs" "$compiles" "$hits" "$misses" "${hits_after:-?}" "${misses_after:-?}" "${BR_JOBS:-measure}" "$(cut -d' ' -f1-3 /proc/loadavg)" "${BR_CLASS:-ok}"
|
||||
printf 'build-remote: RESULT rc=%s secs=%s compiles=%s sccache_hits=%s sccache_misses=%s sccache_hits_total=%s sccache_misses_total=%s jobs=%s nice=%s cores=%s load=%s class=%s\n' \
|
||||
"$rc" "$secs" "$compiles" "$hits" "$misses" "${hits_after:-?}" "${misses_after:-?}" "${BR_JOBS:-measure}" "${BR_NICE:-0}" "$( [ "${BR_CORES:-0}" = 0 ] && nproc || echo "$BR_CORES")" "$(cut -d' ' -f1-3 /proc/loadavg)" "${BR_CLASS:-ok}"
|
||||
jsonlog "$rc" "$([ "$got" = measure ] && echo "" || echo "$got")" "$waited" "$t1" "$t2" "$secs" "$compiles" "$hits" "$misses" "${hits_after:-}" "${misses_after:-}"
|
||||
[ "$rc" = 0 ] || redlog "$rc" "$secs" "$BR_CLASS"
|
||||
release_slot
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ main{flex:1}
|
|||
<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="Menu"><span class="bars"></span></button>
|
||||
<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>
|
||||
|
|
@ -71,11 +71,7 @@ main{flex:1}
|
|||
<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="/bench" data-nav="bench">Engineering log</a>
|
||||
<a href="/evidence" data-nav="evidence">Evidence</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener">GitHub</a>
|
||||
<a href="/miner#get" class="btn primary">Download the miner</a>
|
||||
<a href="/miner#get" class="btn primary">Download</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
|
@ -83,7 +79,7 @@ main{flex:1}
|
|||
(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');document.documentElement.style.overflow=o?'hidden':'';}
|
||||
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();}});
|
||||
|
|
@ -93,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>
|
||||
|
|
@ -111,16 +108,21 @@ main{flex:1}
|
|||
<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="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/litepaper#shoulders">Built on the shoulders</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,26 +130,29 @@ 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="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener"><svg viewBox="0 0 24 24" width="15" height="15" 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>GitHub, spec and vectors</a>
|
||||
<a href="/miner#get">Miner downloads: devnet build</a>
|
||||
<a href="mailto:hello@igneum.network">Report a flaw: hello@igneum.network</a>
|
||||
<a href="https://github.com/igneum-network/spec/issues" rel="noopener">Or open an issue on the spec</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 · <a href="mailto:hello@igneum.network">hello@igneum.network</a></span>
|
||||
<span>© 2026 Igneum. Nothing on this page is an offer to sell anything.</span>
|
||||
<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">igneum.network</span>
|
||||
<span class="mono foot-copy">© 2026 Igneum · not an offer to sell anything</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
|
@ -161,6 +166,8 @@ main{flex:1}
|
|||
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 -->
|
||||
|
|
|
|||
|
|
@ -111,7 +111,7 @@ main{padding-bottom:var(--sec)}
|
|||
<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="Menu"><span class="bars"></span></button>
|
||||
<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>
|
||||
|
|
@ -119,11 +119,7 @@ main{padding-bottom:var(--sec)}
|
|||
<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="/bench" data-nav="bench">Engineering log</a>
|
||||
<a href="/evidence" data-nav="evidence">Evidence</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener">GitHub</a>
|
||||
<a href="/miner#get" class="btn primary">Download the miner</a>
|
||||
<a href="/miner#get" class="btn primary">Download</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
|
@ -131,7 +127,7 @@ main{padding-bottom:var(--sec)}
|
|||
(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');document.documentElement.style.overflow=o?'hidden':'';}
|
||||
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();}});
|
||||
|
|
@ -141,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>
|
||||
|
|
@ -166,16 +163,21 @@ main{padding-bottom:var(--sec)}
|
|||
<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="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/litepaper#shoulders">Built on the shoulders</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,26 +185,29 @@ 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="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener"><svg viewBox="0 0 24 24" width="15" height="15" 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>GitHub, spec and vectors</a>
|
||||
<a href="/miner#get">Miner downloads: devnet build</a>
|
||||
<a href="mailto:hello@igneum.network">Report a flaw: hello@igneum.network</a>
|
||||
<a href="https://github.com/igneum-network/spec/issues" rel="noopener">Or open an issue on the spec</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 · <a href="mailto:hello@igneum.network">hello@igneum.network</a></span>
|
||||
<span>© 2026 Igneum. Nothing on this page is an offer to sell anything.</span>
|
||||
<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">igneum.network</span>
|
||||
<span class="mono foot-copy">© 2026 Igneum · not an offer to sell anything</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
|
@ -216,6 +221,8 @@ main{padding-bottom:var(--sec)}
|
|||
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 -->
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
// Igneum live devnet feed. GET /api/live returns what tools/observer wrote to Neon:
|
||||
// {now, state (incl. height = chain block number), blocks (last 90 s, or ?window=N up to 300), miners (last 10 min), events (last 30), finality (checkpoints, newest lock),
|
||||
// {now, state (incl. height = chain block number), blocks (last 90 s, or ?window=N up to 1800, at most 1,800 blocks), miners (last 10 min), events (last 30), finality (checkpoints, newest lock),
|
||||
// proving (activation and 10-minute counts; every chain block carries shards: [{i, state, prover, lag, payout}])}.
|
||||
// Five queries, all on indexed columns. Cached one second at the edge.
|
||||
// LIVE_TABLE_PREFIX (default empty) reads a test observer's tables (fintest_live_*, provtest_live_*) instead of the devnet's.
|
||||
|
|
@ -37,9 +37,13 @@ export default async function handler(req, res) {
|
|||
}
|
||||
try {
|
||||
const sql = neon();
|
||||
// ?window=N seconds of blocks (30 to 300, default 90): the page's diagnostic long view; the row cap keeps a busy DAG bounded
|
||||
// ?window=N seconds of blocks (30 to 1800, default 90): the page's long views; the row cap of 1,800 blocks keeps a busy DAG bounded
|
||||
// (7 October 2026: the cap was 300 s while proofs land two to five minutes after the block, so no window could show a proven block)
|
||||
const q = new URL(req.url || '/', 'http://x').searchParams;
|
||||
const windowS = Math.max(30, Math.min(300, Number(q.get('window')) || 90));
|
||||
const windowS = Math.max(30, Math.min(1800, Number(q.get('window')) || 90));
|
||||
// ?summary=1: the counts of the window alone (blocks, chain blocks, proven, shards by state), for a tile that reads a long
|
||||
// window every 10 s while the scene keeps its short one (7 October 2026); no block rows, no miners, no events
|
||||
const summary = q.get('summary') === '1';
|
||||
const [head, blockRows, minerRows, checkpointRows, proofRows] = await Promise.all([
|
||||
sql(`SELECT now() AS now,
|
||||
(SELECT row_to_json(s) FROM ${T}live_state s WHERE s.id = 1) AS state,
|
||||
|
|
@ -49,7 +53,7 @@ export default async function handler(req, res) {
|
|||
FROM ${T}live_blocks
|
||||
WHERE received_at > now() - ($1 || ' seconds')::interval
|
||||
ORDER BY received_at DESC
|
||||
LIMIT 2000`, [String(windowS)]),
|
||||
LIMIT 1800`, [String(windowS)]),
|
||||
sql(`SELECT vote_key_hash, count(*)::int AS blocks, max(received_at) AS last_seen, max(engine) AS engine, max(miner_address) AS address
|
||||
FROM ${T}live_blocks
|
||||
WHERE received_at > now() - interval '10 minutes' AND vote_key_hash IS NOT NULL
|
||||
|
|
@ -60,11 +64,13 @@ export default async function handler(req, res) {
|
|||
FROM ${T}live_checkpoints
|
||||
ORDER BY index DESC
|
||||
LIMIT 40`).catch(() => []),
|
||||
// Proving v0: the planned shards of the chain blocks in the window and what became of them (an older observer has no table)
|
||||
sql(`SELECT block_hash, shard, shards, state, prover, lag_daa, payout_wei, pgas
|
||||
FROM ${T}live_proofs
|
||||
WHERE received_at > now() - ($1 || ' seconds')::interval
|
||||
ORDER BY block_hash, shard`, [String(windowS + 30)]).catch(() => []),
|
||||
// Proving v0: the planned shards of the blocks in the window and what became of them (an older observer has no table).
|
||||
// The rows are joined by block hash, never by when the plan or the proof landed: a block in view carries its shard
|
||||
// states (planned, proving, verified, paid) whatever its age, and the proof's own landing is what moves them.
|
||||
sql(`SELECT p.block_hash, p.shard, p.shards, p.state, p.prover, p.lag_daa, p.payout_wei, p.pgas
|
||||
FROM ${T}live_proofs p
|
||||
WHERE p.block_hash IN (SELECT hash FROM ${T}live_blocks WHERE received_at > now() - ($1 || ' seconds')::interval ORDER BY received_at DESC LIMIT 1800)
|
||||
ORDER BY p.block_hash, p.shard`, [String(windowS)]).catch(() => []),
|
||||
]);
|
||||
|
||||
const now = new Date(head[0].now).getTime();
|
||||
|
|
@ -170,6 +176,10 @@ export default async function handler(req, res) {
|
|||
// peer events never carry an address on the public API (review round 4, R4.6.2); older stored rows are redacted here too
|
||||
const events = (head[0].events || []).map(e => ({ ts: e.ts, kind: e.kind, text: String(e.text).replace(/\b\d{1,3}(\.\d{1,3}){3}(:\d+)?\b/g, 'a peer') }));
|
||||
|
||||
if (summary) {
|
||||
const by = {}; for (const b of blocks) for (const x of b.shards) by[x.state] = (by[x.state] || 0) + 1;
|
||||
return res.status(200).json({ ok: true, now: new Date(now).toISOString(), window: windowS, stale, blocks: blocks.length, chain: blocks.filter(b => b.chain).length, planned: blocks.filter(b => b.shards.length).length, proven: blocks.filter(b => b.proven).length, shards: by, proving });
|
||||
}
|
||||
return res.status(200).json({ ok: true, now: new Date(now).toISOString(), state, blocks, miners, events, finality, proving });
|
||||
} catch (e) {
|
||||
res.setHeader('Cache-Control', 'no-store');
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@
|
|||
<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="Menu"><span class="bars"></span></button>
|
||||
<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>
|
||||
|
|
@ -93,11 +93,7 @@
|
|||
<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="/bench" data-nav="bench">Engineering log</a>
|
||||
<a href="/evidence" data-nav="evidence">Evidence</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener">GitHub</a>
|
||||
<a href="/miner#get" class="btn primary">Download the miner</a>
|
||||
<a href="/miner#get" class="btn primary">Download</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
|
@ -105,7 +101,7 @@
|
|||
(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');document.documentElement.style.overflow=o?'hidden':'';}
|
||||
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();}});
|
||||
|
|
@ -118,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>
|
||||
|
|
@ -330,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.17 · 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.17 · 41.9 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>
|
||||
|
|
@ -354,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.17 · 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">
|
||||
|
|
@ -363,16 +360,21 @@
|
|||
<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="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/litepaper#shoulders">Built on the shoulders</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,26 +382,29 @@
|
|||
<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="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener"><svg viewBox="0 0 24 24" width="15" height="15" 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>GitHub, spec and vectors</a>
|
||||
<a href="/miner#get">Miner downloads: devnet build</a>
|
||||
<a href="mailto:hello@igneum.network">Report a flaw: hello@igneum.network</a>
|
||||
<a href="https://github.com/igneum-network/spec/issues" rel="noopener">Or open an issue on the spec</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 · <a href="mailto:hello@igneum.network">hello@igneum.network</a></span>
|
||||
<span>© 2026 Igneum. Nothing on this page is an offer to sell anything.</span>
|
||||
<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">igneum.network</span>
|
||||
<span class="mono foot-copy">© 2026 Igneum · not an offer to sell anything</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
|
@ -413,6 +418,8 @@
|
|||
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 -->
|
||||
|
|
|
|||
369
site/bench.html
|
|
@ -111,7 +111,7 @@ main{padding-bottom:var(--sec)}
|
|||
<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="Menu"><span class="bars"></span></button>
|
||||
<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>
|
||||
|
|
@ -119,11 +119,7 @@ main{padding-bottom:var(--sec)}
|
|||
<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="/bench" data-nav="bench">Engineering log</a>
|
||||
<a href="/evidence" data-nav="evidence">Evidence</a>
|
||||
<a href="/explorer">Explorer</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener">GitHub</a>
|
||||
<a href="/miner#get" class="btn primary">Download the miner</a>
|
||||
<a href="/miner#get" class="btn primary">Download</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
|
@ -131,7 +127,7 @@ main{padding-bottom:var(--sec)}
|
|||
(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');document.documentElement.style.overflow=o?'hidden':'';}
|
||||
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();}});
|
||||
|
|
@ -141,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>
|
||||
|
|
@ -167,16 +164,21 @@ main{padding-bottom:var(--sec)}
|
|||
<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="/litepaper#limits">What Igneum does not claim</a>
|
||||
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
||||
<a href="/litepaper#shoulders">Built on the shoulders</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,26 +186,29 @@ 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="/journey">Journey</a>
|
||||
<a href="/metamask">Add Igneum to MetaMask</a>
|
||||
<a href="https://github.com/igneum-network/spec" rel="noopener"><svg viewBox="0 0 24 24" width="15" height="15" 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>GitHub, spec and vectors</a>
|
||||
<a href="/miner#get">Miner downloads: devnet build</a>
|
||||
<a href="mailto:hello@igneum.network">Report a flaw: hello@igneum.network</a>
|
||||
<a href="https://github.com/igneum-network/spec/issues" rel="noopener">Or open an issue on the spec</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 · <a href="mailto:hello@igneum.network">hello@igneum.network</a></span>
|
||||
<span>© 2026 Igneum. Nothing on this page is an offer to sell anything.</span>
|
||||
<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">igneum.network</span>
|
||||
<span class="mono foot-copy">© 2026 Igneum · not an offer to sell anything</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
|
@ -217,6 +222,8 @@ main{padding-bottom:var(--sec)}
|
|||
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 -->
|
||||
|
|
|
|||
211
site/build.mjs
|
|
@ -51,7 +51,8 @@ const HEAD = partial('head.html'), NAV = partial('nav.html'), FOOT = partial('fo
|
|||
function navFor(active) {
|
||||
if (!active) return NAV;
|
||||
const re = new RegExp(`(<a href="[^"]*" data-nav="${active}")`);
|
||||
if (!re.test(NAV)) throw new Error(`nav: no link with data-nav="${active}"`);
|
||||
// a page outside the six header items (the log, the evidence page, the explorer, the bench table, the faucet) underlines nothing
|
||||
if (!re.test(NAV)) return NAV;
|
||||
return NAV.replace(re, '$1 aria-current="page"');
|
||||
}
|
||||
function inject(html, name, content, file) {
|
||||
|
|
@ -90,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>
|
||||
|
|
@ -103,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>`;
|
||||
}
|
||||
|
|
@ -161,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.
|
||||
|
|
@ -338,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;
|
||||
}
|
||||
|
|
@ -408,7 +415,153 @@ 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)
|
||||
{ const check = join(here, '..', 'tools', 'ci', 'site-nav-check.mjs'); if (existsSync(check)) { const { spawnSync } = await import('node:child_process'); const r = spawnSync(process.execPath, [check, here], { stdio: 'inherit' }); if (r.status !== 0) process.exit(r.status || 1); } }
|
||||
|
|
|
|||
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>
|
||||