use super::GenesisMaterial;
use crate::{mock, Dbc, Hash, Result, Token, TransactionBuilder};
#[derive(Default)]
pub struct GenesisBuilder {
pub spentbook_nodes: Vec<mock::SpentbookNode>,
}
impl GenesisBuilder {
pub fn gen_spentbook_nodes(mut self, num_nodes: usize) -> Self {
for _ in 0..num_nodes {
self.spentbook_nodes.push(mock::SpentbookNode::default());
}
self
}
pub fn add_spentbook_node(mut self, spentbook_node: mock::SpentbookNode) -> Self {
self.spentbook_nodes.push(spentbook_node);
self
}
#[allow(clippy::type_complexity)]
pub fn build(mut self) -> Result<(Vec<mock::SpentbookNode>, Dbc, GenesisMaterial, Token)> {
let genesis_material = GenesisMaterial::default();
let dbc_builder = TransactionBuilder::default()
.add_input(
genesis_material.genesis_tx.0.inputs[0].clone(),
genesis_material.genesis_tx.1.clone(),
genesis_material.genesis_tx.2.clone(),
)
.add_output(
genesis_material.genesis_tx.0.outputs[0].token,
genesis_material.main_key.public_address(),
genesis_material.derivation_index,
)
.build(Hash::default())?;
let tx = &dbc_builder.spent_tx;
for signed_spend in dbc_builder.signed_spends() {
for spentbook_node in self.spentbook_nodes.iter_mut() {
spentbook_node.log_spent(tx, signed_spend)?;
}
}
let (genesis_dbc, token) = dbc_builder.build()?.into_iter().next().unwrap();
Ok((self.spentbook_nodes, genesis_dbc, genesis_material, token))
}
#[allow(clippy::type_complexity)]
pub fn init_genesis(
num_spentbook_nodes: usize,
) -> Result<(Vec<mock::SpentbookNode>, Dbc, GenesisMaterial, Token)> {
Self::default()
.gen_spentbook_nodes(num_spentbook_nodes)
.build()
}
#[allow(clippy::type_complexity)]
pub fn init_genesis_single() -> Result<(mock::SpentbookNode, Dbc, GenesisMaterial, Token)> {
let (spentbook_nodes, genesis_dbc, genesis_material, token) =
Self::default().gen_spentbook_nodes(1).build()?;
Ok((
spentbook_nodes.into_iter().next().unwrap(),
genesis_dbc,
genesis_material,
token,
))
}
}