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_to(drain_addr.script_pubkey()) | ||||||
|             .drain_wallet(); |             .drain_wallet(); | ||||||
|         let (psbt, details) = builder.finish().unwrap(); |         let (psbt, details) = builder.finish().unwrap(); | ||||||
|         dbg!(&psbt); |  | ||||||
|         let outputs = psbt.unsigned_tx.output; |         let outputs = psbt.unsigned_tx.output; | ||||||
| 
 | 
 | ||||||
|         assert_eq!(outputs.len(), 2); |         assert_eq!(outputs.len(), 2); | ||||||
| @ -3859,6 +3858,99 @@ pub(crate) mod test { | |||||||
|         assert_eq!(details.fee.unwrap_or(0), 250); |         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] |     #[test] | ||||||
|     fn test_sign_single_xprv() { |     fn test_sign_single_xprv() { | ||||||
|         let (wallet, _, _) = get_funded_wallet("wpkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)"); |         let (wallet, _, _) = get_funded_wallet("wpkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)"); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user