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.
4176f6b on 18 Oct 2026·Nightly properties 23 Oct 2026·Fuzzing 23 Oct 2026·Live network 22 Oct 2026What’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
701Scanning 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
Webhooks
65Signed 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
Checkout and POS
221The 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
Dashboard and settings
915Admin 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
Key custody
121Encrypting 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
Storage and recovery
131SQLite 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
Exchange rates
93Fiat 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
Abuse protection
29Rate 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
Logs and tracing
57Structured 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
Shop plugins
10A 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
Test tools
67The 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
Everything else
459Shared 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