From 0ddd9aa57997b26c2589d4764c886625fa7e953c Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Fri, 15 Nov 2024 15:14:39 +0100 Subject: [PATCH 1/2] including grovedb proof bytes when error --- packages/rs-drive-proof-verifier/src/error.rs | 5 + packages/rs-drive-proof-verifier/src/proof.rs | 213 ++++++++++++++---- 2 files changed, 169 insertions(+), 49 deletions(-) diff --git a/packages/rs-drive-proof-verifier/src/error.rs b/packages/rs-drive-proof-verifier/src/error.rs index 3203eb73174..f714039a1dd 100644 --- a/packages/rs-drive-proof-verifier/src/error.rs +++ b/packages/rs-drive-proof-verifier/src/error.rs @@ -1,4 +1,5 @@ use dpp::ProtocolError; +use drive::grovedb::operations::proof::GroveDBProof; /// Errors #[derive(Debug, thiserror::Error)] @@ -15,6 +16,10 @@ pub enum Error { #[error("dash drive: {error}")] DriveError { error: String }, + /// GroveDB error, often for issues with proofs + #[error("grovedb: {error}")] + GroveDBError { proof_bytes: Vec, error: String }, + /// Dash Protocol error #[error("dash protocol: {error}")] ProtocolError { error: String }, diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index 3685df1779d..0488ac343a0 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -274,8 +274,12 @@ impl FromProof for Identity { id.into_buffer(), platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -324,8 +328,12 @@ impl FromProof for Identity { public_key_hash, platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -391,8 +399,12 @@ impl FromProof for IdentityPublicKeys { false, platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; let maybe_keys: Option = if let Some(identity) = maybe_identity { @@ -520,8 +532,12 @@ impl FromProof for IdentityNonceFetcher { false, platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -577,8 +593,12 @@ impl FromProof for IdentityContractNo false, platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -627,8 +647,12 @@ impl FromProof for IdentityBalance { false, platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -678,8 +702,12 @@ impl FromProof for IdentityBalances { &identity_ids, platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -726,8 +754,12 @@ impl FromProof for IdentityBalan false, platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -775,8 +807,12 @@ impl FromProof for DataContract { id.into_buffer(), platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -827,8 +863,12 @@ impl FromProof for DataContracts { ids.as_slice(), platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -896,8 +936,12 @@ impl FromProof for DataContractHistory offset, platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -957,8 +1001,12 @@ impl FromProof for StateTransitionPro &contracts_provider_fn, platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, metadata, &root_hash, provider)?; @@ -1044,8 +1092,12 @@ impl FromProof for ExtendedEpochInfos { ascending, platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; let epoch_info = epoch_info @@ -1093,7 +1145,15 @@ impl FromProof for ProtocolVersionUpgrade let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, objects) = - Drive::verify_upgrade_state(&proof.grovedb_proof, platform_version)?; + Drive::verify_upgrade_state(&proof.grovedb_proof, platform_version).map_err( + |e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), + }, + )?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -1145,7 +1205,14 @@ impl FromProof for MasternodeProtoco start_pro_tx_hash, try_u32_to_u16(request_v0.count)?, platform_version, - )?; + ) + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), + })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -1250,9 +1317,14 @@ where let (root_hash, documents) = request .verify_proof(&proof.grovedb_proof, platform_version) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; + let documents = documents .into_iter() .map(|d| (d.id(), Some(d))) @@ -1333,8 +1405,12 @@ impl FromProof for IdentitiesContrac false, platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -1375,8 +1451,12 @@ impl FromProof for ContestedResources { let (root_hash, items) = resolved_request .verify_contests_proof(&proof.grovedb_proof, platform_version) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -1419,8 +1499,12 @@ impl FromProof for Contenders { let (root_hash, contested_resource_vote_state) = resolved_request .verify_vote_poll_vote_state_proof(&proof.grovedb_proof, platform_version) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -1473,8 +1557,12 @@ impl FromProof for Voters { let (root_hash, voters) = resolved_request .verify_vote_poll_votes_proof(&proof.grovedb_proof, platform_version) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -1519,8 +1607,12 @@ impl FromProof for ResourceV &contract_provider_fn, platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -1563,8 +1655,12 @@ impl FromProof for VotePollsGroupedByTim &proof.grovedb_proof, platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -1607,7 +1703,14 @@ impl FromProof for PrefundedSpe balance_id.into_buffer(), false, platform_version, - )?; + ) + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), + })?; let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; @@ -1707,8 +1810,12 @@ impl FromProof for TotalCreditsInPla mtd.core_chain_locked_height, platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -1754,8 +1861,12 @@ impl FromProof for Propose ProposerQueryType::ByIds(ids), platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -1818,8 +1929,12 @@ impl FromProof for Propo ProposerQueryType::ByRange(limit.map(|l| l as u16), formatted_start), platform_version, ) - .map_err(|e| Error::DriveError { - error: e.to_string(), + .map_err(|e| match e { + drive::error::Error::GroveDB(e) => Error::GroveDBError { + proof_bytes: proof.grovedb_proof.clone(), + error: e.to_string(), + }, + _ => e.into(), })?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; From 81a438208d19cdb855191276e0df3a88dd0d6046 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Fri, 15 Nov 2024 15:28:41 +0100 Subject: [PATCH 2/2] added height and time --- packages/rs-drive-proof-verifier/src/error.rs | 7 +- packages/rs-drive-proof-verifier/src/proof.rs | 74 ++++++++++++++++--- 2 files changed, 69 insertions(+), 12 deletions(-) diff --git a/packages/rs-drive-proof-verifier/src/error.rs b/packages/rs-drive-proof-verifier/src/error.rs index f714039a1dd..8c0664c8257 100644 --- a/packages/rs-drive-proof-verifier/src/error.rs +++ b/packages/rs-drive-proof-verifier/src/error.rs @@ -18,7 +18,12 @@ pub enum Error { /// GroveDB error, often for issues with proofs #[error("grovedb: {error}")] - GroveDBError { proof_bytes: Vec, error: String }, + GroveDBError { + proof_bytes: Vec, + height: u64, + time_ms: u64, + error: String, + }, /// Dash Protocol error #[error("dash protocol: {error}")] diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index 0488ac343a0..6399a3e691d 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -277,6 +277,8 @@ impl FromProof for Identity { .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -331,6 +333,8 @@ impl FromProof for Identity { .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -402,6 +406,8 @@ impl FromProof for IdentityPublicKeys { .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -535,6 +541,8 @@ impl FromProof for IdentityNonceFetcher { .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -596,6 +604,8 @@ impl FromProof for IdentityContractNo .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -650,6 +660,8 @@ impl FromProof for IdentityBalance { .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -705,6 +717,8 @@ impl FromProof for IdentityBalances { .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -757,6 +771,8 @@ impl FromProof for IdentityBalan .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -810,6 +826,8 @@ impl FromProof for DataContract { .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -866,6 +884,8 @@ impl FromProof for DataContracts { .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -939,6 +959,8 @@ impl FromProof for DataContractHistory .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -979,17 +1001,17 @@ impl FromProof for StateTransitionPro error: e.to_string(), })?; - let metadata = response.metadata().or(Err(Error::EmptyResponseMetadata))?; + let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; - if metadata.epoch > MAX_EPOCH as u32 { - return Err(drive::error::Error::Proof(ProofError::InvalidMetadata(format!("platform returned an epoch {} that was higher that maximum of a 16 bit integer", metadata.epoch))).into()); + if mtd.epoch > MAX_EPOCH as u32 { + return Err(drive::error::Error::Proof(ProofError::InvalidMetadata(format!("platform returned an epoch {} that was higher that maximum of a 16 bit integer", mtd.epoch))).into()); } let block_info = BlockInfo { - time_ms: metadata.time_ms, - height: metadata.height, - core_height: metadata.core_chain_locked_height, - epoch: (metadata.epoch as u16).try_into()?, + time_ms: mtd.time_ms, + height: mtd.height, + core_height: mtd.core_chain_locked_height, + epoch: (mtd.epoch as u16).try_into()?, }; let contracts_provider_fn = provider.as_contract_lookup_fn(); @@ -1004,14 +1026,16 @@ impl FromProof for StateTransitionPro .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), })?; - verify_tenderdash_proof(proof, metadata, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; - Ok((Some(result), metadata.clone(), proof.clone())) + Ok((Some(result), mtd.clone(), proof.clone())) } } @@ -1095,6 +1119,8 @@ impl FromProof for ExtendedEpochInfos { .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -1149,6 +1175,8 @@ impl FromProof for ProtocolVersionUpgrade |e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -1209,6 +1237,8 @@ impl FromProof for MasternodeProtoco .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -1320,6 +1350,8 @@ where .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -1408,6 +1440,8 @@ impl FromProof for IdentitiesContrac .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -1454,6 +1488,8 @@ impl FromProof for ContestedResources { .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -1502,6 +1538,8 @@ impl FromProof for Contenders { .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -1560,6 +1598,8 @@ impl FromProof for Voters { .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -1610,6 +1650,8 @@ impl FromProof for ResourceV .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -1658,6 +1700,8 @@ impl FromProof for VotePollsGroupedByTim .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -1698,6 +1742,8 @@ impl FromProof for PrefundedSpe let proof = response.proof().or(Err(Error::NoProofInResult))?; + let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; + let (root_hash, balance) = Drive::verify_specialized_balance( &proof.grovedb_proof, balance_id.into_buffer(), @@ -1707,13 +1753,13 @@ impl FromProof for PrefundedSpe .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), })?; - let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; Ok((balance.map(|v| v.into()), mtd.clone(), proof.clone())) @@ -1813,6 +1859,8 @@ impl FromProof for TotalCreditsInPla .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -1864,6 +1912,8 @@ impl FromProof for Propose .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(), @@ -1932,6 +1982,8 @@ impl FromProof for Propo .map_err(|e| match e { drive::error::Error::GroveDB(e) => Error::GroveDBError { proof_bytes: proof.grovedb_proof.clone(), + height: mtd.height, + time_ms: mtd.time_ms, error: e.to_string(), }, _ => e.into(),