use alloy::{primitives::Address, providers::Provider, sol};
use crate::newton_prover_task_manager::NewtonProverTaskManager;
sol! {
#[sol(rpc)]
interface ITaskResponseHandlerVerifier {
function certificateVerifier() external view returns (address);
}
}
#[derive(Debug, Clone, Copy)]
pub struct ResolvedDestinationVerifier {
pub task_response_handler: Address,
pub certificate_verifier: Address,
pub source_chain_avs: Address,
}
pub async fn resolve_destination_verifier<P>(
task_manager_addr: Address,
provider: P,
) -> Result<ResolvedDestinationVerifier, eyre::Error>
where
P: Provider + Clone,
{
let task_manager = NewtonProverTaskManager::new(task_manager_addr, provider.clone());
let task_response_handler = task_manager
.taskResponseHandler()
.call()
.await
.map_err(|e| eyre::eyre!("failed to get task response handler address: {:?}", e))?;
let task_response_handler_contract = ITaskResponseHandlerVerifier::new(task_response_handler, provider.clone());
let certificate_verifier = task_response_handler_contract
.certificateVerifier()
.call()
.await
.map_err(|e| eyre::eyre!("failed to get certificate verifier from task response handler: {:?}", e))?;
let source_chain_avs = task_manager
.serviceManager()
.call()
.await
.map_err(|e| eyre::eyre!("failed to get source chain avs address: {:?}", e))?;
Ok(ResolvedDestinationVerifier {
task_response_handler,
certificate_verifier,
source_chain_avs,
})
}