@@ -17,7 +17,7 @@ use log::{debug, error, info, trace, warn};
17
17
18
18
use bitcoin:: consensus:: encode:: deserialize;
19
19
use bitcoin:: hex:: { DisplayHex , FromHex } ;
20
- use bitcoin:: { Script , Txid } ;
20
+ use bitcoin:: { FeeRate , Script , Txid } ;
21
21
22
22
#[ cfg( feature = "use-openssl" ) ]
23
23
use openssl:: ssl:: { SslConnector , SslMethod , SslStream , SslVerifyMode } ;
@@ -35,9 +35,11 @@ use rustls::{
35
35
pki_types:: { Der , TrustAnchor } ,
36
36
ClientConfig , ClientConnection , RootCertStore , StreamOwned ,
37
37
} ;
38
+ use serde_json:: Value ;
38
39
39
40
#[ cfg( any( feature = "default" , feature = "proxy" ) ) ]
40
41
use crate :: socks:: { Socks5Stream , TargetAddr , ToTargetAddr } ;
42
+ use crate :: utils:: convert_fee_rate;
41
43
42
44
use crate :: stream:: ClonableStream ;
43
45
@@ -69,6 +71,23 @@ macro_rules! impl_batch_call {
69
71
70
72
Ok ( answer)
71
73
} } ;
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
+ } } ;
72
91
}
73
92
74
93
/// 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> {
857
876
Ok ( deserialized)
858
877
}
859
878
860
- fn estimate_fee ( & self , number : usize ) -> Result < f64 , Error > {
879
+ fn estimate_fee ( & self , number : usize ) -> Result < FeeRate , Error > {
861
880
let req = Request :: new_id (
862
881
self . last_id . fetch_add ( 1 , Ordering :: SeqCst ) ,
863
882
"blockchain.estimatefee" ,
@@ -867,10 +886,11 @@ impl<T: Read + Write> ElectrumApi for RawClient<T> {
867
886
868
887
result
869
888
. as_f64 ( )
870
- . ok_or_else ( || Error :: InvalidResponse ( result. clone ( ) ) )
889
+ . map ( |val| convert_fee_rate ( Value :: from ( val) ) )
890
+ . expect ( "Invalid response" )
871
891
}
872
892
873
- fn relay_fee ( & self ) -> Result < f64 , Error > {
893
+ fn relay_fee ( & self ) -> Result < FeeRate , Error > {
874
894
let req = Request :: new_id (
875
895
self . last_id . fetch_add ( 1 , Ordering :: SeqCst ) ,
876
896
"blockchain.relayfee" ,
@@ -880,7 +900,8 @@ impl<T: Read + Write> ElectrumApi for RawClient<T> {
880
900
881
901
result
882
902
. as_f64 ( )
883
- . ok_or_else ( || Error :: InvalidResponse ( result. clone ( ) ) )
903
+ . map ( |val| convert_fee_rate ( Value :: from ( val) ) )
904
+ . expect ( "Invalid response" )
884
905
}
885
906
886
907
fn script_subscribe ( & self , script : & Script ) -> Result < Option < ScriptStatus > , Error > {
@@ -1061,12 +1082,12 @@ impl<T: Read + Write> ElectrumApi for RawClient<T> {
1061
1082
. collect ( )
1062
1083
}
1063
1084
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 >
1065
1086
where
1066
1087
I : IntoIterator + Clone ,
1067
1088
I :: Item : Borrow < usize > ,
1068
1089
{
1069
- impl_batch_call ! ( self , numbers, estimate_fee, apply_deref)
1090
+ impl_batch_call ! ( self , numbers, convert_fee_rate , estimate_fee, apply_deref)
1070
1091
}
1071
1092
1072
1093
fn transaction_broadcast_raw ( & self , raw_tx : & [ u8 ] ) -> Result < Txid , Error > {
@@ -1149,20 +1170,21 @@ mod test {
1149
1170
assert_eq ! ( resp. hash_function, Some ( "sha256" . into( ) ) ) ;
1150
1171
assert_eq ! ( resp. pruning, None ) ;
1151
1172
}
1173
+
1152
1174
#[ test]
1153
1175
fn test_relay_fee ( ) {
1154
1176
let client = RawClient :: new ( get_test_server ( ) , None ) . unwrap ( ) ;
1155
1177
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 ) ;
1158
1180
}
1159
1181
1160
1182
#[ test]
1161
1183
fn test_estimate_fee ( ) {
1162
1184
let client = RawClient :: new ( get_test_server ( ) , None ) . unwrap ( ) ;
1163
1185
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 ) ;
1166
1188
}
1167
1189
1168
1190
#[ test]
@@ -1288,8 +1310,8 @@ mod test {
1288
1310
1289
1311
let resp = client. batch_estimate_fee ( vec ! [ 10 , 20 ] ) . unwrap ( ) ;
1290
1312
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 ) ;
1293
1315
}
1294
1316
1295
1317
#[ test]
0 commit comments