@@ -18,9 +18,7 @@ PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
18
18
PSBTAnalysis result;
19
19
20
20
bool calc_fee = true ;
21
- bool all_final = true ;
22
- bool only_missing_sigs = true ;
23
- bool only_missing_final = false ;
21
+
24
22
CAmount in_amt = 0 ;
25
23
26
24
result.inputs .resize (psbtx.tx ->vin .size ());
@@ -29,6 +27,9 @@ PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
29
27
PSBTInput& input = psbtx.inputs [i];
30
28
PSBTInputAnalysis& input_analysis = result.inputs [i];
31
29
30
+ // We set next role here and ratchet backwards as required
31
+ input_analysis.next = PSBTRole::EXTRACTOR;
32
+
32
33
// Check for a UTXO
33
34
CTxOut utxo;
34
35
if (psbtx.GetInputUTXO (utxo, i)) {
@@ -57,7 +58,6 @@ PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
57
58
// Check if it is final
58
59
if (!utxo.IsNull () && !PSBTInputSigned (input)) {
59
60
input_analysis.is_final = false ;
60
- all_final = false ;
61
61
62
62
// Figure out what is missing
63
63
SignatureData outdata;
@@ -74,22 +74,24 @@ PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
74
74
if (outdata.missing_pubkeys .empty () && outdata.missing_redeem_script .IsNull () && outdata.missing_witness_script .IsNull () && !outdata.missing_sigs .empty ()) {
75
75
input_analysis.next = PSBTRole::SIGNER;
76
76
} else {
77
- only_missing_sigs = false ;
78
77
input_analysis.next = PSBTRole::UPDATER;
79
78
}
80
79
} else {
81
- only_missing_final = true ;
82
80
input_analysis.next = PSBTRole::FINALIZER;
83
81
}
84
82
} else if (!utxo.IsNull ()){
85
83
input_analysis.is_final = true ;
86
84
}
87
85
}
88
86
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 );
92
92
}
93
+ assert (result.next > PSBTRole::CREATOR);
94
+
93
95
if (calc_fee) {
94
96
// Get the output amount
95
97
CAmount out_amt = std::accumulate (psbtx.tx ->vout .begin (), psbtx.tx ->vout .end (), CAmount (0 ),
@@ -139,17 +141,6 @@ PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
139
141
result.estimated_feerate = feerate;
140
142
}
141
143
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;
153
144
}
154
145
155
146
return result;
0 commit comments