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