use alloy_primitives::Address;
use sp1_core_machine::riscv::RiscvAir;
use sp1_hypercube::Machine;
use sp1_primitives::SP1Field;
use super::NetworkProver;
use crate::network::{signer::NetworkSigner, NetworkMode, TEE_NETWORK_RPC_URL};
pub struct NetworkProverBuilder {
pub(crate) private_key: Option<String>,
pub(crate) rpc_url: Option<String>,
pub(crate) tee_signers: Option<Vec<Address>>,
pub(crate) signer: Option<NetworkSigner>,
pub(crate) network_mode: Option<NetworkMode>,
pub(crate) hosted: bool,
pub(crate) machine: Machine<SP1Field, RiscvAir<SP1Field>>,
}
impl Default for NetworkProverBuilder {
fn default() -> Self {
Self::new()
}
}
impl NetworkProverBuilder {
#[must_use]
pub fn new() -> Self {
Self::new_with_machine(RiscvAir::machine())
}
#[must_use]
pub const fn new_with_machine(machine: Machine<SP1Field, RiscvAir<SP1Field>>) -> Self {
Self {
private_key: None,
rpc_url: None,
tee_signers: None,
signer: None,
network_mode: None,
hosted: false,
machine,
}
}
#[must_use]
pub fn private_key(mut self, private_key: &str) -> Self {
self.private_key = Some(private_key.to_string());
self
}
#[must_use]
pub fn rpc_url(mut self, rpc_url: &str) -> Self {
self.rpc_url = Some(rpc_url.to_string());
self
}
#[must_use]
pub fn private(mut self) -> Self {
self.rpc_url = Some(TEE_NETWORK_RPC_URL.to_string());
self
}
#[must_use]
pub fn hosted(mut self) -> Self {
self.hosted = true;
self.network_mode = Some(NetworkMode::Reserved);
self
}
#[must_use]
pub fn tee_signers(mut self, tee_signers: &[Address]) -> Self {
self.tee_signers = Some(tee_signers.to_vec());
self
}
#[must_use]
pub fn signer(mut self, signer: NetworkSigner) -> Self {
self.signer = Some(signer);
self
}
#[must_use]
pub fn build(self) -> NetworkProver {
let async_builder = crate::network::builder::NetworkProverBuilder {
private_key: self.private_key,
rpc_url: self.rpc_url,
tee_signers: self.tee_signers,
signer: self.signer,
network_mode: self.network_mode,
hosted: self.hosted,
machine: self.machine,
};
let prover = crate::blocking::block_on(async_builder.build());
NetworkProver { prover }
}
}