use std::convert::TryInto;
use tari_core::consensus::BaseNodeConsensusManager;
use tari_node_components::blocks::{Block, BlockHeader, NewBlockTemplate};
use tari_transaction_components::{
MicroMinotari,
consensus::emission::Emission,
key_manager::KeyManager,
tari_proof_of_work::Difficulty,
transaction_components::Transaction,
};
use crate::helpers::block_builders::create_coinbase;
#[allow(dead_code)]
pub fn create_orphan_block(
block_height: u64,
transactions: Vec<Transaction>,
consensus: &BaseNodeConsensusManager,
key_manager: &KeyManager,
) -> Block {
let mut coinbase_value = consensus.emission_schedule().block_reward(block_height);
let lock_height = consensus.consensus_constants(block_height).coinbase_min_maturity();
coinbase_value += transactions
.iter()
.fold(MicroMinotari(0), |acc, x| acc + x.body.get_total_fee().unwrap());
let (coinbase_utxo, coinbase_kernel, _coinbase_output) =
create_coinbase(coinbase_value, block_height + lock_height, None, key_manager);
let mut header = BlockHeader::new(consensus.consensus_constants(block_height).blockchain_version().into());
header.prev_hash = Vec::from([1u8; 32]).try_into().unwrap(); header.height = block_height;
let template = NewBlockTemplate::from_block(
header
.into_builder()
.with_transactions(transactions)
.with_coinbase_utxo(coinbase_utxo, coinbase_kernel)
.build(),
Difficulty::min(),
coinbase_value,
true,
)
.unwrap();
Block::new(template.header.into(), template.body)
}
#[allow(dead_code)]
pub fn create_block(block_version: u16, block_height: u64, transactions: Vec<Transaction>) -> Block {
let mut header = BlockHeader::new(block_version);
header.height = block_height;
header.into_builder().with_transactions(transactions).build()
}