How Monokulo is tested

Monokulo handles other people’s money, so it gets tested hard. Every change runs more than 2,600 automatic tests. Every night, two kinds of robot tester invent thousands of strange situations and check that no payment goes missing. This page rebuilds itself from those runs. Open any section to see the details.

Some checks failed·Tests and coverage from 4176f6b on 18 Oct 2026·Nightly properties 23 Oct 2026·Fuzzing 23 Oct 2026·Live network 22 Oct 2026
Tests2,6572,657 passed · 0 skipped
Engine and server90.5%of 92,270 Rust lines
Checkout and POS95.1%of 1,666 browser lines
Properties nightly212plus 10 fuzz targets · 27 live daily

What’s tested

Each test checks one thing Monokulo should do, and its name says what, so the list reads like a rulebook. They’re sorted by the part of Monokulo they protect. Pick an area to see every test in it.

Payment detection

701

Scanning blocks and the mempool, confirmations, reorgs, proof of work and the order statuses customers see.

  • Each transaction visits each tenant independently
  • Repeated multi order forks faults and restarts preserve money
  • Reorg collection of mined outputs crosses full queue pages without losing outputs
RustProperty (nightly)

Webhooks

65

Signed deliveries to the shop, retries and backoff, and receivers checking them.

  • Each webhook says how it is doing; the deliveries of one that needs you are open
  • A delivery's details open as a dialog, with its attempts, request and last response
  • A webhook with many deliveries pages through them in place, 20 at a time
RustBrowser

Checkout and POS

221

The hosted payment page with and without JavaScript, the embed, and the point-of-sale screen on phones and tablets.

  • Payment countdown keeps ticking down while the customer finds their wallet
  • Payment countdown keeps ticking down while the customer finds their wallet
  • The engine page follows the engine live, scrubs, replays and moves its window
Browser

Dashboard and settings

915

Admin pages, stores, nodes, every setting and where its value comes from, and options-file handling.

  • The site, the POS and the hosted payment page share one theme, light and dark
  • With JavaScript Ctrl+Enter swaps the results, and the engine swaps the tables
  • Every tab, for the gallery
RustBrowser

Key custody

121

Encrypting view keys at rest, routing between custody backends, and SEV-SNP attestation.

  • Sparse window histories match fresh scans without rebuilding kept keys
  • Lookup ranges match fresh scans and do not poison the live window
  • Concurrent wallet scans keep independent caches and matches
RustProperty (nightly)

Storage and recovery

131

SQLite schema, single-writer guarantees, crash recovery and resuming after restarts.

  • Killing the engine at random moments never loses a confirmed order or reuses an address
  • Repeated saturation retains fifo fairness and cancellation
  • Historic upgrades recover from process death
RustBrowserProperty (nightly)

Exchange rates

93

Fiat prices from each provider, currency handling and their settings.

  • Unreadable stored settings are the defaults not an error
  • Xmr depth must be a number from zero to the cap
  • Xmr is rejected since no provider ever prices it
Rust

Abuse protection

29

Rate limits, client challenges and the under-attack switch.

  • Real challenge continues inside a cross-site checkout frame with and without JavaScript
  • Real challenge offers a ten second no-JavaScript continuation
  • Real challenge solves in JavaScript and continues to the checkout
RustBrowser

Logs and tracing

57

Structured logs, the log viewer, trace context across engine, server and plugin.

  • The search box, Syntax and Search share one height; Syntax opens the help as a dialog
  • A line's properties load when it's first opened, and only then
  • Live adds new lines at the top without a reload, and pauses
RustBrowser

Shop plugins

10

A shop plugin connecting a store, taking payment and receiving its webhooks, played by the mock WooCommerce plugin.

  • A genuinely forced order expired webhook is delivered and verified
  • A full woocommerce checkout is created with the key opened and paid
  • Create order against a real engine yields a working checkout redirect
Rust

Test tools

67

The stagenet test wallet and fixtures the other suites stand on. Tested too.

  • Background loops genuinely write a real expired order event
  • A held lock names its holder and lets the caller choose
  • One command runs and exits and existing wallets are never replaced
Rust

Everything else

459

Shared types, HTTP plumbing and helpers.

  • A store changes its wallet: the dropdown asks first, then the history shows both
  • The Details card renames the wallet: marked, discarded, refused, saved
  • A wallet nothing uses is retired by typing its name, then restored with its keys
RustBrowserProperty (nightly)