use std::time::Instant;
use stratum_apps::{
stratum_core::{
bitcoin::Target,
sv1_api::{
json_rpc,
utils::{Extranonce, HexU32Be},
},
},
utils::types::{ChannelId, DownstreamId, Hashrate},
};
use tracing::debug;
use super::SubmitShareWithChannelId;
#[derive(Debug)]
pub struct DownstreamData {
pub channel_id: Option<ChannelId>,
pub extranonce1: Extranonce<'static>,
pub extranonce2_len: usize,
pub target: Target,
pub hashrate: Option<Hashrate>,
pub version_rolling_mask: Option<HexU32Be>,
pub version_rolling_min_bit: Option<HexU32Be>,
pub last_job_version_field: Option<u32>,
pub authorized_worker_name: String,
pub user_identity: String,
pub cached_set_difficulty: Option<json_rpc::Message>,
pub cached_notify: Option<json_rpc::Message>,
pub pending_target: Option<Target>,
pub pending_hashrate: Option<Hashrate>,
pub queued_sv1_handshake_messages: Vec<json_rpc::Message>,
pub pending_share: Option<SubmitShareWithChannelId>,
pub upstream_target: Option<Target>,
pub last_job_received_time: Option<Instant>,
}
impl DownstreamData {
pub fn new(hashrate: Option<Hashrate>, target: Target) -> Self {
DownstreamData {
channel_id: None,
extranonce1: vec![0; 8]
.try_into()
.expect("8-byte extranonce is always valid"),
extranonce2_len: 4,
target,
hashrate,
version_rolling_mask: None,
version_rolling_min_bit: None,
last_job_version_field: None,
authorized_worker_name: String::new(),
user_identity: String::new(),
cached_set_difficulty: None,
cached_notify: None,
pending_target: None,
pending_hashrate: None,
queued_sv1_handshake_messages: Vec::new(),
pending_share: None,
upstream_target: None,
last_job_received_time: None,
}
}
pub fn set_pending_target(&mut self, new_target: Target, downstream_id: DownstreamId) {
self.pending_target = Some(new_target);
debug!("Downstream {downstream_id}: Set pending target");
}
pub fn set_pending_hashrate(
&mut self,
new_hashrate: Option<Hashrate>,
downstream_id: DownstreamId,
) {
self.pending_hashrate = new_hashrate;
debug!("Downstream {downstream_id}: Set pending hashrate");
}
pub fn set_upstream_target(&mut self, upstream_target: Target, downstream_id: DownstreamId) {
self.upstream_target = Some(upstream_target);
debug!(
"Downstream {downstream_id}: Set upstream target to {}",
upstream_target
);
}
}