@@ -17,7 +17,7 @@ use log::{debug, error, info, trace, warn};
1717
1818use bitcoin:: consensus:: encode:: deserialize;
1919use bitcoin:: hex:: { DisplayHex , FromHex } ;
20- use bitcoin:: { Script , Txid } ;
20+ use bitcoin:: { FeeRate , Script , Txid } ;
2121
2222#[ cfg( feature = "use-openssl" ) ]
2323use openssl:: ssl:: { SslConnector , SslMethod , SslStream , SslVerifyMode } ;
@@ -35,9 +35,11 @@ use rustls::{
3535 pki_types:: { Der , TrustAnchor } ,
3636 ClientConfig , ClientConnection , RootCertStore , StreamOwned ,
3737} ;
38+ use serde_json:: Value ;
3839
3940#[ cfg( any( feature = "default" , feature = "proxy" ) ) ]
4041use crate :: socks:: { Socks5Stream , TargetAddr , ToTargetAddr } ;
42+ use crate :: utils:: convert_fee_rate;
4143
4244use crate :: stream:: ClonableStream ;
4345
@@ -69,6 +71,23 @@ macro_rules! impl_batch_call {
6971
7072 Ok ( answer)
7173 } } ;
74+
75+ ( $self: expr, $data: expr, $aux_call: expr, $call: ident, $( $apply_deref: tt) ? ) => { {
76+ let mut batch = Batch :: default ( ) ;
77+ for i in $data {
78+ batch. $call( $( $apply_deref) * i. borrow( ) ) ;
79+ }
80+
81+ let resp = $self. batch_call( & batch) ?;
82+ let mut answer = Vec :: new( ) ;
83+
84+ for x in resp {
85+ $aux_call( x) ;
86+ answer. push( serde_json:: from_value( x) ?) ;
87+ }
88+
89+ Ok ( answer)
90+ } } ;
7291}
7392
7493/// A trait for [`ToSocketAddrs`](https://doc.rust-lang.org/std/net/trait.ToSocketAddrs.html) that
@@ -857,7 +876,7 @@ impl<T: Read + Write> ElectrumApi for RawClient<T> {
857876 Ok ( deserialized)
858877 }
859878
860- fn estimate_fee ( & self , number : usize ) -> Result < f64 , Error > {
879+ fn estimate_fee ( & self , number : usize ) -> Result < FeeRate , Error > {
861880 let req = Request :: new_id (
862881 self . last_id . fetch_add ( 1 , Ordering :: SeqCst ) ,
863882 "blockchain.estimatefee" ,
@@ -867,10 +886,11 @@ impl<T: Read + Write> ElectrumApi for RawClient<T> {
867886
868887 result
869888 . as_f64 ( )
870- . ok_or_else ( || Error :: InvalidResponse ( result. clone ( ) ) )
889+ . map ( |val| convert_fee_rate ( Value :: from ( val) ) )
890+ . expect ( "Invalid response" )
871891 }
872892
873- fn relay_fee ( & self ) -> Result < f64 , Error > {
893+ fn relay_fee ( & self ) -> Result < FeeRate , Error > {
874894 let req = Request :: new_id (
875895 self . last_id . fetch_add ( 1 , Ordering :: SeqCst ) ,
876896 "blockchain.relayfee" ,
@@ -880,7 +900,8 @@ impl<T: Read + Write> ElectrumApi for RawClient<T> {
880900
881901 result
882902 . as_f64 ( )
883- . ok_or_else ( || Error :: InvalidResponse ( result. clone ( ) ) )
903+ . map ( |val| convert_fee_rate ( Value :: from ( val) ) )
904+ . expect ( "Invalid response" )
884905 }
885906
886907 fn script_subscribe ( & self , script : & Script ) -> Result < Option < ScriptStatus > , Error > {
@@ -1061,12 +1082,12 @@ impl<T: Read + Write> ElectrumApi for RawClient<T> {
10611082 . collect ( )
10621083 }
10631084
1064- fn batch_estimate_fee < ' s , I > ( & self , numbers : I ) -> Result < Vec < f64 > , Error >
1085+ fn batch_estimate_fee < ' s , I > ( & self , numbers : I ) -> Result < Vec < FeeRate > , Error >
10651086 where
10661087 I : IntoIterator + Clone ,
10671088 I :: Item : Borrow < usize > ,
10681089 {
1069- impl_batch_call ! ( self , numbers, estimate_fee, apply_deref)
1090+ impl_batch_call ! ( self , numbers, convert_fee_rate , estimate_fee, apply_deref)
10701091 }
10711092
10721093 fn transaction_broadcast_raw ( & self , raw_tx : & [ u8 ] ) -> Result < Txid , Error > {
@@ -1149,20 +1170,21 @@ mod test {
11491170 assert_eq ! ( resp. hash_function, Some ( "sha256" . into( ) ) ) ;
11501171 assert_eq ! ( resp. pruning, None ) ;
11511172 }
1173+
11521174 #[ test]
11531175 fn test_relay_fee ( ) {
11541176 let client = RawClient :: new ( get_test_server ( ) , None ) . unwrap ( ) ;
11551177
1156- let resp = client. relay_fee ( ) . unwrap ( ) ;
1157- assert_eq ! ( resp, 0.00001 ) ;
1178+ let resp = client. relay_fee ( ) . unwrap ( ) . to_sat_per_vb_ceil ( ) ;
1179+ assert ! ( resp > 0 ) ;
11581180 }
11591181
11601182 #[ test]
11611183 fn test_estimate_fee ( ) {
11621184 let client = RawClient :: new ( get_test_server ( ) , None ) . unwrap ( ) ;
11631185
1164- let resp = client. estimate_fee ( 10 ) . unwrap ( ) ;
1165- assert ! ( resp > 0.0 ) ;
1186+ let resp = client. estimate_fee ( 10 ) . unwrap ( ) . to_sat_per_vb_ceil ( ) ;
1187+ assert ! ( resp > 0 ) ;
11661188 }
11671189
11681190 #[ test]
@@ -1288,8 +1310,8 @@ mod test {
12881310
12891311 let resp = client. batch_estimate_fee ( vec ! [ 10 , 20 ] ) . unwrap ( ) ;
12901312 assert_eq ! ( resp. len( ) , 2 ) ;
1291- assert ! ( resp[ 0 ] > 0. 0) ;
1292- assert ! ( resp[ 1 ] > 0. 0) ;
1313+ assert ! ( resp[ 0 ] . to_sat_per_vb_ceil ( ) > 0 ) ;
1314+ assert ! ( resp[ 1 ] . to_sat_per_vb_ceil ( ) > 0 ) ;
12931315 }
12941316
12951317 #[ test]
0 commit comments