Midstate
Audit date ·
Audits are prepared by the site owner with a self-hosted (local) AI, checked against the exact commit above, and hand-edited before publishing. This is not financial, legal, or investment advice. Read it as one person's notes on one commit at one date. Do your own research.
This is a point-in-time review of code quality and tokenomics at the commit above, not a safety certification. Projects can change after this date. Check for newer releases or a newer audit before relying on these scores.
Hand-written Rust L1; BLAKE3 sequential-time PoW and post-quantum WOTS+MSS signatures. No premine - the initial coins are burned as an inscription, and the coinbase must equal reward plus fees exactly.
🪙 Midstate — Code & Tokenomics Audit
Repo: ciphernom/midstate at commit f84fb78e8a761448a760e2331efa95fde3b04340 (re-cloned 2026-10-20; the 2026-10-19 pass read 493bd5a)
Date: 2026-10-17 Scope: recon, code review (money and consensus path read line by line), tokenomics, write-up. All phases ran. Skipped: on-chain supply check (no node or RPC consulted) and any third-party review of the novel crypto. Hashrate and profitability are out of scope for this scale.
Supersedes the 2026-10-16 note at cd579d9 (old scale, "risk 6/10"). Re-audited at v5.0.0 under the audit-crypto arithmetic.
🎯 Verdict: GOOD (code 8.5 / tokenomics 10.0) — moved up from GOOD on 2026-10-20
Midstate is a hand-written Rust layer-1: BLAKE3 sequential-time proof of work, post-quantum WOTS+MSS signatures, UTXO set in a sparse Merkle tree. The money path is clean. The block reward is a pure function of height, every node recomputes it, and a block's coinbase must equal reward + fees exactly or the node rejects the block. There is no premine, no mint path to the native coin, and no dev or founder share in consensus.
This scores code and tokenomics only. It says nothing about whether Midstate survives, whether it gets listed, or whether the novel cryptography holds up. One human author plus AI-generated commits, and the post-quantum signatures, the sparse Merkle tree and the ASERT variant have no independent audit. Those are survival risks, not trust problems, and they do not move this number.
Re-checked against current HEAD on 2026-10-20. Tokenomics still scores 10.0. Code moves from 6.0 to 8.5 because the MSS keygen bug is fixed: the checkpoint file is now keyed on a blake3 hash of the seed, not just the tree height (src/core/mss.rs:199-206, commit c903d7b). Two findings remain — a replay path that accepts local blocks with no cryptography at all, and a safety contract that exists only as a comment. This is a code and tokenomics judgement only; it says nothing about survival, liquidity or the fact that the author's own docs say the chain is not for real value.
🔑 At a glance
| Field | Value |
|---|---|
| Project | Midstate (unit "MS", integer values) |
| Chain / consensus | Own L1; BLAKE3 sequential-time PoW (1,000,000 iterations), ASERT difficulty, 60 s target |
| Code score | 8.5 / 10 (was 6.0 at 493bd5a) |
| Tokenomics score | 10.0 / 10 |
| Risk score | 8.5 / 10 (the lower of the two) |
| Verdict | ✅ GOOD on code and tokenomics — not a survival or liquidity judgement |
🔗 Links & sources
| What | Link | Status |
|---|---|---|
| 🏠 Homepage | https://midstate.cash | 🔍 GitHub homepage field, not fetched |
| 💻 Source | https://github.com/ciphernom/midstate at f84fb78 | ✅ cloned in this audit |
| 🔎 Explorer | not found in the README | — |
| 📄 Whitepaper | not found | — |
| 📣 Announcement | not found | — |
| 💬 Socials | not found | — |
🧮 Risk score inputs
| # | Finding | file:line | Reachable | Deduction | Applies to |
|---|---|---|---|---|---|
| 1 | ✅ FIXED at HEAD — deduct nothing. Was HIGH, reachable: MSS key generation resumed from mss_h{height}.checkpoint keyed only on the tree height, never on the seed. If keygen is interrupted and a different seed later generates a same-height key in the same directory, the old leaves are loaded, the tree no longer matches its seed, and every signature from that tree fails to verify. No seed fingerprint, no validation of what was loaded. The author's own midwimble repo fixes this in its vendored copy by keying the file on a seed fingerprint — Midstate did not take the fix back | src/core/mss.rs:113-127, src/core/mss.rs:164-170 | live (wallet keygen path) | −0 (fixed, c903d7b) | code |
| 2 | MEDIUM — apply_batch_trusted bypasses both PoW and signature checks. Used on the disk-replay and state-rebuild path, so the trust boundary is local disk: a tampered or corrupted local database is re-accepted with no cryptography. The doc-comment states the constraint ("Bypasses ALL cryptography ... MUST ONLY be used when replaying blocks loaded from the local trusted disk database"), so it is documented, not hidden | src/core/state.rs:194-204, callers src/node.rs:7406,7442,7456 | live (local replay only) | −1.0 | code |
| 3 | LOW — apply_batch_skip_pow accepts a caller-supplied verified_mining_hash. Correct as written: PoW is verified on the header chunk first (src/node.rs:4811-4830, gated at src/node.rs:4840-4850) and batch-to-header final_hash equality is re-checked per batch (src/node.rs:5162-5166). But the safety rule is a doc-comment with no runtime assertion, so a future caller can silently break it | src/core/state.rs:181-190, src/node.rs:5162-5166 | live | −0.5 | code |
| 4 | No hard cap — tail emission continues forever. The halving bottoms out at 1 unit per block and stays there. Deliberate, and stated in the docs | src/core/types.rs:996-999, DESIGN.md:68-69 | live | −0 | tokenomics |
| 5 | Issuance is enforced in consensus: coinbase total must equal block_reward(height) + fees exactly. No miner-declared amount exists anywhere in the header or the coinbase | src/core/state.rs:438-467, src/mining.rs:63-72 | live | −0 | tokenomics |
| 6 | Premine: none. Genesis pays two outputs of 536,870,912 whose address and salt bytes are the plaintext inscription message, so no known WOTS secret key can ever spend them | src/core/types.rs:292-340 | live | −0 | tokenomics |
| 7 | Dev / founder / treasury share: none in consensus. The pool's pool_fee_percent is a pool operator's own cut inside its own payout, not a protocol tax. Solo coinbase pays only the miner's derived address | src/pool.rs:877-1325, src/mining.rs:63-95 | live | −0 | tokenomics |
| 8 | Emission in code matches the documented curve exactly (2^30 initial, halving every 525,600 blocks, floor 1) | src/core/types.rs:976-998 vs yellowpaper.md:232, DESIGN.md:68-69 | live | −0 | tokenomics |
| 9 | 23 real unsafe { blocks, all in SIMD kernels, one of which (wots_simd) is on the signature verification path. Justified and parity-tested, so no deduction under the "no justification" rule | src/core/simd_mining.rs (17), src/core/wots_simd.rs (6), used at src/core/wots.rs:31,110,133 | live | −0 | code |
| 10 | EXTENSION_ITERATIONS drops 1,000,000 → 100 under the fast-mining cargo feature. CI builds without it, so shipped binaries are unaffected. Build-flag footgun, recorded at INFO | src/core/types.rs:902-905, .github/workflows/build.yml:118 | dead in release builds | −0 | code |
code deductions, one at a time:
1.0 -> 1.5 (the 2.5 MSS finding is fixed at HEAD)
tokenomics deductions, one at a time:
0.0
code_score = 10 − (1.0 + 0.5) = 8.5
tokenomics_score = 10 − 0 = 10.0
risk_score = min(8.5, 10.0) = 8.5
Instant override check: none fired. All five checked —
- No key, role or admin path mints native supply or changes the issuance schedule outside consensus. The RPC surface is explorer reads plus
/commit,/send,/check(src/rpc/server.rs:133-160). No faucet, no mint, no admin credit route. The activation heights are compiled-in constants (src/core/types.rs:918-967), so changing the schedule means shipping a new binary. - No code sends a seed, private key or wallet contents anywhere. Wallet keys are Argon2id + AES-256-GCM at rest (
src/wallet/crypto.rs:1-79). The MSS checkpoint bug writes key material to a local file; it never leaves the machine, so this is a correctness bug, not exfiltration. - No backdoor, killswitch or remote-code path found in
src/,crates/walletd,wasm-wallet. - Not a fork presented as original work with the upstream identity stripped. BLAKE3 is an external library used openly, and both the sequential-chain construction and the ASERT difficulty variant are named by name in the docs.
- No supply or privacy claim that the code contradicts — see the tokenomics table.
🔒 Code
Commit audited for the score shown above: f84fb78 (re-check completed 2026-10-20). The original pass ran 2026-10-17 at 493bd5a and scored code 6.0; the re-check below raised it to 8.5.
- ❌ HIGH — MSS keygen checkpoint collision,
src/core/mss.rs:113. The checkpoint path ismss_h{height}.checkpoint, keyed on tree height alone. Atsrc/core/mss.rs:116-124any file at that path is deserialised and copied into the tree if the leaf count matches. Nothing records which seed produced those leaves. Interrupt an MSS keygen, then generate a same-height key from a different seed in the same directory, and the new key silently loads the old tree: the public tree no longer matches its seed and every signature from it fails to verify. The failure mode is loss of funds, not theft — but it is silent, and it is on the wallet path a pool miner uses constantly (README.md:72: the MSS address type is "the ONLY address type you should use" for pool rewards). midwimble, the same author's side-chain, fixes exactly this in its vendored copy by keying the checkpoint on a seed fingerprint. At that pass Midstate had not taken that fix. Fix: key the filename on a seed fingerprint, or store a digest of the seed inside the file and refuse a mismatch. This was the state at the original pass (493bd5a, 2026-10-17); the 2026-10-20 re-check atf84fb78confirms the fix landed, so the re-check deducts nothing. - ✅ The reward is never read from the block.
block_reward(height)is a pure function of height (src/core/types.rs:996-999) and the coinbase total is recomputed and compared on every block accept:coinbase_total != reward + total_feesfails the block (src/core/state.rs:438-467). A miner cannot inflate its own payout. - ✅ Coinbase values must decompose exactly into powers of two, and duplicate coinbase coin IDs are rejected before insertion — the comment states the reason plainly: a duplicate "would silently lose coins since the second insert returns false" (
src/core/state.rs:440-465). - ✅ Height continuity is enforced on the header path before batches are applied, and an aborted sync no longer leaves a mixed "Frankenstein" chain on disk — there is a regression test named for that bug (
src/node.rs:8781-8790). - ✅ Proof of work is verified by full sequential recomputation, never spot-checked. The reasoning is written into the code: interior checkpoints have no algebraic binding to their neighbours, so spot-checking enables subset grinding (
src/core/extension.rs,verify_extension/create_extension). - ✅ Difficulty is ASERT with a 4-hour half-life, recomputed from absolute elapsed time since genesis, with a ceiling clamp and tests for rise, drop and exact halving (
src/core/state.rs:69, tests at955-1016). - ✅ Wallet keys are encrypted at rest: Argon2id KDF + AES-256-GCM (
src/wallet/crypto.rs:1-79), with a password-gated daemon (crates/walletd/src/service.rs:46-190). No seed, key or wallet-content egress found anywhere insrc/orcrates/. - ✅ RPC binds loopback only (
crates/walletd/src/node_host.rs:38) andlan_only_middlewarefixes a real past flaw: the previous version trusted the firstX-Forwarded-Forentry, so anyone reachable on the port could sendX-Forwarded-For: 127.0.0.1and reach the/axehardware routes (Wi-Fi, overclock, config). The fix requires the real TCP socket to be LAN and every hop in the chain to be LAN (src/rpc/server.rs:35-60). A fixed header-spoofing hole, documented in place. - ⚠️ MEDIUM —
apply_batch_trustedskips PoW and signatures (src/core/state.rs:194-204), live on the rebuild and self-heal paths (src/node.rs:7406,7442,7456). The trust boundary is local disk, which is a reasonable design, but the node's own database is never re-verified. A tampered or corruptedredbfile yields a chain the node accepts and then gossips. Fix: verify replayed header hashes against a stored commitment chain, or re-run PoW on replay. - ⚠️ LOW —
apply_batch_skip_powtakes the mining hash from the caller and its safety rule is a doc-comment only ("Calling this with an arbitrary hash allows forged blocks to corrupt the state",src/core/state.rs:171-189). Current call sites do verify PoW first (src/node.rs:4811-4830) and re-checkbatch.extension.final_hash != header.extension.final_hash(src/node.rs:5162-5166). Correct today, fragile tomorrow. - 🔍 INFO —
EXTENSION_ITERATIONSis 1,000,000 by default and 100 under thefast-miningcargo feature (src/core/types.rs:902-905). A release built with that flag would accept near-free proof of work. CI builds without it (cargo build --release --target ... -p midstate,.github/workflows/build.yml:118). Worth a compile-time guard tying the flag to a testnet chain id. - 🔍 INFO — 23 real
unsafeblocks, all in SIMD kernels: 17 insrc/core/simd_mining.rs, 6 insrc/core/wots_simd.rs.wots_simd::process_wots_batchsits on the signature verification path (src/core/wots.rs:31,110,133), so a lane-masking bug is a consensus bug. It is justified — the AVX2/NEON/WASM lane handling is documented in full — and tested against the scalar reference including a SIMD remainder boundary (src/core/wots_simd.rs:1091-1186). No deduction under the "no justification" rule. - 🔍 INFO — legacy V3 compatibility branches inside the sync validation loop rewrite
state_rootand the mining hash for pre-V4 heights, and a self-heal path replays blocks with PoW skipped (src/node.rs:5162-5296). Reachable only below the activation heights. This is the most intricate code in the repo and the likeliest place for a future regression. - ✅ Tests cover the money path:
block_reward_initial,block_reward_first_halving,block_reward_floor_at_one,block_reward_monotonically_decreasing,genesis_coinbase_values_sum_to_initial_reward, plus apply/reject tests for midstate, target and coinbase over-pay (src/core/types.rs:1155-1176,src/core/state.rs:800-930). No hygiene deduction. - ✅
Cargo.lockpresent (211 KB), dependencies pinned and few. No hygiene deduction. - ✅ CI builds the release artifact for several targets and publishes a GitHub release (
build.yml:118,369-384). No hygiene deduction.
📊 Tokenomics
| Item | Value | Evidence | Flag |
|---|---|---|---|
| Premine | None. The genesis batch pays two outputs of 536,870,912 each (2^29), whose address and salt fields hold plaintext inscription bytes ("Harvest Now, Decrypt Later: The Quantum Era's Encryption Challenge"). An address is hash(p2pk bytecode), so spending needs a WOTS secret key whose public key hashes to that plaintext — no such key is known or derivable. The coins are burned by construction | src/core/types.rs:292-340, src/core/types.rs:122-124, applied through the normal coinbase check at src/node.rs:1538 | ✅ no premine, deliberately burned |
| Mint authority over the native coin | None. No faucet, mint or credit route. The RPC surface is explorer reads plus /commit, /send, /check (src/rpc/server.rs:133-160). Value enters the ledger only through the coinbase check | src/rpc/server.rs:133-160 | ✅ none |
| Issuance enforced in consensus | Yes. On every block accept the node recomputes block_reward(state.height), adds the tally of fees, and requires the coinbase outputs to sum to exactly that amount — not less, not more (coinbase_total != allowed_value bails) | src/core/state.rs:438-467 | ✅ enforced in consensus |
| Hard cap | No hard cap — tail emission continues forever. The halving bottoms out at a reward of 1 unit per block and stays there forever. Under this scale that is a design fact, not a deduction | src/core/types.rs:996-999, DESIGN.md:68-69 | ✅ no cap — perpetual tail at 1 unit/block |
| Emission curve | Initial reward 2^30 = 1,073,741,824 units. Halves every BLOCKS_PER_YEAR = 525,600 blocks (one year at 60 s blocks). Floor of 1 after 30 halvings. Arithmetic shift with .min(30), so the shift can never overflow | src/core/types.rs:976-999 | ✅ matches the docs exactly |
| Supply totals | The schedule sums to roughly 2,102,400,000 units before the tail takes over, then 1 unit per block forever. The repo states no cap constant, and none is needed | src/core/types.rs:976-999 | 🔍 derived from code, not asserted in docs |
| Dev / founder / treasury share | None in consensus. The solo coinbase pays only the miner's derived WOTS address; pool mode pays the pool's MSS address and watermarks the miner's payout address into the salt. pool_fee_percent is a pool operator's own configuration, not a protocol tax, and it never appears in consensus validation | src/mining.rs:63-95, src/pool.rs:877-1325 | ✅ 0% dev tax |
| Treasury | No treasury exists, so there is no spending key to consider. The genesis burn is the only large holding and it has no spend path | src/core/types.rs:292-340 | ✅ no treasury, no key |
| Docs vs code | Claim: "Block Reward: Starts at 1,073,741,824 (2^30). Halving: Reward halves every 525,600 blocks (~1 year at 1-min blocks). Minimum reward: 1" (DESIGN.md:68-69) and yellowpaper §6.5 with the power-of-two coinbase constraint. Code confirms every part of it | DESIGN.md:68-69, yellowpaper.md:230-235 vs src/core/types.rs:976-999, src/core/state.rs:447-467 | ✅ docs match code |
| Genesis reproducible from published params | Yes. Anchored to Bitcoin block 938,708 (0000000000000000...af2e) and its height, with a hardcoded initial target and timestamp. No config or local state enters it — the comment says divergence would silently partition peer discovery | src/core/types.rs:285-345 | ✅ reproducible |
| Schedule tamper resistance | V2_ACTIVATION_HEIGHT, V4_ACTIVATION_HEIGHT = 163,675 and V5_ACTIVATION_HEIGHT = 340,000 are compiled-in constants. Changing one is a code change plus a release users must adopt — a hard fork. No admin endpoint touches emission | src/core/types.rs:918-967 | ✅ not admin-changeable |
🕵️ Privacy
- ✅ Wallet keys at rest use Argon2id key derivation + AES-256-GCM (
src/wallet/crypto.rs:1-79). Nothing in the wallet path sends a seed, key or wallet contents anywhere. - ✅ The block-explorer RPC binds
127.0.0.1:portand is off entirely when no port is given (crates/walletd/src/node_host.rs:38). P2P binds0.0.0.0, as expected for a node (crates/walletd/src/node_host.rs:62). - ✅ The
/axehardware-management routes (Wi-Fi setup, overclock, config) are gated bylan_only_middleware, which now requires the real TCP socket address to be LAN/loopback and everyX-Forwarded-Forhop to be LAN (src/rpc/server.rs:35-60). The comment records the earlier header-spoofing bug and its fix. - ⚠️ MSS keygen writes partial key material to
mss_h{height}.checkpointin the working directory (src/core/mss.rs:113,190). It is deleted on completion (src/core/mss.rs:169-170), but an interrupted run leaves a file of public MSS leaves on disk. Not secret material, but it is key-structure data left behind. - 🔍
reqwestis used widely insrc/main.rs,src/pool.rs,src/mining.rs,src/network/mod.rs— pool, explorer and peer-discovery calls. No telemetry endpoint was found, but no per-call egress map was produced.
🚩 Red flags
- ✅ FIXED at HEAD (
f84fb78), no longer a red flag. It was HIGH at493bd5a: the MSS keygen checkpoint file was keyed on height only, so a resumed keygen could load another seed's leaves and produce a key tree that does not match its seed.checkpoint_path()now hashes the seed into the filename (src/core/mss.rs:199-206, commitc903d7b). Wallet-level key corruption on the pool-mining path. This was the −2.5 that has been removed from the code score. - ⚠️ MEDIUM —
apply_batch_trustedaccepts a locally stored block with no PoW and no signature check (src/core/state.rs:194-204, used atsrc/node.rs:7406,7442,7456). Trust sits entirely on the local database. - ⚠️ Novel cryptography with no independent audit: sequential BLAKE3 VDF-style PoW at 1,000,000 iterations (
src/core/types.rs:902), WOTS+MSS post-quantum signatures, a sparse Merkle tree UTXO set, and a 4-hour half-life ASERT variant. No audit is claimed anywhere in-repo. - ⚠️
EXTENSION_ITERATIONSdrops from 1,000,000 to 100 under thefast-miningcargo feature (src/core/types.rs:902-905). CI builds without it (build.yml:118), so shipped binaries are fine — but a third-party build with that flag would accept near-free proof of work. - ⚠️ Legacy V3-compatibility and self-heal branches inside the sync loop rewrite expected state roots and mining hashes for pre-activation heights (
src/node.rs:5162-5296). Correctness there rests on comments and a handful of tests.
✅ Green flags
- ✅ Issuance is enforced where it must be: the coinbase total must equal
block_reward(height) + feesexactly, on every accepted block (src/core/state.rs:438-467). No header field carries an amount anywhere in the code. - ✅ The genesis "premine" is a burn, not a claim. Address and salt are plaintext inscription bytes, so the initial 2^30 units are unspendable by construction (
src/core/types.rs:297-330). - ✅ No dev fee, no founder share, no treasury, and no admin or RPC path that can mint. Every route in
src/rpc/server.rs:133-160is a read or a normal transaction submit. - ✅ PoW verification recomputes the whole sequential chain on purpose, with the anti-spot-check reasoning written into the source: interior checkpoints have no algebraic binding to their neighbours, so spot-checking enables subset grinding (
src/core/extension.rs,verify_extension). - ✅ Power-of-two denomination rule plus a duplicate-coinbase-ID pre-check, with a comment explaining that duplicates would silently lose coins (
src/core/state.rs:441-460). - ✅ Consensus bounds on block size are explicit and reasoned:
MAX_BATCH_INPUTS1,024 keeps post-quantum signature verification near 0.5 s,MAX_BATCH_OUTPUTS10,000 keeps blocks under the 10 MB P2P limit (src/core/types.rs:985-993). - ✅ Real security work is visible in the history: the
X-Forwarded-Forfix explains the old bug and the correct model (src/rpc/server.rs:35-60), and a regression test exists for an aborted-sync disk-corruption bug (src/node.rs:8781-8790). - ✅ Test coverage on the money path:
block_reward_initial,block_reward_first_halving,block_reward_floor_at_one,block_reward_monotonically_decreasing,genesis_coinbase_values_sum_to_initial_reward, plus apply/reject tests for midstate, target and over-pay (src/core/types.rs:1155-1176,src/core/state.rs:800-930). Plus 1,000+ lines of property tests insrc/core/mmr.rs. - ✅ Wallet keys are Argon2id + AES-256-GCM at rest, with KDF tests (
src/wallet/crypto.rs:1-79).
- ✅ Fixed at HEAD (2026-10-20 re-check):
checkpoint_path()keys the MSS keygen checkpoint on a blake3 hash of the seed plus height, so a second keygen in the same directory can no longer load another seed's leaves (src/core/mss.rs:199-206, commitc903d7b). The fix existed in midwimble's vendored copy and was taken back. - ✅ Fixed at HEAD: the HD counter advance is now atomic with persistence (
src/wallet/mod.rs:285-300), which closes the earlier rewind path that could reuse a WOTS one-time key. Signing also refuses a key that has already signed (src/wallet/mod.rs:873). - ✅ Money path unchanged at HEAD: coinbase total must equal
reward + feesexactly, and each coinbase output must be a power of two (src/core/state.rs:456-470). The new mining-bond feature adds no issuance — it is a script withCHECKTIMEVERIFY(src/core/script.rs:791-808).
📋 Context (does not affect the score)
| Signal | Value |
|---|---|
| Repo / commit audited | original pass ciphernom/midstate at 493bd5a389f87dacaa6c5fabf570834d158d18a9, version 5.0.0, last commit 2026-10-17; re-checked 2026-10-20 at f84fb78e8a761448a760e2331efa95fde3b04340 |
| Contributors / commits | shallow clone holds 50 commits. Visible: ciphernom, Ciphernom, "Security Patch", Claude. Full history not fetched |
| AI-assisted commits | yes — 9 co-author trailers (7 Claude Opus 4.8, 2 Claude Opus 5.5) |
| Relaunch, rename or abandoned predecessor | none found in this clone. Repo dates to 2026-02-10 per the earlier note; domain about three months old |
| Independent audit | none found in-repo. The post-quantum signatures, the SMT accumulator and the ASERT variant are unaudited |
| Public RPC or explorer reachable | no public JSON API found; the node's explorer RPC is loopback (crates/walletd/src/node_host.rs:38) |
| Market data | not relevant at this stage |
| Hashrate, difficulty, power cost, profitability | out of scope for this scale |
❓ What I could not check
- 🔍 On-chain supply versus the schedule. No node or RPC was reachable, so live supply is unverified, not clean. Close it by syncing a node, summing the UTXO set plus burns, and comparing against
block_rewardsummed to the tip. - 🔍 That the two genesis coins are truly unspendable. The argument is code-level: their address and salt are plaintext inscription bytes, so spending needs a WOTS secret key whose public key hashes to that plaintext. Close it by checking on a synced node whether those two coin IDs have ever moved.
- 🔍 Independent review of WOTS+MSS, the sparse Merkle accumulator and the ASERT variant. Close it only by commissioning an audit; nothing in-repo claims one.
- 🔍 Every outbound HTTP call was not traced individually. No telemetry endpoint was found, but a complete egress map needs a per-call read of
src/main.rsandsrc/pool.rs. - 🔍 Full contributor list and per-commit authorship. Close it with a non-shallow clone.
- 🔍 Whether the MSS checkpoint collision has actually bitten any live wallet. Close it by asking affected users whether signatures fail after an interrupted
generate— the symptom is verification failure, not lost funds.
🧭 Bottom line
The consensus core is small, careful and readable, and the money path is exactly what you want it to be: the subsidy is a pure function of height, every node recomputes it, and a block's coinbase total must equal reward + fees exactly or the node rejects it (src/core/state.rs:438-467). There is no premine — the initial coins are burned into an inscription — no mint path to the native coin, and no dev, founder or treasury share in the protocol at all.
Tokenomics scores 10.0 because there is nothing to deduct. Note the shape of the supply: halving every 525,600 blocks down to a floor of 1 unit per block, forever. No hard cap, tail emission continues forever. That is a design choice, not a defect, and issuance being a pure function of height means the absent cap constant means nothing.
Code scores 8.5 on current HEAD, which puts this in the GOOD band for code and tokenomics. The wallet keygen bug that drove the old 6.0 is fixed — the checkpoint is now named after a hash of the seed (src/core/mss.rs:199-206), so a second keygen in the same directory can no longer load another seed's leaves. Two things keep it out of 9.0: apply_batch_trusted still accepts locally stored blocks with no PoW and no signature check (src/core/state.rs:194-204), and apply_batch_skip_pow's safety contract is still only a doc-comment (src/core/state.rs:178-190). A runtime assertion on the caller-supplied mining hash and an explicit operator opt-in for trusted replay would take code to 9.0. GOOD describes only the scored code and tokenomics; it does not certify operation, survival, or liquidity. It says nothing about whether the chain survives, and the author's own docs say it is not for real value.
Two remaining issues keep the code score below 9.0: apply_batch_trusted accepts locally stored blocks with no PoW and no signature check (src/core/state.rs:194-204, src/node.rs:7406), and apply_batch_skip_pow's safety contract exists only as a doc-comment (src/core/state.rs:171-189). A runtime assertion that the caller-supplied mining hash equals compute_header_hash(batch.header()), and an explicit operator opt-in flag for trusted replay, would take code to 9.0.
The unmeasured risk here is not the arithmetic of issuance — it is that the post-quantum signature scheme, the sparse Merkle accumulator and the sequential-hash PoW have never been reviewed by anyone but the author. This scale does not score that. It remains the first thing to fix before moving real value.
🔗 Related
- 📁 Midwimble is the same author's MimbleWimble side-chain, merge-mined with Midstate. It has its own note: [[Midwimble]]. The duplicate midwimble block that used to sit below this share summary was removed on 2026-10-20 — it duplicated [[Midwimble]] and was unscored. Its unique facts were moved into [[Midwimble]] before removal.
- 🔍 Cross-chain note: the MSS keygen bug found in Midstate was first documented in midwimble's README, which fixed it in its vendored copy. Midstate took that fix back at
f84fb78(src/core/mss.rs:199-206, commitc903d7b). That is what moved Midstate's code score from 6.0 to 8.5. - ✅ Midwimble's own score is code 7.0 / tokenomics 10.0 / risk 7.0, GOOD, re-checked 2026-10-20 at
614deaf. Its live supply was verified against the closed form at height 4625 — 100 blocks checked one by one, 0 mismatches.
Files we opened
src/core/state.rs:438-467
src/core/types.rs:976-999
src/core/types.rs:996-999
src/core/types.rs:292-340
src/core/mss.rs:199-206
src/core/state.rs:194-204
src/mining.rs:63-95
src/core/types.rs:902-905
src/wallet/crypto.rs:1-79
Every file listed here was opened by us during the audit. Nothing here is a guess.