drive_proof_verifier/proof/
token_status.rs1use crate::error::MapGroveDbError;
2use crate::types::token_status::TokenStatuses;
3use crate::verify::verify_tenderdash_proof;
4use crate::{ContextProvider, Error, FromProof};
5use dapi_grpc::platform::v0::{
6 get_token_statuses_request, GetTokenStatusesRequest, GetTokenStatusesResponse, Proof,
7 ResponseMetadata,
8};
9use dapi_grpc::platform::VersionedGrpcResponse;
10use dpp::dashcore::Network;
11use dpp::version::PlatformVersion;
12use drive::drive::Drive;
13
14impl FromProof<GetTokenStatusesRequest> for TokenStatuses {
15 type Request = GetTokenStatusesRequest;
16 type Response = GetTokenStatusesResponse;
17
18 fn maybe_from_proof_with_metadata<'a, I: Into<Self::Request>, O: Into<Self::Response>>(
19 request: I,
20 response: O,
21 _network: Network,
22 platform_version: &PlatformVersion,
23 provider: &'a dyn ContextProvider,
24 ) -> Result<(Option<Self>, ResponseMetadata, Proof), Error>
25 where
26 Self: Sized + 'a,
27 {
28 let request: Self::Request = request.into();
29 let response: Self::Response = response.into();
30
31 let token_ids = match request.version.ok_or(Error::EmptyVersion)? {
32 get_token_statuses_request::Version::V0(v0) => v0
33 .token_ids
34 .into_iter()
35 .map(<[u8; 32]>::try_from)
36 .collect::<Result<Vec<_>, _>>()
37 .map_err(|_| Error::RequestError {
38 error: "can't convert token_ids to [u8; 32]".to_string(),
39 })?,
40 };
41
42 let metadata = response
43 .metadata()
44 .or(Err(Error::EmptyResponseMetadata))?
45 .clone();
46
47 let proof = response.proof_owned().or(Err(Error::NoProofInResult))?;
48
49 let (root_hash, result) =
50 Drive::verify_token_statuses(&proof.grovedb_proof, &token_ids, false, platform_version)
51 .map_drive_error(&proof, &metadata)?;
52
53 verify_tenderdash_proof(&proof, &metadata, &root_hash, provider)?;
54
55 Ok((Some(result), metadata, proof))
56 }
57}