data_anchor_client/client/
proof_client.rs

1use anchor_lang::solana_program::clock::Slot;
2use data_anchor_api::{CustomerElf, ProofRpcClient, RequestStatus};
3use solana_signer::Signer;
4
5use super::BloberIdentifier;
6use crate::{DataAnchorClient, DataAnchorClientResult};
7
8#[derive(thiserror::Error, Debug)]
9pub enum ProofError {
10    /// Failed to read checkpoint proof for blober {0} and slot {1} with {2} via indexer client: {3}
11    #[error(
12        "Failed to read checkpoint proof for blober {0} and slot {1} with {2} via indexer client: {3}"
13    )]
14    ZKProof(String, u64, CustomerElf, String),
15    /// Failed to get proof request status: {0}
16    #[error("Failed to get proof request status for request ID {0}: {1}")]
17    ProofRequestStatus(String, String),
18}
19
20impl DataAnchorClient {
21    /// Requests ZK proof generation on the proof RPC for a given blober, slot and proof type.
22    pub async fn checkpoint_custom_proof(
23        &self,
24        slot: Slot,
25        identifier: BloberIdentifier,
26        customer_elf: CustomerElf,
27    ) -> DataAnchorClientResult<String> {
28        let blober = identifier.to_blober_address(self.program_id, self.payer.pubkey());
29
30        self.proof()
31            .checkpoint_proof(blober.into(), slot, customer_elf)
32            .await
33            .map_err(|e| {
34                ProofError::ZKProof(blober.to_string(), slot, customer_elf, e.to_string()).into()
35            })
36    }
37
38    /// Returns the status of a proof request by its request ID.
39    pub async fn get_proof_request_status(
40        &self,
41        request_id: String,
42    ) -> DataAnchorClientResult<RequestStatus> {
43        self.proof()
44            .get_proof_request_status(request_id.clone())
45            .await
46            .map_err(|e| ProofError::ProofRequestStatus(request_id, e.to_string()).into())
47    }
48}