From 3f5b3c7a8013882b0446218092cc9a57a5140bd2 Mon Sep 17 00:00:00 2001 From: w0xlt <94266259+w0xlt@users.noreply.github.com> Date: Sat, 21 Mar 2026 23:15:29 -0700 Subject: [PATCH] psbt: preserve proprietary fields when combining PSBTs CombinePSBTs currently preserves unknown records but drops proprietary records at the global, input, and output levels because the Merge() paths never union m_proprietary. Preserve proprietary records in PartiallySignedTransaction::Merge(), PSBTInput::Merge(), and PSBTOutput::Merge() so combine/merge keeps all PSBT key-value data. --- src/psbt.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/psbt.cpp b/src/psbt.cpp index f01d915f46d..8f2e9ab16f3 100644 --- a/src/psbt.cpp +++ b/src/psbt.cpp @@ -79,6 +79,7 @@ bool PartiallySignedTransaction::Merge(const PartiallySignedTransaction& psbt) m_tx_modifiable = final_modifiable; } + m_proprietary.insert(psbt.m_proprietary.begin(), psbt.m_proprietary.end()); unknown.insert(psbt.unknown.begin(), psbt.unknown.end()); return true; @@ -436,6 +437,7 @@ bool PSBTInput::Merge(const PSBTInput& input) hash160_preimages.insert(input.hash160_preimages.begin(), input.hash160_preimages.end()); hash256_preimages.insert(input.hash256_preimages.begin(), input.hash256_preimages.end()); hd_keypaths.insert(input.hd_keypaths.begin(), input.hd_keypaths.end()); + m_proprietary.insert(input.m_proprietary.begin(), input.m_proprietary.end()); unknown.insert(input.unknown.begin(), input.unknown.end()); m_tap_script_sigs.insert(input.m_tap_script_sigs.begin(), input.m_tap_script_sigs.end()); m_tap_scripts.insert(input.m_tap_scripts.begin(), input.m_tap_scripts.end()); @@ -534,6 +536,7 @@ bool PSBTOutput::IsNull() const bool PSBTOutput::Merge(const PSBTOutput& output) { hd_keypaths.insert(output.hd_keypaths.begin(), output.hd_keypaths.end()); + m_proprietary.insert(output.m_proprietary.begin(), output.m_proprietary.end()); unknown.insert(output.unknown.begin(), output.unknown.end()); m_tap_bip32_paths.insert(output.m_tap_bip32_paths.begin(), output.m_tap_bip32_paths.end());