@@ -436,14 +436,23 @@ fn test_create_tx_change_policy_no_internal() {
436
436
builder. finish ( ) . unwrap ( ) ;
437
437
}
438
438
439
+ macro_rules! check_fee {
440
+ ( $wallet: expr, $psbt: expr) => { {
441
+ let tx = $psbt. clone( ) . extract_tx( ) ;
442
+ let tx_fee = $wallet. calculate_fee( & tx) . ok( ) ;
443
+ assert_eq!( tx_fee, $psbt. fee_amount( ) ) ;
444
+ tx_fee
445
+ } } ;
446
+ }
447
+
439
448
#[ test]
440
449
fn test_create_tx_drain_wallet_and_drain_to ( ) {
441
450
let ( mut wallet, _) = get_funded_wallet ( get_test_wpkh ( ) ) ;
442
451
let addr = wallet. get_address ( New ) ;
443
452
let mut builder = wallet. build_tx ( ) ;
444
453
builder. drain_to ( addr. script_pubkey ( ) ) . drain_wallet ( ) ;
445
454
let psbt = builder. finish ( ) . unwrap ( ) ;
446
- let fee = psbt . fee_amount ( ) ;
455
+ let fee = check_fee ! ( wallet , psbt ) ;
447
456
448
457
assert_eq ! ( psbt. unsigned_tx. output. len( ) , 1 ) ;
449
458
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() {
462
471
. drain_to ( drain_addr. script_pubkey ( ) )
463
472
. drain_wallet ( ) ;
464
473
let psbt = builder. finish ( ) . unwrap ( ) ;
465
- let fee = psbt . fee_amount ( ) ;
474
+ let fee = check_fee ! ( wallet , psbt ) ;
466
475
let outputs = psbt. unsigned_tx . output ;
467
476
468
477
assert_eq ! ( outputs. len( ) , 2 ) ;
@@ -489,7 +498,7 @@ fn test_create_tx_drain_to_and_utxos() {
489
498
. add_utxos ( & utxos)
490
499
. unwrap ( ) ;
491
500
let psbt = builder. finish ( ) . unwrap ( ) ;
492
- let fee = psbt . fee_amount ( ) ;
501
+ let fee = check_fee ! ( wallet , psbt ) ;
493
502
494
503
assert_eq ! ( psbt. unsigned_tx. output. len( ) , 1 ) ;
495
504
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() {
512
521
let mut builder = wallet. build_tx ( ) ;
513
522
builder. add_recipient ( addr. script_pubkey ( ) , 25_000 ) ;
514
523
let psbt = builder. finish ( ) . unwrap ( ) ;
515
- let fee = psbt . fee_amount ( ) ;
524
+ let fee = check_fee ! ( wallet , psbt ) ;
516
525
517
526
assert_fee_rate ! ( psbt, fee. unwrap_or( 0 ) , FeeRate :: default ( ) , @add_signature) ;
518
527
}
@@ -526,7 +535,7 @@ fn test_create_tx_custom_fee_rate() {
526
535
. add_recipient ( addr. script_pubkey ( ) , 25_000 )
527
536
. fee_rate ( FeeRate :: from_sat_per_vb ( 5.0 ) ) ;
528
537
let psbt = builder. finish ( ) . unwrap ( ) ;
529
- let fee = psbt . fee_amount ( ) ;
538
+ let fee = check_fee ! ( wallet , psbt ) ;
530
539
531
540
assert_fee_rate ! ( psbt, fee. unwrap_or( 0 ) , FeeRate :: from_sat_per_vb( 5.0 ) , @add_signature) ;
532
541
}
@@ -541,7 +550,7 @@ fn test_create_tx_absolute_fee() {
541
550
. drain_wallet ( )
542
551
. fee_absolute ( 100 ) ;
543
552
let psbt = builder. finish ( ) . unwrap ( ) ;
544
- let fee = psbt . fee_amount ( ) ;
553
+ let fee = check_fee ! ( wallet , psbt ) ;
545
554
546
555
assert_eq ! ( fee. unwrap_or( 0 ) , 100 ) ;
547
556
assert_eq ! ( psbt. unsigned_tx. output. len( ) , 1 ) ;
@@ -558,7 +567,7 @@ fn test_create_tx_absolute_zero_fee() {
558
567
. drain_wallet ( )
559
568
. fee_absolute ( 0 ) ;
560
569
let psbt = builder. finish ( ) . unwrap ( ) ;
561
- let fee = psbt . fee_amount ( ) ;
570
+ let fee = check_fee ! ( wallet , psbt ) ;
562
571
563
572
assert_eq ! ( fee. unwrap_or( 0 ) , 0 ) ;
564
573
assert_eq ! ( psbt. unsigned_tx. output. len( ) , 1 ) ;
@@ -589,7 +598,7 @@ fn test_create_tx_add_change() {
589
598
. add_recipient ( addr. script_pubkey ( ) , 25_000 )
590
599
. ordering ( TxOrdering :: Untouched ) ;
591
600
let psbt = builder. finish ( ) . unwrap ( ) ;
592
- let fee = psbt . fee_amount ( ) ;
601
+ let fee = check_fee ! ( wallet , psbt ) ;
593
602
594
603
assert_eq ! ( psbt. unsigned_tx. output. len( ) , 2 ) ;
595
604
assert_eq ! ( psbt. unsigned_tx. output[ 0 ] . value, 25_000 ) ;
@@ -603,7 +612,7 @@ fn test_create_tx_skip_change_dust() {
603
612
let mut builder = wallet. build_tx ( ) ;
604
613
builder. add_recipient ( addr. script_pubkey ( ) , 49_800 ) ;
605
614
let psbt = builder. finish ( ) . unwrap ( ) ;
606
- let fee = psbt . fee_amount ( ) ;
615
+ let fee = check_fee ! ( wallet , psbt ) ;
607
616
608
617
assert_eq ! ( psbt. unsigned_tx. output. len( ) , 1 ) ;
609
618
assert_eq ! ( psbt. unsigned_tx. output[ 0 ] . value, 49_800 ) ;
@@ -634,7 +643,7 @@ fn test_create_tx_ordering_respected() {
634
643
. add_recipient ( addr. script_pubkey ( ) , 10_000 )
635
644
. ordering ( bdk:: wallet:: tx_builder:: TxOrdering :: Bip69Lexicographic ) ;
636
645
let psbt = builder. finish ( ) . unwrap ( ) ;
637
- let fee = psbt . fee_amount ( ) ;
646
+ let fee = check_fee ! ( wallet , psbt ) ;
638
647
639
648
assert_eq ! ( psbt. unsigned_tx. output. len( ) , 3 ) ;
640
649
assert_eq ! ( psbt. unsigned_tx. output[ 0 ] . value, 10_000 - fee. unwrap_or( 0 ) ) ;
@@ -1050,7 +1059,8 @@ fn test_add_foreign_utxo() {
1050
1059
. add_foreign_utxo ( utxo. outpoint , psbt_input, foreign_utxo_satisfaction)
1051
1060
. unwrap ( ) ;
1052
1061
let mut psbt = builder. finish ( ) . unwrap ( ) ;
1053
- let fee = psbt. fee_amount ( ) ;
1062
+ wallet1. insert_txout ( utxo. outpoint , utxo. txout ) ;
1063
+ let fee = check_fee ! ( wallet1, psbt) ;
1054
1064
let sent_received = wallet1. sent_and_received ( & psbt. clone ( ) . extract_tx ( ) ) ;
1055
1065
1056
1066
assert_eq ! (
@@ -1129,42 +1139,6 @@ fn test_calculate_fee_with_missing_foreign_utxo() {
1129
1139
wallet1. calculate_fee ( & tx) . unwrap ( ) ;
1130
1140
}
1131
1141
1132
- #[ test]
1133
- fn test_calculate_fee_with_inserted_foreign_utxo ( ) {
1134
- let ( mut wallet1, _) = get_funded_wallet ( get_test_wpkh ( ) ) ;
1135
- let ( wallet2, _) =
1136
- get_funded_wallet ( "wpkh(cVbZ8ovhye9AoAHFsqobCf7LxbXDAECy9Kb8TZdfsDYMZGBUyCnm)" ) ;
1137
-
1138
- let addr = Address :: from_str ( "2N1Ffz3WaNzbeLFBb51xyFMHYSEUXcbiSoX" )
1139
- . unwrap ( )
1140
- . assume_checked ( ) ;
1141
- let utxo = wallet2. list_unspent ( ) . next ( ) . expect ( "must take!" ) ;
1142
- #[ allow( deprecated) ]
1143
- let foreign_utxo_satisfaction = wallet2
1144
- . get_descriptor_for_keychain ( KeychainKind :: External )
1145
- . max_satisfaction_weight ( )
1146
- . unwrap ( ) ;
1147
-
1148
- let psbt_input = psbt:: Input {
1149
- witness_utxo : Some ( utxo. txout . clone ( ) ) ,
1150
- ..Default :: default ( )
1151
- } ;
1152
-
1153
- let mut builder = wallet1. build_tx ( ) ;
1154
- builder
1155
- . add_recipient ( addr. script_pubkey ( ) , 60_000 )
1156
- . only_witness_utxo ( )
1157
- . add_foreign_utxo ( utxo. outpoint , psbt_input, foreign_utxo_satisfaction)
1158
- . unwrap ( ) ;
1159
- let psbt = builder. finish ( ) . unwrap ( ) ;
1160
- let psbt_fee = psbt. fee_amount ( ) . expect ( "psbt fee" ) ;
1161
- let tx = psbt. extract_tx ( ) ;
1162
-
1163
- wallet1. insert_txout ( utxo. outpoint , utxo. txout ) ;
1164
- let wallet1_fee = wallet1. calculate_fee ( & tx) . expect ( "wallet fee" ) ;
1165
- assert_eq ! ( psbt_fee, wallet1_fee) ;
1166
- }
1167
-
1168
1142
#[ test]
1169
1143
#[ should_panic( expected = "Generic(\" Foreign utxo missing witness_utxo or non_witness_utxo\" )" ) ]
1170
1144
fn test_add_foreign_utxo_invalid_psbt_input ( ) {
@@ -1463,7 +1437,7 @@ fn test_bump_fee_reduce_change() {
1463
1437
. enable_rbf ( ) ;
1464
1438
let psbt = builder. finish ( ) . unwrap ( ) ;
1465
1439
let original_sent_received = wallet. sent_and_received ( & psbt. clone ( ) . extract_tx ( ) ) ;
1466
- let original_fee = psbt . fee_amount ( ) ;
1440
+ let original_fee = check_fee ! ( wallet , psbt ) ;
1467
1441
1468
1442
let tx = psbt. extract_tx ( ) ;
1469
1443
let txid = tx. txid ( ) ;
@@ -1475,7 +1449,7 @@ fn test_bump_fee_reduce_change() {
1475
1449
builder. fee_rate ( FeeRate :: from_sat_per_vb ( 2.5 ) ) . enable_rbf ( ) ;
1476
1450
let psbt = builder. finish ( ) . unwrap ( ) ;
1477
1451
let sent_received = wallet. sent_and_received ( & psbt. clone ( ) . extract_tx ( ) ) ;
1478
- let fee = psbt . fee_amount ( ) ;
1452
+ let fee = check_fee ! ( wallet , psbt ) ;
1479
1453
1480
1454
assert_eq ! ( sent_received. 0 , original_sent_received. 0 ) ;
1481
1455
assert_eq ! (
@@ -1510,7 +1484,7 @@ fn test_bump_fee_reduce_change() {
1510
1484
builder. enable_rbf ( ) ;
1511
1485
let psbt = builder. finish ( ) . unwrap ( ) ;
1512
1486
let sent_received = wallet. sent_and_received ( & psbt. clone ( ) . extract_tx ( ) ) ;
1513
- let fee = psbt . fee_amount ( ) ;
1487
+ let fee = check_fee ! ( wallet , psbt ) ;
1514
1488
1515
1489
assert_eq ! ( sent_received. 0 , original_sent_received. 0 ) ;
1516
1490
assert_eq ! (
@@ -1560,7 +1534,7 @@ fn test_bump_fee_reduce_single_recipient() {
1560
1534
let psbt = builder. finish ( ) . unwrap ( ) ;
1561
1535
let tx = psbt. clone ( ) . extract_tx ( ) ;
1562
1536
let original_sent_received = wallet. sent_and_received ( & tx) ;
1563
- let original_fee = psbt . fee_amount ( ) ;
1537
+ let original_fee = check_fee ! ( wallet , psbt ) ;
1564
1538
let txid = tx. txid ( ) ;
1565
1539
wallet
1566
1540
. insert_tx ( tx, ConfirmationTime :: Unconfirmed { last_seen : 0 } )
@@ -1573,7 +1547,7 @@ fn test_bump_fee_reduce_single_recipient() {
1573
1547
. unwrap ( ) ;
1574
1548
let psbt = builder. finish ( ) . unwrap ( ) ;
1575
1549
let sent_received = wallet. sent_and_received ( & psbt. clone ( ) . extract_tx ( ) ) ;
1576
- let fee = psbt . fee_amount ( ) ;
1550
+ let fee = check_fee ! ( wallet , psbt ) ;
1577
1551
1578
1552
assert_eq ! ( sent_received. 0 , original_sent_received. 0 ) ;
1579
1553
assert ! ( fee. unwrap_or( 0 ) > original_fee. unwrap_or( 0 ) ) ;
@@ -1597,7 +1571,7 @@ fn test_bump_fee_absolute_reduce_single_recipient() {
1597
1571
. drain_wallet ( )
1598
1572
. enable_rbf ( ) ;
1599
1573
let psbt = builder. finish ( ) . unwrap ( ) ;
1600
- let original_fee = psbt . fee_amount ( ) ;
1574
+ let original_fee = check_fee ! ( wallet , psbt ) ;
1601
1575
let tx = psbt. extract_tx ( ) ;
1602
1576
let original_sent_received = wallet. sent_and_received ( & tx) ;
1603
1577
let txid = tx. txid ( ) ;
@@ -1613,7 +1587,7 @@ fn test_bump_fee_absolute_reduce_single_recipient() {
1613
1587
let psbt = builder. finish ( ) . unwrap ( ) ;
1614
1588
let tx = & psbt. unsigned_tx ;
1615
1589
let sent_received = wallet. sent_and_received ( tx) ;
1616
- let fee = psbt . fee_amount ( ) ;
1590
+ let fee = check_fee ! ( wallet , psbt ) ;
1617
1591
1618
1592
assert_eq ! ( sent_received. 0 , original_sent_received. 0 ) ;
1619
1593
assert ! ( fee. unwrap_or( 0 ) > original_fee. unwrap_or( 0 ) ) ;
@@ -1784,7 +1758,7 @@ fn test_bump_fee_add_input() {
1784
1758
builder. fee_rate ( FeeRate :: from_sat_per_vb ( 50.0 ) ) ;
1785
1759
let psbt = builder. finish ( ) . unwrap ( ) ;
1786
1760
let sent_received = wallet. sent_and_received ( & psbt. clone ( ) . extract_tx ( ) ) ;
1787
- let fee = psbt . fee_amount ( ) ;
1761
+ let fee = check_fee ! ( wallet , psbt ) ;
1788
1762
assert_eq ! ( sent_received. 0 , original_details. 0 + 25_000 ) ;
1789
1763
assert_eq ! ( fee. unwrap_or( 0 ) + sent_received. 1 , 30_000 ) ;
1790
1764
@@ -1834,7 +1808,7 @@ fn test_bump_fee_absolute_add_input() {
1834
1808
builder. fee_absolute ( 6_000 ) ;
1835
1809
let psbt = builder. finish ( ) . unwrap ( ) ;
1836
1810
let sent_received = wallet. sent_and_received ( & psbt. clone ( ) . extract_tx ( ) ) ;
1837
- let fee = psbt . fee_amount ( ) ;
1811
+ let fee = check_fee ! ( wallet , psbt ) ;
1838
1812
1839
1813
assert_eq ! ( sent_received. 0 , original_sent_received. 0 + 25_000 ) ;
1840
1814
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() {
1880
1854
. enable_rbf ( ) ;
1881
1855
let psbt = builder. finish ( ) . unwrap ( ) ;
1882
1856
let original_sent_received = wallet. sent_and_received ( & psbt. clone ( ) . extract_tx ( ) ) ;
1883
- let original_fee = psbt . fee_amount ( ) ;
1857
+ let original_fee = check_fee ! ( wallet , psbt ) ;
1884
1858
1885
1859
let tx = psbt. extract_tx ( ) ;
1886
1860
let txid = tx. txid ( ) ;
@@ -1894,7 +1868,7 @@ fn test_bump_fee_no_change_add_input_and_change() {
1894
1868
builder. fee_rate ( FeeRate :: from_sat_per_vb ( 50.0 ) ) ;
1895
1869
let psbt = builder. finish ( ) . unwrap ( ) ;
1896
1870
let sent_received = wallet. sent_and_received ( & psbt. clone ( ) . extract_tx ( ) ) ;
1897
- let fee = psbt . fee_amount ( ) ;
1871
+ let fee = check_fee ! ( wallet , psbt ) ;
1898
1872
1899
1873
let original_send_all_amount = original_sent_received. 0 - original_fee. unwrap_or ( 0 ) ;
1900
1874
assert_eq ! ( sent_received. 0 , original_sent_received. 0 + 50_000 ) ;
@@ -1939,7 +1913,7 @@ fn test_bump_fee_add_input_change_dust() {
1939
1913
. enable_rbf ( ) ;
1940
1914
let psbt = builder. finish ( ) . unwrap ( ) ;
1941
1915
let original_sent_received = wallet. sent_and_received ( & psbt. clone ( ) . extract_tx ( ) ) ;
1942
- let original_fee = psbt . fee_amount ( ) ;
1916
+ let original_fee = check_fee ! ( wallet , psbt ) ;
1943
1917
1944
1918
let mut tx = psbt. extract_tx ( ) ;
1945
1919
for txin in & mut tx. input {
@@ -1971,7 +1945,7 @@ fn test_bump_fee_add_input_change_dust() {
1971
1945
builder. fee_rate ( FeeRate :: from_wu ( fee_abs, new_tx_weight) ) ;
1972
1946
let psbt = builder. finish ( ) . unwrap ( ) ;
1973
1947
let sent_received = wallet. sent_and_received ( & psbt. clone ( ) . extract_tx ( ) ) ;
1974
- let fee = psbt . fee_amount ( ) ;
1948
+ let fee = check_fee ! ( wallet , psbt ) ;
1975
1949
1976
1950
assert_eq ! ( original_sent_received. 1 , 5_000 - original_fee. unwrap_or( 0 ) ) ;
1977
1951
@@ -2025,7 +1999,7 @@ fn test_bump_fee_force_add_input() {
2025
1999
. fee_rate ( FeeRate :: from_sat_per_vb ( 5.0 ) ) ;
2026
2000
let psbt = builder. finish ( ) . unwrap ( ) ;
2027
2001
let sent_received = wallet. sent_and_received ( & psbt. clone ( ) . extract_tx ( ) ) ;
2028
- let fee = psbt . fee_amount ( ) ;
2002
+ let fee = check_fee ! ( wallet , psbt ) ;
2029
2003
2030
2004
assert_eq ! ( sent_received. 0 , original_sent_received. 0 + 25_000 ) ;
2031
2005
assert_eq ! ( fee. unwrap_or( 0 ) + sent_received. 1 , 30_000 ) ;
@@ -2083,7 +2057,7 @@ fn test_bump_fee_absolute_force_add_input() {
2083
2057
builder. add_utxo ( incoming_op) . unwrap ( ) . fee_absolute ( 250 ) ;
2084
2058
let psbt = builder. finish ( ) . unwrap ( ) ;
2085
2059
let sent_received = wallet. sent_and_received ( & psbt. clone ( ) . extract_tx ( ) ) ;
2086
- let fee = psbt . fee_amount ( ) ;
2060
+ let fee = check_fee ! ( wallet , psbt ) ;
2087
2061
2088
2062
assert_eq ! ( sent_received. 0 , original_sent_received. 0 + 25_000 ) ;
2089
2063
assert_eq ! ( fee. unwrap_or( 0 ) + sent_received. 1 , 30_000 ) ;
@@ -2212,7 +2186,7 @@ fn test_fee_amount_negative_drain_val() {
2212
2186
. enable_rbf ( )
2213
2187
. fee_rate ( fee_rate) ;
2214
2188
let psbt = builder. finish ( ) . unwrap ( ) ;
2215
- let fee = psbt . fee_amount ( ) ;
2189
+ let fee = check_fee ! ( wallet , psbt ) ;
2216
2190
2217
2191
assert_eq ! ( psbt. inputs. len( ) , 1 ) ;
2218
2192
assert_fee_rate ! ( psbt, fee. unwrap_or( 0 ) , fee_rate, @add_signature) ;
@@ -2951,7 +2925,8 @@ fn test_taproot_foreign_utxo() {
2951
2925
. unwrap ( ) ;
2952
2926
let psbt = builder. finish ( ) . unwrap ( ) ;
2953
2927
let sent_received = wallet1. sent_and_received ( & psbt. clone ( ) . extract_tx ( ) ) ;
2954
- let fee = psbt. fee_amount ( ) ;
2928
+ wallet1. insert_txout ( utxo. outpoint , utxo. txout ) ;
2929
+ let fee = check_fee ! ( wallet1, psbt) ;
2955
2930
2956
2931
assert_eq ! (
2957
2932
sent_received. 0 - sent_received. 1 ,
@@ -3403,7 +3378,7 @@ fn test_fee_rate_sign_no_grinding_high_r() {
3403
3378
. fee_rate ( fee_rate)
3404
3379
. add_data ( & data) ;
3405
3380
let mut psbt = builder. finish ( ) . unwrap ( ) ;
3406
- let fee = psbt . fee_amount ( ) ;
3381
+ let fee = check_fee ! ( wallet , psbt ) ;
3407
3382
let ( op_return_vout, _) = psbt
3408
3383
. unsigned_tx
3409
3384
. output
@@ -3467,7 +3442,7 @@ fn test_fee_rate_sign_grinding_low_r() {
3467
3442
. drain_wallet ( )
3468
3443
. fee_rate ( fee_rate) ;
3469
3444
let mut psbt = builder. finish ( ) . unwrap ( ) ;
3470
- let fee = psbt . fee_amount ( ) ;
3445
+ let fee = check_fee ! ( wallet , psbt ) ;
3471
3446
3472
3447
wallet
3473
3448
. sign (
0 commit comments