use crate::{
outputs::deserialize_template_outputs,
server::jobs::{error::StandardJobError, Job},
};
use binary_sv2::{Sv2OptionOwned, U256Owned};
use bitcoin::transaction::TxOut;
use mining_sv2::NewMiningJobOwned;
use template_distribution_sv2::NewTemplateOwned;
#[derive(Debug, Clone)]
pub struct StandardJob {
template: NewTemplateOwned,
extranonce_prefix: Vec<u8>,
coinbase_outputs: Vec<TxOut>,
job_message: NewMiningJobOwned,
}
impl Job for StandardJob {
fn get_job_id(&self) -> u32 {
self.job_message.job_id
}
fn get_extranonce_prefix(&self) -> &[u8] {
&self.extranonce_prefix
}
fn activate(&mut self, min_ntime: u32) {
self.activate(min_ntime);
}
}
impl StandardJob {
pub fn from_template(
template: NewTemplateOwned,
extranonce_prefix: Vec<u8>,
additional_coinbase_outputs: Vec<TxOut>,
job_message: NewMiningJobOwned,
) -> Result<Self, StandardJobError> {
let template_coinbase_outputs = deserialize_template_outputs(
template.coinbase_tx_outputs.to_owned_bytes(),
template.coinbase_tx_outputs_count,
)
.map_err(|_| StandardJobError::FailedToDeserializeCoinbaseOutputs)?;
let mut coinbase_outputs = vec![];
coinbase_outputs.extend(additional_coinbase_outputs);
coinbase_outputs.extend(template_coinbase_outputs);
Ok(Self {
template,
extranonce_prefix,
coinbase_outputs,
job_message,
})
}
pub fn get_job_id(&self) -> u32 {
self.job_message.job_id
}
pub fn get_coinbase_outputs(&self) -> &[TxOut] {
&self.coinbase_outputs
}
pub fn get_extranonce_prefix(&self) -> &[u8] {
&self.extranonce_prefix
}
pub fn get_job_message(&self) -> &NewMiningJobOwned {
&self.job_message
}
pub fn get_template(&self) -> &NewTemplateOwned {
&self.template
}
pub fn get_merkle_root(&self) -> &U256Owned {
&self.job_message.merkle_root
}
pub fn get_version(&self) -> u32 {
self.job_message.version
}
pub fn get_min_ntime(&self) -> Option<u32> {
self.job_message.min_ntime.as_ref().copied()
}
pub fn is_future(&self) -> bool {
self.get_min_ntime().is_none()
}
pub fn activate(&mut self, min_ntime: u32) {
self.job_message.min_ntime = Sv2OptionOwned::new(Some(min_ntime));
}
}