@@ -18,9 +18,7 @@ PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
1818 PSBTAnalysis result;
1919
2020 bool calc_fee = true ;
21- bool all_final = true ;
22- bool only_missing_sigs = true ;
23- bool only_missing_final = false ;
21+
2422 CAmount in_amt = 0 ;
2523
2624 result.inputs .resize (psbtx.tx ->vin .size ());
@@ -29,6 +27,9 @@ PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
2927 PSBTInput& input = psbtx.inputs [i];
3028 PSBTInputAnalysis& input_analysis = result.inputs [i];
3129
30+ // We set next role here and ratchet backwards as required
31+ input_analysis.next = PSBTRole::EXTRACTOR;
32+
3233 // Check for a UTXO
3334 CTxOut utxo;
3435 if (psbtx.GetInputUTXO (utxo, i)) {
@@ -57,7 +58,6 @@ PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
5758 // Check if it is final
5859 if (!utxo.IsNull () && !PSBTInputSigned (input)) {
5960 input_analysis.is_final = false ;
60- all_final = false ;
6161
6262 // Figure out what is missing
6363 SignatureData outdata;
@@ -74,22 +74,24 @@ PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
7474 if (outdata.missing_pubkeys .empty () && outdata.missing_redeem_script .IsNull () && outdata.missing_witness_script .IsNull () && !outdata.missing_sigs .empty ()) {
7575 input_analysis.next = PSBTRole::SIGNER;
7676 } else {
77- only_missing_sigs = false ;
7877 input_analysis.next = PSBTRole::UPDATER;
7978 }
8079 } else {
81- only_missing_final = true ;
8280 input_analysis.next = PSBTRole::FINALIZER;
8381 }
8482 } else if (!utxo.IsNull ()){
8583 input_analysis.is_final = true ;
8684 }
8785 }
8886
89- if (all_final) {
90- only_missing_sigs = false ;
91- result.next = PSBTRole::EXTRACTOR;
87+ // Calculate next role for PSBT by grabbing "minumum" PSBTInput next role
88+ result.next = PSBTRole::EXTRACTOR;
89+ for (unsigned int i = 0 ; i < psbtx.tx ->vin .size (); ++i) {
90+ PSBTInputAnalysis& input_analysis = result.inputs [i];
91+ result.next = std::min (result.next , input_analysis.next );
9292 }
93+ assert (result.next > PSBTRole::CREATOR);
94+
9395 if (calc_fee) {
9496 // Get the output amount
9597 CAmount out_amt = std::accumulate (psbtx.tx ->vout .begin (), psbtx.tx ->vout .end (), CAmount (0 ),
@@ -139,17 +141,6 @@ PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
139141 result.estimated_feerate = feerate;
140142 }
141143
142- if (only_missing_sigs) {
143- result.next = PSBTRole::SIGNER;
144- } else if (only_missing_final) {
145- result.next = PSBTRole::FINALIZER;
146- } else if (all_final) {
147- result.next = PSBTRole::EXTRACTOR;
148- } else {
149- result.next = PSBTRole::UPDATER;
150- }
151- } else {
152- result.next = PSBTRole::UPDATER;
153144 }
154145
155146 return result;
0 commit comments