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.

All checks passed·Tests and coverage from 6b1dcda on 16 Oct 2026·Nightly properties 17 Oct 2026·Fuzzing 16 Oct 2026·Live network 16 Oct 2026
Tests2,6072,607 passed · 0 skipped
Engine and server90.6%of 87,305 Rust lines
Checkout and POS95.0%of 1,655 browser lines
WooCommerce95.6%of 502 PHP lines
Properties nightly211plus 9 fuzz targets · 26 live daily

Live tests

Once a day, the tests that need the outside world run against it: real Monero nodes on mainnet and stagenet, the exchange-rate services Monokulo can price with, DNS, the Tor network, and real stagenet payments from a pair of test wallets. None of these is Monokulo’s, so each is checked just before the tests start. A test that failed while a service it needs wasn’t answering is shown as that service’s outage, not as a failure of the code.

Run of 16 Oct 2026
Tests
26 none failed
Passed
26
Service outages
0 0 tests hit one
Services answering
7 of 7 checked
ServiceBefore the testsWhat it said
Monero mainnet nodeAnsweringhttps://node.hollingworth.xyz:18089/get_height answered HTTP 200
Monero stagenet nodes (monerodevs.org)Answeringhttp://node.monerodevs.org:38089/get_height answered HTTP 200; http://node2.monerodevs.org:38089/get_height answered HTTP 200
Funded stagenet test walletsAnsweringthe spender in e2e/wallets/ci can pay a run
Coingecko APIAnsweringhttps://api.coingecko.com/api/v3/ping answered HTTP 200
CoinMarketCap public APIAnsweringhttps://pro-api.coinmarketcap.com/public-api/ answered HTTP 200
haveno.marketsAnsweringhttps://haveno.markets/ answered HTTP 200
DNSAnsweringgoogle.com is 64.233.180.113
Tor networkNot checkedonly the test itself can tell whether it works

Test wallets

The stagenet wallets the paid tests use (e2e/wallets/ci), as the run left them. After the tests, what the merchant was paid goes back to the spender, so only the fees are lost. “Ready to pay” counts the unlocked outputs big enough to pay one test order; a run makes 6 payments.

WalletBalance (XMR)UnlockedOutputsReady to pay
Spender53etP59TCSWcnK3cJUyEdQAgTNCLWX92m39NJSHt3qnyVVYzqQEtXHnEF1Y7UkrfgwhndYnHmwxDu9RBAryjP2MHKWrENMo1.0334811800000.4429883800004034
Merchant52Ed34jp4AE2bpkCPdcUM44h4jepS59LgCj42xAtVGExBkhxBdqqjZ4UHHY4FmJLmaEhNQnUEfX9J88fYfTdiZ3QAo3Gxo70.0020110000000.00000000000060
After the testsSwept 0.002011000000 XMR from the merchant to the spender

Tests

Every live test of the run, with the services it needs. A failure’s first line says what went wrong.

TestNeedsResultTime
✓ System resolver reads real txt recordsRust · monokuloDNSPassed23 ms
✓ Coinmarketcap api quotes usdRust · sharedCoinMarketCap public APIPassed161 ms
✓ Coingecko api quotes usd and lists it as supportedRust · sharedCoingecko APIPassed228 ms
✓ Haveno markets api prices fiat under both policiesRust · sharedhaveno.marketsPassed361 ms
✓ Stagenet payment shows up in the dashboard with the correct total receivedRust · e2e-harness::e2e_dashboard_stagenetMonero stagenet nodes (monerodevs.org), Funded stagenet test walletsPassed575 ms
✓ Node block transactions all parse as valid monero transactionsRust · engineMonero mainnet nodePassed1.5 s
✓ Node end to end scan of live mempool never panics and finds no false matchesRust · engineMonero mainnet nodePassed1.7 s
✓ Node find transaction finds nothing for a bogus hashRust · engineMonero mainnet nodePassed829 ms
✓ Node find transaction matches the same tx in its blockRust · engineMonero mainnet nodePassed1.6 s
✓ Node get block hash matches a known immutable blockRust · engineMonero mainnet nodePassed837 ms
✓ Node get height returns a plausible valueRust · engineMonero mainnet nodePassed848 ms
✓ Node header matches a known immutable blockRust · engineMonero mainnet nodePassed838 ms
✓ Node is key image spent reports unspent for a null imageRust · engineMonero mainnet nodePassed886 ms
✓ Node locate transaction finds a known confirmed txRust · engineMonero mainnet nodePassed833 ms
✓ Node locate transaction reports not found for a bogus hashRust · engineMonero mainnet nodePassed835 ms
✓ Node pool is followed by its changesRust · engineMonero mainnet nodePassed1.9 s
✓ Node pool transactions fetched by id hash to their idsRust · engineMonero mainnet nodePassed1.4 s
✓ Node pruned chain blocks match the whole onesRust · engineMonero mainnet nodePassed4.4 s
✓ Node says the tip has not moved with the pools changesRust · engineMonero mainnet nodePassed3.3 s
✓ Stagenet payment is detected end to endRust · e2e-harness::e2e_stagenetMonero stagenet nodes (monerodevs.org), Funded stagenet test walletsPassed7.1 s
✓ Stagenet node answers as recordedRust · engine::daemon_rpc_replayMonero stagenet nodes (monerodevs.org)Passed2.6 s
✓ Tor takes our torrc and hands monokulo a circuit identityRust · monokulo::e2e_torTor networkPassed17.5 s
✓ Stagenet order resolves and enforces a non default confirmation thresholdRust · mock-woocommerce::e2e_stagenet_confirmation_thresholdMonero stagenet nodes (monerodevs.org), Funded stagenet test walletsPassed25.8 s
✓ Stagenet connect flow pays a real order end to endRust · mock-woocommerce::e2e_stagenet_connect_flowMonero stagenet nodes (monerodevs.org), Funded stagenet test walletsPassed1.4 s
✓ POS terminal - real stagenet payments › a 0-conf-trusted payment shows shared success and stays reviewableBrowser · pos-stagenet-payments.spec.jsMonero stagenet nodes (monerodevs.org), Funded stagenet test walletsPassed8.2 s
✓ POS terminal - real stagenet payments › a confirming payment can be backgrounded and completes in the top stackBrowser · pos-stagenet-payments.spec.jsMonero stagenet nodes (monerodevs.org), Funded stagenet test walletsPassed45.3 s