drive_proof_verifier/proof/
token_total_supply.rs

1use crate::error::MapGroveDbError;
2use crate::verify::verify_tenderdash_proof;
3use crate::{ContextProvider, Error, FromProof};
4use dapi_grpc::platform::v0::{
5    get_token_total_supply_request, GetTokenTotalSupplyRequest, GetTokenTotalSupplyResponse, Proof,
6    ResponseMetadata,
7};
8use dapi_grpc::platform::VersionedGrpcResponse;
9use dpp::balances::total_single_token_balance::TotalSingleTokenBalance;
10use dpp::dashcore::Network;
11use dpp::version::PlatformVersion;
12use drive::drive::Drive;
13
14impl FromProof<GetTokenTotalSupplyRequest> for TotalSingleTokenBalance {
15    type Request = GetTokenTotalSupplyRequest;
16    type Response = GetTokenTotalSupplyResponse;
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_id = match request.version.ok_or(Error::EmptyVersion)? {
32            get_token_total_supply_request::Version::V0(v0) => <[u8; 32]>::try_from(v0.token_id)
33                .map_err(|_| Error::RequestError {
34                    error: "can't convert token_id to [u8; 32]".to_string(),
35                })?,
36        };
37
38        let metadata = response
39            .metadata()
40            .or(Err(Error::EmptyResponseMetadata))?
41            .clone();
42
43        let proof = response.proof_owned().or(Err(Error::NoProofInResult))?;
44
45        let (root_hash, result) = Drive::verify_token_total_supply_and_aggregated_identity_balance(
46            &proof.grovedb_proof,
47            token_id,
48            false,
49            platform_version,
50        )
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}