@@ -57,11 +57,11 @@ pub struct SystemInfo {
5757 /// Current hashrate in H/s
5858 #[ serde( rename = "hashRate" ) ]
5959 #[ serde( deserialize_with = "deserialize_hashrate" ) ]
60- pub hashrate : u64 ,
60+ pub hashrate_hs : u64 ,
6161 /// Expected hashrate in H/s
6262 #[ serde( rename = "expectedHashrate" ) ]
6363 #[ serde( deserialize_with = "deserialize_hashrate" ) ]
64- pub expected_hashrate : u64 ,
64+ pub expected_hashrate_hs : u64 ,
6565 /// Best difficulty achieved
6666 #[ serde( rename = "bestDiff" ) ]
6767 #[ serde( deserialize_with = "deserialize_difficulty" ) ]
@@ -171,26 +171,25 @@ impl Visitor<'_> for HashrateVisitor {
171171 where
172172 E : de:: Error ,
173173 {
174- if value < 0 { Ok ( 0 ) } else { Ok ( value as u64 ) }
174+ if value < 0 {
175+ return Ok ( 0 ) ;
176+ }
177+
178+ convert_ghs_to_hs ( value as f64 )
175179 }
176180
177- fn visit_u64 < E > ( self , value : u64 ) -> Result < Self :: Value , E > {
178- Ok ( value)
181+ fn visit_u64 < E > ( self , value : u64 ) -> Result < Self :: Value , E >
182+ where
183+ E : de:: Error ,
184+ {
185+ convert_ghs_to_hs ( value as f64 )
179186 }
180187
181188 fn visit_f64 < E > ( self , value : f64 ) -> Result < Self :: Value , E >
182189 where
183190 E : de:: Error ,
184191 {
185- if !value. is_finite ( ) || value < 0.0 {
186- return Ok ( 0 ) ;
187- }
188-
189- if value > u64:: MAX as f64 {
190- return Err ( E :: custom ( "hashrate is too large" ) ) ;
191- }
192-
193- Ok ( value as u64 )
192+ convert_ghs_to_hs ( value)
194193 }
195194
196195 fn visit_str < E > ( self , value : & str ) -> Result < Self :: Value , E >
@@ -228,7 +227,24 @@ where
228227 . parse ( )
229228 . map_err ( |_| E :: custom ( "hashrate string is not numeric" ) ) ?;
230229
231- HashrateVisitor . visit_f64 ( parsed)
230+ convert_ghs_to_hs ( parsed)
231+ }
232+
233+ fn convert_ghs_to_hs < E > ( value : f64 ) -> Result < u64 , E >
234+ where
235+ E : de:: Error ,
236+ {
237+ if !value. is_finite ( ) || value < 0.0 {
238+ return Ok ( 0 ) ;
239+ }
240+
241+ let hashrate_hs: f64 = value * 1_000_000_000.0 ;
242+
243+ if hashrate_hs > u64:: MAX as f64 {
244+ return Err ( E :: custom ( "hashrate is too large" ) ) ;
245+ }
246+
247+ Ok ( hashrate_hs as u64 )
232248}
233249
234250struct DifficultyVisitor ;
@@ -430,8 +446,8 @@ mod tests {
430446 fallback_stratum_port: 3333 ,
431447 fallback_stratum_user: String :: from( "1PKN98VN2z5gwSGZvGKS2bj8aADZBkyhkZ" ) ,
432448 stratum_latency: Some ( 22.331 ) ,
433- hashrate : 1184 ,
434- expected_hashrate : 1071 ,
449+ hashrate_hs : 1_184_809_322_463 ,
450+ expected_hashrate_hs : 1_071_000_000_000 ,
435451 best_diff: Some ( 2.03e9 as u64 ) ,
436452 best_session_diff: Some ( 138.17e6 as u64 ) ,
437453 pool_difficulty: 1000 ,
@@ -515,8 +531,8 @@ mod tests {
515531}"# ;
516532
517533 let info: SystemInfo = serde_json:: from_str ( json) . unwrap ( ) ;
518- assert_eq ! ( info. hashrate , 1072 ) ;
519- assert_eq ! ( info. expected_hashrate , 1071 ) ;
534+ assert_eq ! ( info. hashrate_hs , 1_072_240_722_700 ) ;
535+ assert_eq ! ( info. expected_hashrate_hs , 1_071_000_000_000 ) ;
520536 assert_eq ! ( info. best_diff, Some ( 49_224_525 ) ) ;
521537 assert_eq ! ( info. best_session_diff, Some ( 2_038_368 ) ) ;
522538 assert ! ( info. is_using_fallback_stratum) ;
0 commit comments