@@ -310,7 +310,10 @@ impl NegotiationContext {
310
310
} ;
311
311
let prev_output =
312
312
tx. output . get ( msg. prevtx_out as usize ) . ok_or ( AbortReason :: PrevTxOutInvalid ) ?. clone ( ) ;
313
- self . prevtx_outpoints . insert ( input. previous_output . clone ( ) ) ;
313
+ if !self . prevtx_outpoints . insert ( input. previous_output . clone ( ) ) {
314
+ // We have added an input that already exists
315
+ return Err ( AbortReason :: PrevTxOutInvalid ) ;
316
+ }
314
317
self . inputs . insert ( msg. serial_id , TxInputWithPrevOutput { input, prev_output } ) ;
315
318
Ok ( ( ) )
316
319
}
@@ -1272,7 +1275,7 @@ mod tests {
1272
1275
outputs_a : generate_outputs ( & [ 1_000_000 ] ) ,
1273
1276
inputs_b : vec ! [ ] ,
1274
1277
outputs_b : vec ! [ ] ,
1275
- expect_error : Some ( ( AbortReason :: PrevTxOutInvalid , ErrorCulprit :: NodeA ) ) ,
1278
+ expect_error : Some ( ( AbortReason :: PrevTxOutInvalid , ErrorCulprit :: NodeB ) ) ,
1276
1279
} ) ;
1277
1280
// Non-initiator uses same prevout as initiator.
1278
1281
let duplicate_input = TxIn {
@@ -1285,7 +1288,7 @@ mod tests {
1285
1288
outputs_a : generate_outputs ( & [ 1_000_000 ] ) ,
1286
1289
inputs_b : vec ! [ ( duplicate_input. clone( ) , tx. clone( ) ) ] ,
1287
1290
outputs_b : vec ! [ ] ,
1288
- expect_error : Some ( ( AbortReason :: PrevTxOutInvalid , ErrorCulprit :: NodeB ) ) ,
1291
+ expect_error : Some ( ( AbortReason :: PrevTxOutInvalid , ErrorCulprit :: NodeA ) ) ,
1289
1292
} ) ;
1290
1293
// Initiator sends too many TxAddInputs
1291
1294
do_test_interactive_tx_constructor ( TestSession {
0 commit comments