Original release notes
Added
- Enable CLI tab completion inside the maker, taker and jmwalletd Docker images (4605f891)
- BIP-329 wallet metadata now labels addresses as CoinJoin output, CoinJoin change, deposit, or non-CoinJoin change instead of a bare jm:used marker (1997c6e6)
- Add a --show-utxos flag to jm-wallet info that lists UTXOs grouped by type plus fidelity bonds (fbf2f56e)
- taker/coinjoin now exposes a status endpoint reporting phase, txid and error (6adeca78)
Fixed
- Keep installer updates working while new releases await trusted signatures (e37e5a27)
- Keep makers available when optional miner-fee prevout lookups fail while logging absent inputs for diagnosis (950d4b7d)
- Keep TUI update output available in a scrollable log before returning to the menu (2625586b)
- Preserve working Tor configurations when cookie-authenticated control access is already available during installation or updates (7e8c45a8)
- Fix stale maker offers not being re-announced after a CoinJoin reduced the available balance (c87a731f)
- Apply maker offer privacy delays to private orderbook responses and retry failed offer announcements and withdrawals (2ae87a59)
- Sort UTXOs numerically by derivation path so indices >= 10 order correctly (44642121)
- Fix jm-wallet info --show-utxos crashing on a wallet with no UTXOs (c25968bc)
- Support PSBT v2 signing and transactions with unrelated P2WSH inputs (b6b08368)
- Omitted Tor control hosts now follow the SOCKS host. Explicit hosts remain unchanged; set control_host = "127.0.0.1" to retain local control with a remote SOCKS proxy. (24fe2838)
- Unknown config entries now warn, including ignored [tor_control] sections. Existing config files are not rewritten. (24fe2838)
- The legacy wallet.background_full_scan setting now blocks startup. Rename it to background_full_rescan (WALLET__BACKGROUND_FULL_RESCAN for environment variables), preserving its value. (24fe2838)
- Keep orderbook nicknames on one line while allowing reachability badges to wrap below them. (7e28b1db)
- Prioritize zero-fee and feature-advertising makers in direct probes and increase scan coverage without increasing concurrency (783f5ecd)
- The fee picked for a single send in JAM (txfee on direct-send and coinjoin requests) is now used instead of being replaced by the global fee setting (a999aafa)
- Apply size_factor only to maximum offer sizes so common minimum sizes remain stable (8143a16f)
- Reduce repeated missing-transaction maker logs to hourly INFO messages (a100b213)
- Install jmwalletd in fresh complete profiles and support opt-in updates (7aa994e4)
- Report the identity rotation quiet period as rotation progress instead of a directory disconnection warning, and stop logging the hidden service listener shutdown twice (be6ac40c)
- Makers now detect when Tor drops their onion service (for example after a Tor restart) and renew their identity instead of advertising an unreachable onion for up to a day (f421cb29)
- Default the BIP39 wallet confirmation prompt to Yes so Enter continues (f5f980db)
- Remove the plaintext all-interface wallet daemon recipe and warn when starting with a non-loopback plaintext listener (cd55dfb3)
- Bound direct maker scans and keep peerlist refresh independent of slow probes (02f254ce)
Configuration Changes
Existing config.toml files are not updated automatically. Review the bundled template changes below and apply the relevant options manually.
--- config.toml.template (0.39.2)
+++ config.toml.template (0.40.0)
@@ -6,6 +6,7 @@ top level
# section and key, then join them with a double underscore. For example:
# [wallet] background_full_rescan -> WALLET__BACKGROUND_FULL_RESCAN
# Environment variables take precedence over values in this file.
+# Unknown sections and keys warn at startup and are ignored.
# ============================================================================
# Core Settings
@@ -37,6 +38,9 @@ [tor]
# connection_timeout = 120.0
# Control port settings (for hidden services)
+# Keep SOCKS and control settings together in [tor], not [tor_control].
+# When control_host is omitted, it follows the effective socks_host (including
+# environment/CLI overrides). Set it explicitly for a separate control endpoint.
# control_enabled = true
# control_host = "127.0.0.1" # Defaults to socks_host if not set
# control_port = 9051
@@ -360,8 +364,9 @@ [maker]
# Minimum CoinJoin amount (in satoshis) that this maker will offer.
#
# Lower min_size lets you serve takers requesting smaller mixes at the cost of
-# producing smaller UTXOs. Note: the *advertised* minsize is randomized on each
-# offer announcement (see size_factor below) and clamped to the dust threshold.
+# producing smaller UTXOs. The advertised minsize is not randomized. It remains
+# subject to the dust threshold, relative-fee profitability floor, and dual-offer
+# fee intersection described below.
#
# Default: 100000 (matches the upstream JoinMarket reference; using a different
# value may make jm-ng makers fingerprintable).
@@ -403,9 +408,11 @@ [maker]
# cj_fee_absolute = 500 # Absolute fee in satoshis (for sw0absoffer)
# tx_fee_contribution = 0 # Mining fee contribution in satoshis
-# Offer randomization factors. Each advertised offer is sampled uniformly from
-# [value*(1-factor), value*(1+factor)] (size is sampled downward only) on every
-# announcement so observers cannot correlate balance changes with exact values.
+# Offer randomization factors. Fees are sampled uniformly from
+# [value*(1-factor), value*(1+factor)] on every announcement.
+# size_factor applies only to maxsize, sampled from
+# [available*(1-size_factor), available] to obscure exact fillable liquidity.
+# The minimum is not randomized, and dual-offer intersection boundaries stay pinned.
# Set any factor to 0 to disable randomization for that field.
# cjfee_factor defaults to 0 (no fee randomization) so a default maker stays
# exactly on its quantization quantum. Randomized and other off-grid offers can
