@@ -308,7 +308,10 @@ impl NegotiationContext {
308
308
} ;
309
309
let prev_output =
310
310
tx. output . get ( msg. prevtx_out as usize ) . ok_or ( AbortReason :: PrevTxOutInvalid ) ?. clone ( ) ;
311
- self . prevtx_outpoints . insert ( input. previous_output ) ;
311
+ if !self . prevtx_outpoints . insert ( input. previous_output ) {
312
+ // We have added an input that already exists
313
+ return Err ( AbortReason :: PrevTxOutInvalid ) ;
314
+ }
312
315
self . inputs . insert ( msg. serial_id , TxInputWithPrevOutput { input, prev_output } ) ;
313
316
Ok ( ( ) )
314
317
}
@@ -1253,7 +1256,7 @@ mod tests {
1253
1256
outputs_a : generate_outputs ( & [ 1_000_000 ] ) ,
1254
1257
inputs_b : vec ! [ ] ,
1255
1258
outputs_b : vec ! [ ] ,
1256
- expect_error : Some ( ( AbortReason :: PrevTxOutInvalid , ErrorCulprit :: NodeA ) ) ,
1259
+ expect_error : Some ( ( AbortReason :: PrevTxOutInvalid , ErrorCulprit :: NodeB ) ) ,
1257
1260
} ) ;
1258
1261
// Non-initiator uses same prevout as initiator.
1259
1262
let duplicate_input = TxIn {
@@ -1266,7 +1269,7 @@ mod tests {
1266
1269
outputs_a : generate_outputs ( & [ 1_000_000 ] ) ,
1267
1270
inputs_b : vec ! [ ( duplicate_input. clone( ) , tx. clone( ) ) ] ,
1268
1271
outputs_b : vec ! [ ] ,
1269
- expect_error : Some ( ( AbortReason :: PrevTxOutInvalid , ErrorCulprit :: NodeB ) ) ,
1272
+ expect_error : Some ( ( AbortReason :: PrevTxOutInvalid , ErrorCulprit :: NodeA ) ) ,
1270
1273
} ) ;
1271
1274
// Initiator sends too many TxAddInputs
1272
1275
do_test_interactive_tx_constructor ( TestSession {
0 commit comments