# Public round verification kit

This kit is a local, read-only verification distribution. It includes only the public verifier runtime, source and scripts needed here, not an operator archive or a production round catalog. The two beacon controls are a retained public quicknet beacon and an intentionally invalid mutation, **not new payout evidence**. No wallet, signing, funding, compilation or network calls occur in the self-test or BLS command.

## Prerequisites (not bundled)

- Python 3.11 was exercised. Select an interpreter with the **already installed** packages in `requirements-pinned.txt`. The verifier enforces py-evm 0.12.1b1, py-ecc 8.0.0, eth-utils 6.0.0 and eth-keys 0.8.0; the self-test also checks the retained transitive dependency pins. Other Python versions/platforms have not been qualified.
- A modern browser for offline math, or Node.js with BigInt and built-in fetch for the optional Node CLI. Neither executes BLS.
- ZIP extraction support. No interpreter, Python package/wheel or Node dependency is included. No package download, clean-machine install, compiler or hosted RPC/CORS test was performed. The kit was extracted outside the repository and exercised with an existing installed Python environment. If your interpreter lacks a pin, the result is **Not checked**: provision/review those dependencies separately from trusted package sources. Do not treat dependency availability as verified by this release.

## Start from the extracted directory

Extract the ZIP, enter `gm-round-verification-kit/`, and use relative paths below. Here `python` means the interpreter you selected with the prerequisites above, not a special executable supplied by this kit.

1. Inspect `PROVENANCE.json`, `SOURCE-NOTICES.md`, the bundled MIT license and verifier source. `SHA256SUMS` binds all kit payload files; it is not a signature from an independent authority. Compare the downloaded ZIP hash with `round-verification-kit.zip.sha256` from the same release (a same-origin checksum detects corruption, not a compromised publisher).
2. Run the actual positive/negative crypto controls and all payload checksums:

   ```sh
   python -I -B selftest.py
   ```

   Expected exit 0 with `selftest: Passed`: the real retained beacon must produce `Passed`/exit 0 and its one-bit signature mutation must produce `Failed`/exit 1. Both must dispatch the actual BLS precompiles; a mock or missing runtime cannot pass. `inputSha256` must match each control's exact file bytes. A checksum/prerequisite failure exits 2, not cryptographic success. Self-test success authenticates **only those control inputs**, not your bundle. Read individual outputs.

3. Put your exact downloaded payout evidence in `BUNDLE.json` without editing or reserializing it. Authenticate its supplied round/signature:

   ```sh
   python -I -B bin/verify-round-bls.py BUNDLE.json --compiled verifier-artifact.json
   ```

   Match `inputSha256` to the bundle SHA256 shown on the public page. `Passed`/exit 0 certifies the signature and round under the pinned quicknet key; `Failed`/exit 1 means executed cryptographic verification failed. `Not checked`/exit 2 means a required capability/input was unavailable or unusable. It does not certify the target, winner, holder list, payout transaction, consumption of this signature by settlement, or chain finality. The script never trusts a bundled/uploaded PASS claim.

4. Run local math separately on the **same unchanged file**:

   ```sh
   node bin/verify-round.js BUNDLE.json
   ```

   Alternatively open `public/verify-round.html` locally and import `BUNDLE.json`. All required browser scripts are included; file import makes no network request. Its kit links point to the already extracted local README (not another nested ZIP). Node exit 0 means no failed checks, **not** all result domains verified. Browser/Node BLS remains **Not checked** even if you ran Python separately.

5. Optional independent chain reads require a separately selected public HTTPS RPC with chain 4663 history support:

   ```sh
   node bin/verify-round.js BUNDLE.json --rpc https://YOUR-CHOSEN-PUBLIC-RPC
   ```

   Replace the example URL yourself; no endpoint is provisioned. A browser may additionally require provider CORS support. Network/history absence is Not checked; observed protocol faults/contradictions are Failed. Partial checks are retained. Provider statements are not consensus proofs. Do not embed credentials in RPC URLs.

## Source, runtime and trust boundaries

`verifier-artifact.json` is a minimal public projection of the retained compiler output, containing the original ABI and **exact unmodified deployed runtime bytes**, not a newly compiled contract or the large private archive. The fixed runtime SHA256 is `e207cf195489a91e23ef50bd7ea6b4106ac086b5a7e42aa2e42871651da02815`. The Python script checks this before execution. `quicknet-key.json` and `source/contracts/GMDrandQuicknetVerifier.sol` identify the embedded key, scheme, DST, genesis and period. Source bytes were checked against the retained compiler input; compiler settings and parent-artifact hashes are in provenance. No reproducible rebuild is claimed.

The vendored Randamu BLS code and key reference carry MIT notices; see `SOURCE-NOTICES.md` and `source/contracts/vendor/bls-solidity/LICENSE`. The vendored cryptography is experimental and unaudited; this kit is not a professional audit or production-funds approval. Python dependencies are **not redistributed**, only named/pinned. No additional cryptographic mechanism or dependency was introduced.

Holder completeness, maturity and source-selection correctness are not independently replayed. Exported operator provenance hashes are byte provenance, not transaction authority. Publication is a separate approved operation; there is no automatic export-on-settlement or refresh service in this kit. No genuine fresh-coin production bundle was available for this local release.

## Payout-policy scope

Fresh targets use 90/10: reserve is floor(pot × 10 / 100), winner receives the entire remainder. The public math verifier preserves 80/20 only for the exact historical chain4663 token `0x027d8146f37e1a80e0c968f926c2eff0e10602bc` and custody `0xc6ac4867a0ede70ed7f9e3e76092e5148a8b3ca9`. A self-declared percentage cannot select this exception. This is target-bound arithmetic, not proof of deployment: chain receipts, transfers and timing remain separately checked; BLS and holder completeness are never inferred from a split pass.
