builder.finish().unwrap();
}
+macro_rules! check_fee {
+ ($wallet:expr, $psbt: expr) => {{
+ let tx = $psbt.clone().extract_tx();
+ let tx_fee = $wallet.calculate_fee(&tx).ok();
+ assert_eq!(tx_fee, $psbt.fee_amount());
+ tx_fee
+ }};
+}
+
#[test]
fn test_create_tx_drain_wallet_and_drain_to() {
let (mut wallet, _) = get_funded_wallet(get_test_wpkh());
let mut builder = wallet.build_tx();
builder.drain_to(addr.script_pubkey()).drain_wallet();
let psbt = builder.finish().unwrap();
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_eq!(psbt.unsigned_tx.output.len(), 1);
assert_eq!(psbt.unsigned_tx.output[0].value, 50_000 - fee.unwrap_or(0));
.drain_to(drain_addr.script_pubkey())
.drain_wallet();
let psbt = builder.finish().unwrap();
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
let outputs = psbt.unsigned_tx.output;
assert_eq!(outputs.len(), 2);
.add_utxos(&utxos)
.unwrap();
let psbt = builder.finish().unwrap();
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_eq!(psbt.unsigned_tx.output.len(), 1);
assert_eq!(psbt.unsigned_tx.output[0].value, 50_000 - fee.unwrap_or(0));
let mut builder = wallet.build_tx();
builder.add_recipient(addr.script_pubkey(), 25_000);
let psbt = builder.finish().unwrap();
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_fee_rate!(psbt, fee.unwrap_or(0), FeeRate::default(), @add_signature);
}
.add_recipient(addr.script_pubkey(), 25_000)
.fee_rate(FeeRate::from_sat_per_vb(5.0));
let psbt = builder.finish().unwrap();
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_fee_rate!(psbt, fee.unwrap_or(0), FeeRate::from_sat_per_vb(5.0), @add_signature);
}
.drain_wallet()
.fee_absolute(100);
let psbt = builder.finish().unwrap();
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_eq!(fee.unwrap_or(0), 100);
assert_eq!(psbt.unsigned_tx.output.len(), 1);
.drain_wallet()
.fee_absolute(0);
let psbt = builder.finish().unwrap();
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_eq!(fee.unwrap_or(0), 0);
assert_eq!(psbt.unsigned_tx.output.len(), 1);
.add_recipient(addr.script_pubkey(), 25_000)
.ordering(TxOrdering::Untouched);
let psbt = builder.finish().unwrap();
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_eq!(psbt.unsigned_tx.output.len(), 2);
assert_eq!(psbt.unsigned_tx.output[0].value, 25_000);
let mut builder = wallet.build_tx();
builder.add_recipient(addr.script_pubkey(), 49_800);
let psbt = builder.finish().unwrap();
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_eq!(psbt.unsigned_tx.output.len(), 1);
assert_eq!(psbt.unsigned_tx.output[0].value, 49_800);
.add_recipient(addr.script_pubkey(), 10_000)
.ordering(bdk::wallet::tx_builder::TxOrdering::Bip69Lexicographic);
let psbt = builder.finish().unwrap();
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_eq!(psbt.unsigned_tx.output.len(), 3);
assert_eq!(psbt.unsigned_tx.output[0].value, 10_000 - fee.unwrap_or(0));
.add_foreign_utxo(utxo.outpoint, psbt_input, foreign_utxo_satisfaction)
.unwrap();
let mut psbt = builder.finish().unwrap();
- let fee = psbt.fee_amount();
+ wallet1.insert_txout(utxo.outpoint, utxo.txout);
+ let fee = check_fee!(wallet1, psbt);
let sent_received = wallet1.sent_and_received(&psbt.clone().extract_tx());
assert_eq!(
wallet1.calculate_fee(&tx).unwrap();
}
-#[test]
-fn test_calculate_fee_with_inserted_foreign_utxo() {
- let (mut wallet1, _) = get_funded_wallet(get_test_wpkh());
- let (wallet2, _) =
- get_funded_wallet("wpkh(cVbZ8ovhye9AoAHFsqobCf7LxbXDAECy9Kb8TZdfsDYMZGBUyCnm)");
-
- let addr = Address::from_str("2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX")
- .unwrap()
- .assume_checked();
- let utxo = wallet2.list_unspent().next().expect("must take!");
- #[allow(deprecated)]
- let foreign_utxo_satisfaction = wallet2
- .get_descriptor_for_keychain(KeychainKind::External)
- .max_satisfaction_weight()
- .unwrap();
-
- let psbt_input = psbt::Input {
- witness_utxo: Some(utxo.txout.clone()),
- ..Default::default()
- };
-
- let mut builder = wallet1.build_tx();
- builder
- .add_recipient(addr.script_pubkey(), 60_000)
- .only_witness_utxo()
- .add_foreign_utxo(utxo.outpoint, psbt_input, foreign_utxo_satisfaction)
- .unwrap();
- let psbt = builder.finish().unwrap();
- let psbt_fee = psbt.fee_amount().expect("psbt fee");
- let tx = psbt.extract_tx();
-
- wallet1.insert_txout(utxo.outpoint, utxo.txout);
- let wallet1_fee = wallet1.calculate_fee(&tx).expect("wallet fee");
- assert_eq!(psbt_fee, wallet1_fee);
-}
-
#[test]
#[should_panic(expected = "Generic(\"Foreign utxo missing witness_utxo or non_witness_utxo\")")]
fn test_add_foreign_utxo_invalid_psbt_input() {
.enable_rbf();
let psbt = builder.finish().unwrap();
let original_sent_received = wallet.sent_and_received(&psbt.clone().extract_tx());
- let original_fee = psbt.fee_amount();
+ let original_fee = check_fee!(wallet, psbt);
let tx = psbt.extract_tx();
let txid = tx.txid();
builder.fee_rate(FeeRate::from_sat_per_vb(2.5)).enable_rbf();
let psbt = builder.finish().unwrap();
let sent_received = wallet.sent_and_received(&psbt.clone().extract_tx());
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_eq!(sent_received.0, original_sent_received.0);
assert_eq!(
builder.enable_rbf();
let psbt = builder.finish().unwrap();
let sent_received = wallet.sent_and_received(&psbt.clone().extract_tx());
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_eq!(sent_received.0, original_sent_received.0);
assert_eq!(
let psbt = builder.finish().unwrap();
let tx = psbt.clone().extract_tx();
let original_sent_received = wallet.sent_and_received(&tx);
- let original_fee = psbt.fee_amount();
+ let original_fee = check_fee!(wallet, psbt);
let txid = tx.txid();
wallet
.insert_tx(tx, ConfirmationTime::Unconfirmed { last_seen: 0 })
.unwrap();
let psbt = builder.finish().unwrap();
let sent_received = wallet.sent_and_received(&psbt.clone().extract_tx());
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_eq!(sent_received.0, original_sent_received.0);
assert!(fee.unwrap_or(0) > original_fee.unwrap_or(0));
.drain_wallet()
.enable_rbf();
let psbt = builder.finish().unwrap();
- let original_fee = psbt.fee_amount();
+ let original_fee = check_fee!(wallet, psbt);
let tx = psbt.extract_tx();
let original_sent_received = wallet.sent_and_received(&tx);
let txid = tx.txid();
let psbt = builder.finish().unwrap();
let tx = &psbt.unsigned_tx;
let sent_received = wallet.sent_and_received(tx);
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_eq!(sent_received.0, original_sent_received.0);
assert!(fee.unwrap_or(0) > original_fee.unwrap_or(0));
builder.fee_rate(FeeRate::from_sat_per_vb(50.0));
let psbt = builder.finish().unwrap();
let sent_received = wallet.sent_and_received(&psbt.clone().extract_tx());
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_eq!(sent_received.0, original_details.0 + 25_000);
assert_eq!(fee.unwrap_or(0) + sent_received.1, 30_000);
builder.fee_absolute(6_000);
let psbt = builder.finish().unwrap();
let sent_received = wallet.sent_and_received(&psbt.clone().extract_tx());
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_eq!(sent_received.0, original_sent_received.0 + 25_000);
assert_eq!(fee.unwrap_or(0) + sent_received.1, 30_000);
.enable_rbf();
let psbt = builder.finish().unwrap();
let original_sent_received = wallet.sent_and_received(&psbt.clone().extract_tx());
- let original_fee = psbt.fee_amount();
+ let original_fee = check_fee!(wallet, psbt);
let tx = psbt.extract_tx();
let txid = tx.txid();
builder.fee_rate(FeeRate::from_sat_per_vb(50.0));
let psbt = builder.finish().unwrap();
let sent_received = wallet.sent_and_received(&psbt.clone().extract_tx());
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
let original_send_all_amount = original_sent_received.0 - original_fee.unwrap_or(0);
assert_eq!(sent_received.0, original_sent_received.0 + 50_000);
.enable_rbf();
let psbt = builder.finish().unwrap();
let original_sent_received = wallet.sent_and_received(&psbt.clone().extract_tx());
- let original_fee = psbt.fee_amount();
+ let original_fee = check_fee!(wallet, psbt);
let mut tx = psbt.extract_tx();
for txin in &mut tx.input {
builder.fee_rate(FeeRate::from_wu(fee_abs, new_tx_weight));
let psbt = builder.finish().unwrap();
let sent_received = wallet.sent_and_received(&psbt.clone().extract_tx());
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_eq!(original_sent_received.1, 5_000 - original_fee.unwrap_or(0));
.fee_rate(FeeRate::from_sat_per_vb(5.0));
let psbt = builder.finish().unwrap();
let sent_received = wallet.sent_and_received(&psbt.clone().extract_tx());
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_eq!(sent_received.0, original_sent_received.0 + 25_000);
assert_eq!(fee.unwrap_or(0) + sent_received.1, 30_000);
builder.add_utxo(incoming_op).unwrap().fee_absolute(250);
let psbt = builder.finish().unwrap();
let sent_received = wallet.sent_and_received(&psbt.clone().extract_tx());
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_eq!(sent_received.0, original_sent_received.0 + 25_000);
assert_eq!(fee.unwrap_or(0) + sent_received.1, 30_000);
.enable_rbf()
.fee_rate(fee_rate);
let psbt = builder.finish().unwrap();
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
assert_eq!(psbt.inputs.len(), 1);
assert_fee_rate!(psbt, fee.unwrap_or(0), fee_rate, @add_signature);
.unwrap();
let psbt = builder.finish().unwrap();
let sent_received = wallet1.sent_and_received(&psbt.clone().extract_tx());
- let fee = psbt.fee_amount();
+ wallet1.insert_txout(utxo.outpoint, utxo.txout);
+ let fee = check_fee!(wallet1, psbt);
assert_eq!(
sent_received.0 - sent_received.1,
.fee_rate(fee_rate)
.add_data(&data);
let mut psbt = builder.finish().unwrap();
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
let (op_return_vout, _) = psbt
.unsigned_tx
.output
.drain_wallet()
.fee_rate(fee_rate);
let mut psbt = builder.finish().unwrap();
- let fee = psbt.fee_amount();
+ let fee = check_fee!(wallet, psbt);
wallet
.sign(