test that BDK won't add unconf inputs when fee bumping
Fixes #144 Also removes a leftover dbg!() in a test
This commit is contained in:
		
							parent
							
								
									98748906f6
								
							
						
					
					
						commit
						5d00f82388
					
				| @ -2262,7 +2262,6 @@ pub(crate) mod test { | ||||
|             .drain_to(drain_addr.script_pubkey()) | ||||
|             .drain_wallet(); | ||||
|         let (psbt, details) = builder.finish().unwrap(); | ||||
|         dbg!(&psbt); | ||||
|         let outputs = psbt.unsigned_tx.output; | ||||
| 
 | ||||
|         assert_eq!(outputs.len(), 2); | ||||
| @ -3859,6 +3858,99 @@ pub(crate) mod test { | ||||
|         assert_eq!(details.fee.unwrap_or(0), 250); | ||||
|     } | ||||
| 
 | ||||
|     #[test] | ||||
|     #[should_panic(expected = "InsufficientFunds")] | ||||
|     fn test_bump_fee_unconfirmed_inputs_only() { | ||||
|         // We try to bump the fee, but:
 | ||||
|         // - We can't reduce the change, as we have no change
 | ||||
|         // - All our UTXOs are unconfirmed
 | ||||
|         // So, we fail with "InsufficientFunds", as per RBF rule 2:
 | ||||
|         // The replacement transaction may only include an unconfirmed input
 | ||||
|         // if that input was included in one of the original transactions.
 | ||||
|         let (wallet, descriptors, _) = get_funded_wallet(get_test_wpkh()); | ||||
|         let addr = Address::from_str("2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX").unwrap(); | ||||
|         let mut builder = wallet.build_tx(); | ||||
|         builder | ||||
|             .drain_wallet() | ||||
|             .drain_to(addr.script_pubkey()) | ||||
|             .enable_rbf(); | ||||
|         let (psbt, mut original_details) = builder.finish().unwrap(); | ||||
|         // Now we receive one transaction with 0 confirmations. We won't be able to use that for
 | ||||
|         // fee bumping, as it's still unconfirmed!
 | ||||
|         crate::populate_test_db!( | ||||
|             wallet.database.borrow_mut(), | ||||
|             testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 0)), | ||||
|             Some(100), | ||||
|         ); | ||||
|         let mut tx = psbt.extract_tx(); | ||||
|         let txid = tx.txid(); | ||||
|         for txin in &mut tx.input { | ||||
|             txin.witness.push([0x00; 108]); // fake signature
 | ||||
|             wallet | ||||
|                 .database | ||||
|                 .borrow_mut() | ||||
|                 .del_utxo(&txin.previous_output) | ||||
|                 .unwrap(); | ||||
|         } | ||||
|         original_details.transaction = Some(tx); | ||||
|         wallet | ||||
|             .database | ||||
|             .borrow_mut() | ||||
|             .set_tx(&original_details) | ||||
|             .unwrap(); | ||||
| 
 | ||||
|         let mut builder = wallet.build_fee_bump(txid).unwrap(); | ||||
|         builder.fee_rate(FeeRate::from_sat_per_vb(25.0)); | ||||
|         builder.finish().unwrap(); | ||||
|     } | ||||
| 
 | ||||
|     #[test] | ||||
|     fn test_bump_fee_unconfirmed_input() { | ||||
|         // We create a tx draining the wallet and spending one confirmed
 | ||||
|         // and one unconfirmed UTXO. We check that we can fee bump normally
 | ||||
|         // (BIP125 rule 2 only apply to newly added unconfirmed input, you can
 | ||||
|         // always fee bump with an unconfirmed input if it was included in the
 | ||||
|         // original transaction)
 | ||||
|         let (wallet, descriptors, _) = get_funded_wallet(get_test_wpkh()); | ||||
|         let addr = Address::from_str("2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX").unwrap(); | ||||
|         // We receive a tx with 0 confirmations, which will be used as an input
 | ||||
|         // in the drain tx.
 | ||||
|         crate::populate_test_db!( | ||||
|             wallet.database.borrow_mut(), | ||||
|             testutils! (@tx ( (@external descriptors, 0) => 25_000 ) (@confirmations 0)), | ||||
|             Some(100), | ||||
|         ); | ||||
|         let mut builder = wallet.build_tx(); | ||||
|         builder | ||||
|             .drain_wallet() | ||||
|             .drain_to(addr.script_pubkey()) | ||||
|             .enable_rbf(); | ||||
|         let (psbt, mut original_details) = builder.finish().unwrap(); | ||||
|         let mut tx = psbt.extract_tx(); | ||||
|         let txid = tx.txid(); | ||||
|         for txin in &mut tx.input { | ||||
|             txin.witness.push([0x00; 108]); // fake signature
 | ||||
|             wallet | ||||
|                 .database | ||||
|                 .borrow_mut() | ||||
|                 .del_utxo(&txin.previous_output) | ||||
|                 .unwrap(); | ||||
|         } | ||||
|         original_details.transaction = Some(tx); | ||||
|         wallet | ||||
|             .database | ||||
|             .borrow_mut() | ||||
|             .set_tx(&original_details) | ||||
|             .unwrap(); | ||||
| 
 | ||||
|         let mut builder = wallet.build_fee_bump(txid).unwrap(); | ||||
|         builder | ||||
|             .fee_rate(FeeRate::from_sat_per_vb(15.0)) | ||||
|             .allow_shrinking(addr.script_pubkey()) | ||||
|             .unwrap(); | ||||
|         builder.finish().unwrap(); | ||||
|     } | ||||
| 
 | ||||
|     #[test] | ||||
|     fn test_sign_single_xprv() { | ||||
|         let (wallet, _, _) = get_funded_wallet("wpkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)"); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user