Everything the Windows field test turned up, plus what came out of checking it.
Fees
The fee slider offered eight steps out of twelve that the miner will never accept. Doichain refuses to relay below DEFAULT_MIN_RELAY_TX_FEE = COIN/1000 — 100 sat/vByte, a hundred times Bitcoin's floor. The public servers lower that limit; the mining node does not. A transaction paying less was taken by the servers, showed as sent, sat in the mempool and was never mined, with no error anywhere to explain it. (#23)
Rescaling the steps alone would not have helped: a wallet that had ever touched the slider carried its choice in fee_per_kb and got it back verbatim, so the slider would have sat on its lowest position while still paying the old rate. The clamp now sits where the number becomes a payment.
Fiat display
- Enabling it no longer produces a
TypeErrordialog for every amount on screen (#16) - The rate is the currency you selected, not always dollars (#17)
- No more empty history column — the free plan has no history to offer, and the wallet stops asking (#18)
- Ten of the eleven rate sources were pricing Bitcoin, not Doichain (#24). Picking one valued your balance about six orders of magnitude too high, with nothing on screen to say which coin was being priced. Only sources that quote this chain are offered now
Windows name resolution
The wallet resolved DNS itself, through servers it read out of the registry — where Windows keeps an entry for every adapter the machine has ever had. A long-dead adapter's resolver answered for the wallet while every other program on the machine resolved correctly. Windows now resolves its own names. (#19)
Also
- the description column in the history list can be dragged; it was 104 px and fixed (#20)
- four bundled servers in four distinct buckets rather than three — over IPv6 a different pair collided than over IPv4 (#22)
This build is reproducible, and that is new
The Windows binaries have always been built on one machine. This release was built twice — locally, and on a GitHub runner from a clean checkout of the tag — and the three binaries came out byte-identical:
92a15df2fd55566886b2deee6d8f34126235defe76d745fcd0c3e407c47c2cb5 electrum-doi-dc4.1.7-setup.exe
2a96c10f48056db373bf4574f4bfb2deae82c27b675d61e6b8af608cbd793121 electrum-doi-dc4.1.7-portable.exe
b7690c4ddd189714f636e138b8e952ccbe801dd978b43e6701b972f6e7aef31b electrum-doi-dc4.1.7.exe
You can check this yourself: run 35385952658 built the same tag on GitHub's hardware, and its log carries the same three lines.
The first comparison found a difference, and it was worth finding: the local tree had __pycache__ directories from test runs, which deterministic.spec was bundling into the binary. The released files come from a pristine clone.
SHA256SUMS is signed with 52A21926 E3F274AA 1F2D9CDA 9BA0ED44 F14E8118.
And the tests run again
This repository had no CI since July 2021 — the inherited .travis.yml stopped working when Travis ended its free tier, and it had been broken before that. main now runs flake8 and 183 unit tests on every push (#33).
It found things immediately. The fiat defect above had made test_wallet.py hang rather than fail, which is why it survived for years. And contrib/requirements/requirements.txt asked for protobuf with no upper bound, so a fresh install produced a wallet that could not parse a payment request.
Ten test modules are still excluded: they assert Bitcoin addresses and keys inherited at the fork. As far as I could tell not one is a real defect — details in #32.