Original release notes
Automatic history import for existing wallets, fee quantization defaults for better privacy, coin control labels, local mempool API support, bug fixes, and security hardening.
Added
- Detect CoinJoin transactions from their output structure (3ec85e3d)
- Show cj-out/cj-change for imported wallets by reconstructing CoinJoin labels from on-chain data (ea805be6)
- Show fidelity bond addresses that hold more than one UTXO in list-bonds, including the extra locked coins and the total locked at the address (63ef4778)
- Add shared fee-quantization grid primitives in jmcore (52702271)
- Show a fee-quantization bands chart in the orderbook watcher (d60612a7)
- Add a zero (free-maker) band to the absolute fee quantization grid (527329c2)
- Count advertised bonds without a backend and chart makers in their rounded-up fee band (276c7c03)
- Fee quantization chart shows cumulative reachable bond share per band (864e93e1)
- Default maker fee sits on a quantization quantum with randomization disabled (9134c0c6)
- Redesign the fee quantization chart to show which makers share an exact-fee anonymity set, with a legend, unit captions, and per-band median max size (8a1afa30)
- Fee quantization chart tooltip now shows cumulative bond share and max coinjoin size for 10 makers, in sats (939fd698)
- Persist handed-out deposit addresses so /address/new never reissues one after a restart (dc5ae6c9)
- Let deposit addresses be set aside with a label, shown in jm-wallet info --extended (dc5ae6c9)
- Add 'jm-wallet address' commands to reserve, label, release, and list deposit addresses (d5a736db)
- Add incremental wallet transaction enumeration for descriptor and Neutrino backends (9500de04)
- Notify websocket clients about deposits, CoinJoins, sends, and later confirmations for descriptor and Neutrino wallets (e7cbccd3)
- Allow explicit direct access to a configured mempool API (602be73d)
Fixed
- All maker settings are now configurable from config.toml, including dual_offers, directory reconnection tuning, and orderbook rate limiter knobs. (af8fd720)
- Existing coins on reused addresses are no longer auto-frozen on the first sync after a wallet restart or unlock. (84ab95b0)
- Accept a single-string notifications url and show a clear message for invalid config values instead of crashing at startup (64767960)
- Verify the appended nick signature on relayed maker responses and attribute them to the signed sender instead of matching nicks by substring, preventing a malicious maker from hijacking another maker's encrypted session or forging error responses (e0af9a15)
- Validate a peer-supplied relative cjfee before fixed-point formatting so a crafted offer can no longer expand to gigabytes and exhaust memory in every peer parsing the orderbook (f2efe3c7)
- Stop auto-freezing legitimate first-use coins discovered by a (29595ef0)
- Wait out Bitcoin Core's transient wallet-loading state on all wallet load paths instead of triggering a redundant rescan or failing (45346eaa)
- Stop surfacing the expected neutrino 501 from /v1/tx as an error during wallet info (8bb4a7ba)
- Detect confirmation of neutrino pending coinjoins via chain lookups so they are no longer marked failed once they confirm (006593a8)
- Fix fidelity bond UTXOs disappearing from wallet balance when the local bond registry has no matching entry but Bitcoin Core already tracks the bond address (b7030c7d)
- Fix fidelity bond registry migration failing to claim legacy entries with a stale or inconsistent path/pubkey (edb1fd52)
- Fix wallet-info reporting fidelity bonds as found when the bond-aware sync would not actually register them (2379a9c1)
- Fix fidelity bond sync listing all 960 timenumber addresses and registering only one bond at the wrong value (4877e743)
- Fix fidelity bond value in list-bonds not refreshing after a plain wallet sync when the bond address has multiple UTXOs (d2d1b1b2)
- Starting a wallet rescan while Bitcoin Core is already rescanning no longer fails with RPC error -4; the existing scan is tracked instead (7537e7e7)
- getrescaninfo now reports real rescan progress from Bitcoin Core instead of always 0.0 (7351e296)
- getrescaninfo and /session keep reporting rescanning=true while Bitcoin Core is still scanning (7351e296)
- sign_bond_psbt.py now reports the installed HWI version and hints that HWI >= 3.1.0 is required to detect newer devices (Ledger Stax/Flex, Trezor Safe 3/5) when no hardware wallet is found. (606841c0)
- spend-bond guidance no longer claims current Ledger firmware can sign bond PSBTs via HWI; it explains the legacy-app caveat and points to the mnemonic and Specter DIY QR fallbacks. (49f5b5a8)
- Make the first wallet command after
jm-wallet generatenear-instant by recording the wallet creation height, and report scan progress during first-time wallet setup instead of appearing frozen (0d341e59) - Fix /address/new/{mixdepth} returning the same address on repeated calls (bb4e8f1a)
- Honor the documented orderbook_min_wait and orderbook_quiet_period config keys in the taker CLI instead of silently using defaults (68483c64)
- Honor orderbook_min_wait and orderbook_quiet_period for CoinJoins started through the jmwalletd API (9ecda897)
- Honor the [tumbler] pacing settings (retry delay, confirmation poll interval, min confirmations) in the standalone tumbler CLI, not just jmwalletd (6b001d03)
- Honor all [taker] policy settings for tumbler phases and CoinJoins started through the jmwalletd API (7e6a220b)
- Prevent background work (commitment broadcasts, wallet resyncs, notifications) from being garbage-collected mid-flight and log its failures (e2b0e370)
- Fix the session endpoint always reporting a null schedule while a tumbler is running, so JAM can render scheduler progress again (8fb33ad6)
- Fix the fee quantization chart labeling the 10% relative quantum as 1% (880d3e40)
- Fee quantization chart renders the grid even while the orderbook is still empty (66d5b730)
- Browsers no longer serve a stale web UI after the orderbook watcher is upgraded (16d47fc3)
- Per-connection Tor/TCP dial logs moved from INFO to DEBUG (bda6ddd3)
- Reduce orderbook watcher log noise from bond deduplication and maker health checks (faf643a4)
- Verify that a maker's signing pubkey owns the UTXO it signs before accepting the signature, so a maker can no longer pass verification with a key it does not control and make the taker assemble and broadcast a consensus-invalid coinjoin (5591ccca)
- Require the maker's !ioauth btc_sig to verify and bind the auth pubkey to one of its declared UTXOs, dropping the maker otherwise, so a malicious directory can no longer substitute a maker's encryption key to MITM the session and a maker can no longer authenticate with a UTXO it does not control (80d60717)
- Accept honest makers whose declared UTXO scriptPubKey hex is uppercase (6a354843)
- Rescans requested above the chain tip (e.g. JAM's default mainnet SegWit height on signet/regtest) are clamped to the tip instead of failing server-side after a 200 OK response (c1384d3a)
- Stop peerlist-fetch log spam and abort immediately when the directory connection drops (04477a3a)
- Tumbler stop now terminates a stuck phase after a grace period instead of hanging (f251697f)
- Show a 'reused' privacy warning for deposit addresses paid to more than once (56fbedf6)
- Fix backup detection on Raspiblitz by using portable bash glob (b9b9a221)
- Fixed exit behavior when pressing 'B' while already in JM-NG shell on RaspiBlitz (c9054d99)
- Abort in-flight peerlist requests immediately when their continuous listener disconnects (5d98fa14)
- Keep tumbler shutdown bounded while recording cancellation only after the runner actually stops (d6bc39e7)
- Make wallet discovery portable on BusyBox and include hidden wallet files without changing caller shell options (75a6e9e7)
- Preserve forced-address-reuse protection and explicit metadata changes across restarts and concurrent wallet processes (a7443611)
- Verify CI-first release signatures without requiring local manifests (a0f2979f)
- Install the tumbler with complete maker and taker profiles (648768d0)
- Prevent wallet notifications from being missed immediately after WebSocket connection (28d3a84e)
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.33.0)
+++ config.toml.template (0.34.0)
@@ -143,17 +143,6 @@
# Directory servers (leave empty to use network defaults)
# Override with a custom list if needed:
# directory_servers = ["custom1.onion:5222", "custom2.onion:5222"]
-
-# How long to keep retrying directory connections at startup (Tor may still be
-# bootstrapping when the maker starts). After this timeout, the background
-# reconnect task takes over. Defaults to 120 seconds.
-# directory_startup_timeout = 120
-
-# Background reconnect interval in seconds (default: 300)
-# directory_reconnect_interval = 300
-
-# Max reconnection attempts per directory (0 = unlimited, default: 0)
-# directory_reconnect_max_retries = 0
# ============================================================================
# Wallet Settings
@@ -205,7 +194,8 @@
# Explicit start height for initial scan (overrides scan_lookback_blocks if set)
# Useful when you know when the wallet was first used. Set to 0 for full scan.
-# Note: wallets created via the daemon automatically record a creation height,
+# Note: wallets created via `jm-wallet generate` or the daemon automatically
+# record a creation height (when the backend is reachable at creation time),
# which is used as the scan start when this setting is not explicitly set.
# scan_start_height = 0
@@ -247,11 +237,17 @@
# Enable notifications
# enabled = false
-# Apprise notification URLs
-# Examples:
-# Telegram: "tgram://bottoken/ChatID"
-# Gotify: "gotify://hostname/token"
-# See: https://github.com/caronc/apprise
+# Apprise notification URLs. This MUST be a TOML array (square brackets) with
+# each URL quoted, even when you only configure a single service:
+# urls = ["tgram://bottoken/ChatID"]
+# Multiple services (a trailing comma is allowed):
+# urls = [
+# "tgram://bottoken/ChatID",
+# "gotify://hostname/token",
