Skip to main content

Audit any auction

Status: Testnet.

Command line

What it does (crates/sealforge-chain/src/audit.rs scan_incoming, sealforge_auditor::audit_chain):
  1. Trial-decrypts every compact block in range with the UIVK, for both the Orchard and Ironwood pools.
  2. Fetches each matching transaction and decrypts value, output index and memo.
  3. Reclassifies every payment with sealforge_core::selection and recomputes with compute_result.
  4. Compares clearing price, volume, valid bid count, winner count, Merkle root and every per-bid outcome. Exit code 1 on any mismatch.
Sample output and the tamper test (a result edited to hide a bid and claim a lower price is caught, with exit code 1): evidence/audit-rescan.md.

In the browser

On /audit/<CODE>, Rescan the chain in my browser runs the same sealforge-scan and sealforge-auditor compiled to WebAssembly. Blocks come over gRPC-web from a lightwallet endpoint the auditor types in. Nothing but the result being checked comes from sealForge. The older quick check (payments_from_published) only checks that the published list is self-consistent. It doesn’t detect an omitted bid, and the page says so.

As a bidder

Load your receipt on /verify. The WASM auditor (verify_receipt) recomputes your leaf, checks the Merkle proof against the published root, and shows your outcome and refund plan. Tests: winning_receipt_is_included_with_its_refund_plan, losing_and_unknown_receipts, tampered_root_breaks_inclusion.

Testnet record

Both auctions ran on public Zcash testnet through the hosted instance, in sealed-reveal mode, uniform price. Full tables (heights, txids, signer pairs, per-wallet end balances, fees) live in the evidence files. They are not copied here. Both used test-network-only settings (SF_MIN_WINDOW_BLOCKS, SF_REFUND_DELAY_SECS) so they’d fit in about an hour. Both were run from one machine holding all three trustee keystores (scripts/testnet-demo.sh), which defeats the threshold and is acceptable only on test networks. Trustee aliases in the evidence are labels for those keystores.

Regtest

  • Full auction on a local chain (Zebra + Zaino regtest, real binaries): evidence/regtest-e2e.md. Deposit mode, 4 bids, close, publish, receipt check, refund planning.
  • FROST spike: the first 2-of-3 FROST escrow spend mined on regtest, txid 8367e1c6ca8ef305678a7179faf3d161647f90da40bb5462ecc6dc6275ec016f (docs/spikes/frost-pczt.md).

Reproducibility

CI

.github/workflows/ci.yml, on every push to main and every pull request:

Test inventory

Generated from test-runner output by scripts/test-inventory.sh into evidence/test-inventory.md, the single source for counts and names. Don’t hand-count. Adversarial tests worth reading first: Not covered by an automated test: the testnet runs themselves (recorded as evidence), the embed widget, and anything ShieldRamp beyond the score.