test(wallet): add check_fee!(wallet,psbt) macro and use it in place of psbt.fee_amount()

- removed test_calculate_fee_with_inserted_foreign_utxo() since it now duplicates test in test_add_foreign_utxo()
This commit is contained in:
Steve Myers 2023-08-24 09:52:31 -05:00
parent 465d53cc88
commit dd5b8d7599
No known key found for this signature in database
GPG Key ID: 8105A46B22C2D051

View File

@ -436,6 +436,15 @@ fn test_create_tx_change_policy_no_internal() {
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());
@ -443,7 +452,7 @@ fn test_create_tx_drain_wallet_and_drain_to() {
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));
@ -462,7 +471,7 @@ fn test_create_tx_drain_wallet_and_drain_to_and_with_recipient() {
.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);
@ -489,7 +498,7 @@ fn test_create_tx_drain_to_and_utxos() {
.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));
@ -512,7 +521,7 @@ fn test_create_tx_default_fee_rate() {
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);
}
@ -526,7 +535,7 @@ fn test_create_tx_custom_fee_rate() {
.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);
}
@ -541,7 +550,7 @@ fn test_create_tx_absolute_fee() {
.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);
@ -558,7 +567,7 @@ fn test_create_tx_absolute_zero_fee() {
.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);
@ -589,7 +598,7 @@ fn test_create_tx_add_change() {
.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);
@ -603,7 +612,7 @@ fn test_create_tx_skip_change_dust() {
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);
@ -634,7 +643,7 @@ fn test_create_tx_ordering_respected() {
.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));
@ -1050,7 +1059,8 @@ fn test_add_foreign_utxo() {
.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!(
@ -1129,42 +1139,6 @@ fn test_calculate_fee_with_missing_foreign_utxo() {
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() {
@ -1463,7 +1437,7 @@ fn test_bump_fee_reduce_change() {
.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();
@ -1475,7 +1449,7 @@ fn test_bump_fee_reduce_change() {
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!(
@ -1510,7 +1484,7 @@ fn test_bump_fee_reduce_change() {
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!(
@ -1560,7 +1534,7 @@ fn test_bump_fee_reduce_single_recipient() {
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 })
@ -1573,7 +1547,7 @@ fn test_bump_fee_reduce_single_recipient() {
.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));
@ -1597,7 +1571,7 @@ fn test_bump_fee_absolute_reduce_single_recipient() {
.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();
@ -1613,7 +1587,7 @@ fn test_bump_fee_absolute_reduce_single_recipient() {
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));
@ -1784,7 +1758,7 @@ fn test_bump_fee_add_input() {
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);
@ -1834,7 +1808,7 @@ fn test_bump_fee_absolute_add_input() {
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);
@ -1880,7 +1854,7 @@ fn test_bump_fee_no_change_add_input_and_change() {
.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();
@ -1894,7 +1868,7 @@ fn test_bump_fee_no_change_add_input_and_change() {
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);
@ -1939,7 +1913,7 @@ fn test_bump_fee_add_input_change_dust() {
.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 {
@ -1971,7 +1945,7 @@ fn test_bump_fee_add_input_change_dust() {
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));
@ -2025,7 +1999,7 @@ fn test_bump_fee_force_add_input() {
.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);
@ -2083,7 +2057,7 @@ fn test_bump_fee_absolute_force_add_input() {
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);
@ -2212,7 +2186,7 @@ fn test_fee_amount_negative_drain_val() {
.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);
@ -2951,7 +2925,8 @@ fn test_taproot_foreign_utxo() {
.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,
@ -3403,7 +3378,7 @@ fn test_fee_rate_sign_no_grinding_high_r() {
.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
@ -3467,7 +3442,7 @@ fn test_fee_rate_sign_grinding_low_r() {
.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(