@@ -1941,11 +1941,15 @@ pub fn update_nodes_with_chan_announce<'a, 'b, 'c, 'd>(
1941
1941
pub fn do_check_spends < F : Fn ( & bitcoin:: transaction:: OutPoint ) -> Option < TxOut > > (
1942
1942
tx : & Transaction , get_output : F ,
1943
1943
) {
1944
+ let mut single_output_below_dust = false ;
1944
1945
for outp in tx. output . iter ( ) {
1945
- assert ! (
1946
- outp. value >= outp. script_pubkey. minimal_non_dust( ) ,
1947
- "Spending tx output didn't meet dust limit"
1948
- ) ;
1946
+ if outp. value < outp. script_pubkey . minimal_non_dust ( ) {
1947
+ if single_output_below_dust {
1948
+ panic ! ( "Spending tx output didn't meet dust limit" ) ;
1949
+ } else {
1950
+ single_output_below_dust = true ;
1951
+ }
1952
+ } ;
1949
1953
}
1950
1954
let mut total_value_in = 0 ;
1951
1955
for input in tx. input . iter ( ) {
@@ -1955,9 +1959,15 @@ pub fn do_check_spends<F: Fn(&bitcoin::transaction::OutPoint) -> Option<TxOut>>(
1955
1959
for output in tx. output . iter ( ) {
1956
1960
total_value_out += output. value . to_sat ( ) ;
1957
1961
}
1958
- let min_fee = ( tx. weight ( ) . to_wu ( ) as u64 + 3 ) / 4 ; // One sat per vbyte (ie per weight/4, rounded up)
1959
- // Input amount - output amount = fee, so check that out + min_fee is smaller than input
1960
- assert ! ( total_value_out + min_fee <= total_value_in) ;
1962
+ if single_output_below_dust {
1963
+ assert_eq ! (
1964
+ total_value_in, total_value_out,
1965
+ "Spending tx has one output below dust, while not zero fee"
1966
+ ) ;
1967
+ } else {
1968
+ let min_fee = ( tx. weight ( ) . to_wu ( ) as u64 + 3 ) / 4 ; // One sat per vbyte (ie per weight/4, rounded up)
1969
+ assert ! ( total_value_out + min_fee <= total_value_in) ;
1970
+ }
1961
1971
tx. verify ( get_output) . unwrap ( ) ;
1962
1972
}
1963
1973
@@ -1966,8 +1976,15 @@ macro_rules! check_spends {
1966
1976
( $tx: expr, $( $spends_txn: expr) ,* ) => {
1967
1977
{
1968
1978
$(
1979
+ let mut single_output_below_dust = false ;
1969
1980
for outp in $spends_txn. output. iter( ) {
1970
- assert!( outp. value >= outp. script_pubkey. minimal_non_dust( ) , "Input tx output didn't meet dust limit" ) ;
1981
+ if outp. value. lt( & outp. script_pubkey. minimal_non_dust( ) ) {
1982
+ if single_output_below_dust || outp. script_pubkey != $crate:: ln:: chan_utils:: shared_anchor_script_pubkey( ) {
1983
+ panic!( "Input tx output didn't meet dust limit" ) ;
1984
+ } else {
1985
+ single_output_below_dust = true ;
1986
+ }
1987
+ }
1971
1988
}
1972
1989
) *
1973
1990
let get_output = |out_point: & bitcoin:: transaction:: OutPoint | {
@@ -1980,7 +1997,10 @@ macro_rules! check_spends {
1980
1997
} ;
1981
1998
$crate:: ln:: functional_test_utils:: do_check_spends( & $tx, get_output) ;
1982
1999
}
1983
- }
2000
+ } ;
2001
+ ( $tx: expr, $( $spends_txn: expr) ,* ) => {
2002
+ check_spends!( $tx, $( $spends_txn; false ) ,* )
2003
+ } ;
1984
2004
}
1985
2005
1986
2006
macro_rules! get_closing_signed_broadcast {
0 commit comments