Skip to content

Commit b056d67

Browse files
committed
Fix hashrate is returned as gh/s instead of h/s
Signed-off-by: Yuki Kishimoto <[email protected]>
1 parent 63dcbee commit b056d67

1 file changed

Lines changed: 35 additions & 19 deletions

File tree

src/response.rs

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

234250
struct 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

Comments
 (0)