{
  "meta": {
    "title": "How an IOTA miner gets paid",
    "route": "/iota/atlas/mining/",
    "kick": "05 · Mining",
    "crumb": "Mining",
    "summary": "Mining on IOTA means holding one layer of a model that many machines train together. You are paid when your layer's work passes checks that Macrocosmos's coordinator (the orchestrator, in its code) supplies and scores.",
    "result": "Three of subnet 9's 256 slots earn. On 4 Oct 2026 one of them, UID 171, took 94.0% of what miners are paid, and 4.9% burned at the owner's slot.",
    "chain_read": "2 and 4 Oct 2026",
    "read": "2 Oct 2026, 04:33 UTC",
    "block": 9192756,
    "repo_head": "22d702a",
    "repo_version": "v4.12.10, 30 Aug 2026",
    "lede": "Read from the public code, the docs, the paper and the chain, by someone outside Macrocosmos. Every line links to where it was read."
  },
  "sources": {
    "ws": {"t": "weight_setting.py, line 12: validators fetch global_miner_scores", "u": "https://github.com/macrocosm-os/iota/blob/22d702acd07453dabb187abedfad185826091341/src/validator/src/validator/utils/weight_setting.py#L12"},
    "ws_fb": {"t": "weight_setting.py, line 130: fallback copies other validators' weights", "u": "https://github.com/macrocosm-os/iota/blob/22d702acd07453dabb187abedfad185826091341/src/validator/src/validator/utils/weight_setting.py#L130"},
    "vs": {"t": "validator settings.py, lines 14 to 21: 21-minute interval, thresholds", "u": "https://github.com/macrocosm-os/iota/blob/22d702acd07453dabb187abedfad185826091341/src/validator/src/validator/settings.py#L14-L21"},
    "zip": {"t": "validator.py, line 106: validator code arrives as a zip from the orchestrator", "u": "https://github.com/macrocosm-os/iota/blob/22d702acd07453dabb187abedfad185826091341/src/validator/src/validator/validator.py#L106"},
    "owner": {"t": "common settings.py, line 25: OWNER_UID = 209", "u": "https://github.com/macrocosm-os/iota/blob/22d702acd07453dabb187abedfad185826091341/shared/common/src/common/settings.py#L25"},
    "model": {"t": "api_models.py, lines 223 to 288: MinerScore, RunIncentiveAllocation, SubnetScores", "u": "https://github.com/macrocosm-os/iota/blob/22d702acd07453dabb187abedfad185826091341/shared/common/src/common/models/api_models.py#L223-L288"},
    "kick": {"t": "run_metadata.py, line 7: kick policies and tiers", "u": "https://github.com/macrocosm-os/iota/blob/22d702acd07453dabb187abedfad185826091341/shared/common/src/common/models/run_metadata.py#L7"},
    "miner": {"t": "miner_api_client.py: the miner's endpoints", "u": "https://github.com/macrocosm-os/iota/blob/22d702acd07453dabb187abedfad185826091341/shared/subnet/src/subnet/miner_api_client.py"},
    "attest": {"t": "attestation_utils.py, line 28: imports common.attest, absent from the repo", "u": "https://github.com/macrocosm-os/iota/blob/22d702acd07453dabb187abedfad185826091341/src/miner/src/miner/utils/attestation_utils.py#L28"},
    "pool": {"t": "main_pool.py, line 38: imports miner.pool, absent from the repo", "u": "https://github.com/macrocosm-os/iota/blob/22d702acd07453dabb187abedfad185826091341/src/miner/main_pool.py#L38"},
    "payout": {"t": "miner_api_client.py, line 197: payout coldkey set with the orchestrator", "u": "https://github.com/macrocosm-os/iota/blob/22d702acd07453dabb187abedfad185826091341/shared/subnet/src/subnet/miner_api_client.py#L197"},
    "old": {"t": "validator.py before v2.0.0, lines 108 to 165: recompute, magnitude gate, cosine, +1 or -3", "u": "https://github.com/macrocosm-os/iota/blob/4bb075dcada4ed2f2416f4a7e38d0803492efb9a/src/validator/src/validator/validator.py#L108-L165"},
    "v2": {"t": "Commit fb83f78, 27 Nov 2025: v2.0.0", "u": "https://github.com/macrocosm-os/iota/commit/fb83f78"},
    "docs": {"t": "Docs: Scoring, Rewards and Kicking (added 6 Aug 2026)", "u": "https://docs.macrocosmos.ai/subnets/subnet-9-iota/scoring-rewards-and-kicking"},
    "tah": {"t": "Docs: Train at Home FAQ (21 Jul 2026)", "u": "https://docs.macrocosmos.ai/product-and-services/tah/faqs"},
    "paper": {"t": "IOTA: A Technical Primer for Release, arXiv 2507.17766 (16 Jul 2025)", "u": "https://arxiv.org/abs/2507.17766"},
    "primer": {"t": "The paper, explained on this site", "u": "/iota/atlas/papers/iota-primer/"},
    "chain": {"t": "Bittensor finney, netuid 9, metagraph and weights at block 9192756", "u": "https://taostats.io/subnets/9/metagraph"},
    "issues": {"t": "macrocosm-os/iota issues #190 to #211, September 2026", "u": "https://github.com/macrocosm-os/iota/issues"},
    "wp": {"t": "LLM Pretraining: The Use-Case Blockchain Has Been Waiting For? The subnet 9 whitepaper (Aug 2024)", "u": "https://www.macrocosmos.ai/research/pretraining_whitepaper.pdf"},
    "btc": {"t": "Bitcoin: A Peer-to-Peer Electronic Cash System (the whitepaper)", "u": "https://bitcoin.org/bitcoin.pdf"},
    "eth": {"t": "ethereum.org: Proof-of-stake", "u": "https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/"},
    "yuma": {"t": "Bittensor docs: Yuma Consensus", "u": "https://docs.learnbittensor.org/learn/yuma-consensus"},
    "orion": {"t": "Macrocosmos Substack: Orion-100B (1 Jun 2026)", "u": "https://macrocosmosai.substack.com/"}
  },
  "mechanic": {
    "iota": {
      "k": "IOTA, subnet 9",
      "layers": 5, "peers": 3,
      "orc": "Macrocosmos's coordinator",
      "orc_t": "registers each miner on a layer, supplies the checks, sets the score and the weights",
      "fwd": "activations pass forward", "back": "gradients pass back", "merge": "miners on one layer merge their weights",
      "out": ["validators relay the weights", "the chain pays alpha", "the unearned share burns"],
      "steps": ["1. Forward: each layer passes its activations to the next.", "2. Back: gradients return, layer by layer.", "3. The coordinator's checks score each miner's work.", "4. Pay: validators relay the weights, the chain pays, the rest burns."],
      "t": "Each miner takes one layer of a run: it pulls activations from the layer before, runs forward and backward, and passes its own on.", "l": "verified", "s": ["miner"],
      "paid": "your layer's work passing the checks, summed over about a day", "paid_s": ["docs"],
      "judge": "Macrocosmos's coordinator, in code that has not been public since 27 November 2025", "judge_l": "verified", "judge_s": ["ws", "zip"],
      "cap": "Schematic. Layers and machines per layer vary by run; Orion-100B ran on 48 single-A100 peers.", "cap_s": ["orion"]
    },
    "else_k": "Mining elsewhere",
    "else": [
      {"k": "Bitcoin", "art": "race", "t": "Every miner races at the same puzzle. The first to solve it takes the block reward.", "paid": "winning the race", "judge": "anyone, by checking one hash", "l": "stated", "s": ["btc"]},
      {"k": "Ethereum", "art": "stake", "t": "Validators lock up ETH and take turns proposing and attesting to blocks.", "paid": "staking and showing up", "judge": "the protocol's public rules", "l": "stated", "s": ["eth"]},
      {"k": "A typical Bittensor subnet", "art": "rank", "t": "Every miner answers the same kind of task. Validators score the answers and the chain pays by their ranking.", "paid": "ranking well among miners", "judge": "validators, running the subnet's code", "l": "inferred", "s": ["yuma"]}
    ]
  },
  "families": {
    "note": "The grouping is mine; the subnet 9 entries are from its own record.",
    "gist": "Contest, proof of resource, work to a spec, scored contribution, managed production. Subnet 9 has stood in three of them.",
    "judges": {"validators": "Validators judge, by rules anyone can read", "owner": "The owner judges"},
    "items": [
      {"k": "Contest", "pays": "Miners submit an entry. The best takes most of the pay.", "judge": "validators", "state": "past", "when": "2024", "t": "Subnet 9 ran as a winner-takes-all pretraining contest.", "l": "stated", "s": ["wp"]},
      {"k": "Proof of resource", "pays": "Miners supply hardware. Pay follows what is shown to be there and serving.", "judge": "validators", "state": "none"},
      {"k": "Work to a spec", "pays": "Miners deliver units of work that can be checked. Each unit that passes is paid.", "judge": "validators", "state": "past", "when": "Until Nov 2025", "t": "Validators recomputed each miner's work in open code: fail below 0.8 magnitude or 0.9 cosine.", "l": "verified", "s": ["old"]},
      {"k": "Scored contribution", "pays": "Miners add to one shared result. Pay follows each miner's measured effect on it.", "judge": "validators", "state": "planned", "when": "Planned", "t": "The paper names this as future work, under the name CLASP.", "l": "stated", "s": ["paper"]},
      {"k": "Managed production", "pays": "The owner assigns the work, checks it with its own code, sets the pay and routes it through a pool.", "judge": "owner", "state": "now", "when": "Since 27 Nov 2025", "t": "Subnet 9 today. The scoring code left the public repo for a zip from the coordinator.", "l": "verified", "s": ["v2", "zip"]}
    ]
  },
  "axes": {
    "usual_s": ["yuma"],
    "rows": [
      {"k": "Who computes the score", "usual": "Each validator, running the subnet's scoring code", "t": "Macrocosmos's coordinator. Each validator fetches a finished weight vector and sets it on chain every 21 minutes.", "l": "verified", "s": ["ws", "vs"]},
      {"k": "What is paid for", "usual": "Winning, or work anyone can check", "t": "Passing the coordinator's checks on assigned work, summed over a rolling window of about a day.", "l": "stated", "s": ["docs", "model"]},
      {"k": "Who earns", "usual": "Any registered slot that performs", "t": "Three of 256 UIDs. One of them is the owner's, where the unpaid share burns.", "l": "verified", "s": ["chain", "owner"]},
      {"k": "How pay arrives", "usual": "Alpha on chain, by weight", "t": "Alpha on chain to registered slots. Off chain, about every 24 hours, to Train at Home miners.", "l": "stated", "s": ["tah", "payout"]},
      {"k": "Can the scoring be read", "usual": "In the subnet's public repo", "t": "Not since 27 November 2025. Validators receive the code as a zip when they start.", "l": "verified", "s": ["zip", "v2"]}
    ]
  },
  "chain": {
    "readings": [
      {"date": "4 Oct 2026", "time": "02:21 UTC", "block": 9206495, "alt": "4 Oct 2026: UID 171 took 94.0 percent, UID 128 1.1 percent, UID 209 4.9 percent, burned",
       "shares": [{"uid": 171, "share": 0.940}, {"uid": 128, "share": 0.0106}, {"uid": 209, "share": 0.0494}]},
      {"date": "2 Oct 2026", "time": "04:33 UTC", "block": 9192756, "alt": "2 Oct 2026: UID 171 took 64.0 percent, UID 128 25.7 percent, UID 209 10.2 percent, burned",
       "shares": [{"uid": 171, "share": 0.6401}, {"uid": 128, "share": 0.2574}, {"uid": 209, "share": 0.1025}]}
    ],
    "readings_s": ["chain", "owner"],
    "gist": "Ten validators set the same weight for UID 171 at each reading: 0.64 on 2 Oct, 0.94 on 4 Oct.",
    "validators_at": "2 Oct 2026, block 9,192,756",
    "earners": [
      {"uid": 171, "tag": "", "share": 0.6401, "note": "No stake, no validator permit. Registered at block 8944744.", "l": "verified"},
      {"uid": 128, "tag": "", "share": 0.2574, "note": "Validator permit, sets no weights. Registered at block 8944745, one block after 171.", "l": "verified"},
      {"uid": 209, "tag": ", burned", "share": 0.1025, "note": "The owner hotkey, Owner9. The code names it the burn sink.", "l": "verified"}
    ],
    "others": 253,
    "who": "171 and 128 each sit alone on a coldkey with no identity, registered one block apart. They are most likely Macrocosmos's own pool and provisioning keys. If so, no independent miner earned from SN9 directly on 2 Oct 2026. On 4 Oct the same three UIDs earned.",
    "who_l": "inferred",
    "validators": [
      {"uid": 109, "name": "Macrocosmos", "w": [0.64, 0.2574, 0.1026]},
      {"uid": 254, "name": "", "w": [0.64, 0.2574, 0.1026]},
      {"uid": 148, "name": "", "w": [0.64, 0.2329, 0.1271]},
      {"uid": 22, "name": "", "w": [0.64, 0.2575, 0.1025]},
      {"uid": 236, "name": "", "w": [0.64, 0.2574, 0.1026]},
      {"uid": 40, "name": "", "w": [0.64, 0.2329, 0.1271]},
      {"uid": 64, "name": "", "w": [0.64, 0.2575, 0.1025]},
      {"uid": 68, "name": "", "w": [0.64, 0.2574, 0.1026]},
      {"uid": 76, "name": "", "w": [0.64, 0.2574, 0.1026]},
      {"uid": 117, "name": "", "w": [0.64, 0.2573, 0.1026]}
    ],
    "validators_note": "Ten validators set weights. Each gives UID 171 exactly 0.64 and sets three nonzero weights. The two that differ had updated a block or so later; the split between 128 and 209 moves from one fetch to the next, and 171 does not. The ten are Kraken, Crucible Labs, Rizzo, Datura, Macrocosmos, WildSage, Yuma, 1T1B, tao.bot and one unnamed; the page orders them by stake.",
    "drift": "About ninety minutes earlier, at block 9192281, the owner's share was 0.067. At this read it is 0.103 to 0.127. 171 stayed at 0.64 at both reads. Two days later the split had moved: at block 9206495 (4 Oct 2026, 02:21 UTC) UID 171 was at 0.940, the burn UID 209 at 0.049 and UID 128 at 0.011, and ten validators each gave UID 171 exactly 0.94."
  },
  "path": [
    {"k": "Work", "who": "Miner", "open": "public", "t": "Take one layer of a run. Pull activations, run forward and backward, submit activations, upload weights and optimizer state, merge partitions with peers.", "l": "verified", "s": ["miner"]},
    {"k": "Sign", "who": "Miner, native module", "open": "sealed", "t": "Every action answers an attestation challenge through a native module or an enclave key. The module is not in the repo; what it proves is not public.", "l": "verified", "s": ["attest"]},
    {"k": "Check", "who": "Coordinator's code, run by validators", "open": "sealed", "t": "Until November 2025: recompute the miner's activations; fail below 0.8 magnitude or 0.9 cosine. Today the docs list consistency, peer agreement, signal shape and anti-gaming checks, as examples, without thresholds.", "l": "verified", "s": ["old", "docs", "zip"]},
    {"k": "Score", "who": "Coordinator", "open": "partial", "t": "Sum a miner's scores over a rolling window of about a day, times a per-miner multiplier. A negative total drops the miner.", "l": "stated", "s": ["docs", "model"]},
    {"k": "Weight", "who": "Coordinator, relayed by validators", "open": "partial", "t": "Share of the run, times the run's share of incentive, minus the run's burn. Validators normalise it and set it on chain.", "l": "verified", "s": ["model", "ws"]},
    {"k": "Burn", "who": "Coordinator", "open": "partial", "t": "Whatever the miners do not earn goes to UID 209. A hard cap limits the miners' total share; the number is not published.", "l": "verified", "s": ["owner", "docs"]},
    {"k": "Payout", "who": "Chain, then Macrocosmos for the pool", "open": "partial", "t": "Registered miners are paid alpha by Yuma from the weights. Train at Home miners are paid off chain about every 24 hours to a coldkey they give the coordinator; a period's pay freezes if the run's loss is not at its lowest yet.", "l": "stated", "s": ["tah", "payout", "pool"]}
  ],
  "formula": {
    "lines": [
      "S<sub>m</sub> = Σ scores in the window × multiplier<sub>m</sub>",
      "weight<sub>m</sub> = S<sub>m</sub> ⁄ Σ<sub>run</sub> S<sub>k</sub> × (1 − b<sub>r</sub>) × w<sub>r</sub> × a<sub>r</sub>",
      "burn = 1 − Σ weight<sub>m</sub> → UID 209"
    ],
    "terms": [
      {"sym": "multiplier<sub>m</sub>", "what": "per-miner multiplier", "set": "Operators", "pub": "not published"},
      {"sym": "b<sub>r</sub>", "what": "the run's burn", "set": "Macrocosmos, per run", "pub": "not published; the code falls back to 0.8"},
      {"sym": "w<sub>r</sub>", "what": "the run's share of all incentive", "set": "Macrocosmos, per run", "pub": "not published"},
      {"sym": "a<sub>r</sub>", "what": "fraction of the window the run was live", "set": "The clock", "pub": "follows from run dates"},
      {"sym": "cap", "what": "most the miners can take in total", "set": "Macrocosmos", "pub": "not published"}
    ],
    "l": "verified",
    "s": ["model", "docs", "owner"]
  },
  "known": [
    {"t": "How weights reach the chain", "l": "verified"},
    {"t": "The formula from score to weight", "l": "verified"},
    {"t": "The burn sink, UID 209", "l": "verified"},
    {"t": "The check before November 2025: recompute, 0.8 magnitude, 0.9 cosine, +1 or −3", "l": "verified"},
    {"t": "The kick policies: none, bottom N, below a score; tier bans", "l": "verified"},
    {"t": "Who earned at blocks 9192756 (2 Oct 2026) and 9206495 (4 Oct 2026), and how much", "l": "verified"}
  ],
  "unknown": [
    {"t": "The checks that ran on 2 Oct 2026, and their thresholds"},
    {"t": "Whether the checks of 2 Oct 2026 still recompute the miner's work"},
    {"t": "What the attestation module proves"},
    {"t": "The burn, incentive share and multipliers of each run"},
    {"t": "The cap on the miners' share"},
    {"t": "Who controls UIDs 171 and 128"},
    {"t": "How Train at Home splits its pay among Macs"}
  ],
  "changes": [
    {"d": "16 Jul 2025", "t": "The paper: pay per backward pass, a score that drops to zero after a set time, validators recompute the work. CLASP, the rule that credits each miner's effect on the loss, is named as future work.", "l": "stated", "s": ["paper", "primer"]},
    {"d": "5 Jun to 16 Aug 2025", "t": "Burn set in the code six times: 80, 50, 20, 80, 50, 80 percent. An inverted burn condition fixed on 12 Aug.", "l": "verified", "s": []},
    {"d": "28 Aug 2025", "t": "The burn moves to the coordinator, with 0.8 as the fallback.", "l": "verified", "s": []},
    {"d": "10 Sep 2025", "t": "Several runs at once, each with its own burn and share of incentive.", "l": "verified", "s": []},
    {"d": "13 Oct 2025", "t": "Miners answer attestation challenges.", "l": "verified", "s": ["attest"]},
    {"d": "27 Nov 2025", "t": "v2.0.0. The scoring code leaves the repo for a zip from the coordinator; the burn arrives as UID 209's weight.", "l": "verified", "s": ["v2", "zip"]},
    {"d": "20 May 2026", "t": "The docs page that described the paper's backward-pass rule is deleted.", "l": "verified", "s": []},
    {"d": "1 Jun 2026", "t": "Orion-100B trains on 48 single-A100 peers provisioned from several providers.", "l": "stated", "s": ["orion"]},
    {"d": "29 Jul 2026", "t": "Tiers for runs and miners: Iron, Bronze, Silver, Gold, and Banned.", "l": "verified", "s": ["kick"]},
    {"d": "6 Aug 2026", "t": "New docs page: scoring on forward-pass activations, a rolling day, the formula above.", "l": "verified", "s": ["docs"]},
    {"d": "Sep 2026", "t": "Miners file issues: zero earnings after 1,500 passes (#205), a registration queue reset 80 times in 34 hours (#193), a run stalled at epoch 12 (#204).", "l": "verified", "s": ["issues"]}
  ],
  "drift_summary": "Since the paper: backward passes became forward activations; exact recomputation became, at least in part, statistical checks; a short-lived score became a rolling day; no burn became a burn per run and a cap; CLASP never shipped.",
  "questions": [
    {"q": "Who controls UIDs 171 and 128? Does all miner incentive now pass through Macrocosmos's pool and provisioning?", "why": "If yes, the miner on SN9 is Macrocosmos, and the open-mining story needs new words."},
    {"q": "Why did scoring leave the public repo, and will it come back?", "why": "A validator cannot audit code it cannot read. Every allocator will ask this first."},
    {"q": "What are the live numbers: the cap, each run's burn and share, the multipliers? Is CLASP still the plan now that Liquid Compute buys priced capacity?", "why": "With those numbers anyone could check the weights against the formula."}
  ]
}
