igneum/docs/design/miner-dev-fee.md
igneum-josh 6b4ec59648 Miner dev fee: app switch and UI line, HiveOS package, Linux worker cross-build, docs and public text
Decision of 4 October 2026 (evening): the Igneum Miner software takes a visible, switchable 1% dev fee, the norm
for GPU miners; the protocol stays fee-free. The miner side (--dev-fee, the 1-in-100 template counter, the audit
command) is on branch dev-fee of the node fork.

- app: settings.dev_fee (default on) passes --dev-fee 0 to igneum-miner when off; Settings shows the miner's own
  "dev fee 1% (1 block in 100) to 0x..." line next to the rewards address with a switch; the engine parses the
  miner's start line and its dev-fee block lines (fee_session, lifetime fee_total, an event per fee block)
- packaging/hive: h-manifest.conf, h-config.sh, h-run.sh, h-stats.sh, make-hive-package.sh (igneum-hive-<v>.tar.gz
  with the Linux igneumd, igneum-miner and both GPU workers), README with the Flight Sheet, selftest.sh (bash -n,
  stub binaries, the three hooks the way Hive runs them, the stats JSON parsed). Hive itself is untested
- infra/cross/build-workers-linux.sh: the NVRTC and OpenCL workers cross-compiled for Linux with zig;
  proto-opencl/cl_dynamic.h gains the Linux dlopen branch (libOpenCL.so.1)
- tools/dev-fee/run.mjs: the fee-block test network (two nodes on 29900+, three CPU miners, payouts audit)
- docs/design/miner-dev-fee.md (mechanism, flag, lines, the DEV_FEE_ADDRESS placeholder and the devnet address),
  docs/fud-ledger.md E18 and the E5/L9 status line, litepaper "What a miner's hour looks like" paragraph, homepage
  miner section note

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 22:46:41 +01:00

4.5 KiB

The miner software's dev fee

Decision (Josh, 4 October 2026, evening): the Igneum miner software takes a visible, switchable 1% dev fee, the norm for GPU miners (lolMiner, T-Rex). The protocol stays fee-free: no dev fund, no fee to any team, foundation or fund (CLAUDE.md, litepaper). This fee is the software's, like every third-party miner's, and it is documented as such.

Mechanism

Solo mining, no pool: the miner asks its node for block templates with a payout address. One template in 100 is requested with the dev payout address instead of the user's. The choice is a template counter, never a random draw, so it is exactly 1 in 100 and anyone can audit it from the source: template n (counting from 0) is a fee template when floor((n + 1) p / 100) > floor(n p / 100), which at p = 1 is the templates 99, 199, 299, ... Every template is mined for the same time, so fee blocks are p in 100 on average.

What changes on a fee template, and what does not:

Field User template Fee template
Coinbase extra data IGNA address (the execution-layer payout the chain pays) the user's --evm-address the dev address
Vote key hash (finality weight) the user's the user's, unchanged
UTXO-side coinbase script (--address, a label address with no key in the app) the user's the user's, unchanged

So a fee block still adds to the user's finality weight, and the only thing that moves is who the execution layer pays for that block.

Source: vendor/igneum-node-v4 branch dev-fee, igneum/miner/src/main.rs, section "Software dev fee" (DevFee, fee_slot, Identity::with_dev_fee_address, template(.., fee), submit(.., fee), payouts).

The flag, the lines, the counter

Where What
igneum-miner mine ... --dev-fee <percent> whole percent of templates; default 1; --dev-fee 0 turns it off
Start line, on dev fee 1% (1 block in 100) to 0x<address>; --dev-fee 0 turns it off
Start line, off dev fee off (--dev-fee 0); the default is 1% (1 block in 100) to 0x<address>
Start line, no release address dev fee off: no release address is set (DEV_FEE_ADDRESS placeholder in igneum/miner/src/main.rs)
Per fee block accepted dev-fee block <hash>
Status line (CPU and worker modes) and MINER SUMMARY fee=N
igneum-miner payouts <grpc url> blocks per IGNA payout address over every block the node holds, with the share; the dev address is tagged (dev fee)

The app (Igneum Miner): Settings shows the same line next to the rewards address with a switch, stored in settings.json as dev_fee (default on); off passes --dev-fee 0. The dashboard's "your blocks" row shows the lifetime dev-fee block count; each fee block is also an event. The HiveOS package: DEV_FEE=0 in the Flight Sheet's extra config.

The addresses

Constant (igneum/miner/src/main.rs) Value Network
DEV_FEE_ADDRESS the placeholder string DEV_FEE_ADDRESS; Josh fills it before any public release. While it is not 40 hex the fee is off outside the devnet and the miner says so at start mainnet, testnet
DEV_FEE_ADDRESS_DEVNET 0xdfaea67368f3e3753397d878f97efe6aa8020c2e devnet and simnet only

The devnet address was generated on 4 October 2026 with the app's own key derivation (secp256k1, keccak of the uncompressed public key, app/igneum-app/src/keys.rs), checked against the known vector for key 0x01. The private key is held outside the repository (the maintainers' local secret store, mode 0600) and never in any commit. Devnet coins have no value and the devnet may be reset; this address is never a release address.

Tests and measurement

  • Unit tests (cargo test --release -p igneum-miner dev_fee_tests): exactly 100 fee templates in 10,000 at 1%, at positions 99, 199, ...; 0 at --dev-fee 0; 2, 3, 5, 10, 50 and 100% exact over 10,000; a fee template carries the dev IGNA address and the user's unchanged key reveal; the release placeholder keeps the fee off outside the devnet.
  • Test network: node tools/dev-fee/run.mjs (two nodes on 29900+, fast-time profile, proof of work skipped and the genesis target at the floor, three CPU stub miners: two at the default fee and one control at --dev-fee 0), then igneum-miner payouts on the peer node. The numbers are in docs/bench-log.md under "the software dev fee measured".

Public text

  • Litepaper, "For miners", "What a miner's hour looks like": the fee paragraph.
  • Homepage, the miner section's download note.
  • docs/fud-ledger.md: entry E18 (software-level, switchable, the audit).