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.
6b1dcda on 16 Oct 2026·Nightly properties 17 Oct 2026·Fuzzing 16 Oct 2026·Live network 16 Oct 2026Live 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.
- Tests
- 26 none failed
- Passed
- 26
- Service outages
- 0 0 tests hit one
- Services answering
- 7 of 7 checked
| Service | Before the tests | What it said |
|---|---|---|
| Monero mainnet node | Answering | https://node.hollingworth.xyz:18089/get_height answered HTTP 200 |
| Monero stagenet nodes (monerodevs.org) | Answering | http://node.monerodevs.org:38089/get_height answered HTTP 200; http://node2.monerodevs.org:38089/get_height answered HTTP 200 |
| Funded stagenet test wallets | Answering | the spender in e2e/wallets/ci can pay a run |
| Coingecko API | Answering | https://api.coingecko.com/api/v3/ping answered HTTP 200 |
| CoinMarketCap public API | Answering | https://pro-api.coinmarketcap.com/public-api/ answered HTTP 200 |
| haveno.markets | Answering | https://haveno.markets/ answered HTTP 200 |
| DNS | Answering | google.com is 64.233.180.113 |
| Tor network | Not checked | only 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.
| Wallet | Balance (XMR) | Unlocked | Outputs | Ready to pay |
|---|---|---|---|---|
| Spender53etP59TCSWcnK3cJUyEdQAgTNCLWX92m39NJSHt3qnyVVYzqQEtXHnEF1Y7UkrfgwhndYnHmwxDu9RBAryjP2MHKWrENMo | 1.033481180000 | 0.442988380000 | 40 | 34 |
| Merchant52Ed34jp4AE2bpkCPdcUM44h4jepS59LgCj42xAtVGExBkhxBdqqjZ4UHHY4FmJLmaEhNQnUEfX9J88fYfTdiZ3QAo3Gxo7 | 0.002011000000 | 0.000000000000 | 6 | 0 |
Tests
Every live test of the run, with the services it needs. A failure’s first line says what went wrong.
| Test | Needs | Result | Time |
|---|---|---|---|
| ✓ System resolver reads real txt recordsRust · monokulo | DNS | Passed | 23 ms |
| ✓ Coinmarketcap api quotes usdRust · shared | CoinMarketCap public API | Passed | 161 ms |
| ✓ Coingecko api quotes usd and lists it as supportedRust · shared | Coingecko API | Passed | 228 ms |
| ✓ Haveno markets api prices fiat under both policiesRust · shared | haveno.markets | Passed | 361 ms |
| ✓ Stagenet payment shows up in the dashboard with the correct total receivedRust · e2e-harness::e2e_dashboard_stagenet | Monero stagenet nodes (monerodevs.org), Funded stagenet test wallets | Passed | 575 ms |
| ✓ Node block transactions all parse as valid monero transactionsRust · engine | Monero mainnet node | Passed | 1.5 s |
| ✓ Node end to end scan of live mempool never panics and finds no false matchesRust · engine | Monero mainnet node | Passed | 1.7 s |
| ✓ Node find transaction finds nothing for a bogus hashRust · engine | Monero mainnet node | Passed | 829 ms |
| ✓ Node find transaction matches the same tx in its blockRust · engine | Monero mainnet node | Passed | 1.6 s |
| ✓ Node get block hash matches a known immutable blockRust · engine | Monero mainnet node | Passed | 837 ms |
| ✓ Node get height returns a plausible valueRust · engine | Monero mainnet node | Passed | 848 ms |
| ✓ Node header matches a known immutable blockRust · engine | Monero mainnet node | Passed | 838 ms |
| ✓ Node is key image spent reports unspent for a null imageRust · engine | Monero mainnet node | Passed | 886 ms |
| ✓ Node locate transaction finds a known confirmed txRust · engine | Monero mainnet node | Passed | 833 ms |
| ✓ Node locate transaction reports not found for a bogus hashRust · engine | Monero mainnet node | Passed | 835 ms |
| ✓ Node pool is followed by its changesRust · engine | Monero mainnet node | Passed | 1.9 s |
| ✓ Node pool transactions fetched by id hash to their idsRust · engine | Monero mainnet node | Passed | 1.4 s |
| ✓ Node pruned chain blocks match the whole onesRust · engine | Monero mainnet node | Passed | 4.4 s |
| ✓ Node says the tip has not moved with the pools changesRust · engine | Monero mainnet node | Passed | 3.3 s |
| ✓ Stagenet payment is detected end to endRust · e2e-harness::e2e_stagenet | Monero stagenet nodes (monerodevs.org), Funded stagenet test wallets | Passed | 7.1 s |
| ✓ Stagenet node answers as recordedRust · engine::daemon_rpc_replay | Monero stagenet nodes (monerodevs.org) | Passed | 2.6 s |
| ✓ Tor takes our torrc and hands monokulo a circuit identityRust · monokulo::e2e_tor | Tor network | Passed | 17.5 s |
| ✓ Stagenet order resolves and enforces a non default confirmation thresholdRust · mock-woocommerce::e2e_stagenet_confirmation_threshold | Monero stagenet nodes (monerodevs.org), Funded stagenet test wallets | Passed | 25.8 s |
| ✓ Stagenet connect flow pays a real order end to endRust · mock-woocommerce::e2e_stagenet_connect_flow | Monero stagenet nodes (monerodevs.org), Funded stagenet test wallets | Passed | 1.4 s |
| ✓ POS terminal - real stagenet payments › a 0-conf-trusted payment shows shared success and stays reviewableBrowser · pos-stagenet-payments.spec.js | Monero stagenet nodes (monerodevs.org), Funded stagenet test wallets | Passed | 8.2 s |
| ✓ POS terminal - real stagenet payments › a confirming payment can be backgrounded and completes in the top stackBrowser · pos-stagenet-payments.spec.js | Monero stagenet nodes (monerodevs.org), Funded stagenet test wallets | Passed | 45.3 s |