# Eddycoin emission spec – Kompromis-120b (emission of the Eddycoin mainnet) Status: in use on the live Eddycoin mainnet (eddycoin-mainnet-1, genesis 2026-10-27 22:45 EDT). The spec SHA-256 is committed into the mainnet genesis. The "status" text inside the signed JSON still says "planned" because the file was frozen before launch; it is not edited (its hash is locked into the genesis). The old test network, which used an earlier test schedule, has ended. ## Where the spec lives (source of truth: the Eddycoin node on Oracle) | File | URL | |---|---| | Spec (canonical JSON) | https://129-159-188-73.sslip.io/emission/kompromis-120b.json | | SHA-256 | https://129-159-188-73.sslip.io/emission/kompromis-120b.json.sha256 | | Detached Ed25519 signature (hex, 64 bytes) | https://129-159-188-73.sslip.io/emission/kompromis-120b.json.sig | | Signing public key (hex, raw 32 bytes) | https://129-159-188-73.sslip.io/emission/emission-signing.pub | Static files, GET/HEAD only. Cloudflare Pages runs no server logic for this; it only serves the renderer script (`emission-verified.js`) and a cached copy under `/emission/` that is verified the same way and labelled as non-authoritative. - Spec SHA-256: `0a70d671ca52094d7eaa82c7b43122bce4f9bba1281f79d0ca1211b99c27cfb7` - Signing key fingerprint (SHA-256 of the raw 32-byte Ed25519 public key): `b62ce8abf98a9c3d2416bee74766ed4d847afb5f3a9cd999bf4f07c4f3d591a5` Canonical JSON = `json.dumps(spec, sort_keys=True, separators=(",", ":"), ensure_ascii=True)` + one newline. All amounts are strings of whole units (1 EDDY = 100,000,000 units). ## How the website verifies it 1. Downloads the JSON, `.sig`, `.sha256` and `emission-signing.pub` from the node. 2. Checks SHA-256 of the key against the fingerprint pinned in the page (``). 3. Checks SHA-256 of the JSON against the `.sha256` file and verifies the Ed25519 signature (WebCrypto Ed25519; browsers without it load the self-hosted tweetnacl 1.0.3 with Subresource Integrity). 4. Recomputes the whole integer schedule from the consensus constants (BigInt) and compares it with the signed tables. 5. Only then shows the table and charts, with a "Verified" badge. If the node is unreachable it tries the cached copy on the site (same checks, badge "Verified cached copy"). If nothing verifies, no numbers are shown. ## Verify it yourself python3 verify_emission.py # downloads from the node python3 verify_emission.py --dir ./copy # local copies Python 3.8+, standard library only. Exit code 0 = signature, hash, key fingerprint and the recomputed schedule all match. ## Consensus rule (integer) epoch_length = 9740, epochs N = 12960 (108 epochs per year, 120 years), end checkpoint = 126,230,400 F_0 = F0; F_(k+1) = floor(F_k * Q / 2^40) m = 2N - 2k - 1; s_k = floor((F_k + C) * m^2 / (4 N^2)); s_k -= s_k mod 2 (even -> exact 50/50 split) checkpoint h in epoch k = floor((h-1)/epoch_length) gets s_k; the final checkpoint also gets the exact remainder; the sum is exactly the cap. Constants F0, C, Q and the remainder are in the signed JSON. ## Honest limits The signature proves the file was produced by the holder of the emission signing key and was not changed on the way. It does not make the schedule immutable: whoever controls the key, the Oracle server or the website could publish a new file (the website would show it only if it is signed by the pinned key; changing the pinned key needs a site change). Real immutability comes only when the formula is hard-coded in node consensus and the spec SHA-256 is committed into the new chain's genesis. On the mainnet both are done: the formula is built into every node and the spec SHA-256 is in genesis.json (field emission.spec_sha256, genesis id f720818b202072d10b8b694d39eba3f17bb8a82d8597a92688057a5016f4746a).