This is my first Bitcoin Core PR.
I originally reported #36035 after running into this while experimenting with Taproot 2-of-3 multisig on Signet. After reporting it, I wanted to see whether I could actually trace the problem in the source code and try to fix it myself.
I used ChatGPT Pro as a tool to help me navigate the codebase, understand the PSBT analysis/signing flow, and test different hypotheses. I followed the changes myself, built Bitcoin Core locally, and ran the tests rather than just submitting generated code.
The issue appears to come from the Taproot script-path signing path not recording a missing signature in missing_sigs when a Schnorr signature is not available. AnalyzePSBT() uses missing_sigs to decide whether the next role should be signer. Without it, the PSBT was classified as updater, which is also why the GUI displayed “Transaction is missing some information about inputs.”
My first attempt at the fix did not work. The regression test still returned updater, which led me to notice that SignMuSig2() can return successfully without actually producing a Taproot script-path signature. I adjusted the change so that, after the Schnorr/MuSig2 attempts, a missing signature is recorded when no script-path signature was produced.
I also added a regression test that checks that this Taproot script-path case is classified as signer.
I tested the change locally with:
test/functional/rpc_psbt.py test/functional/wallet_musig.py test_bitcoin --run_test=psbt_tests test_bitcoin --run_test=miniscript_tests git diff --check
All of these passed with the current patch.
This appears to fix the behavior I reported in #36035. Since this is my first contribution, feedback on both the approach and the implementation is very welcome.
Fixes #36035