#36539 gui: Use PSBT v0

ReviewabilityReviewsAgreementSize
#36539 davidgumberg gui: Use PSBT v0Ready2Positive19 + 5 tests
  • Restore PSBTv0 creation in the GUI for unsigned sends and watch-only fee bumping
  • Fix interoperability with third-party wallet tools and hardware signers that reject PSBTv2
  • Ready for review
  • Support without stated reasons, no open objections (Sjors, w0xlt)
  • Earlier scope objection to adding UI controls for backport resolved by keeping v0 default (achow101)
  • 19 lines added or modified outside tests
  • 5 lines added or modified in tests
  • 10 lines removed in total
  • 8 files, 2 commits
Wallet#17 of 92
P2 · bug fix
  • P2 because it fixes an interoperability regression introduced in 32.0
  • Prevents external wallet software and hardware signers from rejecting GUI-exported watch-only transactions
  • Ranking pass: Moved up: it fixes a shipped 32.0 interoperability regression, which outranks the feature-oriented P2s.
Reviewability: ReadyStalePaused
Agreement: StrongPositivePositive w/ caveatsNeutralMildDisputedBlockedCrickets
Reviews: current code-review ACKs, then (+stale ACKs) and -NACKs; greener = more ACKs.
Size: lines added or modified outside tests, then in tests; greener = smaller.

Goal

Switches PSBTs created by the GUI for unsigned sends and watch-only fee bumping back to PSBTv0. External signer flows explicitly retain PSBTv2, and the PartiallySignedTransaction constructor default version argument is removed to require explicit version specification at call sites.

Problem: Bitcoin Core 32.0 started defaulting newly created PSBTs to PSBTv2. Many third-party wallet tools and signing hardware used with watch-only GUI wallets only support PSBTv0, causing clipboard-exported unsigned transactions to be rejected.

Evidence of importance:

  • Fixes #36518 (reported in description: 'This fixes: https://github.com/bitcoin/bitcoin/issues/36518')
  • Commit 23dcb03a2c notes: 'PSBTv2 is not very interesting for current GUI users, and defaulting to it causes issues for existing users.'

Scope: Small diff across GUI, wallet feebumper, and tests, accompanied by a release note documenting external signer PSBTv2 requirements (HWI >= 2.1.0).

Risk of a mistake: medium (gui, wallet). Mistakes in PSBT serialization version selection or construction could break transaction signing workflows for watch-only or external signer users.

Changed since the previous assessment: External signer PSBT creation is explicitly set to version 2 rather than version 0, and a release note documenting the HWI 2.1.0 minimum version requirement was added.

Reviewability

Ready

Nothing known that would invalidate a review now.

Waiting on (from the thread read):

  • nothing: no pending reviews or author action needed

Agreement

Positive

support without stated reasons, no open objection (Sjors, w0xlt)

Thread notes: Sjors and w0xlt both ACKed the PR. hebasto restarted cancelled CI jobs.

Objections, suggestions, and questions:

ReviewerTypeHarm, request, or questionStatusMust beAuthor repliedQuote
achow101 (member)objection, scopeAdding GUI elements and new translation strings is inappropriate for a PR intended for backporting; GUI should just default to v0 without adding new UI controls.fixed · fix pushed · author pushed to make GUI return v0 PSBTs without new UI controlschangedyes2026-10-16: 'I don't think we should be adding any GUI elements for a PR targeting a backport, particularly as it adds strings for translation. We can do v0 only in the GUI I guess.'
Status from: 2026-10-18: davidgumberg: 'I've pushed so that the GUI just returns v0 PSBT's.'
Sjors (member)suggestion, maintenanceAdd a release note mentioning that RPC can be used for v2 if the GUI is restricted to v0.fixed · fix pushed · author added a release noteansweredyes2026-10-17: 'There could be a (release) note to use the RPC for v2 when needed.'
Status from: 2026-10-26: davidgumberg: 'so I've added a release note about that.'
Sjors (member)suggestion, approachConsistently use PSBT v2 for external signers from both GUI and RPC.fixed · fix pushed · author modified external signer PSBTs to use v2answeredyes2026-10-20: 'I think it's better to consistently use v2 for external signers, both from the GUI and RPC.'
Status from: 2026-10-26: davidgumberg: 'I've modified this so that the external signer PSBT's are v2'
w0xlt (contributor)suggestion, approachAdd a psbt_version parameter to feebumper::SignTransaction/signBumpTransaction so the GUI fee bump can pass v0 while RPC retains v2.fixed · fix pushed · author adopted the suggested changeansweredyes2026-10-20: 'Suggestion: a psbt_version param can be added to feebumper::SignTransaction/signBumpTransaction, with the GUI passing 0 and RPC keeping 2.'
Status from: 2026-10-26: davidgumberg: 'Taken, thanks'

Support:

  • Sjors (member) (ACK, 2026-10-27): (no reason given) [not substantive]
  • w0xlt (contributor) (ACK, 2026-10-27): (no reason given) [not substantive]

Participants:

  • achow101 (member, objection, 1 statements 2026-10-16 to 2026-10-16): objected to adding GUI elements and translation strings in a PR intended for backporting
  • fanquake (member, neutral, 2 statements 2026-10-16 to 2026-10-21): pinged another reviewer and set the milestone to 32.1
  • Sjors (member, support, 4 statements 2026-10-17 to 2026-10-27): ACKed the PR
  • w0xlt (contributor, support, 2 statements 2026-10-20 to 2026-10-27): crACKed the PR
  • hebasto (member, neutral, 1 statements 2026-10-27 to 2026-10-27): re-ran cancelled CI jobs

Files

9 lines under test/bench/ci.

  • doc/release-notes-hwi-minver.md +10/-0
  • src/qt/sendcoinsdialog.cpp +4/-2
  • src/test/psbt_tests.cpp +3/-3
  • src/wallet/feebumper.cpp +3/-2
  • src/psbt.h +1/-1
  • src/qt/walletmodel.cpp +1/-1
  • src/test/fuzz/psbt.cpp +1/-1
  • src/qt/test/wallettests.cpp +1/-0

Card

The short text the ranking pass compares across PRs.

Switches PSBT generation in the GUI back to version 0 for watch-only sends and fee bumps, while keeping PSBTv2 for external signer flows and removing the default version parameter from the PartiallySignedTransaction constructor. This addresses issue #36518, where exporting PSBTv2 transactions from the GUI broke compatibility with external software and hardware signers that only parse PSBTv0. A release note is added documenting the minimum HWI version (2.1.0) needed for external signers.

Data

dossier JSON · extract JSON · model ledger, generated 2026-10-28T01:22, confidence high, input hash 76a4325d95505f86
thread read through 2026-10-27 (14 statements), head 3fdc45d1fa
labels: GUI, Needs Backport (32.x)

Categories

Wallet

P2 · bug fix (ranking pass: Moved up: it fixes a shipped 32.0 interoperability regression, which outranks the feature-oriented P2s.)

Fixes an interoperability regression introduced in 32.0 where defaulting GUI unsigned transactions to PSBTv2 caused third-party wallet tools and hardware signers to reject them (#36518).

Membership: Modifies PSBT generation logic in src/wallet/feebumper.cpp, src/psbt.h, and GUI wallet controllers.

Factors: security/stability 0, bug 2, performance 0, user value 2, leverage 0