From 994b82195f7ad3c034acc0c65386e3cddd2353c2 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sat, 12 Sep 2026 05:22:55 +0700 Subject: [PATCH 1/7] fix(proof-verification)!: require V1 GroveDB proof envelopes Reject legacy and unknown GroveDB proof envelopes at Platform client verification boundaries before handing their bytes to Drive. Validate nested identity and compacted proofs while preserving raw Merk sync proof handling. --- packages/rs-drive-proof-verifier/src/error.rs | 6 + packages/rs-drive-proof-verifier/src/proof.rs | 212 +++++++++++++----- .../src/proof/chained_document.rs | 5 +- .../src/proof/composite_document.rs | 5 +- .../src/proof/document_average.rs | 16 +- .../src/proof/document_count.rs | 26 ++- .../src/proof/document_having.rs | 5 +- .../src/proof/document_ranked.rs | 5 +- .../src/proof/document_sum.rs | 21 +- .../src/proof/groups.rs | 8 +- .../src/proof/identity_token_balance.rs | 4 +- .../src/proof/token_contract_info.rs | 2 +- .../src/proof/token_direct_purchase.rs | 2 +- .../src/proof/token_info.rs | 4 +- ...token_perpetual_distribution_last_claim.rs | 2 +- .../token_pre_programmed_distributions.rs | 2 +- .../src/proof/token_status.rs | 10 +- .../src/proof/token_total_supply.rs | 2 +- .../rs-drive-proof-verifier/src/verify.rs | 133 ++++++++++- .../v1/mod.rs | 68 ++++++ .../src/contract/verify_contract.rs | 2 +- .../src/contract/verify_contract_history.rs | 2 +- .../src/document/verify_proof.rs | 5 +- .../document/verify_proof_keep_serialized.rs | 5 +- .../verify_start_at_document_in_proof.rs | 2 +- .../src/group/verify_action_signers.rs | 4 +- .../verify_action_signers_total_power.rs | 2 +- .../src/group/verify_active_action_infos.rs | 4 +- .../src/group/verify_group_info.rs | 2 +- .../group/verify_group_infos_in_contract.rs | 4 +- ...fy_full_identities_by_public_key_hashes.rs | 4 +- .../verify_full_identity_by_identity_id.rs | 2 +- ..._identity_by_non_unique_public_key_hash.rs | 5 + ...full_identity_by_unique_public_key_hash.rs | 2 +- .../verify_identities_contract_keys.rs | 2 +- ...ty_balance_and_revision_for_identity_id.rs | 2 +- ...verify_identity_balance_for_identity_id.rs | 2 +- ...rify_identity_balances_for_identity_ids.rs | 4 +- .../verify_identity_contract_nonce.rs | 2 +- ...entity_id_by_non_unique_public_key_hash.rs | 2 +- ...y_identity_id_by_unique_public_key_hash.rs | 2 +- ...dentity_ids_by_unique_public_key_hashes.rs | 4 +- .../verify_identity_keys_by_identity_id.rs | 2 +- .../src/identity/verify_identity_nonce.rs | 2 +- ...erify_identity_revision_for_identity_id.rs | 2 +- packages/wasm-drive-verify/src/native.rs | 13 +- .../single_document/verify_single_document.rs | 9 +- ...tate_transition_was_executed_with_proof.rs | 2 +- .../src/system/verify_epoch_infos.rs | 2 +- .../src/system/verify_epoch_proposers.rs | 8 +- .../system/verify_total_credits_in_system.rs | 2 +- .../src/system/verify_upgrade_state.rs | 7 +- .../src/system/verify_upgrade_vote_status.rs | 2 +- .../verify_token_balance_for_identity_id.rs | 2 +- .../verify_token_balances_for_identity_id.rs | 4 +- .../verify_token_balances_for_identity_ids.rs | 4 +- .../src/tokens/verify_token_contract_info.rs | 2 +- .../verify_token_direct_selling_price.rs | 2 +- .../verify_token_direct_selling_prices.rs | 4 +- .../verify_token_info_for_identity_id.rs | 2 +- .../verify_token_infos_for_identity_id.rs | 4 +- .../verify_token_infos_for_identity_ids.rs | 4 +- ...n_perpetual_distribution_last_paid_time.rs | 2 +- ...rify_token_pre_programmed_distributions.rs | 4 +- .../src/tokens/verify_token_status.rs | 2 +- .../src/tokens/verify_token_statuses.rs | 4 +- ..._supply_and_aggregated_identity_balance.rs | 2 +- packages/wasm-drive-verify/src/utils/mod.rs | 1 + packages/wasm-drive-verify/src/utils/proof.rs | 51 +++++ .../src/voting/verify_contests_proof.rs | 5 +- .../verify_identity_votes_given_proof.rs | 12 +- .../src/voting/verify_masternode_vote.rs | 2 +- .../src/voting/verify_specialized_balance.rs | 2 +- .../verify_vote_poll_vote_state_proof.rs | 5 +- .../voting/verify_vote_poll_votes_proof.rs | 5 +- .../verify_vote_polls_end_date_query.rs | 10 +- 76 files changed, 615 insertions(+), 174 deletions(-) create mode 100644 packages/wasm-drive-verify/src/utils/proof.rs diff --git a/packages/rs-drive-proof-verifier/src/error.rs b/packages/rs-drive-proof-verifier/src/error.rs index 601d104bcb2..019ac0c4eb1 100644 --- a/packages/rs-drive-proof-verifier/src/error.rs +++ b/packages/rs-drive-proof-verifier/src/error.rs @@ -44,6 +44,12 @@ pub enum Error { #[error("no proof in result")] NoProofInResult, + /// Legacy or unknown GroveDB proof envelope version + #[error( + "unsupported GroveDB proof envelope version {version}: current-state responses require V1" + )] + UnsupportedGroveDBProofVersion { version: u32 }, + /// Requested object not found #[error("requested object not found")] NotFound, diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index f1645b4f7c5..70126ceb66c 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -46,7 +46,9 @@ pub mod token_status; pub mod token_total_supply; use crate::from_request::TryFromRequest; -use crate::verify::verify_tenderdash_proof; +use crate::verify::{ + require_current_grovedb_proof_bytes, verify_tenderdash_proof, verify_tenderdash_signature, +}; use crate::{types::*, ContextProvider, DataContractProvider, Error}; use dapi_grpc::platform::v0::get_evonodes_proposed_epoch_blocks_by_range_request::get_evonodes_proposed_epoch_blocks_by_range_request_v0::Start; use dapi_grpc::platform::v0::get_identities_contract_keys_request::GetIdentitiesContractKeysRequestV0; @@ -324,7 +326,7 @@ impl FromProof for Identity { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_full_identity_by_identity_id( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, false, id.into_buffer(), platform_version, @@ -373,7 +375,7 @@ impl FromProof for Identity { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_full_identity_by_unique_public_key_hash( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, public_key_hash, platform_version, ) @@ -447,6 +449,11 @@ impl FromProof for Identit let proof = proved_response .grovedb_identity_public_key_hash_proof .ok_or(Error::NoProofInResult)?; + require_current_grovedb_proof_bytes(&proof.grovedb_proof)?; + + if let Some(identity_proof) = proved_response.identity_proof_bytes.as_deref() { + require_current_grovedb_proof_bytes(identity_proof)?; + } let proof_tuple = IdentityAndNonUniquePublicKeyHashDoubleProof { identity_proof: proved_response.identity_proof_bytes, @@ -536,7 +543,7 @@ impl FromProof for IdentityPublicKeys { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_identity_keys_by_identity_id( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, key_request, false, false, @@ -664,7 +671,7 @@ impl FromProof for IdentityNonceFetcher { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_nonce) = Drive::verify_identity_nonce( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, identity_id.into_buffer(), false, platform_version, @@ -718,7 +725,7 @@ impl FromProof for IdentityContractNo // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_identity_contract_nonce( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, identity_id.into_buffer(), contract_id.into_buffer(), false, @@ -767,7 +774,7 @@ impl FromProof for IdentityBalance { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_identity_balance_for_identity_id( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, id.into_buffer(), false, platform_version, @@ -816,7 +823,7 @@ impl FromProof for IdentityBalances { }) .collect::, Error>>()?; let (root_hash, balances) = Drive::verify_identity_balances_for_identity_ids( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, false, &identity_ids, platform_version, @@ -862,7 +869,7 @@ impl FromProof for IdentityBalan // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_identity_balance_and_revision_for_identity_id( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, id.into_buffer(), false, platform_version, @@ -902,9 +909,13 @@ impl FromProof for AddressInfo { })?, }; - let (root_hash, maybe_info) = - Drive::verify_address_info(&proof.grovedb_proof, &address, false, platform_version) - .map_drive_error(proof, mtd)?; + let (root_hash, maybe_info) = Drive::verify_address_info( + crate::verify::current_grovedb_proof_bytes(proof)?, + &address, + false, + platform_version, + ) + .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -955,7 +966,7 @@ impl FromProof for AddressInfos { _, Vec<(PlatformAddress, Option<(AddressNonce, Credits)>)>, >( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, addresses.iter(), false, platform_version, @@ -1013,7 +1024,7 @@ impl FromProof for RecentAddres let (root_hash, verified_changes) = if start_height_exclusive { Drive::verify_recent_address_balance_changes_after( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, start_height, limit, false, @@ -1022,7 +1033,7 @@ impl FromProof for RecentAddres .map_drive_error(proof, mtd)? } else { Drive::verify_recent_address_balance_changes( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, start_height, limit, false, @@ -1081,6 +1092,17 @@ impl FromProof // packages/rs-drive-abci/src/query/address_funds/recent_compacted_address_balance_changes/v0/mod.rs let limit = Some(25u16); + if platform_version + .drive + .methods + .verify + .address_funds + .verify_compacted_address_balance_changes + == 0 + { + require_current_grovedb_proof_bytes(&proof.grovedb_proof)?; + } + let (root_hash, verified_changes) = Drive::verify_compacted_address_balance_changes( &proof.grovedb_proof, start_block_height, @@ -1089,7 +1111,7 @@ impl FromProof ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_signature(proof, mtd, &root_hash, provider)?; let result = RecentCompactedAddressBalanceChanges( verified_changes @@ -1131,7 +1153,7 @@ impl FromProof for GroveTrunkQueryResul Drive::verify_address_funds_trunk_query(&proof.grovedb_proof, platform_version) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_signature(proof, mtd, &root_hash, provider)?; Ok((Some(trunk_result), mtd.clone(), proof.clone())) } @@ -1193,7 +1215,7 @@ impl FromProof for DataContract { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_contract) = Drive::verify_contract( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, None, false, false, @@ -1240,7 +1262,7 @@ impl FromProof for (DataContract, Vec) { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_contract) = Drive::verify_contract_return_serialization( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, None, false, false, @@ -1292,7 +1314,7 @@ impl FromProof for DataContracts { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, contracts) = Drive::verify_contracts( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, false, ids.as_slice(), platform_version, @@ -1357,7 +1379,7 @@ impl FromProof for DataContractHistory // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_history) = Drive::verify_contract_history( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, id.into_buffer(), start_at_ms, limit, @@ -1433,7 +1455,7 @@ impl FromProof for DocumentHistory { })?; let (root_hash, maybe_history) = Drive::verify_document_history( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, contract_id.into_buffer(), &document_type_name, document_type, @@ -1509,7 +1531,7 @@ impl FromProof for StateTransitionPro let (root_hash, outcome) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, &block_info, - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, &contracts_provider_fn, platform_version, ) @@ -1599,7 +1621,7 @@ impl FromProof for ExtendedEpochInfos { let count = try_u32_to_u16(count)?; let (root_hash, epoch_info) = Drive::verify_epoch_infos( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, current_epoch, start_epoch, count, @@ -1665,7 +1687,7 @@ impl FromProof for FinalizedEpochInfos let end_epoch_index: EpochIndex = try_u32_to_u16(end_epoch_index)?; let (root_hash, epoch_info) = Drive::verify_finalized_epoch_infos( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, start_epoch_index, start_epoch_index_included, end_epoch_index, @@ -1711,9 +1733,11 @@ impl FromProof for ProtocolVersionUpgrade let proof = response.proof().or(Err(Error::NoProofInResult))?; let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; - let (root_hash, objects) = - Drive::verify_upgrade_state(&proof.grovedb_proof, platform_version) - .map_drive_error(proof, mtd)?; + let (root_hash, objects) = Drive::verify_upgrade_state( + crate::verify::current_grovedb_proof_bytes(proof)?, + platform_version, + ) + .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -1759,11 +1783,12 @@ impl FromProof for MasternodeProtoco }, )?) }; + let count = try_u32_to_u16(request_v0.count)?; let (root_hash, objects) = Drive::verify_upgrade_vote_status( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, start_pro_tx_hash, - try_u32_to_u16(request_v0.count)?, + count, platform_version, ) .map_drive_error(proof, mtd)?; @@ -1824,8 +1849,12 @@ impl FromProof for Elements { let path = request_v0.path; let keys = request_v0.keys; - let (root_hash, objects) = - Drive::verify_elements(&proof.grovedb_proof, path, keys, platform_version)?; + let (root_hash, objects) = Drive::verify_elements( + crate::verify::current_grovedb_proof_bytes(proof)?, + path, + keys, + platform_version, + )?; let elements: Elements = Elements::from_iter(objects); verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -1869,7 +1898,10 @@ where let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, documents) = request - .verify_proof(&proof.grovedb_proof, platform_version) + .verify_proof( + crate::verify::current_grovedb_proof_bytes(proof)?, + platform_version, + ) .map_drive_error(proof, mtd)?; let documents = documents @@ -1944,7 +1976,7 @@ impl FromProof for IdentitiesContrac // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, identities_contract_keys) = Drive::verify_identities_contract_keys( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, identities_ids.as_slice(), &contract_id, document_type_name, @@ -1992,7 +2024,10 @@ impl FromProof for ContestedResources { let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, items) = resolved_request - .verify_contests_proof(&proof.grovedb_proof, platform_version) + .verify_contests_proof( + crate::verify::current_grovedb_proof_bytes(proof)?, + platform_version, + ) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -2034,7 +2069,10 @@ impl FromProof for Contenders { let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, contested_resource_vote_state) = resolved_request - .verify_vote_poll_vote_state_proof(&proof.grovedb_proof, platform_version) + .verify_vote_poll_vote_state_proof( + crate::verify::current_grovedb_proof_bytes(proof)?, + platform_version, + ) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -2086,7 +2124,10 @@ impl FromProof for Voters { let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, voters) = resolved_request - .verify_vote_poll_votes_proof(&proof.grovedb_proof, platform_version) + .verify_vote_poll_votes_proof( + crate::verify::current_grovedb_proof_bytes(proof)?, + platform_version, + ) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -2127,7 +2168,7 @@ impl FromProof for ResourceV let contract_provider_fn = provider.as_contract_lookup_fn(platform_version); let (root_hash, voters) = drive_query .verify_identity_votes_given_proof::>( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, &contract_provider_fn, platform_version, ) @@ -2170,7 +2211,7 @@ impl FromProof for VotePollsGroupedByTim let (root_hash, vote_polls) = drive_query .verify_vote_polls_by_end_date_proof::>( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, platform_version, ) .map_drive_error(proof, mtd)?; @@ -2213,7 +2254,7 @@ impl FromProof for PrefundedSpe let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, balance) = Drive::verify_specialized_balance( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, balance_id.into_buffer(), false, platform_version, @@ -2306,7 +2347,7 @@ impl FromProof for TotalCreditsInPla let core_subsidy_halving_interval = network.core_subsidy_halving_interval(); let (root_hash, credits) = Drive::verify_total_credits_in_system( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, core_subsidy_halving_interval, || { provider.get_platform_activation_height().map_err(|e| { @@ -2363,7 +2404,7 @@ impl FromProof for Propose }; let (root_hash, proposer_block_counts) = Drive::verify_epoch_proposers( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, epoch_index, ProposerQueryType::ByIds(ids), platform_version, @@ -2433,7 +2474,7 @@ impl FromProof for Propo let checked_limit = limit.map(try_u32_to_u16).transpose()?; let (root_hash, proposer_block_counts) = Drive::verify_epoch_proposers( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, epoch_index, ProposerQueryType::ByRange(checked_limit, formatted_start), platform_version, @@ -2487,9 +2528,12 @@ impl FromProof for ShieldedPoolState { let proof = response.proof().or(Err(Error::NoProofInResult))?; let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; - let (root_hash, maybe_balance) = - Drive::verify_shielded_pool_state(&proof.grovedb_proof, false, platform_version) - .map_drive_error(proof, mtd)?; + let (root_hash, maybe_balance) = Drive::verify_shielded_pool_state( + crate::verify::current_grovedb_proof_bytes(proof)?, + false, + platform_version, + ) + .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -2523,9 +2567,12 @@ impl FromProof for ShieldedNotesCount { // proved element type — `verify_shielded_notes_count` decodes // `total_count` out of the `CommitmentTree` element rather than a // `SumItem` balance. - let (root_hash, maybe_count) = - Drive::verify_shielded_notes_count(&proof.grovedb_proof, false, platform_version) - .map_drive_error(proof, mtd)?; + let (root_hash, maybe_count) = Drive::verify_shielded_notes_count( + crate::verify::current_grovedb_proof_bytes(proof)?, + false, + platform_version, + ) + .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -2555,9 +2602,12 @@ impl FromProof for ShieldedAnchors { let proof = response.proof().or(Err(Error::NoProofInResult))?; let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; - let (root_hash, anchors) = - Drive::verify_shielded_anchors(&proof.grovedb_proof, false, platform_version) - .map_drive_error(proof, mtd)?; + let (root_hash, anchors) = Drive::verify_shielded_anchors( + crate::verify::current_grovedb_proof_bytes(proof)?, + false, + platform_version, + ) + .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -2590,7 +2640,7 @@ impl FromProof for MostRecentShiel let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, maybe_anchor) = Drive::verify_most_recent_shielded_anchor( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, false, platform_version, ) @@ -2639,7 +2689,7 @@ impl FromProof for ShieldedEncrypted * (1u32 << drive::drive::shielded::paths::SHIELDED_NOTES_CHUNK_POWER); let (root_hash, notes, total_count) = Drive::verify_shielded_encrypted_notes( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, start_index, count, max_elements, @@ -2698,7 +2748,7 @@ impl FromProof for ShieldedNullifierStat }; let (root_hash, statuses) = Drive::verify_shielded_nullifiers( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, &nullifiers, false, platform_version, @@ -3630,6 +3680,58 @@ mod tests { } } + #[test] + fn identity_by_non_unique_public_key_hash_rejects_v0_inner_proof() { + use dapi_grpc::platform::v0::get_identity_by_non_unique_public_key_hash_request::GetIdentityByNonUniquePublicKeyHashRequestV0; + use platform::get_identity_by_non_unique_public_key_hash_response::{ + get_identity_by_non_unique_public_key_hash_response_v0::{ + IdentityProvedResponse, Result as V0Result, + }, + GetIdentityByNonUniquePublicKeyHashResponseV0, Version, + }; + + let config = bincode::config::standard().with_big_endian(); + let v0_inner_proof = + bincode::encode_to_vec(0u32, config).expect("V0 envelope discriminant should encode"); + let v1_outer_proof = + bincode::encode_to_vec(1u32, config).expect("V1 envelope discriminant should encode"); + let response = platform::GetIdentityByNonUniquePublicKeyHashResponse { + version: Some(Version::V0(GetIdentityByNonUniquePublicKeyHashResponseV0 { + result: Some(V0Result::Proof(IdentityProvedResponse { + identity_proof_bytes: Some(v0_inner_proof), + grovedb_identity_public_key_hash_proof: Some(Proof { + grovedb_proof: v1_outer_proof, + ..Proof::default() + }), + })), + metadata: Some(ResponseMetadata::default()), + })), + }; + let request: platform::GetIdentityByNonUniquePublicKeyHashRequest = + GetIdentityByNonUniquePublicKeyHashRequestV0 { + public_key_hash: vec![0u8; 20], + start_after: None, + prove: true, + } + .into(); + + let err = >::maybe_from_proof( + request, + response, + Network::Testnet, + default_platform_version(), + &unreachable_provider(), + ) + .unwrap_err(); + + assert!(matches!( + err, + Error::UnsupportedGroveDBProofVersion { version: 0 } + )); + } + #[test] fn identity_by_non_unique_response_with_no_result_yields_no_proof() { use dapi_grpc::platform::v0::get_identity_by_non_unique_public_key_hash_request::GetIdentityByNonUniquePublicKeyHashRequestV0; diff --git a/packages/rs-drive-proof-verifier/src/proof/chained_document.rs b/packages/rs-drive-proof-verifier/src/proof/chained_document.rs index 1ccdb286621..0c846c3a492 100644 --- a/packages/rs-drive-proof-verifier/src/proof/chained_document.rs +++ b/packages/rs-drive-proof-verifier/src/proof/chained_document.rs @@ -68,7 +68,10 @@ pub fn verify_chained_documents_proof( provider: &dyn ContextProvider, ) -> Result<(RootHash, ChainedDocuments), Error> { let (root_hash, result) = query - .verify_chained_documents_proof(&proof.grovedb_proof, platform_version) + .verify_chained_documents_proof( + crate::verify::current_grovedb_proof_bytes(proof)?, + platform_version, + ) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; diff --git a/packages/rs-drive-proof-verifier/src/proof/composite_document.rs b/packages/rs-drive-proof-verifier/src/proof/composite_document.rs index 8bae50074cc..e984706dbbe 100644 --- a/packages/rs-drive-proof-verifier/src/proof/composite_document.rs +++ b/packages/rs-drive-proof-verifier/src/proof/composite_document.rs @@ -63,7 +63,10 @@ pub fn verify_composite_documents_proof( provider: &dyn ContextProvider, ) -> Result<(RootHash, CompositeDocuments), Error> { let (root_hash, result) = query - .verify_composite_documents_proof(&proof.grovedb_proof, platform_version) + .verify_composite_documents_proof( + crate::verify::current_grovedb_proof_bytes(proof)?, + platform_version, + ) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; diff --git a/packages/rs-drive-proof-verifier/src/proof/document_average.rs b/packages/rs-drive-proof-verifier/src/proof/document_average.rs index 7a3ef28bbd5..3e8d52dd994 100644 --- a/packages/rs-drive-proof-verifier/src/proof/document_average.rs +++ b/packages/rs-drive-proof-verifier/src/proof/document_average.rs @@ -46,7 +46,10 @@ pub fn verify_point_lookup_count_and_sum_proof( provider: &dyn ContextProvider, ) -> Result, Error> { let (root_hash, entries) = query - .verify_point_lookup_count_and_sum_proof(&proof.grovedb_proof, platform_version) + .verify_point_lookup_count_and_sum_proof( + crate::verify::current_grovedb_proof_bytes(proof)?, + platform_version, + ) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -75,7 +78,7 @@ pub fn verify_distinct_count_and_sum_proof( ) -> Result, Error> { let (root_hash, entries) = query .verify_distinct_count_and_sum_proof( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, limit, left_to_right, platform_version, @@ -145,7 +148,10 @@ pub fn verify_aggregate_count_and_sum_proof( provider: &dyn ContextProvider, ) -> Result<(u64, i64), Error> { let (root_hash, count, sum) = query - .verify_aggregate_count_and_sum_proof(&proof.grovedb_proof, platform_version) + .verify_aggregate_count_and_sum_proof( + crate::verify::current_grovedb_proof_bytes(proof)?, + platform_version, + ) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -174,7 +180,7 @@ pub fn verify_primary_key_count_sum_tree_proof( provider: &dyn ContextProvider, ) -> Result<(u64, i64), Error> { let (root_hash, count, sum) = DriveDocumentSumQuery::verify_primary_key_count_sum_tree_proof( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, contract_id, document_type_name, platform_version, @@ -216,7 +222,7 @@ pub fn verify_carrier_aggregate_count_and_sum_proof( ) -> Result, Error> { let (root_hash, per_key_count_sum) = query .verify_carrier_aggregate_count_and_sum_proof( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, limit, left_to_right, platform_version, diff --git a/packages/rs-drive-proof-verifier/src/proof/document_count.rs b/packages/rs-drive-proof-verifier/src/proof/document_count.rs index b789cbf07b8..37016871e12 100644 --- a/packages/rs-drive-proof-verifier/src/proof/document_count.rs +++ b/packages/rs-drive-proof-verifier/src/proof/document_count.rs @@ -45,7 +45,10 @@ where let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, documents) = request - .verify_proof(&proof.grovedb_proof, platform_version) + .verify_proof( + crate::verify::current_grovedb_proof_bytes(proof)?, + platform_version, + ) .map_drive_error(proof, mtd)?; let count = documents.len() as u64; @@ -82,7 +85,10 @@ pub fn verify_aggregate_count_proof( provider: &dyn ContextProvider, ) -> Result { let (root_hash, count) = query - .verify_aggregate_count_proof(&proof.grovedb_proof, platform_version) + .verify_aggregate_count_proof( + crate::verify::current_grovedb_proof_bytes(proof)?, + platform_version, + ) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -123,7 +129,12 @@ pub fn verify_distinct_count_proof( provider: &dyn ContextProvider, ) -> Result, Error> { let (root_hash, entries) = query - .verify_distinct_count_proof(&proof.grovedb_proof, limit, left_to_right, platform_version) + .verify_distinct_count_proof( + crate::verify::current_grovedb_proof_bytes(proof)?, + limit, + left_to_right, + platform_version, + ) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -183,7 +194,10 @@ pub fn verify_point_lookup_count_proof( provider: &dyn ContextProvider, ) -> Result, Error> { let (root_hash, entries) = query - .verify_point_lookup_count_proof(&proof.grovedb_proof, platform_version) + .verify_point_lookup_count_proof( + crate::verify::current_grovedb_proof_bytes(proof)?, + platform_version, + ) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -210,7 +224,7 @@ pub fn verify_primary_key_count_tree_proof( provider: &dyn ContextProvider, ) -> Result { let (root_hash, count) = DriveDocumentCountQuery::verify_primary_key_count_tree_proof( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, contract_id, document_type_name, platform_version, @@ -273,7 +287,7 @@ pub fn verify_carrier_aggregate_count_proof( ) -> Result, Error> { let (root_hash, per_key_counts) = query .verify_carrier_aggregate_count_proof( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, limit, left_to_right, platform_version, diff --git a/packages/rs-drive-proof-verifier/src/proof/document_having.rs b/packages/rs-drive-proof-verifier/src/proof/document_having.rs index b8208100071..31a4ee6b442 100644 --- a/packages/rs-drive-proof-verifier/src/proof/document_having.rs +++ b/packages/rs-drive-proof-verifier/src/proof/document_having.rs @@ -174,7 +174,10 @@ pub fn verify_having_range_proof( provider: &dyn ContextProvider, ) -> Result<(RootHash, Vec), Error> { let (root_hash, entries) = query - .verify_having_range_proof(&proof.grovedb_proof, platform_version) + .verify_having_range_proof( + crate::verify::current_grovedb_proof_bytes(proof)?, + platform_version, + ) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; diff --git a/packages/rs-drive-proof-verifier/src/proof/document_ranked.rs b/packages/rs-drive-proof-verifier/src/proof/document_ranked.rs index 386c2930414..9bd7dc02023 100644 --- a/packages/rs-drive-proof-verifier/src/proof/document_ranked.rs +++ b/packages/rs-drive-proof-verifier/src/proof/document_ranked.rs @@ -332,7 +332,10 @@ pub fn verify_ranked_top_k_proof( provider: &dyn ContextProvider, ) -> Result<(RootHash, RankedPage), Error> { let (root_hash, page) = query - .verify_ranked_top_k_proof(&proof.grovedb_proof, platform_version) + .verify_ranked_top_k_proof( + crate::verify::current_grovedb_proof_bytes(proof)?, + platform_version, + ) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; diff --git a/packages/rs-drive-proof-verifier/src/proof/document_sum.rs b/packages/rs-drive-proof-verifier/src/proof/document_sum.rs index 6d72ba1b2ee..12744466182 100644 --- a/packages/rs-drive-proof-verifier/src/proof/document_sum.rs +++ b/packages/rs-drive-proof-verifier/src/proof/document_sum.rs @@ -61,7 +61,10 @@ pub fn verify_aggregate_sum_proof( provider: &dyn ContextProvider, ) -> Result { let (root_hash, sum) = query - .verify_aggregate_sum_proof(&proof.grovedb_proof, platform_version) + .verify_aggregate_sum_proof( + crate::verify::current_grovedb_proof_bytes(proof)?, + platform_version, + ) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -88,7 +91,7 @@ pub fn verify_primary_key_sum_tree_proof( provider: &dyn ContextProvider, ) -> Result { let (root_hash, sum) = DriveDocumentSumQuery::verify_primary_key_sum_tree_proof( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, contract_id, document_type_name, platform_version, @@ -119,7 +122,10 @@ pub fn verify_point_lookup_sum_proof( provider: &dyn ContextProvider, ) -> Result, Error> { let (root_hash, entries) = query - .verify_point_lookup_sum_proof(&proof.grovedb_proof, platform_version) + .verify_point_lookup_sum_proof( + crate::verify::current_grovedb_proof_bytes(proof)?, + platform_version, + ) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -148,7 +154,12 @@ pub fn verify_distinct_sum_proof( provider: &dyn ContextProvider, ) -> Result, Error> { let (root_hash, entries) = query - .verify_distinct_sum_proof(&proof.grovedb_proof, limit, left_to_right, platform_version) + .verify_distinct_sum_proof( + crate::verify::current_grovedb_proof_bytes(proof)?, + limit, + left_to_right, + platform_version, + ) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -186,7 +197,7 @@ pub fn verify_carrier_aggregate_sum_proof( ) -> Result, Error> { let (root_hash, per_key_sums) = query .verify_carrier_aggregate_sum_proof( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, limit, left_to_right, platform_version, diff --git a/packages/rs-drive-proof-verifier/src/proof/groups.rs b/packages/rs-drive-proof-verifier/src/proof/groups.rs index 392dccfdc30..e4b6a9efdf2 100644 --- a/packages/rs-drive-proof-verifier/src/proof/groups.rs +++ b/packages/rs-drive-proof-verifier/src/proof/groups.rs @@ -60,7 +60,7 @@ impl FromProof for Group { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_group_info( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(&proof)?, contract_id, group_contract_position, false, @@ -123,7 +123,7 @@ impl FromProof for Groups { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_group_infos_in_contract( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(&proof)?, contract_id, start_at_group_contract_position, count, @@ -221,7 +221,7 @@ impl FromProof for GroupActions { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_action_infos_in_contract( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(&proof)?, contract_id, group_contract_position, status, @@ -300,7 +300,7 @@ impl FromProof for GroupActionSigners { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_action_signers( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(&proof)?, contract_id, group_contract_position, status, diff --git a/packages/rs-drive-proof-verifier/src/proof/identity_token_balance.rs b/packages/rs-drive-proof-verifier/src/proof/identity_token_balance.rs index f3ce159b92e..00376db2564 100644 --- a/packages/rs-drive-proof-verifier/src/proof/identity_token_balance.rs +++ b/packages/rs-drive-proof-verifier/src/proof/identity_token_balance.rs @@ -57,7 +57,7 @@ impl FromProof for IdentityTokenBalances { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_balances_for_identity_id( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(&proof)?, &token_ids, identity_id, false, @@ -117,7 +117,7 @@ impl FromProof for IdentitiesTokenBalances { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_balances_for_identity_ids( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(&proof)?, token_id, &identity_ids, false, diff --git a/packages/rs-drive-proof-verifier/src/proof/token_contract_info.rs b/packages/rs-drive-proof-verifier/src/proof/token_contract_info.rs index 44bcb029732..13092a73fd6 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_contract_info.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_contract_info.rs @@ -44,7 +44,7 @@ impl FromProof for TokenContractInfo { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_contract_info( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(&proof)?, token_id, false, platform_version, diff --git a/packages/rs-drive-proof-verifier/src/proof/token_direct_purchase.rs b/packages/rs-drive-proof-verifier/src/proof/token_direct_purchase.rs index e888a79043f..cf6576050a3 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_direct_purchase.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_direct_purchase.rs @@ -57,7 +57,7 @@ impl FromProof for TokenDirectPurchasePrice // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, tokens): (_, Self) = Drive::verify_token_direct_selling_prices( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(proof)?, &token_ids, false, platform_version, diff --git a/packages/rs-drive-proof-verifier/src/proof/token_info.rs b/packages/rs-drive-proof-verifier/src/proof/token_info.rs index 03d6f741620..7d4a43be3f1 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_info.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_info.rs @@ -57,7 +57,7 @@ impl FromProof for IdentityTokenInfos { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_infos_for_identity_id( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(&proof)?, &token_ids, identity_id, false, @@ -116,7 +116,7 @@ impl FromProof for IdentitiesTokenInfos { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_infos_for_identity_ids( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(&proof)?, token_id, &identity_ids, false, diff --git a/packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs b/packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs index 93ca01acfc1..8a9062e3d09 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs @@ -95,7 +95,7 @@ impl FromProof for RewardDistribu Some(distribution_type) => { let (root_hash, moment_opt) = Drive::verify_token_perpetual_distribution_last_paid_time( - &proof_msg.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(&proof_msg)?, token_id, identity_id, &distribution_type, diff --git a/packages/rs-drive-proof-verifier/src/proof/token_pre_programmed_distributions.rs b/packages/rs-drive-proof-verifier/src/proof/token_pre_programmed_distributions.rs index f88ed305014..01949a73804 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_pre_programmed_distributions.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_pre_programmed_distributions.rs @@ -86,7 +86,7 @@ impl FromProof for TokenPreProgrammed let (root_hash, result): ([u8; 32], TokenPreProgrammedDistributions) = Drive::verify_token_pre_programmed_distributions( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(&proof)?, token_id, start_at, limit, diff --git a/packages/rs-drive-proof-verifier/src/proof/token_status.rs b/packages/rs-drive-proof-verifier/src/proof/token_status.rs index 48c2b54e36d..5f922ac2897 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_status.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_status.rs @@ -46,9 +46,13 @@ impl FromProof for TokenStatuses { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; - let (root_hash, result) = - Drive::verify_token_statuses(&proof.grovedb_proof, &token_ids, false, platform_version) - .map_drive_error(&proof, &metadata)?; + let (root_hash, result) = Drive::verify_token_statuses( + crate::verify::current_grovedb_proof_bytes(&proof)?, + &token_ids, + false, + platform_version, + ) + .map_drive_error(&proof, &metadata)?; verify_tenderdash_proof(&proof, &metadata, &root_hash, provider)?; diff --git a/packages/rs-drive-proof-verifier/src/proof/token_total_supply.rs b/packages/rs-drive-proof-verifier/src/proof/token_total_supply.rs index aa99ef96eca..3ee8ff898f5 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_total_supply.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_total_supply.rs @@ -43,7 +43,7 @@ impl FromProof for TotalSingleTokenBalance { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_total_supply_and_aggregated_identity_balance( - &proof.grovedb_proof, + crate::verify::current_grovedb_proof_bytes(&proof)?, token_id, false, platform_version, diff --git a/packages/rs-drive-proof-verifier/src/verify.rs b/packages/rs-drive-proof-verifier/src/verify.rs index 2c32a65fc56..ea582b12997 100644 --- a/packages/rs-drive-proof-verifier/src/verify.rs +++ b/packages/rs-drive-proof-verifier/src/verify.rs @@ -10,6 +10,39 @@ use tenderdash_abci::{ use crate::ContextProvider; +const CURRENT_GROVEDB_PROOF_ENVELOPE_VERSION: u32 = 1; + +/// Reject legacy GroveDB proof envelopes before accepting a current-state +/// response. GroveDB's envelope enum is encoded by bincode as a `u32` +/// discriminant followed by the version-specific payload. +pub(crate) fn require_current_grovedb_proof_bytes(grovedb_proof: &[u8]) -> Result<(), Error> { + let config = bincode::config::standard() + .with_big_endian() + .with_limit::<16>(); + let (version, _): (u32, usize) = + bincode::decode_from_slice(grovedb_proof, config).map_err(|error| { + Error::ResponseDecodeError { + error: format!("invalid GroveDB proof envelope: {error}"), + } + })?; + + if version != CURRENT_GROVEDB_PROOF_ENVELOPE_VERSION { + return Err(Error::UnsupportedGroveDBProofVersion { version }); + } + + Ok(()) +} + +/// Validate a direct GroveDB proof envelope before handing its bytes to Drive. +pub(crate) fn current_grovedb_proof_bytes(proof: &Proof) -> Result<&[u8], Error> { + require_current_grovedb_proof_bytes(&proof.grovedb_proof)?; + Ok(&proof.grovedb_proof) +} + +fn require_current_grovedb_proof(proof: &Proof) -> Result<(), Error> { + require_current_grovedb_proof_bytes(&proof.grovedb_proof) +} + /// Verify cryptographic proof generated by Tenderdash /// /// This function verifies the cryptographic proof generated by Tenderdash. @@ -33,6 +66,20 @@ pub(crate) fn verify_tenderdash_proof( mtd: &ResponseMetadata, root_hash: &[u8], provider: &dyn ContextProvider, +) -> Result<(), Error> { + require_current_grovedb_proof(proof)?; + + verify_tenderdash_signature(proof, mtd, root_hash, provider) +} + +/// Verify a Tenderdash signature for an endpoint whose proof payload is not a +/// direct `GroveDBProof` envelope. The endpoint must validate the version of +/// every nested GroveDB proof before calling this function. +pub(crate) fn verify_tenderdash_signature( + proof: &Proof, + mtd: &ResponseMetadata, + root_hash: &[u8], + provider: &dyn ContextProvider, ) -> Result<(), Error> { let block_id_hash = proof.block_id_hash.to_vec(); @@ -154,8 +201,35 @@ mod tests { use dpp::data_contract::TokenConfiguration; use dpp::prelude::{CoreBlockHeight, DataContract, Identifier}; use dpp::version::PlatformVersion; + use drive::grovedb::operations::proof::{ + GroveDBProof, GroveDBProofV0, GroveDBProofV1, LayerProof, MerkOnlyLayerProof, ProofBytes, + ProveOptions, + }; + use std::collections::BTreeMap; use std::sync::Arc; + fn grovedb_proof_bytes(version: u32) -> Vec { + let proof = match version { + 0 => GroveDBProof::V0(GroveDBProofV0 { + root_layer: MerkOnlyLayerProof { + merk_proof: vec![], + lower_layers: BTreeMap::new(), + }, + prove_options: ProveOptions::default(), + }), + 1 => GroveDBProof::V1(GroveDBProofV1 { + root_layer: LayerProof { + merk_proof: ProofBytes::Merk(vec![]), + lower_layers: BTreeMap::new(), + }, + }), + _ => panic!("test helper only encodes known GroveDB envelopes"), + }; + + bincode::encode_to_vec(proof, bincode::config::standard().with_big_endian()) + .expect("test GroveDB proof should encode") + } + /// Minimal ContextProvider stub that returns a dummy quorum public key. /// This allows the test to reach the vulnerable `.expect()` on line 80 /// without failing earlier in the verification pipeline. @@ -203,7 +277,7 @@ mod tests { #[test] fn test_malicious_quorum_type_returns_error() { let proof = Proof { - grovedb_proof: vec![], + grovedb_proof: grovedb_proof_bytes(1), quorum_hash: vec![0u8; 32], // valid 32-byte hash so we pass the earlier check signature: vec![0u8; 96], round: 1, @@ -231,6 +305,53 @@ mod tests { ); } + #[test] + fn test_legacy_grovedb_v0_proof_is_rejected() { + let proof = Proof { + grovedb_proof: grovedb_proof_bytes(0), + quorum_hash: vec![0u8; 32], + signature: vec![0u8; 96], + round: 1, + block_id_hash: vec![0u8; 32], + quorum_type: 1, + }; + let metadata = ResponseMetadata { + height: 100, + core_chain_locked_height: 1, + epoch: 0, + time_ms: 1_000_000, + protocol_version: 1, + chain_id: "test-chain".to_string(), + }; + + let result = verify_tenderdash_proof(&proof, &metadata, &[0u8; 32], &StubContextProvider); + + assert!(matches!( + result, + Err(Error::UnsupportedGroveDBProofVersion { version: 0 }) + )); + } + + #[test] + fn test_unknown_grovedb_proof_version_is_rejected() { + let grovedb_proof = + bincode::encode_to_vec(2u32, bincode::config::standard().with_big_endian()) + .expect("test proof version should encode"); + let proof = Proof { + grovedb_proof, + quorum_hash: vec![0u8; 32], + signature: vec![0u8; 96], + round: 1, + block_id_hash: vec![0u8; 32], + quorum_type: 1, + }; + + assert!(matches!( + require_current_grovedb_proof(&proof), + Err(Error::UnsupportedGroveDBProofVersion { version: 2 }) + )); + } + /// Helper: create a deterministic BLS key pair for testing. fn test_keypair() -> ( bls_signatures::SecretKey, @@ -347,7 +468,7 @@ mod tests { #[test] fn test_verify_tenderdash_proof_invalid_quorum_hash_size() { let proof = Proof { - grovedb_proof: vec![], + grovedb_proof: grovedb_proof_bytes(1), quorum_hash: vec![0u8; 16], // too short — not 32 bytes signature: vec![0u8; 96], round: 1, @@ -374,7 +495,7 @@ mod tests { #[test] fn test_verify_tenderdash_proof_invalid_signature_size() { let proof = Proof { - grovedb_proof: vec![], + grovedb_proof: grovedb_proof_bytes(1), quorum_hash: vec![0u8; 32], signature: vec![0u8; 50], // wrong size — not 96 bytes round: 1, @@ -431,7 +552,7 @@ mod tests { #[test] fn test_verify_tenderdash_proof_provider_error_propagates() { let proof = Proof { - grovedb_proof: vec![], + grovedb_proof: grovedb_proof_bytes(1), quorum_hash: vec![0u8; 32], signature: vec![0u8; 96], round: 1, @@ -488,7 +609,7 @@ mod tests { } let proof = Proof { - grovedb_proof: vec![], + grovedb_proof: grovedb_proof_bytes(1), quorum_hash: vec![0u8; 32], signature: vec![1u8; 96], // non-zero to skip empty check round: 1, @@ -518,7 +639,7 @@ mod tests { #[test] fn test_verify_tenderdash_proof_empty_signature() { let proof = Proof { - grovedb_proof: vec![], + grovedb_proof: grovedb_proof_bytes(1), quorum_hash: vec![0u8; 32], signature: vec![0u8; 96], // all zeros — "empty signature" round: 1, diff --git a/packages/rs-drive/src/verify/address_funds/verify_compacted_address_balance_changes/v1/mod.rs b/packages/rs-drive/src/verify/address_funds/verify_compacted_address_balance_changes/v1/mod.rs index c9a823cbfac..699e074948c 100644 --- a/packages/rs-drive/src/verify/address_funds/verify_compacted_address_balance_changes/v1/mod.rs +++ b/packages/rs-drive/src/verify/address_funds/verify_compacted_address_balance_changes/v1/mod.rs @@ -16,6 +16,7 @@ const MAX_COMPACTED_PROOF_DECODE_BYTES: usize = 16 * 1024 * 1024; /// A compacted row contains at most one configured address chunk. Keep a /// separate semantic-object budget after the GroveDB envelope is decoded. const MAX_COMPACTED_BALANCE_ROW_DECODE_BYTES: usize = 1024 * 1024; +const CURRENT_GROVEDB_PROOF_ENVELOPE_VERSION: u32 = 1; use dpp::balances::credits::BlockAwareCreditOperation; use grovedb::{GroveDb, PathQuery, Query, SizedQuery}; use platform_version::version::PlatformVersion; @@ -23,6 +24,26 @@ use std::collections::BTreeMap; use super::{CompactedAddressBalanceProof, VerifiedCompactedAddressBalanceChanges}; +fn require_current_grovedb_proof(proof: &[u8], label: &str) -> Result<(), Error> { + let config = bincode::config::standard() + .with_big_endian() + .with_limit::<16>(); + let (version, _): (u32, usize) = + bincode::decode_from_slice(proof, config).map_err(|error| { + Error::Proof(ProofError::CorruptedProof(format!( + "invalid {label} GroveDB proof envelope: {error}" + ))) + })?; + + if version != CURRENT_GROVEDB_PROOF_ENVELOPE_VERSION { + return Err(Error::Proof(ProofError::CorruptedProof(format!( + "unsupported {label} GroveDB proof envelope version {version}: current-state responses require V1" + )))); + } + + Ok(()) +} + impl Drive { /// Verifies compacted address balance changes proof. /// @@ -58,6 +79,9 @@ impl Drive { ))); } + require_current_grovedb_proof(&proof_envelope.predecessor_proof, "predecessor")?; + require_current_grovedb_proof(&proof_envelope.forward_proof, "forward")?; + let path = vec![ vec![RootTree::SavedBlockTransactions as u8], vec![COMPACTED_ADDRESS_BALANCES_KEY_U8], @@ -281,6 +305,50 @@ mod tests { ); } + #[test] + fn rejects_v0_envelope_in_either_compacted_proof_half() { + let (drive, max_blocks) = setup_drive_with_compacted_ranges(); + let platform_version = PlatformVersion::latest(); + let start_block_height = max_blocks / 2; + let proof = drive + .prove_compacted_address_balance_changes( + start_block_height, + None, + None, + platform_version, + ) + .expect("should prove compacted ranges"); + let config = bincode::config::standard().with_big_endian(); + + for predecessor in [true, false] { + let (mut envelope, _): (CompactedAddressBalanceProof, usize) = + bincode::decode_from_slice(&proof, config).expect("decode compacted envelope"); + let nested_proof = if predecessor { + &mut envelope.predecessor_proof + } else { + &mut envelope.forward_proof + }; + assert_eq!(nested_proof.first(), Some(&1), "fixture should use V1"); + nested_proof[0] = 0; + let tampered = bincode::encode_to_vec(envelope, config) + .expect("encode tampered compacted envelope"); + + let error = Drive::verify_compacted_address_balance_changes( + &tampered, + start_block_height, + None, + platform_version, + ) + .expect_err("V0 nested proof must be rejected"); + assert!( + error + .to_string() + .contains("current-state responses require V1"), + "unexpected error: {error}" + ); + } + } + #[test] fn should_prove_and_verify_empty_compacted_address_balance_changes() { let drive = setup_drive_with_initial_state_structure(None); diff --git a/packages/wasm-drive-verify/src/contract/verify_contract.rs b/packages/wasm-drive-verify/src/contract/verify_contract.rs index e5ff917743e..63c490d7fc5 100644 --- a/packages/wasm-drive-verify/src/contract/verify_contract.rs +++ b/packages/wasm-drive-verify/src/contract/verify_contract.rs @@ -44,7 +44,7 @@ pub fn verify_contract( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, contract_option) = Drive::verify_contract( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, contract_known_keeps_history, is_proof_subset, in_multiple_contract_proof_form, diff --git a/packages/wasm-drive-verify/src/contract/verify_contract_history.rs b/packages/wasm-drive-verify/src/contract/verify_contract_history.rs index 46255c79117..9ad411e1db1 100644 --- a/packages/wasm-drive-verify/src/contract/verify_contract_history.rs +++ b/packages/wasm-drive-verify/src/contract/verify_contract_history.rs @@ -44,7 +44,7 @@ pub fn verify_contract_history( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, contract_history_option) = Drive::verify_contract_history( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, contract_id_bytes, start_at_date, limit, diff --git a/packages/wasm-drive-verify/src/document/verify_proof.rs b/packages/wasm-drive-verify/src/document/verify_proof.rs index 516210b2fcd..5b7de9942bd 100644 --- a/packages/wasm-drive-verify/src/document/verify_proof.rs +++ b/packages/wasm-drive-verify/src/document/verify_proof.rs @@ -119,7 +119,10 @@ pub fn verify_document_proof( }; let (root_hash, documents) = query - .verify_proof(&proof_vec, platform_version) + .verify_proof( + crate::utils::proof::current_grovedb_proof(&proof_vec)?, + platform_version, + ) .map_err(|e| format_result_error(ErrorCategory::VerificationError, e))?; // Convert documents to JS array diff --git a/packages/wasm-drive-verify/src/document/verify_proof_keep_serialized.rs b/packages/wasm-drive-verify/src/document/verify_proof_keep_serialized.rs index 39de614da0f..17142dec1d5 100644 --- a/packages/wasm-drive-verify/src/document/verify_proof_keep_serialized.rs +++ b/packages/wasm-drive-verify/src/document/verify_proof_keep_serialized.rs @@ -110,7 +110,10 @@ pub fn verify_document_proof_keep_serialized( }; let (root_hash, serialized_docs) = query - .verify_proof_keep_serialized(&proof_vec, platform_version) + .verify_proof_keep_serialized( + crate::utils::proof::current_grovedb_proof(&proof_vec)?, + platform_version, + ) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert serialized documents to JS array of Uint8Arrays diff --git a/packages/wasm-drive-verify/src/document/verify_start_at_document_in_proof.rs b/packages/wasm-drive-verify/src/document/verify_start_at_document_in_proof.rs index c1267e8d3e4..c6cfb37254f 100644 --- a/packages/wasm-drive-verify/src/document/verify_start_at_document_in_proof.rs +++ b/packages/wasm-drive-verify/src/document/verify_start_at_document_in_proof.rs @@ -119,7 +119,7 @@ pub fn verify_start_at_document_in_proof( let (root_hash, document_option) = query .verify_start_at_document_in_proof( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, is_proof_subset, document_id_bytes, platform_version, diff --git a/packages/wasm-drive-verify/src/group/verify_action_signers.rs b/packages/wasm-drive-verify/src/group/verify_action_signers.rs index 62896dc0845..9bbbff79709 100644 --- a/packages/wasm-drive-verify/src/group/verify_action_signers.rs +++ b/packages/wasm-drive-verify/src/group/verify_action_signers.rs @@ -63,7 +63,7 @@ pub fn verify_action_signers_vec( let (root_hash, signers_vec): (RootHash, Vec<(Identifier, GroupMemberPower)>) = Drive::verify_action_signers( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, Identifier::from(contract_id_bytes), group_contract_position, action_status_enum, @@ -124,7 +124,7 @@ pub fn verify_action_signers_map( let (root_hash, signers_map): (RootHash, BTreeMap) = Drive::verify_action_signers( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, Identifier::from(contract_id_bytes), group_contract_position, action_status_enum, diff --git a/packages/wasm-drive-verify/src/group/verify_action_signers_total_power.rs b/packages/wasm-drive-verify/src/group/verify_action_signers_total_power.rs index f04ae64580a..e50cf98dd59 100644 --- a/packages/wasm-drive-verify/src/group/verify_action_signers_total_power.rs +++ b/packages/wasm-drive-verify/src/group/verify_action_signers_total_power.rs @@ -72,7 +72,7 @@ pub fn verify_action_signers_total_power( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, status, total_power) = Drive::verify_action_signer_and_total_power( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, Identifier::from(contract_id_bytes), group_contract_position, action_status_enum, diff --git a/packages/wasm-drive-verify/src/group/verify_active_action_infos.rs b/packages/wasm-drive-verify/src/group/verify_active_action_infos.rs index 050cdaef27c..f3f7a51a824 100644 --- a/packages/wasm-drive-verify/src/group/verify_active_action_infos.rs +++ b/packages/wasm-drive-verify/src/group/verify_active_action_infos.rs @@ -127,7 +127,7 @@ pub fn verify_action_infos_in_contract_vec( let (root_hash, actions_vec): (RootHash, Vec<(Identifier, GroupAction)>) = Drive::verify_action_infos_in_contract( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, Identifier::from(contract_id_bytes), group_contract_position, action_status_enum, @@ -209,7 +209,7 @@ pub fn verify_action_infos_in_contract_map( let (root_hash, actions_map): (RootHash, BTreeMap) = Drive::verify_action_infos_in_contract( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, Identifier::from(contract_id_bytes), group_contract_position, action_status_enum, diff --git a/packages/wasm-drive-verify/src/group/verify_group_info.rs b/packages/wasm-drive-verify/src/group/verify_group_info.rs index c796f9ef2df..cc810cb391b 100644 --- a/packages/wasm-drive-verify/src/group/verify_group_info.rs +++ b/packages/wasm-drive-verify/src/group/verify_group_info.rs @@ -44,7 +44,7 @@ pub fn verify_group_info( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, group_option) = Drive::verify_group_info( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, Identifier::from(contract_id_bytes), group_contract_position, is_proof_subset, diff --git a/packages/wasm-drive-verify/src/group/verify_group_infos_in_contract.rs b/packages/wasm-drive-verify/src/group/verify_group_infos_in_contract.rs index 0696fa0cc8e..5e0055df343 100644 --- a/packages/wasm-drive-verify/src/group/verify_group_infos_in_contract.rs +++ b/packages/wasm-drive-verify/src/group/verify_group_infos_in_contract.rs @@ -67,7 +67,7 @@ pub fn verify_group_infos_in_contract_vec( let (root_hash, groups_vec): (RootHash, Vec<(GroupContractPosition, Group)>) = Drive::verify_group_infos_in_contract( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, Identifier::from(contract_id_bytes), start_position, limit, @@ -136,7 +136,7 @@ pub fn verify_group_infos_in_contract_map( let (root_hash, groups_map): (RootHash, BTreeMap) = Drive::verify_group_infos_in_contract( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, Identifier::from(contract_id_bytes), start_position, limit, diff --git a/packages/wasm-drive-verify/src/identity/verify_full_identities_by_public_key_hashes.rs b/packages/wasm-drive-verify/src/identity/verify_full_identities_by_public_key_hashes.rs index 48e7850eb29..68f2b152731 100644 --- a/packages/wasm-drive-verify/src/identity/verify_full_identities_by_public_key_hashes.rs +++ b/packages/wasm-drive-verify/src/identity/verify_full_identities_by_public_key_hashes.rs @@ -62,7 +62,7 @@ pub fn verify_full_identities_by_public_key_hashes_vec( let (root_hash, identities_vec): (RootHash, Vec<([u8; 20], Option)>) = Drive::verify_full_identities_by_public_key_hashes( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, &public_key_hashes_vec, platform_version, ) @@ -132,7 +132,7 @@ pub fn verify_full_identities_by_public_key_hashes_map( let (root_hash, identities_map): (RootHash, BTreeMap<[u8; 20], Option>) = Drive::verify_full_identities_by_public_key_hashes( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, &public_key_hashes_vec, platform_version, ) diff --git a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_identity_id.rs b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_identity_id.rs index 767b8a37ed0..8a86f96b2f9 100644 --- a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_identity_id.rs +++ b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_identity_id.rs @@ -53,7 +53,7 @@ pub fn verify_full_identity_by_identity_id( let platform_version = get_platform_version_with_validation(platform_version_number)?; let (root_hash, identity_option) = Drive::verify_full_identity_by_identity_id( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, is_proof_subset, identity_id_bytes, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_non_unique_public_key_hash.rs b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_non_unique_public_key_hash.rs index 2ebc4c4bf5a..7585bc6dd3b 100644 --- a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_non_unique_public_key_hash.rs +++ b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_non_unique_public_key_hash.rs @@ -55,6 +55,11 @@ pub fn verify_full_identity_by_non_unique_public_key_hash( let platform_version = PlatformVersion::get(platform_version_number) .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; + if let Some(identity_proof) = identity_proof_vec.as_deref() { + crate::utils::proof::current_grovedb_proof(identity_proof)?; + } + crate::utils::proof::current_grovedb_proof(&identity_id_public_key_hash_proof_vec)?; + let proof = IdentityAndNonUniquePublicKeyHashDoubleProof { identity_proof: identity_proof_vec, identity_id_public_key_hash_proof: identity_id_public_key_hash_proof_vec, diff --git a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_unique_public_key_hash.rs b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_unique_public_key_hash.rs index 372da9184c4..75991eadd43 100644 --- a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_unique_public_key_hash.rs +++ b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_unique_public_key_hash.rs @@ -41,7 +41,7 @@ pub fn verify_full_identity_by_unique_public_key_hash( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, identity_option) = Drive::verify_full_identity_by_unique_public_key_hash( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, public_key_hash_bytes, platform_version, ) diff --git a/packages/wasm-drive-verify/src/identity/verify_identities_contract_keys.rs b/packages/wasm-drive-verify/src/identity/verify_identities_contract_keys.rs index b4820cd6c0e..51c7b5ec39c 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identities_contract_keys.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identities_contract_keys.rs @@ -80,7 +80,7 @@ pub fn verify_identities_contract_keys( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, keys) = Drive::verify_identities_contract_keys( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, &identity_ids_vec, &contract_id_bytes, document_type_name, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_balance_and_revision_for_identity_id.rs b/packages/wasm-drive-verify/src/identity/verify_identity_balance_and_revision_for_identity_id.rs index cd789b36899..81ce432711e 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_balance_and_revision_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_balance_and_revision_for_identity_id.rs @@ -48,7 +48,7 @@ pub fn verify_identity_balance_and_revision_for_identity_id( let (root_hash, balance_and_revision_option) = Drive::verify_identity_balance_and_revision_for_identity_id( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, identity_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_balance_for_identity_id.rs b/packages/wasm-drive-verify/src/identity/verify_identity_balance_for_identity_id.rs index c64ab906e55..9176211ceda 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_balance_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_balance_for_identity_id.rs @@ -41,7 +41,7 @@ pub fn verify_identity_balance_for_identity_id( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, balance_option) = Drive::verify_identity_balance_for_identity_id( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, identity_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_balances_for_identity_ids.rs b/packages/wasm-drive-verify/src/identity/verify_identity_balances_for_identity_ids.rs index d5ab3284a4d..7fd24b53abf 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_balances_for_identity_ids.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_balances_for_identity_ids.rs @@ -63,7 +63,7 @@ pub fn verify_identity_balances_for_identity_ids_vec( let (root_hash, balances_vec): (RootHash, Vec<([u8; 32], Option)>) = Drive::verify_identity_balances_for_identity_ids( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, is_proof_subset, &identity_ids_vec, platform_version, @@ -134,7 +134,7 @@ pub fn verify_identity_balances_for_identity_ids_map( let (root_hash, balances_map): (RootHash, BTreeMap<[u8; 32], Option>) = Drive::verify_identity_balances_for_identity_ids( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, is_proof_subset, &identity_ids_vec, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_contract_nonce.rs b/packages/wasm-drive-verify/src/identity/verify_identity_contract_nonce.rs index 8496bbe08c6..44dc9808c76 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_contract_nonce.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_contract_nonce.rs @@ -47,7 +47,7 @@ pub fn verify_identity_contract_nonce( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, nonce_option) = Drive::verify_identity_contract_nonce( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, identity_id_bytes, contract_id_bytes, verify_subset_of_proof, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_id_by_non_unique_public_key_hash.rs b/packages/wasm-drive-verify/src/identity/verify_identity_id_by_non_unique_public_key_hash.rs index 4525752c913..2088f1990d8 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_id_by_non_unique_public_key_hash.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_id_by_non_unique_public_key_hash.rs @@ -53,7 +53,7 @@ pub fn verify_identity_id_by_non_unique_public_key_hash( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, identity_id_option) = Drive::verify_identity_id_by_non_unique_public_key_hash( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, is_proof_subset, public_key_hash_bytes, after_bytes, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_id_by_unique_public_key_hash.rs b/packages/wasm-drive-verify/src/identity/verify_identity_id_by_unique_public_key_hash.rs index ac4a85915c0..dcdf2939e5f 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_id_by_unique_public_key_hash.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_id_by_unique_public_key_hash.rs @@ -41,7 +41,7 @@ pub fn verify_identity_id_by_unique_public_key_hash( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, identity_id_option) = Drive::verify_identity_id_by_unique_public_key_hash( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, is_proof_subset, public_key_hash_bytes, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_ids_by_unique_public_key_hashes.rs b/packages/wasm-drive-verify/src/identity/verify_identity_ids_by_unique_public_key_hashes.rs index 4b9326d2556..ea640940199 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_ids_by_unique_public_key_hashes.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_ids_by_unique_public_key_hashes.rs @@ -62,7 +62,7 @@ pub fn verify_identity_ids_by_unique_public_key_hashes_vec( let (root_hash, identity_ids_vec): (RootHash, Vec<([u8; 20], Option<[u8; 32]>)>) = Drive::verify_identity_ids_by_unique_public_key_hashes( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, is_proof_subset, &public_key_hashes_vec, platform_version, @@ -134,7 +134,7 @@ pub fn verify_identity_ids_by_unique_public_key_hashes_map( let (root_hash, identity_ids_map): (RootHash, BTreeMap<[u8; 20], Option<[u8; 32]>>) = Drive::verify_identity_ids_by_unique_public_key_hashes( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, is_proof_subset, &public_key_hashes_vec, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_keys_by_identity_id.rs b/packages/wasm-drive-verify/src/identity/verify_identity_keys_by_identity_id.rs index c8d3e38fbdc..1559cc110ec 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_keys_by_identity_id.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_keys_by_identity_id.rs @@ -153,7 +153,7 @@ pub fn verify_identity_keys_by_identity_id( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, identity_option) = Drive::verify_identity_keys_by_identity_id( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, key_request, with_revision, with_balance, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_nonce.rs b/packages/wasm-drive-verify/src/identity/verify_identity_nonce.rs index f280db32b54..374e63d588f 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_nonce.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_nonce.rs @@ -41,7 +41,7 @@ pub fn verify_identity_nonce( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, nonce_option) = Drive::verify_identity_nonce( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, identity_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_revision_for_identity_id.rs b/packages/wasm-drive-verify/src/identity/verify_identity_revision_for_identity_id.rs index cda1d9ed5d9..ee5a0ec7d72 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_revision_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_revision_for_identity_id.rs @@ -41,7 +41,7 @@ pub fn verify_identity_revision_for_identity_id( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, revision_option) = Drive::verify_identity_revision_for_identity_id( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, identity_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/native.rs b/packages/wasm-drive-verify/src/native.rs index 149a5abc73f..1fa3d47dbc1 100644 --- a/packages/wasm-drive-verify/src/native.rs +++ b/packages/wasm-drive-verify/src/native.rs @@ -8,8 +8,15 @@ use dpp::document::Document; use dpp::identity::Identity; use dpp::version::PlatformVersion; use drive::drive::Drive; +use drive::error::proof::ProofError; use drive::query::DriveDocumentQuery; +fn current_grovedb_proof(proof: &[u8]) -> Result<&[u8], drive::error::Error> { + crate::utils::proof::validate_current_grovedb_proof(proof) + .map_err(|error| drive::error::Error::Proof(ProofError::CorruptedProof(error)))?; + Ok(proof) +} + /// Verify a full identity by identity ID pub fn verify_full_identity_by_identity_id( proof: &[u8], @@ -18,7 +25,7 @@ pub fn verify_full_identity_by_identity_id( platform_version: &PlatformVersion, ) -> Result<([u8; 32], Option), drive::error::Error> { Drive::verify_full_identity_by_identity_id( - proof, + current_grovedb_proof(proof)?, is_proof_subset, identity_id, platform_version, @@ -35,7 +42,7 @@ pub fn verify_contract( platform_version: &PlatformVersion, ) -> Result<([u8; 32], Option), drive::error::Error> { Drive::verify_contract( - proof, + current_grovedb_proof(proof)?, contract_known_keeps_history, is_proof_subset, in_multiple_contract_proof_form, @@ -50,5 +57,5 @@ pub fn verify_documents_with_query( query: &DriveDocumentQuery, platform_version: &PlatformVersion, ) -> Result<([u8; 32], Vec), drive::error::Error> { - query.verify_proof(proof, platform_version) + query.verify_proof(current_grovedb_proof(proof)?, platform_version) } diff --git a/packages/wasm-drive-verify/src/single_document/verify_single_document.rs b/packages/wasm-drive-verify/src/single_document/verify_single_document.rs index 2c887d66953..64e2f55fc9c 100644 --- a/packages/wasm-drive-verify/src/single_document/verify_single_document.rs +++ b/packages/wasm-drive-verify/src/single_document/verify_single_document.rs @@ -132,10 +132,11 @@ pub fn verify_single_document_proof_keep_serialized( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; // Verify the proof keeping it serialized - match query - .inner - .verify_proof_keep_serialized(is_subset, &proof, platform_version) - { + match query.inner.verify_proof_keep_serialized( + is_subset, + crate::utils::proof::current_grovedb_proof(&proof)?, + platform_version, + ) { Ok((root_hash, maybe_serialized_document)) => Ok(SingleDocumentProofResult { root_hash: root_hash.to_vec(), document_serialized: maybe_serialized_document, diff --git a/packages/wasm-drive-verify/src/state_transition/verify_state_transition_was_executed_with_proof.rs b/packages/wasm-drive-verify/src/state_transition/verify_state_transition_was_executed_with_proof.rs index 1597530477b..b227b9396c2 100644 --- a/packages/wasm-drive-verify/src/state_transition/verify_state_transition_was_executed_with_proof.rs +++ b/packages/wasm-drive-verify/src/state_transition/verify_state_transition_was_executed_with_proof.rs @@ -84,7 +84,7 @@ pub fn verify_state_transition_was_executed_with_proof( let (root_hash, outcome) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, &block_info, - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, &contract_lookup_fn, platform_version, ) diff --git a/packages/wasm-drive-verify/src/system/verify_epoch_infos.rs b/packages/wasm-drive-verify/src/system/verify_epoch_infos.rs index 7fdf4024845..d7814b07be7 100644 --- a/packages/wasm-drive-verify/src/system/verify_epoch_infos.rs +++ b/packages/wasm-drive-verify/src/system/verify_epoch_infos.rs @@ -40,7 +40,7 @@ pub fn verify_epoch_infos( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, epoch_infos_vec) = Drive::verify_epoch_infos( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, current_epoch, start_epoch, count, diff --git a/packages/wasm-drive-verify/src/system/verify_epoch_proposers.rs b/packages/wasm-drive-verify/src/system/verify_epoch_proposers.rs index 5943069ea19..c8d33dc861a 100644 --- a/packages/wasm-drive-verify/src/system/verify_epoch_proposers.rs +++ b/packages/wasm-drive-verify/src/system/verify_epoch_proposers.rs @@ -58,7 +58,7 @@ pub fn verify_epoch_proposers_by_range_vec( let (root_hash, proposers_vec): (RootHash, Vec<(Vec, u64)>) = Drive::verify_epoch_proposers( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, epoch_index, proposer_query_type, platform_version, @@ -117,7 +117,7 @@ pub fn verify_epoch_proposers_by_range_map( let (root_hash, proposers_map): (RootHash, BTreeMap, u64>) = Drive::verify_epoch_proposers( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, epoch_index, proposer_query_type, platform_version, @@ -176,7 +176,7 @@ pub fn verify_epoch_proposers_by_ids_vec( let (root_hash, proposers_vec): (RootHash, Vec<(Vec, u64)>) = Drive::verify_epoch_proposers( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, epoch_index, proposer_query_type, platform_version, @@ -237,7 +237,7 @@ pub fn verify_epoch_proposers_by_ids_map( let (root_hash, proposers_map): (RootHash, BTreeMap, u64>) = Drive::verify_epoch_proposers( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, epoch_index, proposer_query_type, platform_version, diff --git a/packages/wasm-drive-verify/src/system/verify_total_credits_in_system.rs b/packages/wasm-drive-verify/src/system/verify_total_credits_in_system.rs index 8171c5f1cc2..b42eb41dc93 100644 --- a/packages/wasm-drive-verify/src/system/verify_total_credits_in_system.rs +++ b/packages/wasm-drive-verify/src/system/verify_total_credits_in_system.rs @@ -42,7 +42,7 @@ pub fn verify_total_credits_in_system( || -> Result { Ok(activation_core_height) }; let (root_hash, total_credits) = Drive::verify_total_credits_in_system( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, core_subsidy_halving_interval, request_activation_core_height, current_core_height, diff --git a/packages/wasm-drive-verify/src/system/verify_upgrade_state.rs b/packages/wasm-drive-verify/src/system/verify_upgrade_state.rs index 22a301f4b55..7357f95b823 100644 --- a/packages/wasm-drive-verify/src/system/verify_upgrade_state.rs +++ b/packages/wasm-drive-verify/src/system/verify_upgrade_state.rs @@ -33,8 +33,11 @@ pub fn verify_upgrade_state( let platform_version = PlatformVersion::get(platform_version_number) .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; - let (root_hash, upgrade_state_map) = Drive::verify_upgrade_state(&proof_vec, platform_version) - .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; + let (root_hash, upgrade_state_map) = Drive::verify_upgrade_state( + crate::utils::proof::current_grovedb_proof(&proof_vec)?, + platform_version, + ) + .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert IntMap to JS object let js_obj = Object::new(); diff --git a/packages/wasm-drive-verify/src/system/verify_upgrade_vote_status.rs b/packages/wasm-drive-verify/src/system/verify_upgrade_vote_status.rs index 9390f564666..bf2143ba00f 100644 --- a/packages/wasm-drive-verify/src/system/verify_upgrade_vote_status.rs +++ b/packages/wasm-drive-verify/src/system/verify_upgrade_vote_status.rs @@ -53,7 +53,7 @@ pub fn verify_upgrade_vote_status( }; let (root_hash, vote_status_map) = Drive::verify_upgrade_vote_status( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, start_protx_hash_array, count, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_balance_for_identity_id.rs b/packages/wasm-drive-verify/src/tokens/verify_token_balance_for_identity_id.rs index 1cc368ca8ef..5bd31821f5b 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_balance_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_balance_for_identity_id.rs @@ -47,7 +47,7 @@ pub fn verify_token_balance_for_identity_id( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, balance_option) = Drive::verify_token_balance_for_identity_id( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, token_id_bytes, identity_id_bytes, verify_subset_of_proof, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_id.rs b/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_id.rs index b1cc9b8f273..a84af8da981 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_id.rs @@ -68,7 +68,7 @@ pub fn verify_token_balances_for_identity_id_vec( let (root_hash, balances_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_balances_for_identity_id( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, &token_ids_vec, identity_id_bytes, verify_subset_of_proof, @@ -146,7 +146,7 @@ pub fn verify_token_balances_for_identity_id_map( let (root_hash, balances_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_balances_for_identity_id( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, &token_ids_vec, identity_id_bytes, verify_subset_of_proof, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_ids.rs b/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_ids.rs index 0f3cb7d5a43..79ed3019707 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_ids.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_ids.rs @@ -68,7 +68,7 @@ pub fn verify_token_balances_for_identity_ids_vec( let (root_hash, balances_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_balances_for_identity_ids( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, token_id_bytes, &identity_ids_vec, is_proof_subset, @@ -146,7 +146,7 @@ pub fn verify_token_balances_for_identity_ids_map( let (root_hash, balances_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_balances_for_identity_ids( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, token_id_bytes, &identity_ids_vec, is_proof_subset, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_contract_info.rs b/packages/wasm-drive-verify/src/tokens/verify_token_contract_info.rs index 68b136f873a..9920ba1924e 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_contract_info.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_contract_info.rs @@ -42,7 +42,7 @@ pub fn verify_token_contract_info( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, contract_info_option) = Drive::verify_token_contract_info( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, token_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_price.rs b/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_price.rs index 55aeec32b64..ee3ac0983da 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_price.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_price.rs @@ -42,7 +42,7 @@ pub fn verify_token_direct_selling_price( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, price_option) = Drive::verify_token_direct_selling_price( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, token_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_prices.rs b/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_prices.rs index 616ec019d56..733b063df96 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_prices.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_prices.rs @@ -62,7 +62,7 @@ pub fn verify_token_direct_selling_prices_vec( let (root_hash, prices_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_direct_selling_prices( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, &token_ids_vec, verify_subset_of_proof, platform_version, @@ -171,7 +171,7 @@ pub fn verify_token_direct_selling_prices_map( let (root_hash, prices_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_direct_selling_prices( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, &token_ids_vec, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_info_for_identity_id.rs b/packages/wasm-drive-verify/src/tokens/verify_token_info_for_identity_id.rs index d824f53530c..3c14a927fc8 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_info_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_info_for_identity_id.rs @@ -48,7 +48,7 @@ pub fn verify_token_info_for_identity_id( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, token_info_option) = Drive::verify_token_info_for_identity_id( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, token_id_bytes, identity_id_bytes, verify_subset_of_proof, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_id.rs b/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_id.rs index 431b69c32be..ca7dbcd62cc 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_id.rs @@ -81,7 +81,7 @@ pub fn verify_token_infos_for_identity_id_vec( let (root_hash, token_infos_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_infos_for_identity_id( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, &token_ids_vec, identity_id_bytes, verify_subset_of_proof, @@ -159,7 +159,7 @@ pub fn verify_token_infos_for_identity_id_map( let (root_hash, token_infos_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_infos_for_identity_id( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, &token_ids_vec, identity_id_bytes, verify_subset_of_proof, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_ids.rs b/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_ids.rs index 9046778e080..607b634083b 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_ids.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_ids.rs @@ -81,7 +81,7 @@ pub fn verify_token_infos_for_identity_ids_vec( let (root_hash, token_infos_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_infos_for_identity_ids( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, token_id_bytes, &identity_ids_vec, is_proof_subset, @@ -155,7 +155,7 @@ pub fn verify_token_infos_for_identity_ids_map( let (root_hash, token_infos_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_infos_for_identity_ids( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, token_id_bytes, &identity_ids_vec, is_proof_subset, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_perpetual_distribution_last_paid_time.rs b/packages/wasm-drive-verify/src/tokens/verify_token_perpetual_distribution_last_paid_time.rs index 06d579f45ae..bf47fe84abf 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_perpetual_distribution_last_paid_time.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_perpetual_distribution_last_paid_time.rs @@ -55,7 +55,7 @@ pub fn verify_token_perpetual_distribution_last_paid_time( let (root_hash, last_paid_time_option) = Drive::verify_token_perpetual_distribution_last_paid_time( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, token_id_bytes, identity_id_bytes, &distribution_type, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_pre_programmed_distributions.rs b/packages/wasm-drive-verify/src/tokens/verify_token_pre_programmed_distributions.rs index 2926cb5fcb8..4cf823c6e26 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_pre_programmed_distributions.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_pre_programmed_distributions.rs @@ -74,7 +74,7 @@ pub fn verify_token_pre_programmed_distributions_vec( type DistributionVec = Vec<(Identifier, TokenAmount)>; let (root_hash, distributions_vec): (RootHash, Vec<(TimestampMillis, DistributionVec)>) = drive::drive::Drive::verify_token_pre_programmed_distributions( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, token_id_bytes, start_at, limit, @@ -155,7 +155,7 @@ pub fn verify_token_pre_programmed_distributions_map( type DistributionMap = BTreeMap; let (root_hash, distributions_map): (RootHash, BTreeMap) = drive::drive::Drive::verify_token_pre_programmed_distributions( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, token_id_bytes, start_at, limit, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_status.rs b/packages/wasm-drive-verify/src/tokens/verify_token_status.rs index 26b943d0262..d4891da8fe2 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_status.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_status.rs @@ -43,7 +43,7 @@ pub fn verify_token_status( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, status_option) = Drive::verify_token_status( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, token_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_statuses.rs b/packages/wasm-drive-verify/src/tokens/verify_token_statuses.rs index a503e19d6c5..7548ef151e5 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_statuses.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_statuses.rs @@ -63,7 +63,7 @@ pub fn verify_token_statuses_vec( let (root_hash, statuses_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_statuses( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, &token_ids_vec, verify_subset_of_proof, platform_version, @@ -140,7 +140,7 @@ pub fn verify_token_statuses_map( let (root_hash, statuses_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_statuses( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, &token_ids_vec, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_total_supply_and_aggregated_identity_balance.rs b/packages/wasm-drive-verify/src/tokens/verify_token_total_supply_and_aggregated_identity_balance.rs index c08d0068d7a..9d5217afae7 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_total_supply_and_aggregated_identity_balance.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_total_supply_and_aggregated_identity_balance.rs @@ -42,7 +42,7 @@ pub fn verify_token_total_supply_and_aggregated_identity_balance( let (root_hash, total_balance) = Drive::verify_token_total_supply_and_aggregated_identity_balance( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, token_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/utils/mod.rs b/packages/wasm-drive-verify/src/utils/mod.rs index c997771b369..027bacd37f9 100644 --- a/packages/wasm-drive-verify/src/utils/mod.rs +++ b/packages/wasm-drive-verify/src/utils/mod.rs @@ -3,4 +3,5 @@ pub mod error; pub mod getters; pub mod logging; pub mod platform_version; +pub(crate) mod proof; pub mod serialization; diff --git a/packages/wasm-drive-verify/src/utils/proof.rs b/packages/wasm-drive-verify/src/utils/proof.rs new file mode 100644 index 00000000000..3c8562fcf3b --- /dev/null +++ b/packages/wasm-drive-verify/src/utils/proof.rs @@ -0,0 +1,51 @@ +//! GroveDB proof-envelope policy for public WASM verification entry points. + +use crate::utils::error::{format_error, ErrorCategory}; +use wasm_bindgen::JsValue; + +const CURRENT_GROVEDB_PROOF_ENVELOPE_VERSION: u32 = 1; + +pub(crate) fn validate_current_grovedb_proof(proof: &[u8]) -> Result<(), String> { + let config = bincode::config::standard() + .with_big_endian() + .with_limit::<16>(); + let (version, _): (u32, usize) = bincode::decode_from_slice(proof, config) + .map_err(|error| format!("invalid GroveDB proof envelope: {error}"))?; + + if version != CURRENT_GROVEDB_PROOF_ENVELOPE_VERSION { + return Err(format!( + "unsupported GroveDB proof envelope version {version}: current-state responses require V1" + )); + } + + Ok(()) +} + +pub(crate) fn current_grovedb_proof(proof: &[u8]) -> Result<&[u8], JsValue> { + validate_current_grovedb_proof(proof) + .map_err(|error| format_error(ErrorCategory::VerificationError, &error))?; + Ok(proof) +} + +#[cfg(test)] +mod tests { + use super::validate_current_grovedb_proof; + + #[test] + fn rejects_legacy_and_unknown_proof_envelopes() { + let config = bincode::config::standard().with_big_endian(); + + for version in [0u32, 2u32] { + let proof = bincode::encode_to_vec(version, config).expect("encode proof version"); + assert!(validate_current_grovedb_proof(&proof).is_err()); + } + } + + #[test] + fn accepts_v1_proof_envelope() { + let proof = bincode::encode_to_vec(1u32, bincode::config::standard().with_big_endian()) + .expect("encode proof version"); + + assert!(validate_current_grovedb_proof(&proof).is_ok()); + } +} diff --git a/packages/wasm-drive-verify/src/voting/verify_contests_proof.rs b/packages/wasm-drive-verify/src/voting/verify_contests_proof.rs index 83acdecc626..48eda0a8933 100644 --- a/packages/wasm-drive-verify/src/voting/verify_contests_proof.rs +++ b/packages/wasm-drive-verify/src/voting/verify_contests_proof.rs @@ -80,7 +80,10 @@ pub fn verify_contests_proof( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, contests_vec) = query - .verify_contests_proof(&proof_vec, platform_version) + .verify_contests_proof( + crate::utils::proof::current_grovedb_proof(&proof_vec)?, + platform_version, + ) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert Values to JS array diff --git a/packages/wasm-drive-verify/src/voting/verify_identity_votes_given_proof.rs b/packages/wasm-drive-verify/src/voting/verify_identity_votes_given_proof.rs index 49eefa06e9f..95332ce8ffd 100644 --- a/packages/wasm-drive-verify/src/voting/verify_identity_votes_given_proof.rs +++ b/packages/wasm-drive-verify/src/voting/verify_identity_votes_given_proof.rs @@ -95,7 +95,11 @@ pub fn verify_identity_votes_given_proof_vec( let contract_lookup_fn = create_contract_lookup_fn(contract_lookup, platform_version)?; let (root_hash, votes_vec): (RootHash, Vec<(Identifier, ResourceVote)>) = query - .verify_identity_votes_given_proof(&proof_vec, &*contract_lookup_fn, platform_version) + .verify_identity_votes_given_proof( + crate::utils::proof::current_grovedb_proof(&proof_vec)?, + &*contract_lookup_fn, + platform_version, + ) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert to JS array of tuples @@ -144,7 +148,11 @@ pub fn verify_identity_votes_given_proof_map( let contract_lookup_fn = create_contract_lookup_fn(contract_lookup, platform_version)?; let (root_hash, votes_map): (RootHash, BTreeMap) = query - .verify_identity_votes_given_proof(&proof_vec, &*contract_lookup_fn, platform_version) + .verify_identity_votes_given_proof( + crate::utils::proof::current_grovedb_proof(&proof_vec)?, + &*contract_lookup_fn, + platform_version, + ) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert to JS object with base58 keys diff --git a/packages/wasm-drive-verify/src/voting/verify_masternode_vote.rs b/packages/wasm-drive-verify/src/voting/verify_masternode_vote.rs index 69688bbf561..25c8ca47b8b 100644 --- a/packages/wasm-drive-verify/src/voting/verify_masternode_vote.rs +++ b/packages/wasm-drive-verify/src/voting/verify_masternode_vote.rs @@ -58,7 +58,7 @@ pub fn verify_masternode_vote( .map_err(|e| JsValue::from_str(&format!("Failed to deserialize data contract: {:?}", e)))?; let (root_hash, vote_option) = Drive::verify_masternode_vote( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, masternode_pro_tx_hash_bytes, &vote, &data_contract, diff --git a/packages/wasm-drive-verify/src/voting/verify_specialized_balance.rs b/packages/wasm-drive-verify/src/voting/verify_specialized_balance.rs index d74e20b6c75..001e8875486 100644 --- a/packages/wasm-drive-verify/src/voting/verify_specialized_balance.rs +++ b/packages/wasm-drive-verify/src/voting/verify_specialized_balance.rs @@ -41,7 +41,7 @@ pub fn verify_specialized_balance( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, balance_option) = Drive::verify_specialized_balance( - &proof_vec, + crate::utils::proof::current_grovedb_proof(&proof_vec)?, specialized_balance_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/voting/verify_vote_poll_vote_state_proof.rs b/packages/wasm-drive-verify/src/voting/verify_vote_poll_vote_state_proof.rs index cd77152cbd8..8eda6b240c4 100644 --- a/packages/wasm-drive-verify/src/voting/verify_vote_poll_vote_state_proof.rs +++ b/packages/wasm-drive-verify/src/voting/verify_vote_poll_vote_state_proof.rs @@ -95,7 +95,10 @@ pub fn verify_vote_poll_vote_state_proof( .map_err(|e| JsValue::from_str(&format!("Failed to resolve query: {:?}", e)))?; let (root_hash, execution_result) = resolved_query - .verify_vote_poll_vote_state_proof(&proof_vec, platform_version) + .verify_vote_poll_vote_state_proof( + crate::utils::proof::current_grovedb_proof(&proof_vec)?, + platform_version, + ) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert execution result to JS object diff --git a/packages/wasm-drive-verify/src/voting/verify_vote_poll_votes_proof.rs b/packages/wasm-drive-verify/src/voting/verify_vote_poll_votes_proof.rs index edd4387b07c..3eed78a5c38 100644 --- a/packages/wasm-drive-verify/src/voting/verify_vote_poll_votes_proof.rs +++ b/packages/wasm-drive-verify/src/voting/verify_vote_poll_votes_proof.rs @@ -105,7 +105,10 @@ pub fn verify_vote_poll_votes_proof( .map_err(|e| JsValue::from_str(&format!("Failed to resolve query: {:?}", e)))?; let (root_hash, votes_vec) = resolved_query - .verify_vote_poll_votes_proof(&proof_vec, platform_version) + .verify_vote_poll_votes_proof( + crate::utils::proof::current_grovedb_proof(&proof_vec)?, + platform_version, + ) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert identifiers to JS array diff --git a/packages/wasm-drive-verify/src/voting/verify_vote_polls_end_date_query.rs b/packages/wasm-drive-verify/src/voting/verify_vote_polls_end_date_query.rs index 4b394ec4ffe..4256b2e0c09 100644 --- a/packages/wasm-drive-verify/src/voting/verify_vote_polls_end_date_query.rs +++ b/packages/wasm-drive-verify/src/voting/verify_vote_polls_end_date_query.rs @@ -47,7 +47,10 @@ pub fn verify_vote_polls_end_date_query_vec( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, polls_vec): (RootHash, Vec<(TimestampMillis, Vec)>) = query - .verify_vote_polls_by_end_date_proof(&proof_vec, platform_version) + .verify_vote_polls_by_end_date_proof( + crate::utils::proof::current_grovedb_proof(&proof_vec)?, + platform_version, + ) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert to JS array of tuples @@ -98,7 +101,10 @@ pub fn verify_vote_polls_end_date_query_map( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, polls_map): (RootHash, BTreeMap>) = query - .verify_vote_polls_by_end_date_proof(&proof_vec, platform_version) + .verify_vote_polls_by_end_date_proof( + crate::utils::proof::current_grovedb_proof(&proof_vec)?, + platform_version, + ) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert to JS object with timestamp as string key From 1c03a2a4a86c4bf916066d8e51d4ee791a904d0f Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 13 Sep 2026 16:59:50 +0700 Subject: [PATCH 2/7] test(sdk): cover the V1 envelope policy through public entry points Import the envelope helpers instead of spelling out crate paths at every call site in drive-proof-verifier and wasm-drive-verify. Add regressions that reach the policy through public entry points: the native wasm-drive-verify functions reject V0 and unknown envelopes for identity, contract, and document proofs while a V1 envelope reaches Drive; the identity double proof rejects a V0 outer proof as well as a V0 inner one; the WASM double-proof entry point gets the same two cases. Co-Authored-By: Claude Fable 5.1 --- packages/rs-drive-proof-verifier/src/proof.rs | 149 +++++++++++------- .../src/proof/chained_document.rs | 7 +- .../src/proof/composite_document.rs | 7 +- .../src/proof/document_average.rs | 15 +- .../src/proof/document_count.rs | 23 +-- .../src/proof/document_having.rs | 7 +- .../src/proof/document_ranked.rs | 7 +- .../src/proof/document_sum.rs | 18 +-- .../src/proof/groups.rs | 10 +- .../src/proof/identity_token_balance.rs | 6 +- .../src/proof/token_contract_info.rs | 4 +- .../src/proof/token_direct_purchase.rs | 3 +- .../src/proof/token_info.rs | 6 +- ...token_perpetual_distribution_last_claim.rs | 3 +- .../token_pre_programmed_distributions.rs | 4 +- .../src/proof/token_status.rs | 4 +- .../src/proof/token_total_supply.rs | 4 +- .../src/contract/verify_contract.rs | 3 +- .../src/contract/verify_contract_history.rs | 3 +- .../src/document/verify_proof.rs | 6 +- .../document/verify_proof_keep_serialized.rs | 6 +- .../verify_start_at_document_in_proof.rs | 3 +- .../src/group/verify_action_signers.rs | 5 +- .../verify_action_signers_total_power.rs | 3 +- .../src/group/verify_active_action_infos.rs | 5 +- .../src/group/verify_group_info.rs | 3 +- .../group/verify_group_infos_in_contract.rs | 5 +- ...fy_full_identities_by_public_key_hashes.rs | 5 +- .../verify_full_identity_by_identity_id.rs | 3 +- ..._identity_by_non_unique_public_key_hash.rs | 5 +- ...full_identity_by_unique_public_key_hash.rs | 3 +- .../verify_identities_contract_keys.rs | 3 +- ...ty_balance_and_revision_for_identity_id.rs | 3 +- ...verify_identity_balance_for_identity_id.rs | 3 +- ...rify_identity_balances_for_identity_ids.rs | 5 +- .../verify_identity_contract_nonce.rs | 3 +- ...entity_id_by_non_unique_public_key_hash.rs | 3 +- ...y_identity_id_by_unique_public_key_hash.rs | 3 +- ...dentity_ids_by_unique_public_key_hashes.rs | 5 +- .../verify_identity_keys_by_identity_id.rs | 3 +- .../src/identity/verify_identity_nonce.rs | 3 +- ...erify_identity_revision_for_identity_id.rs | 3 +- packages/wasm-drive-verify/src/native.rs | 134 +++++++++++++++- .../single_document/verify_single_document.rs | 3 +- ...tate_transition_was_executed_with_proof.rs | 3 +- .../src/system/verify_epoch_infos.rs | 3 +- .../src/system/verify_epoch_proposers.rs | 9 +- .../system/verify_total_credits_in_system.rs | 3 +- .../src/system/verify_upgrade_state.rs | 9 +- .../src/system/verify_upgrade_vote_status.rs | 3 +- .../verify_token_balance_for_identity_id.rs | 3 +- .../verify_token_balances_for_identity_id.rs | 5 +- .../verify_token_balances_for_identity_ids.rs | 5 +- .../src/tokens/verify_token_contract_info.rs | 3 +- .../verify_token_direct_selling_price.rs | 3 +- .../verify_token_direct_selling_prices.rs | 5 +- .../verify_token_info_for_identity_id.rs | 3 +- .../verify_token_infos_for_identity_id.rs | 5 +- .../verify_token_infos_for_identity_ids.rs | 5 +- ...n_perpetual_distribution_last_paid_time.rs | 3 +- ...rify_token_pre_programmed_distributions.rs | 5 +- .../src/tokens/verify_token_status.rs | 3 +- .../src/tokens/verify_token_statuses.rs | 5 +- ..._supply_and_aggregated_identity_balance.rs | 3 +- .../src/voting/verify_contests_proof.rs | 6 +- .../verify_identity_votes_given_proof.rs | 5 +- .../src/voting/verify_masternode_vote.rs | 3 +- .../src/voting/verify_specialized_balance.rs | 3 +- .../verify_vote_poll_vote_state_proof.rs | 6 +- .../voting/verify_vote_poll_votes_proof.rs | 6 +- .../verify_vote_polls_end_date_query.rs | 11 +- .../wasm-drive-verify/tests/identity_tests.rs | 60 +++++++ 72 files changed, 465 insertions(+), 230 deletions(-) diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index 70126ceb66c..d088762bcab 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -47,7 +47,7 @@ pub mod token_total_supply; use crate::from_request::TryFromRequest; use crate::verify::{ - require_current_grovedb_proof_bytes, verify_tenderdash_proof, verify_tenderdash_signature, + current_grovedb_proof_bytes, require_current_grovedb_proof_bytes, verify_tenderdash_proof, verify_tenderdash_signature, }; use crate::{types::*, ContextProvider, DataContractProvider, Error}; use dapi_grpc::platform::v0::get_evonodes_proposed_epoch_blocks_by_range_request::get_evonodes_proposed_epoch_blocks_by_range_request_v0::Start; @@ -326,7 +326,7 @@ impl FromProof for Identity { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_full_identity_by_identity_id( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, false, id.into_buffer(), platform_version, @@ -375,7 +375,7 @@ impl FromProof for Identity { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_full_identity_by_unique_public_key_hash( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, public_key_hash, platform_version, ) @@ -543,7 +543,7 @@ impl FromProof for IdentityPublicKeys { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_identity_keys_by_identity_id( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, key_request, false, false, @@ -671,7 +671,7 @@ impl FromProof for IdentityNonceFetcher { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_nonce) = Drive::verify_identity_nonce( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, identity_id.into_buffer(), false, platform_version, @@ -725,7 +725,7 @@ impl FromProof for IdentityContractNo // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_identity_contract_nonce( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, identity_id.into_buffer(), contract_id.into_buffer(), false, @@ -774,7 +774,7 @@ impl FromProof for IdentityBalance { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_identity_balance_for_identity_id( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, id.into_buffer(), false, platform_version, @@ -823,7 +823,7 @@ impl FromProof for IdentityBalances { }) .collect::, Error>>()?; let (root_hash, balances) = Drive::verify_identity_balances_for_identity_ids( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, false, &identity_ids, platform_version, @@ -869,7 +869,7 @@ impl FromProof for IdentityBalan // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_identity_balance_and_revision_for_identity_id( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, id.into_buffer(), false, platform_version, @@ -910,7 +910,7 @@ impl FromProof for AddressInfo { }; let (root_hash, maybe_info) = Drive::verify_address_info( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, &address, false, platform_version, @@ -966,7 +966,7 @@ impl FromProof for AddressInfos { _, Vec<(PlatformAddress, Option<(AddressNonce, Credits)>)>, >( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, addresses.iter(), false, platform_version, @@ -1024,7 +1024,7 @@ impl FromProof for RecentAddres let (root_hash, verified_changes) = if start_height_exclusive { Drive::verify_recent_address_balance_changes_after( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, start_height, limit, false, @@ -1033,7 +1033,7 @@ impl FromProof for RecentAddres .map_drive_error(proof, mtd)? } else { Drive::verify_recent_address_balance_changes( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, start_height, limit, false, @@ -1215,7 +1215,7 @@ impl FromProof for DataContract { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_contract) = Drive::verify_contract( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, None, false, false, @@ -1262,7 +1262,7 @@ impl FromProof for (DataContract, Vec) { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_contract) = Drive::verify_contract_return_serialization( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, None, false, false, @@ -1314,7 +1314,7 @@ impl FromProof for DataContracts { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, contracts) = Drive::verify_contracts( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, false, ids.as_slice(), platform_version, @@ -1379,7 +1379,7 @@ impl FromProof for DataContractHistory // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_history) = Drive::verify_contract_history( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, id.into_buffer(), start_at_ms, limit, @@ -1455,7 +1455,7 @@ impl FromProof for DocumentHistory { })?; let (root_hash, maybe_history) = Drive::verify_document_history( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, contract_id.into_buffer(), &document_type_name, document_type, @@ -1531,7 +1531,7 @@ impl FromProof for StateTransitionPro let (root_hash, outcome) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, &block_info, - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, &contracts_provider_fn, platform_version, ) @@ -1621,7 +1621,7 @@ impl FromProof for ExtendedEpochInfos { let count = try_u32_to_u16(count)?; let (root_hash, epoch_info) = Drive::verify_epoch_infos( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, current_epoch, start_epoch, count, @@ -1687,7 +1687,7 @@ impl FromProof for FinalizedEpochInfos let end_epoch_index: EpochIndex = try_u32_to_u16(end_epoch_index)?; let (root_hash, epoch_info) = Drive::verify_finalized_epoch_infos( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, start_epoch_index, start_epoch_index_included, end_epoch_index, @@ -1733,11 +1733,9 @@ impl FromProof for ProtocolVersionUpgrade let proof = response.proof().or(Err(Error::NoProofInResult))?; let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; - let (root_hash, objects) = Drive::verify_upgrade_state( - crate::verify::current_grovedb_proof_bytes(proof)?, - platform_version, - ) - .map_drive_error(proof, mtd)?; + let (root_hash, objects) = + Drive::verify_upgrade_state(current_grovedb_proof_bytes(proof)?, platform_version) + .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -1786,7 +1784,7 @@ impl FromProof for MasternodeProtoco let count = try_u32_to_u16(request_v0.count)?; let (root_hash, objects) = Drive::verify_upgrade_vote_status( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, start_pro_tx_hash, count, platform_version, @@ -1850,7 +1848,7 @@ impl FromProof for Elements { let keys = request_v0.keys; let (root_hash, objects) = Drive::verify_elements( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, path, keys, platform_version, @@ -1898,10 +1896,7 @@ where let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, documents) = request - .verify_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, - platform_version, - ) + .verify_proof(current_grovedb_proof_bytes(proof)?, platform_version) .map_drive_error(proof, mtd)?; let documents = documents @@ -1976,7 +1971,7 @@ impl FromProof for IdentitiesContrac // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, identities_contract_keys) = Drive::verify_identities_contract_keys( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, identities_ids.as_slice(), &contract_id, document_type_name, @@ -2024,10 +2019,7 @@ impl FromProof for ContestedResources { let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, items) = resolved_request - .verify_contests_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, - platform_version, - ) + .verify_contests_proof(current_grovedb_proof_bytes(proof)?, platform_version) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -2070,7 +2062,7 @@ impl FromProof for Contenders { let (root_hash, contested_resource_vote_state) = resolved_request .verify_vote_poll_vote_state_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, platform_version, ) .map_drive_error(proof, mtd)?; @@ -2124,10 +2116,7 @@ impl FromProof for Voters { let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, voters) = resolved_request - .verify_vote_poll_votes_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, - platform_version, - ) + .verify_vote_poll_votes_proof(current_grovedb_proof_bytes(proof)?, platform_version) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -2168,7 +2157,7 @@ impl FromProof for ResourceV let contract_provider_fn = provider.as_contract_lookup_fn(platform_version); let (root_hash, voters) = drive_query .verify_identity_votes_given_proof::>( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, &contract_provider_fn, platform_version, ) @@ -2211,7 +2200,7 @@ impl FromProof for VotePollsGroupedByTim let (root_hash, vote_polls) = drive_query .verify_vote_polls_by_end_date_proof::>( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, platform_version, ) .map_drive_error(proof, mtd)?; @@ -2254,7 +2243,7 @@ impl FromProof for PrefundedSpe let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, balance) = Drive::verify_specialized_balance( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, balance_id.into_buffer(), false, platform_version, @@ -2347,7 +2336,7 @@ impl FromProof for TotalCreditsInPla let core_subsidy_halving_interval = network.core_subsidy_halving_interval(); let (root_hash, credits) = Drive::verify_total_credits_in_system( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, core_subsidy_halving_interval, || { provider.get_platform_activation_height().map_err(|e| { @@ -2404,7 +2393,7 @@ impl FromProof for Propose }; let (root_hash, proposer_block_counts) = Drive::verify_epoch_proposers( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, epoch_index, ProposerQueryType::ByIds(ids), platform_version, @@ -2474,7 +2463,7 @@ impl FromProof for Propo let checked_limit = limit.map(try_u32_to_u16).transpose()?; let (root_hash, proposer_block_counts) = Drive::verify_epoch_proposers( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, epoch_index, ProposerQueryType::ByRange(checked_limit, formatted_start), platform_version, @@ -2529,7 +2518,7 @@ impl FromProof for ShieldedPoolState { let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, maybe_balance) = Drive::verify_shielded_pool_state( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, false, platform_version, ) @@ -2568,7 +2557,7 @@ impl FromProof for ShieldedNotesCount { // `total_count` out of the `CommitmentTree` element rather than a // `SumItem` balance. let (root_hash, maybe_count) = Drive::verify_shielded_notes_count( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, false, platform_version, ) @@ -2603,7 +2592,7 @@ impl FromProof for ShieldedAnchors { let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, anchors) = Drive::verify_shielded_anchors( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, false, platform_version, ) @@ -2640,7 +2629,7 @@ impl FromProof for MostRecentShiel let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, maybe_anchor) = Drive::verify_most_recent_shielded_anchor( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, false, platform_version, ) @@ -2689,7 +2678,7 @@ impl FromProof for ShieldedEncrypted * (1u32 << drive::drive::shielded::paths::SHIELDED_NOTES_CHUNK_POWER); let (root_hash, notes, total_count) = Drive::verify_shielded_encrypted_notes( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, start_index, count, max_elements, @@ -2748,7 +2737,7 @@ impl FromProof for ShieldedNullifierStat }; let (root_hash, statuses) = Drive::verify_shielded_nullifiers( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, &nullifiers, false, platform_version, @@ -3732,6 +3721,58 @@ mod tests { )); } + #[test] + fn identity_by_non_unique_public_key_hash_rejects_v0_outer_proof() { + use dapi_grpc::platform::v0::get_identity_by_non_unique_public_key_hash_request::GetIdentityByNonUniquePublicKeyHashRequestV0; + use platform::get_identity_by_non_unique_public_key_hash_response::{ + get_identity_by_non_unique_public_key_hash_response_v0::{ + IdentityProvedResponse, Result as V0Result, + }, + GetIdentityByNonUniquePublicKeyHashResponseV0, Version, + }; + + let config = bincode::config::standard().with_big_endian(); + let v1_inner_proof = + bincode::encode_to_vec(1u32, config).expect("V1 envelope discriminant should encode"); + let v0_outer_proof = + bincode::encode_to_vec(0u32, config).expect("V0 envelope discriminant should encode"); + let response = platform::GetIdentityByNonUniquePublicKeyHashResponse { + version: Some(Version::V0(GetIdentityByNonUniquePublicKeyHashResponseV0 { + result: Some(V0Result::Proof(IdentityProvedResponse { + identity_proof_bytes: Some(v1_inner_proof), + grovedb_identity_public_key_hash_proof: Some(Proof { + grovedb_proof: v0_outer_proof, + ..Proof::default() + }), + })), + metadata: Some(ResponseMetadata::default()), + })), + }; + let request: platform::GetIdentityByNonUniquePublicKeyHashRequest = + GetIdentityByNonUniquePublicKeyHashRequestV0 { + public_key_hash: vec![0u8; 20], + start_after: None, + prove: true, + } + .into(); + + let err = >::maybe_from_proof( + request, + response, + Network::Testnet, + default_platform_version(), + &unreachable_provider(), + ) + .unwrap_err(); + + assert!(matches!( + err, + Error::UnsupportedGroveDBProofVersion { version: 0 } + )); + } + #[test] fn identity_by_non_unique_response_with_no_result_yields_no_proof() { use dapi_grpc::platform::v0::get_identity_by_non_unique_public_key_hash_request::GetIdentityByNonUniquePublicKeyHashRequestV0; diff --git a/packages/rs-drive-proof-verifier/src/proof/chained_document.rs b/packages/rs-drive-proof-verifier/src/proof/chained_document.rs index 0c846c3a492..c6a25c449a1 100644 --- a/packages/rs-drive-proof-verifier/src/proof/chained_document.rs +++ b/packages/rs-drive-proof-verifier/src/proof/chained_document.rs @@ -22,7 +22,7 @@ //! chooses, but the canonical path proves. use crate::error::MapGroveDbError; -use crate::verify::verify_tenderdash_proof; +use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{GetDocumentsResponse, Proof, ResponseMetadata}; use dapi_grpc::platform::VersionedGrpcResponse; @@ -68,10 +68,7 @@ pub fn verify_chained_documents_proof( provider: &dyn ContextProvider, ) -> Result<(RootHash, ChainedDocuments), Error> { let (root_hash, result) = query - .verify_chained_documents_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, - platform_version, - ) + .verify_chained_documents_proof(current_grovedb_proof_bytes(proof)?, platform_version) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; diff --git a/packages/rs-drive-proof-verifier/src/proof/composite_document.rs b/packages/rs-drive-proof-verifier/src/proof/composite_document.rs index e984706dbbe..c063ffccbf2 100644 --- a/packages/rs-drive-proof-verifier/src/proof/composite_document.rs +++ b/packages/rs-drive-proof-verifier/src/proof/composite_document.rs @@ -21,7 +21,7 @@ //! path proves. use crate::error::MapGroveDbError; -use crate::verify::verify_tenderdash_proof; +use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{GetDocumentsResponse, Proof, ResponseMetadata}; use dapi_grpc::platform::VersionedGrpcResponse; @@ -63,10 +63,7 @@ pub fn verify_composite_documents_proof( provider: &dyn ContextProvider, ) -> Result<(RootHash, CompositeDocuments), Error> { let (root_hash, result) = query - .verify_composite_documents_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, - platform_version, - ) + .verify_composite_documents_proof(current_grovedb_proof_bytes(proof)?, platform_version) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; diff --git a/packages/rs-drive-proof-verifier/src/proof/document_average.rs b/packages/rs-drive-proof-verifier/src/proof/document_average.rs index 3e8d52dd994..c6e23317bda 100644 --- a/packages/rs-drive-proof-verifier/src/proof/document_average.rs +++ b/packages/rs-drive-proof-verifier/src/proof/document_average.rs @@ -22,7 +22,7 @@ //! `DocumentAverageMode`. use crate::error::MapGroveDbError; -use crate::verify::verify_tenderdash_proof; +use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error}; use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; use dpp::version::PlatformVersion; @@ -47,7 +47,7 @@ pub fn verify_point_lookup_count_and_sum_proof( ) -> Result, Error> { let (root_hash, entries) = query .verify_point_lookup_count_and_sum_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, platform_version, ) .map_drive_error(proof, mtd)?; @@ -78,7 +78,7 @@ pub fn verify_distinct_count_and_sum_proof( ) -> Result, Error> { let (root_hash, entries) = query .verify_distinct_count_and_sum_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, limit, left_to_right, platform_version, @@ -148,10 +148,7 @@ pub fn verify_aggregate_count_and_sum_proof( provider: &dyn ContextProvider, ) -> Result<(u64, i64), Error> { let (root_hash, count, sum) = query - .verify_aggregate_count_and_sum_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, - platform_version, - ) + .verify_aggregate_count_and_sum_proof(current_grovedb_proof_bytes(proof)?, platform_version) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -180,7 +177,7 @@ pub fn verify_primary_key_count_sum_tree_proof( provider: &dyn ContextProvider, ) -> Result<(u64, i64), Error> { let (root_hash, count, sum) = DriveDocumentSumQuery::verify_primary_key_count_sum_tree_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, contract_id, document_type_name, platform_version, @@ -222,7 +219,7 @@ pub fn verify_carrier_aggregate_count_and_sum_proof( ) -> Result, Error> { let (root_hash, per_key_count_sum) = query .verify_carrier_aggregate_count_and_sum_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, limit, left_to_right, platform_version, diff --git a/packages/rs-drive-proof-verifier/src/proof/document_count.rs b/packages/rs-drive-proof-verifier/src/proof/document_count.rs index 37016871e12..ca433717b4b 100644 --- a/packages/rs-drive-proof-verifier/src/proof/document_count.rs +++ b/packages/rs-drive-proof-verifier/src/proof/document_count.rs @@ -1,5 +1,5 @@ use crate::error::MapGroveDbError; -use crate::verify::verify_tenderdash_proof; +use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{GetDocumentsResponse, Proof, ResponseMetadata}; use dapi_grpc::platform::VersionedGrpcResponse; @@ -45,10 +45,7 @@ where let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, documents) = request - .verify_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, - platform_version, - ) + .verify_proof(current_grovedb_proof_bytes(proof)?, platform_version) .map_drive_error(proof, mtd)?; let count = documents.len() as u64; @@ -85,10 +82,7 @@ pub fn verify_aggregate_count_proof( provider: &dyn ContextProvider, ) -> Result { let (root_hash, count) = query - .verify_aggregate_count_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, - platform_version, - ) + .verify_aggregate_count_proof(current_grovedb_proof_bytes(proof)?, platform_version) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -130,7 +124,7 @@ pub fn verify_distinct_count_proof( ) -> Result, Error> { let (root_hash, entries) = query .verify_distinct_count_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, limit, left_to_right, platform_version, @@ -194,10 +188,7 @@ pub fn verify_point_lookup_count_proof( provider: &dyn ContextProvider, ) -> Result, Error> { let (root_hash, entries) = query - .verify_point_lookup_count_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, - platform_version, - ) + .verify_point_lookup_count_proof(current_grovedb_proof_bytes(proof)?, platform_version) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -224,7 +215,7 @@ pub fn verify_primary_key_count_tree_proof( provider: &dyn ContextProvider, ) -> Result { let (root_hash, count) = DriveDocumentCountQuery::verify_primary_key_count_tree_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, contract_id, document_type_name, platform_version, @@ -287,7 +278,7 @@ pub fn verify_carrier_aggregate_count_proof( ) -> Result, Error> { let (root_hash, per_key_counts) = query .verify_carrier_aggregate_count_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, limit, left_to_right, platform_version, diff --git a/packages/rs-drive-proof-verifier/src/proof/document_having.rs b/packages/rs-drive-proof-verifier/src/proof/document_having.rs index 31a4ee6b442..757763058d2 100644 --- a/packages/rs-drive-proof-verifier/src/proof/document_having.rs +++ b/packages/rs-drive-proof-verifier/src/proof/document_having.rs @@ -27,7 +27,7 @@ use crate::error::MapGroveDbError; use crate::proof::document_ranked::{ranked_entry_from_proto, result_variant_name}; -use crate::verify::verify_tenderdash_proof; +use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::get_documents_response::get_documents_response_v1::{ result_data, ResultData, @@ -174,10 +174,7 @@ pub fn verify_having_range_proof( provider: &dyn ContextProvider, ) -> Result<(RootHash, Vec), Error> { let (root_hash, entries) = query - .verify_having_range_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, - platform_version, - ) + .verify_having_range_proof(current_grovedb_proof_bytes(proof)?, platform_version) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; diff --git a/packages/rs-drive-proof-verifier/src/proof/document_ranked.rs b/packages/rs-drive-proof-verifier/src/proof/document_ranked.rs index 9bd7dc02023..5499b0dcc29 100644 --- a/packages/rs-drive-proof-verifier/src/proof/document_ranked.rs +++ b/packages/rs-drive-proof-verifier/src/proof/document_ranked.rs @@ -26,7 +26,7 @@ //! contract, which this crate does not carry. use crate::error::MapGroveDbError; -use crate::verify::verify_tenderdash_proof; +use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::get_documents_response::get_documents_response_v1::{ ranked_entry, result_data, RankedEntry as ProtoRankedEntry, ResultData, @@ -332,10 +332,7 @@ pub fn verify_ranked_top_k_proof( provider: &dyn ContextProvider, ) -> Result<(RootHash, RankedPage), Error> { let (root_hash, page) = query - .verify_ranked_top_k_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, - platform_version, - ) + .verify_ranked_top_k_proof(current_grovedb_proof_bytes(proof)?, platform_version) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; diff --git a/packages/rs-drive-proof-verifier/src/proof/document_sum.rs b/packages/rs-drive-proof-verifier/src/proof/document_sum.rs index 12744466182..f5a2c9503c2 100644 --- a/packages/rs-drive-proof-verifier/src/proof/document_sum.rs +++ b/packages/rs-drive-proof-verifier/src/proof/document_sum.rs @@ -17,7 +17,7 @@ //! `DocumentSumMode`. use crate::error::MapGroveDbError; -use crate::verify::verify_tenderdash_proof; +use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error}; use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; use dpp::version::PlatformVersion; @@ -61,10 +61,7 @@ pub fn verify_aggregate_sum_proof( provider: &dyn ContextProvider, ) -> Result { let (root_hash, sum) = query - .verify_aggregate_sum_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, - platform_version, - ) + .verify_aggregate_sum_proof(current_grovedb_proof_bytes(proof)?, platform_version) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -91,7 +88,7 @@ pub fn verify_primary_key_sum_tree_proof( provider: &dyn ContextProvider, ) -> Result { let (root_hash, sum) = DriveDocumentSumQuery::verify_primary_key_sum_tree_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, contract_id, document_type_name, platform_version, @@ -122,10 +119,7 @@ pub fn verify_point_lookup_sum_proof( provider: &dyn ContextProvider, ) -> Result, Error> { let (root_hash, entries) = query - .verify_point_lookup_sum_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, - platform_version, - ) + .verify_point_lookup_sum_proof(current_grovedb_proof_bytes(proof)?, platform_version) .map_drive_error(proof, mtd)?; verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; @@ -155,7 +149,7 @@ pub fn verify_distinct_sum_proof( ) -> Result, Error> { let (root_hash, entries) = query .verify_distinct_sum_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, limit, left_to_right, platform_version, @@ -197,7 +191,7 @@ pub fn verify_carrier_aggregate_sum_proof( ) -> Result, Error> { let (root_hash, per_key_sums) = query .verify_carrier_aggregate_sum_proof( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, limit, left_to_right, platform_version, diff --git a/packages/rs-drive-proof-verifier/src/proof/groups.rs b/packages/rs-drive-proof-verifier/src/proof/groups.rs index e4b6a9efdf2..993997cc8a7 100644 --- a/packages/rs-drive-proof-verifier/src/proof/groups.rs +++ b/packages/rs-drive-proof-verifier/src/proof/groups.rs @@ -1,6 +1,6 @@ use crate::error::MapGroveDbError; use crate::types::groups::{GroupActionSigners, GroupActions, Groups}; -use crate::verify::verify_tenderdash_proof; +use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{ get_group_action_signers_request, get_group_actions_request, get_group_info_request, @@ -60,7 +60,7 @@ impl FromProof for Group { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_group_info( - crate::verify::current_grovedb_proof_bytes(&proof)?, + current_grovedb_proof_bytes(&proof)?, contract_id, group_contract_position, false, @@ -123,7 +123,7 @@ impl FromProof for Groups { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_group_infos_in_contract( - crate::verify::current_grovedb_proof_bytes(&proof)?, + current_grovedb_proof_bytes(&proof)?, contract_id, start_at_group_contract_position, count, @@ -221,7 +221,7 @@ impl FromProof for GroupActions { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_action_infos_in_contract( - crate::verify::current_grovedb_proof_bytes(&proof)?, + current_grovedb_proof_bytes(&proof)?, contract_id, group_contract_position, status, @@ -300,7 +300,7 @@ impl FromProof for GroupActionSigners { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_action_signers( - crate::verify::current_grovedb_proof_bytes(&proof)?, + current_grovedb_proof_bytes(&proof)?, contract_id, group_contract_position, status, diff --git a/packages/rs-drive-proof-verifier/src/proof/identity_token_balance.rs b/packages/rs-drive-proof-verifier/src/proof/identity_token_balance.rs index 00376db2564..516545912c4 100644 --- a/packages/rs-drive-proof-verifier/src/proof/identity_token_balance.rs +++ b/packages/rs-drive-proof-verifier/src/proof/identity_token_balance.rs @@ -1,6 +1,6 @@ use crate::error::MapGroveDbError; use crate::types::identity_token_balance::{IdentitiesTokenBalances, IdentityTokenBalances}; -use crate::verify::verify_tenderdash_proof; +use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{ get_identities_token_balances_request, get_identity_token_balances_request, @@ -57,7 +57,7 @@ impl FromProof for IdentityTokenBalances { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_balances_for_identity_id( - crate::verify::current_grovedb_proof_bytes(&proof)?, + current_grovedb_proof_bytes(&proof)?, &token_ids, identity_id, false, @@ -117,7 +117,7 @@ impl FromProof for IdentitiesTokenBalances { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_balances_for_identity_ids( - crate::verify::current_grovedb_proof_bytes(&proof)?, + current_grovedb_proof_bytes(&proof)?, token_id, &identity_ids, false, diff --git a/packages/rs-drive-proof-verifier/src/proof/token_contract_info.rs b/packages/rs-drive-proof-verifier/src/proof/token_contract_info.rs index 13092a73fd6..3083f373d9b 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_contract_info.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_contract_info.rs @@ -1,5 +1,5 @@ use crate::error::MapGroveDbError; -use crate::verify::verify_tenderdash_proof; +use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{ get_token_contract_info_request, GetTokenContractInfoRequest, GetTokenContractInfoResponse, @@ -44,7 +44,7 @@ impl FromProof for TokenContractInfo { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_contract_info( - crate::verify::current_grovedb_proof_bytes(&proof)?, + current_grovedb_proof_bytes(&proof)?, token_id, false, platform_version, diff --git a/packages/rs-drive-proof-verifier/src/proof/token_direct_purchase.rs b/packages/rs-drive-proof-verifier/src/proof/token_direct_purchase.rs index cf6576050a3..7b26f80841b 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_direct_purchase.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_direct_purchase.rs @@ -1,3 +1,4 @@ +use crate::verify::current_grovedb_proof_bytes; use std::collections::BTreeSet; use dapi_grpc::platform::{ @@ -57,7 +58,7 @@ impl FromProof for TokenDirectPurchasePrice // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, tokens): (_, Self) = Drive::verify_token_direct_selling_prices( - crate::verify::current_grovedb_proof_bytes(proof)?, + current_grovedb_proof_bytes(proof)?, &token_ids, false, platform_version, diff --git a/packages/rs-drive-proof-verifier/src/proof/token_info.rs b/packages/rs-drive-proof-verifier/src/proof/token_info.rs index 7d4a43be3f1..3d7425d68df 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_info.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_info.rs @@ -1,6 +1,6 @@ use crate::error::MapGroveDbError; use crate::types::token_info::{IdentitiesTokenInfos, IdentityTokenInfos}; -use crate::verify::verify_tenderdash_proof; +use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{ get_identities_token_infos_request, get_identity_token_infos_request, @@ -57,7 +57,7 @@ impl FromProof for IdentityTokenInfos { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_infos_for_identity_id( - crate::verify::current_grovedb_proof_bytes(&proof)?, + current_grovedb_proof_bytes(&proof)?, &token_ids, identity_id, false, @@ -116,7 +116,7 @@ impl FromProof for IdentitiesTokenInfos { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_infos_for_identity_ids( - crate::verify::current_grovedb_proof_bytes(&proof)?, + current_grovedb_proof_bytes(&proof)?, token_id, &identity_ids, false, diff --git a/packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs b/packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs index 8a9062e3d09..e41cb755b00 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs @@ -1,3 +1,4 @@ +use crate::verify::current_grovedb_proof_bytes; use dapi_grpc::platform::v0::{ get_token_perpetual_distribution_last_claim_request::Version as RequestVersion, get_token_perpetual_distribution_last_claim_response::{ @@ -95,7 +96,7 @@ impl FromProof for RewardDistribu Some(distribution_type) => { let (root_hash, moment_opt) = Drive::verify_token_perpetual_distribution_last_paid_time( - crate::verify::current_grovedb_proof_bytes(&proof_msg)?, + current_grovedb_proof_bytes(&proof_msg)?, token_id, identity_id, &distribution_type, diff --git a/packages/rs-drive-proof-verifier/src/proof/token_pre_programmed_distributions.rs b/packages/rs-drive-proof-verifier/src/proof/token_pre_programmed_distributions.rs index 01949a73804..7ff5e89caa9 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_pre_programmed_distributions.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_pre_programmed_distributions.rs @@ -1,5 +1,5 @@ use crate::error::MapGroveDbError; -use crate::verify::verify_tenderdash_proof; +use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{types::TokenPreProgrammedDistributions, ContextProvider, Error}; use dapi_grpc::platform::v0::{ get_token_pre_programmed_distributions_request, GetTokenPreProgrammedDistributionsRequest, @@ -86,7 +86,7 @@ impl FromProof for TokenPreProgrammed let (root_hash, result): ([u8; 32], TokenPreProgrammedDistributions) = Drive::verify_token_pre_programmed_distributions( - crate::verify::current_grovedb_proof_bytes(&proof)?, + current_grovedb_proof_bytes(&proof)?, token_id, start_at, limit, diff --git a/packages/rs-drive-proof-verifier/src/proof/token_status.rs b/packages/rs-drive-proof-verifier/src/proof/token_status.rs index 5f922ac2897..7e8bb8dcbeb 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_status.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_status.rs @@ -1,6 +1,6 @@ use crate::error::MapGroveDbError; use crate::types::token_status::TokenStatuses; -use crate::verify::verify_tenderdash_proof; +use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{ get_token_statuses_request, GetTokenStatusesRequest, GetTokenStatusesResponse, Proof, @@ -47,7 +47,7 @@ impl FromProof for TokenStatuses { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_statuses( - crate::verify::current_grovedb_proof_bytes(&proof)?, + current_grovedb_proof_bytes(&proof)?, &token_ids, false, platform_version, diff --git a/packages/rs-drive-proof-verifier/src/proof/token_total_supply.rs b/packages/rs-drive-proof-verifier/src/proof/token_total_supply.rs index 3ee8ff898f5..81d7f62f8f1 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_total_supply.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_total_supply.rs @@ -1,5 +1,5 @@ use crate::error::MapGroveDbError; -use crate::verify::verify_tenderdash_proof; +use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{ get_token_total_supply_request, GetTokenTotalSupplyRequest, GetTokenTotalSupplyResponse, Proof, @@ -43,7 +43,7 @@ impl FromProof for TotalSingleTokenBalance { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_total_supply_and_aggregated_identity_balance( - crate::verify::current_grovedb_proof_bytes(&proof)?, + current_grovedb_proof_bytes(&proof)?, token_id, false, platform_version, diff --git a/packages/wasm-drive-verify/src/contract/verify_contract.rs b/packages/wasm-drive-verify/src/contract/verify_contract.rs index 63c490d7fc5..ae142071464 100644 --- a/packages/wasm-drive-verify/src/contract/verify_contract.rs +++ b/packages/wasm-drive-verify/src/contract/verify_contract.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -44,7 +45,7 @@ pub fn verify_contract( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, contract_option) = Drive::verify_contract( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, contract_known_keeps_history, is_proof_subset, in_multiple_contract_proof_form, diff --git a/packages/wasm-drive-verify/src/contract/verify_contract_history.rs b/packages/wasm-drive-verify/src/contract/verify_contract_history.rs index 9ad411e1db1..17b365e2f9b 100644 --- a/packages/wasm-drive-verify/src/contract/verify_contract_history.rs +++ b/packages/wasm-drive-verify/src/contract/verify_contract_history.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::{Object, Reflect, Uint8Array}; @@ -44,7 +45,7 @@ pub fn verify_contract_history( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, contract_history_option) = Drive::verify_contract_history( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, contract_id_bytes, start_at_date, limit, diff --git a/packages/wasm-drive-verify/src/document/verify_proof.rs b/packages/wasm-drive-verify/src/document/verify_proof.rs index 5b7de9942bd..8e59ab032ed 100644 --- a/packages/wasm-drive-verify/src/document/verify_proof.rs +++ b/packages/wasm-drive-verify/src/document/verify_proof.rs @@ -5,6 +5,7 @@ use crate::utils::error::{ }; use crate::utils::getters::VecU8ToUint8Array; use crate::utils::platform_version::get_platform_version_with_validation; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::document_to_js_value; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; @@ -119,10 +120,7 @@ pub fn verify_document_proof( }; let (root_hash, documents) = query - .verify_proof( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, - platform_version, - ) + .verify_proof(current_grovedb_proof(&proof_vec)?, platform_version) .map_err(|e| format_result_error(ErrorCategory::VerificationError, e))?; // Convert documents to JS array diff --git a/packages/wasm-drive-verify/src/document/verify_proof_keep_serialized.rs b/packages/wasm-drive-verify/src/document/verify_proof_keep_serialized.rs index 17142dec1d5..cd426f176a2 100644 --- a/packages/wasm-drive-verify/src/document/verify_proof_keep_serialized.rs +++ b/packages/wasm-drive-verify/src/document/verify_proof_keep_serialized.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; use dpp::platform_value::Value; @@ -110,10 +111,7 @@ pub fn verify_document_proof_keep_serialized( }; let (root_hash, serialized_docs) = query - .verify_proof_keep_serialized( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, - platform_version, - ) + .verify_proof_keep_serialized(current_grovedb_proof(&proof_vec)?, platform_version) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert serialized documents to JS array of Uint8Arrays diff --git a/packages/wasm-drive-verify/src/document/verify_start_at_document_in_proof.rs b/packages/wasm-drive-verify/src/document/verify_start_at_document_in_proof.rs index c6cfb37254f..237eef9e6d0 100644 --- a/packages/wasm-drive-verify/src/document/verify_start_at_document_in_proof.rs +++ b/packages/wasm-drive-verify/src/document/verify_start_at_document_in_proof.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::document_to_js_value; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; @@ -119,7 +120,7 @@ pub fn verify_start_at_document_in_proof( let (root_hash, document_option) = query .verify_start_at_document_in_proof( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, is_proof_subset, document_id_bytes, platform_version, diff --git a/packages/wasm-drive-verify/src/group/verify_action_signers.rs b/packages/wasm-drive-verify/src/group/verify_action_signers.rs index 9bbbff79709..4e928d7c51a 100644 --- a/packages/wasm-drive-verify/src/group/verify_action_signers.rs +++ b/packages/wasm-drive-verify/src/group/verify_action_signers.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::data_contract::group::GroupMemberPower; use dpp::group::group_action_status::GroupActionStatus; use dpp::identifier::Identifier; @@ -63,7 +64,7 @@ pub fn verify_action_signers_vec( let (root_hash, signers_vec): (RootHash, Vec<(Identifier, GroupMemberPower)>) = Drive::verify_action_signers( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, Identifier::from(contract_id_bytes), group_contract_position, action_status_enum, @@ -124,7 +125,7 @@ pub fn verify_action_signers_map( let (root_hash, signers_map): (RootHash, BTreeMap) = Drive::verify_action_signers( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, Identifier::from(contract_id_bytes), group_contract_position, action_status_enum, diff --git a/packages/wasm-drive-verify/src/group/verify_action_signers_total_power.rs b/packages/wasm-drive-verify/src/group/verify_action_signers_total_power.rs index e50cf98dd59..1ad0045fc11 100644 --- a/packages/wasm-drive-verify/src/group/verify_action_signers_total_power.rs +++ b/packages/wasm-drive-verify/src/group/verify_action_signers_total_power.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::group::group_action_status::GroupActionStatus; use dpp::identifier::Identifier; use dpp::version::PlatformVersion; @@ -72,7 +73,7 @@ pub fn verify_action_signers_total_power( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, status, total_power) = Drive::verify_action_signer_and_total_power( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, Identifier::from(contract_id_bytes), group_contract_position, action_status_enum, diff --git a/packages/wasm-drive-verify/src/group/verify_active_action_infos.rs b/packages/wasm-drive-verify/src/group/verify_active_action_infos.rs index f3f7a51a824..7745279031b 100644 --- a/packages/wasm-drive-verify/src/group/verify_active_action_infos.rs +++ b/packages/wasm-drive-verify/src/group/verify_active_action_infos.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::group::action_event::GroupActionEvent; use dpp::group::group_action::GroupAction; use dpp::group::group_action_status::GroupActionStatus; @@ -127,7 +128,7 @@ pub fn verify_action_infos_in_contract_vec( let (root_hash, actions_vec): (RootHash, Vec<(Identifier, GroupAction)>) = Drive::verify_action_infos_in_contract( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, Identifier::from(contract_id_bytes), group_contract_position, action_status_enum, @@ -209,7 +210,7 @@ pub fn verify_action_infos_in_contract_map( let (root_hash, actions_map): (RootHash, BTreeMap) = Drive::verify_action_infos_in_contract( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, Identifier::from(contract_id_bytes), group_contract_position, action_status_enum, diff --git a/packages/wasm-drive-verify/src/group/verify_group_info.rs b/packages/wasm-drive-verify/src/group/verify_group_info.rs index cc810cb391b..dc668f90628 100644 --- a/packages/wasm-drive-verify/src/group/verify_group_info.rs +++ b/packages/wasm-drive-verify/src/group/verify_group_info.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::identifier::Identifier; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -44,7 +45,7 @@ pub fn verify_group_info( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, group_option) = Drive::verify_group_info( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, Identifier::from(contract_id_bytes), group_contract_position, is_proof_subset, diff --git a/packages/wasm-drive-verify/src/group/verify_group_infos_in_contract.rs b/packages/wasm-drive-verify/src/group/verify_group_infos_in_contract.rs index 5e0055df343..ae0066212fe 100644 --- a/packages/wasm-drive-verify/src/group/verify_group_infos_in_contract.rs +++ b/packages/wasm-drive-verify/src/group/verify_group_infos_in_contract.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::data_contract::group::Group; use dpp::data_contract::GroupContractPosition; use dpp::identifier::Identifier; @@ -67,7 +68,7 @@ pub fn verify_group_infos_in_contract_vec( let (root_hash, groups_vec): (RootHash, Vec<(GroupContractPosition, Group)>) = Drive::verify_group_infos_in_contract( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, Identifier::from(contract_id_bytes), start_position, limit, @@ -136,7 +137,7 @@ pub fn verify_group_infos_in_contract_map( let (root_hash, groups_map): (RootHash, BTreeMap) = Drive::verify_group_infos_in_contract( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, Identifier::from(contract_id_bytes), start_position, limit, diff --git a/packages/wasm-drive-verify/src/identity/verify_full_identities_by_public_key_hashes.rs b/packages/wasm-drive-verify/src/identity/verify_full_identities_by_public_key_hashes.rs index 68f2b152731..942b6950251 100644 --- a/packages/wasm-drive-verify/src/identity/verify_full_identities_by_public_key_hashes.rs +++ b/packages/wasm-drive-verify/src/identity/verify_full_identities_by_public_key_hashes.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::{bytes_to_base58, identity_to_js_value}; use dpp::prelude::Identity; use dpp::version::PlatformVersion; @@ -62,7 +63,7 @@ pub fn verify_full_identities_by_public_key_hashes_vec( let (root_hash, identities_vec): (RootHash, Vec<([u8; 20], Option)>) = Drive::verify_full_identities_by_public_key_hashes( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, &public_key_hashes_vec, platform_version, ) @@ -132,7 +133,7 @@ pub fn verify_full_identities_by_public_key_hashes_map( let (root_hash, identities_map): (RootHash, BTreeMap<[u8; 20], Option>) = Drive::verify_full_identities_by_public_key_hashes( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, &public_key_hashes_vec, platform_version, ) diff --git a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_identity_id.rs b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_identity_id.rs index 8a86f96b2f9..e22f4cffee0 100644 --- a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_identity_id.rs +++ b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_identity_id.rs @@ -2,6 +2,7 @@ use crate::utils::error::{format_error, format_result_error, ErrorCategory}; use crate::utils::getters::VecU8ToUint8Array; use crate::utils::logging::{debug, error, PerfLogger}; use crate::utils::platform_version::get_platform_version_with_validation; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::identity_to_js_value; use drive::drive::Drive; use js_sys::Uint8Array; @@ -53,7 +54,7 @@ pub fn verify_full_identity_by_identity_id( let platform_version = get_platform_version_with_validation(platform_version_number)?; let (root_hash, identity_option) = Drive::verify_full_identity_by_identity_id( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, is_proof_subset, identity_id_bytes, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_non_unique_public_key_hash.rs b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_non_unique_public_key_hash.rs index 7585bc6dd3b..f35f11fd7c4 100644 --- a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_non_unique_public_key_hash.rs +++ b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_non_unique_public_key_hash.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::identity_to_js_value; use dpp::version::PlatformVersion; use drive::drive::identity::identity_and_non_unique_public_key_hash_double_proof::IdentityAndNonUniquePublicKeyHashDoubleProof; @@ -56,9 +57,9 @@ pub fn verify_full_identity_by_non_unique_public_key_hash( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; if let Some(identity_proof) = identity_proof_vec.as_deref() { - crate::utils::proof::current_grovedb_proof(identity_proof)?; + current_grovedb_proof(identity_proof)?; } - crate::utils::proof::current_grovedb_proof(&identity_id_public_key_hash_proof_vec)?; + current_grovedb_proof(&identity_id_public_key_hash_proof_vec)?; let proof = IdentityAndNonUniquePublicKeyHashDoubleProof { identity_proof: identity_proof_vec, diff --git a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_unique_public_key_hash.rs b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_unique_public_key_hash.rs index 75991eadd43..c91d9d08dc9 100644 --- a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_unique_public_key_hash.rs +++ b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_unique_public_key_hash.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::identity_to_js_value; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -41,7 +42,7 @@ pub fn verify_full_identity_by_unique_public_key_hash( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, identity_option) = Drive::verify_full_identity_by_unique_public_key_hash( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, public_key_hash_bytes, platform_version, ) diff --git a/packages/wasm-drive-verify/src/identity/verify_identities_contract_keys.rs b/packages/wasm-drive-verify/src/identity/verify_identities_contract_keys.rs index 51c7b5ec39c..c4caa6e1ad3 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identities_contract_keys.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identities_contract_keys.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::identity::Purpose; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -80,7 +81,7 @@ pub fn verify_identities_contract_keys( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, keys) = Drive::verify_identities_contract_keys( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, &identity_ids_vec, &contract_id_bytes, document_type_name, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_balance_and_revision_for_identity_id.rs b/packages/wasm-drive-verify/src/identity/verify_identity_balance_and_revision_for_identity_id.rs index 81ce432711e..c05faee1e2e 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_balance_and_revision_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_balance_and_revision_for_identity_id.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -48,7 +49,7 @@ pub fn verify_identity_balance_and_revision_for_identity_id( let (root_hash, balance_and_revision_option) = Drive::verify_identity_balance_and_revision_for_identity_id( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, identity_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_balance_for_identity_id.rs b/packages/wasm-drive-verify/src/identity/verify_identity_balance_for_identity_id.rs index 9176211ceda..4dd6dec753d 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_balance_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_balance_for_identity_id.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -41,7 +42,7 @@ pub fn verify_identity_balance_for_identity_id( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, balance_option) = Drive::verify_identity_balance_for_identity_id( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, identity_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_balances_for_identity_ids.rs b/packages/wasm-drive-verify/src/identity/verify_identity_balances_for_identity_ids.rs index 7fd24b53abf..2d9b0917bcb 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_balances_for_identity_ids.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_balances_for_identity_ids.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::fee::Credits; use dpp::version::PlatformVersion; @@ -63,7 +64,7 @@ pub fn verify_identity_balances_for_identity_ids_vec( let (root_hash, balances_vec): (RootHash, Vec<([u8; 32], Option)>) = Drive::verify_identity_balances_for_identity_ids( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, is_proof_subset, &identity_ids_vec, platform_version, @@ -134,7 +135,7 @@ pub fn verify_identity_balances_for_identity_ids_map( let (root_hash, balances_map): (RootHash, BTreeMap<[u8; 32], Option>) = Drive::verify_identity_balances_for_identity_ids( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, is_proof_subset, &identity_ids_vec, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_contract_nonce.rs b/packages/wasm-drive-verify/src/identity/verify_identity_contract_nonce.rs index 44dc9808c76..888090cd0fe 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_contract_nonce.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_contract_nonce.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -47,7 +48,7 @@ pub fn verify_identity_contract_nonce( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, nonce_option) = Drive::verify_identity_contract_nonce( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, identity_id_bytes, contract_id_bytes, verify_subset_of_proof, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_id_by_non_unique_public_key_hash.rs b/packages/wasm-drive-verify/src/identity/verify_identity_id_by_non_unique_public_key_hash.rs index 2088f1990d8..7a4015628d7 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_id_by_non_unique_public_key_hash.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_id_by_non_unique_public_key_hash.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -53,7 +54,7 @@ pub fn verify_identity_id_by_non_unique_public_key_hash( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, identity_id_option) = Drive::verify_identity_id_by_non_unique_public_key_hash( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, is_proof_subset, public_key_hash_bytes, after_bytes, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_id_by_unique_public_key_hash.rs b/packages/wasm-drive-verify/src/identity/verify_identity_id_by_unique_public_key_hash.rs index dcdf2939e5f..e79c0804dae 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_id_by_unique_public_key_hash.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_id_by_unique_public_key_hash.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -41,7 +42,7 @@ pub fn verify_identity_id_by_unique_public_key_hash( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, identity_id_option) = Drive::verify_identity_id_by_unique_public_key_hash( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, is_proof_subset, public_key_hash_bytes, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_ids_by_unique_public_key_hashes.rs b/packages/wasm-drive-verify/src/identity/verify_identity_ids_by_unique_public_key_hashes.rs index ea640940199..a5c5678cfdd 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_ids_by_unique_public_key_hashes.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_ids_by_unique_public_key_hashes.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::{bytes_to_base58, identifier_to_base58}; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -62,7 +63,7 @@ pub fn verify_identity_ids_by_unique_public_key_hashes_vec( let (root_hash, identity_ids_vec): (RootHash, Vec<([u8; 20], Option<[u8; 32]>)>) = Drive::verify_identity_ids_by_unique_public_key_hashes( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, is_proof_subset, &public_key_hashes_vec, platform_version, @@ -134,7 +135,7 @@ pub fn verify_identity_ids_by_unique_public_key_hashes_map( let (root_hash, identity_ids_map): (RootHash, BTreeMap<[u8; 20], Option<[u8; 32]>>) = Drive::verify_identity_ids_by_unique_public_key_hashes( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, is_proof_subset, &public_key_hashes_vec, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_keys_by_identity_id.rs b/packages/wasm-drive-verify/src/identity/verify_identity_keys_by_identity_id.rs index 1559cc110ec..e4a71066321 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_keys_by_identity_id.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_keys_by_identity_id.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::identity::identity_public_key::IdentityPublicKey; use dpp::identity::PartialIdentity; use dpp::version::PlatformVersion; @@ -153,7 +154,7 @@ pub fn verify_identity_keys_by_identity_id( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, identity_option) = Drive::verify_identity_keys_by_identity_id( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, key_request, with_revision, with_balance, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_nonce.rs b/packages/wasm-drive-verify/src/identity/verify_identity_nonce.rs index 374e63d588f..b78eef64f5c 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_nonce.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_nonce.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -41,7 +42,7 @@ pub fn verify_identity_nonce( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, nonce_option) = Drive::verify_identity_nonce( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, identity_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_revision_for_identity_id.rs b/packages/wasm-drive-verify/src/identity/verify_identity_revision_for_identity_id.rs index ee5a0ec7d72..01f224cbc16 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_revision_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_revision_for_identity_id.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -41,7 +42,7 @@ pub fn verify_identity_revision_for_identity_id( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, revision_option) = Drive::verify_identity_revision_for_identity_id( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, identity_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/native.rs b/packages/wasm-drive-verify/src/native.rs index 1fa3d47dbc1..b1757d00b1e 100644 --- a/packages/wasm-drive-verify/src/native.rs +++ b/packages/wasm-drive-verify/src/native.rs @@ -3,6 +3,7 @@ //! This module provides Rust-native functions for proof verification, //! allowing other Rust/WASM projects to use wasm-drive-verify as a library. +use crate::utils::proof::validate_current_grovedb_proof; use dpp::data_contract::DataContract; use dpp::document::Document; use dpp::identity::Identity; @@ -12,7 +13,7 @@ use drive::error::proof::ProofError; use drive::query::DriveDocumentQuery; fn current_grovedb_proof(proof: &[u8]) -> Result<&[u8], drive::error::Error> { - crate::utils::proof::validate_current_grovedb_proof(proof) + validate_current_grovedb_proof(proof) .map_err(|error| drive::error::Error::Proof(ProofError::CorruptedProof(error)))?; Ok(proof) } @@ -59,3 +60,134 @@ pub fn verify_documents_with_query( ) -> Result<([u8; 32], Vec), drive::error::Error> { query.verify_proof(current_grovedb_proof(proof)?, platform_version) } + +#[cfg(test)] +mod tests { + use super::{ + verify_contract, verify_documents_with_query, verify_full_identity_by_identity_id, + }; + use dpp::data_contract::DataContract; + use dpp::data_contracts::SystemDataContract; + use dpp::system_data_contracts::load_system_data_contract; + use dpp::version::PlatformVersion; + use drive::error::proof::ProofError; + use drive::error::Error; + use drive::query::DriveDocumentQuery; + + /// A bincode-encoded GroveDB proof envelope discriminant with no payload. + fn envelope_only_proof(version: u32) -> Vec { + bincode::encode_to_vec(version, bincode::config::standard().with_big_endian()) + .expect("encode envelope version") + } + + fn assert_rejected_envelope(result: Result<(), Error>, version: u32) { + match result { + Err(Error::Proof(ProofError::CorruptedProof(message))) => assert!( + message.contains(&format!( + "unsupported GroveDB proof envelope version {version}" + )), + "unexpected message: {message}" + ), + other => panic!("expected envelope rejection, got {other:?}"), + } + } + + fn dpns_domain_query<'a>( + contract: &'a DataContract, + platform_version: &PlatformVersion, + ) -> DriveDocumentQuery<'a> { + DriveDocumentQuery::from_sql_expr( + "select * from domain limit 1", + contract, + None, + platform_version, + ) + .expect("DPNS domain query") + } + + #[test] + fn identity_entry_point_rejects_legacy_and_unknown_envelopes() { + let platform_version = PlatformVersion::latest(); + + for version in [0u32, 2u32] { + let result = verify_full_identity_by_identity_id( + &envelope_only_proof(version), + false, + [0u8; 32], + platform_version, + ) + .map(|_| ()); + assert_rejected_envelope(result, version); + } + } + + #[test] + fn contract_entry_point_rejects_legacy_and_unknown_envelopes() { + let platform_version = PlatformVersion::latest(); + + for version in [0u32, 2u32] { + let result = verify_contract( + &envelope_only_proof(version), + None, + false, + false, + [0u8; 32], + platform_version, + ) + .map(|_| ()); + assert_rejected_envelope(result, version); + } + } + + #[test] + fn documents_entry_point_rejects_legacy_and_unknown_envelopes() { + let platform_version = PlatformVersion::latest(); + let contract = load_system_data_contract(SystemDataContract::DPNS, platform_version) + .expect("DPNS contract"); + let query = dpns_domain_query(&contract, platform_version); + + for version in [0u32, 2u32] { + let result = verify_documents_with_query( + &envelope_only_proof(version), + &query, + platform_version, + ) + .map(|_| ()); + assert_rejected_envelope(result, version); + } + } + + #[test] + fn entry_points_pass_v1_envelopes_through_to_drive() { + let platform_version = PlatformVersion::latest(); + let contract = load_system_data_contract(SystemDataContract::DPNS, platform_version) + .expect("DPNS contract"); + let query = dpns_domain_query(&contract, platform_version); + let truncated_v1 = envelope_only_proof(1); + + // A V1 discriminant with no payload clears the envelope gate and is + // then rejected by Drive's own decoder, never by the envelope policy. + let results: Vec> = vec![ + verify_full_identity_by_identity_id(&truncated_v1, false, [0u8; 32], platform_version) + .map(|_| ()), + verify_contract( + &truncated_v1, + None, + false, + false, + [0u8; 32], + platform_version, + ) + .map(|_| ()), + verify_documents_with_query(&truncated_v1, &query, platform_version).map(|_| ()), + ]; + + for result in results { + let error = result.expect_err("truncated V1 payload cannot verify"); + assert!( + !error.to_string().contains("GroveDB proof envelope"), + "V1 envelope must not be rejected by the envelope policy: {error}" + ); + } + } +} diff --git a/packages/wasm-drive-verify/src/single_document/verify_single_document.rs b/packages/wasm-drive-verify/src/single_document/verify_single_document.rs index 64e2f55fc9c..94944670937 100644 --- a/packages/wasm-drive-verify/src/single_document/verify_single_document.rs +++ b/packages/wasm-drive-verify/src/single_document/verify_single_document.rs @@ -1,3 +1,4 @@ +use crate::utils::proof::current_grovedb_proof; use dpp::version::PlatformVersion; use drive::query::{SingleDocumentDriveQuery, SingleDocumentDriveQueryContestedStatus}; use wasm_bindgen::prelude::*; @@ -134,7 +135,7 @@ pub fn verify_single_document_proof_keep_serialized( // Verify the proof keeping it serialized match query.inner.verify_proof_keep_serialized( is_subset, - crate::utils::proof::current_grovedb_proof(&proof)?, + current_grovedb_proof(&proof)?, platform_version, ) { Ok((root_hash, maybe_serialized_document)) => Ok(SingleDocumentProofResult { diff --git a/packages/wasm-drive-verify/src/state_transition/verify_state_transition_was_executed_with_proof.rs b/packages/wasm-drive-verify/src/state_transition/verify_state_transition_was_executed_with_proof.rs index b227b9396c2..482d609fc03 100644 --- a/packages/wasm-drive-verify/src/state_transition/verify_state_transition_was_executed_with_proof.rs +++ b/packages/wasm-drive-verify/src/state_transition/verify_state_transition_was_executed_with_proof.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; @@ -84,7 +85,7 @@ pub fn verify_state_transition_was_executed_with_proof( let (root_hash, outcome) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, &block_info, - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, &contract_lookup_fn, platform_version, ) diff --git a/packages/wasm-drive-verify/src/system/verify_epoch_infos.rs b/packages/wasm-drive-verify/src/system/verify_epoch_infos.rs index d7814b07be7..6d2fd427d0b 100644 --- a/packages/wasm-drive-verify/src/system/verify_epoch_infos.rs +++ b/packages/wasm-drive-verify/src/system/verify_epoch_infos.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -40,7 +41,7 @@ pub fn verify_epoch_infos( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, epoch_infos_vec) = Drive::verify_epoch_infos( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, current_epoch, start_epoch, count, diff --git a/packages/wasm-drive-verify/src/system/verify_epoch_proposers.rs b/packages/wasm-drive-verify/src/system/verify_epoch_proposers.rs index c8d33dc861a..8512488967b 100644 --- a/packages/wasm-drive-verify/src/system/verify_epoch_proposers.rs +++ b/packages/wasm-drive-verify/src/system/verify_epoch_proposers.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::bytes_to_base58; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -58,7 +59,7 @@ pub fn verify_epoch_proposers_by_range_vec( let (root_hash, proposers_vec): (RootHash, Vec<(Vec, u64)>) = Drive::verify_epoch_proposers( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, epoch_index, proposer_query_type, platform_version, @@ -117,7 +118,7 @@ pub fn verify_epoch_proposers_by_range_map( let (root_hash, proposers_map): (RootHash, BTreeMap, u64>) = Drive::verify_epoch_proposers( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, epoch_index, proposer_query_type, platform_version, @@ -176,7 +177,7 @@ pub fn verify_epoch_proposers_by_ids_vec( let (root_hash, proposers_vec): (RootHash, Vec<(Vec, u64)>) = Drive::verify_epoch_proposers( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, epoch_index, proposer_query_type, platform_version, @@ -237,7 +238,7 @@ pub fn verify_epoch_proposers_by_ids_map( let (root_hash, proposers_map): (RootHash, BTreeMap, u64>) = Drive::verify_epoch_proposers( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, epoch_index, proposer_query_type, platform_version, diff --git a/packages/wasm-drive-verify/src/system/verify_total_credits_in_system.rs b/packages/wasm-drive-verify/src/system/verify_total_credits_in_system.rs index b42eb41dc93..b3e8ed2911a 100644 --- a/packages/wasm-drive-verify/src/system/verify_total_credits_in_system.rs +++ b/packages/wasm-drive-verify/src/system/verify_total_credits_in_system.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::prelude::CoreBlockHeight; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -42,7 +43,7 @@ pub fn verify_total_credits_in_system( || -> Result { Ok(activation_core_height) }; let (root_hash, total_credits) = Drive::verify_total_credits_in_system( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, core_subsidy_halving_interval, request_activation_core_height, current_core_height, diff --git a/packages/wasm-drive-verify/src/system/verify_upgrade_state.rs b/packages/wasm-drive-verify/src/system/verify_upgrade_state.rs index 7357f95b823..ef65fd4257a 100644 --- a/packages/wasm-drive-verify/src/system/verify_upgrade_state.rs +++ b/packages/wasm-drive-verify/src/system/verify_upgrade_state.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::{Object, Reflect, Uint8Array}; @@ -33,11 +34,9 @@ pub fn verify_upgrade_state( let platform_version = PlatformVersion::get(platform_version_number) .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; - let (root_hash, upgrade_state_map) = Drive::verify_upgrade_state( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, - platform_version, - ) - .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; + let (root_hash, upgrade_state_map) = + Drive::verify_upgrade_state(current_grovedb_proof(&proof_vec)?, platform_version) + .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert IntMap to JS object let js_obj = Object::new(); diff --git a/packages/wasm-drive-verify/src/system/verify_upgrade_vote_status.rs b/packages/wasm-drive-verify/src/system/verify_upgrade_vote_status.rs index bf2143ba00f..77dc7fcd22c 100644 --- a/packages/wasm-drive-verify/src/system/verify_upgrade_vote_status.rs +++ b/packages/wasm-drive-verify/src/system/verify_upgrade_vote_status.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -53,7 +54,7 @@ pub fn verify_upgrade_vote_status( }; let (root_hash, vote_status_map) = Drive::verify_upgrade_vote_status( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, start_protx_hash_array, count, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_balance_for_identity_id.rs b/packages/wasm-drive-verify/src/tokens/verify_token_balance_for_identity_id.rs index 5bd31821f5b..fca46fa4955 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_balance_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_balance_for_identity_id.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -47,7 +48,7 @@ pub fn verify_token_balance_for_identity_id( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, balance_option) = Drive::verify_token_balance_for_identity_id( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, token_id_bytes, identity_id_bytes, verify_subset_of_proof, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_id.rs b/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_id.rs index a84af8da981..251aff4ea87 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_id.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::balances::credits::TokenAmount; use dpp::version::PlatformVersion; @@ -68,7 +69,7 @@ pub fn verify_token_balances_for_identity_id_vec( let (root_hash, balances_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_balances_for_identity_id( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, &token_ids_vec, identity_id_bytes, verify_subset_of_proof, @@ -146,7 +147,7 @@ pub fn verify_token_balances_for_identity_id_map( let (root_hash, balances_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_balances_for_identity_id( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, &token_ids_vec, identity_id_bytes, verify_subset_of_proof, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_ids.rs b/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_ids.rs index 79ed3019707..722b9283e7c 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_ids.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_ids.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::balances::credits::TokenAmount; use dpp::version::PlatformVersion; @@ -68,7 +69,7 @@ pub fn verify_token_balances_for_identity_ids_vec( let (root_hash, balances_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_balances_for_identity_ids( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, token_id_bytes, &identity_ids_vec, is_proof_subset, @@ -146,7 +147,7 @@ pub fn verify_token_balances_for_identity_ids_map( let (root_hash, balances_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_balances_for_identity_ids( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, token_id_bytes, &identity_ids_vec, is_proof_subset, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_contract_info.rs b/packages/wasm-drive-verify/src/tokens/verify_token_contract_info.rs index 9920ba1924e..e305c13a1ee 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_contract_info.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_contract_info.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::tokens::contract_info::v0::TokenContractInfoV0Accessors; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -42,7 +43,7 @@ pub fn verify_token_contract_info( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, contract_info_option) = Drive::verify_token_contract_info( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, token_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_price.rs b/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_price.rs index ee3ac0983da..c3435f70a8c 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_price.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_price.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::tokens::token_pricing_schedule::TokenPricingSchedule; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -42,7 +43,7 @@ pub fn verify_token_direct_selling_price( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, price_option) = Drive::verify_token_direct_selling_price( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, token_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_prices.rs b/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_prices.rs index 733b063df96..201c0a1698a 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_prices.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_prices.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::tokens::token_pricing_schedule::TokenPricingSchedule; use dpp::version::PlatformVersion; @@ -62,7 +63,7 @@ pub fn verify_token_direct_selling_prices_vec( let (root_hash, prices_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_direct_selling_prices( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, &token_ids_vec, verify_subset_of_proof, platform_version, @@ -171,7 +172,7 @@ pub fn verify_token_direct_selling_prices_map( let (root_hash, prices_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_direct_selling_prices( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, &token_ids_vec, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_info_for_identity_id.rs b/packages/wasm-drive-verify/src/tokens/verify_token_info_for_identity_id.rs index 3c14a927fc8..ae7b4e7f386 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_info_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_info_for_identity_id.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::tokens::info::IdentityTokenInfo; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -48,7 +49,7 @@ pub fn verify_token_info_for_identity_id( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, token_info_option) = Drive::verify_token_info_for_identity_id( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, token_id_bytes, identity_id_bytes, verify_subset_of_proof, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_id.rs b/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_id.rs index ca7dbcd62cc..dae299752e7 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_id.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::tokens::info::IdentityTokenInfo; use dpp::version::PlatformVersion; @@ -81,7 +82,7 @@ pub fn verify_token_infos_for_identity_id_vec( let (root_hash, token_infos_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_infos_for_identity_id( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, &token_ids_vec, identity_id_bytes, verify_subset_of_proof, @@ -159,7 +160,7 @@ pub fn verify_token_infos_for_identity_id_map( let (root_hash, token_infos_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_infos_for_identity_id( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, &token_ids_vec, identity_id_bytes, verify_subset_of_proof, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_ids.rs b/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_ids.rs index 607b634083b..73acdb22a51 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_ids.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_ids.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::tokens::info::IdentityTokenInfo; use dpp::version::PlatformVersion; @@ -81,7 +82,7 @@ pub fn verify_token_infos_for_identity_ids_vec( let (root_hash, token_infos_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_infos_for_identity_ids( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, token_id_bytes, &identity_ids_vec, is_proof_subset, @@ -155,7 +156,7 @@ pub fn verify_token_infos_for_identity_ids_map( let (root_hash, token_infos_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_infos_for_identity_ids( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, token_id_bytes, &identity_ids_vec, is_proof_subset, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_perpetual_distribution_last_paid_time.rs b/packages/wasm-drive-verify/src/tokens/verify_token_perpetual_distribution_last_paid_time.rs index bf47fe84abf..8ffb8ba24e9 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_perpetual_distribution_last_paid_time.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_perpetual_distribution_last_paid_time.rs @@ -1,3 +1,4 @@ +use crate::utils::proof::current_grovedb_proof; use dpp::version::PlatformVersion; use dpp::data_contract::associated_token::token_perpetual_distribution::reward_distribution_type::RewardDistributionType; use crate::utils::getters::VecU8ToUint8Array; @@ -55,7 +56,7 @@ pub fn verify_token_perpetual_distribution_last_paid_time( let (root_hash, last_paid_time_option) = Drive::verify_token_perpetual_distribution_last_paid_time( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, token_id_bytes, identity_id_bytes, &distribution_type, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_pre_programmed_distributions.rs b/packages/wasm-drive-verify/src/tokens/verify_token_pre_programmed_distributions.rs index 4cf823c6e26..29e184f13a0 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_pre_programmed_distributions.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_pre_programmed_distributions.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::balances::credits::TokenAmount; use dpp::identifier::Identifier; @@ -74,7 +75,7 @@ pub fn verify_token_pre_programmed_distributions_vec( type DistributionVec = Vec<(Identifier, TokenAmount)>; let (root_hash, distributions_vec): (RootHash, Vec<(TimestampMillis, DistributionVec)>) = drive::drive::Drive::verify_token_pre_programmed_distributions( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, token_id_bytes, start_at, limit, @@ -155,7 +156,7 @@ pub fn verify_token_pre_programmed_distributions_map( type DistributionMap = BTreeMap; let (root_hash, distributions_map): (RootHash, BTreeMap) = drive::drive::Drive::verify_token_pre_programmed_distributions( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, token_id_bytes, start_at, limit, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_status.rs b/packages/wasm-drive-verify/src/tokens/verify_token_status.rs index d4891da8fe2..4c911bf887f 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_status.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_status.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::tokens::status::TokenStatus; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -43,7 +44,7 @@ pub fn verify_token_status( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, status_option) = Drive::verify_token_status( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, token_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_statuses.rs b/packages/wasm-drive-verify/src/tokens/verify_token_statuses.rs index 7548ef151e5..d8ad1914db2 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_statuses.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_statuses.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::tokens::status::TokenStatus; use dpp::version::PlatformVersion; @@ -63,7 +64,7 @@ pub fn verify_token_statuses_vec( let (root_hash, statuses_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_statuses( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, &token_ids_vec, verify_subset_of_proof, platform_version, @@ -140,7 +141,7 @@ pub fn verify_token_statuses_map( let (root_hash, statuses_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_statuses( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, &token_ids_vec, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_total_supply_and_aggregated_identity_balance.rs b/packages/wasm-drive-verify/src/tokens/verify_token_total_supply_and_aggregated_identity_balance.rs index 9d5217afae7..b07f4c6c98c 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_total_supply_and_aggregated_identity_balance.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_total_supply_and_aggregated_identity_balance.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::{Object, Reflect, Uint8Array}; @@ -42,7 +43,7 @@ pub fn verify_token_total_supply_and_aggregated_identity_balance( let (root_hash, total_balance) = Drive::verify_token_total_supply_and_aggregated_identity_balance( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, token_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/voting/verify_contests_proof.rs b/packages/wasm-drive-verify/src/voting/verify_contests_proof.rs index 48eda0a8933..ecdd6cac2f2 100644 --- a/packages/wasm-drive-verify/src/voting/verify_contests_proof.rs +++ b/packages/wasm-drive-verify/src/voting/verify_contests_proof.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::data_contract::DataContract; use dpp::platform_value::Value; use dpp::version::PlatformVersion; @@ -80,10 +81,7 @@ pub fn verify_contests_proof( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, contests_vec) = query - .verify_contests_proof( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, - platform_version, - ) + .verify_contests_proof(current_grovedb_proof(&proof_vec)?, platform_version) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert Values to JS array diff --git a/packages/wasm-drive-verify/src/voting/verify_identity_votes_given_proof.rs b/packages/wasm-drive-verify/src/voting/verify_identity_votes_given_proof.rs index 95332ce8ffd..8a1c80cdcf8 100644 --- a/packages/wasm-drive-verify/src/voting/verify_identity_votes_given_proof.rs +++ b/packages/wasm-drive-verify/src/voting/verify_identity_votes_given_proof.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::data_contract::DataContract; use dpp::identifier::Identifier; @@ -96,7 +97,7 @@ pub fn verify_identity_votes_given_proof_vec( let (root_hash, votes_vec): (RootHash, Vec<(Identifier, ResourceVote)>) = query .verify_identity_votes_given_proof( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, &*contract_lookup_fn, platform_version, ) @@ -149,7 +150,7 @@ pub fn verify_identity_votes_given_proof_map( let (root_hash, votes_map): (RootHash, BTreeMap) = query .verify_identity_votes_given_proof( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, &*contract_lookup_fn, platform_version, ) diff --git a/packages/wasm-drive-verify/src/voting/verify_masternode_vote.rs b/packages/wasm-drive-verify/src/voting/verify_masternode_vote.rs index 25c8ca47b8b..111aedbbe22 100644 --- a/packages/wasm-drive-verify/src/voting/verify_masternode_vote.rs +++ b/packages/wasm-drive-verify/src/voting/verify_masternode_vote.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::data_contract::DataContract; use dpp::serialization::PlatformDeserializableWithPotentialValidationFromVersionedStructure; use dpp::version::PlatformVersion; @@ -58,7 +59,7 @@ pub fn verify_masternode_vote( .map_err(|e| JsValue::from_str(&format!("Failed to deserialize data contract: {:?}", e)))?; let (root_hash, vote_option) = Drive::verify_masternode_vote( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, masternode_pro_tx_hash_bytes, &vote, &data_contract, diff --git a/packages/wasm-drive-verify/src/voting/verify_specialized_balance.rs b/packages/wasm-drive-verify/src/voting/verify_specialized_balance.rs index 001e8875486..65e5f0f8d70 100644 --- a/packages/wasm-drive-verify/src/voting/verify_specialized_balance.rs +++ b/packages/wasm-drive-verify/src/voting/verify_specialized_balance.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -41,7 +42,7 @@ pub fn verify_specialized_balance( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, balance_option) = Drive::verify_specialized_balance( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, + current_grovedb_proof(&proof_vec)?, specialized_balance_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/voting/verify_vote_poll_vote_state_proof.rs b/packages/wasm-drive-verify/src/voting/verify_vote_poll_vote_state_proof.rs index 8eda6b240c4..cbd01271287 100644 --- a/packages/wasm-drive-verify/src/voting/verify_vote_poll_vote_state_proof.rs +++ b/packages/wasm-drive-verify/src/voting/verify_vote_poll_vote_state_proof.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; use dpp::identifier::Identifier; @@ -95,10 +96,7 @@ pub fn verify_vote_poll_vote_state_proof( .map_err(|e| JsValue::from_str(&format!("Failed to resolve query: {:?}", e)))?; let (root_hash, execution_result) = resolved_query - .verify_vote_poll_vote_state_proof( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, - platform_version, - ) + .verify_vote_poll_vote_state_proof(current_grovedb_proof(&proof_vec)?, platform_version) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert execution result to JS object diff --git a/packages/wasm-drive-verify/src/voting/verify_vote_poll_votes_proof.rs b/packages/wasm-drive-verify/src/voting/verify_vote_poll_votes_proof.rs index 3eed78a5c38..81476fb89ba 100644 --- a/packages/wasm-drive-verify/src/voting/verify_vote_poll_votes_proof.rs +++ b/packages/wasm-drive-verify/src/voting/verify_vote_poll_votes_proof.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; use dpp::identifier::Identifier; @@ -105,10 +106,7 @@ pub fn verify_vote_poll_votes_proof( .map_err(|e| JsValue::from_str(&format!("Failed to resolve query: {:?}", e)))?; let (root_hash, votes_vec) = resolved_query - .verify_vote_poll_votes_proof( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, - platform_version, - ) + .verify_vote_poll_votes_proof(current_grovedb_proof(&proof_vec)?, platform_version) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert identifiers to JS array diff --git a/packages/wasm-drive-verify/src/voting/verify_vote_polls_end_date_query.rs b/packages/wasm-drive-verify/src/voting/verify_vote_polls_end_date_query.rs index 4256b2e0c09..fb440edae57 100644 --- a/packages/wasm-drive-verify/src/voting/verify_vote_polls_end_date_query.rs +++ b/packages/wasm-drive-verify/src/voting/verify_vote_polls_end_date_query.rs @@ -1,4 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; +use crate::utils::proof::current_grovedb_proof; use bincode; use dpp::prelude::TimestampMillis; use dpp::version::PlatformVersion; @@ -47,10 +48,7 @@ pub fn verify_vote_polls_end_date_query_vec( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, polls_vec): (RootHash, Vec<(TimestampMillis, Vec)>) = query - .verify_vote_polls_by_end_date_proof( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, - platform_version, - ) + .verify_vote_polls_by_end_date_proof(current_grovedb_proof(&proof_vec)?, platform_version) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert to JS array of tuples @@ -101,10 +99,7 @@ pub fn verify_vote_polls_end_date_query_map( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, polls_map): (RootHash, BTreeMap>) = query - .verify_vote_polls_by_end_date_proof( - crate::utils::proof::current_grovedb_proof(&proof_vec)?, - platform_version, - ) + .verify_vote_polls_by_end_date_proof(current_grovedb_proof(&proof_vec)?, platform_version) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert to JS object with timestamp as string key diff --git a/packages/wasm-drive-verify/tests/identity_tests.rs b/packages/wasm-drive-verify/tests/identity_tests.rs index 41c4099a7e5..f68e7f132ba 100644 --- a/packages/wasm-drive-verify/tests/identity_tests.rs +++ b/packages/wasm-drive-verify/tests/identity_tests.rs @@ -104,3 +104,63 @@ fn test_verify_identity_nonce_invalid_identity_id() { "Invalid identity_id length. Expected 32 bytes", ); } + +/// A bincode-encoded GroveDB proof envelope discriminant with no payload. +/// Version 1 is the only envelope the public entry points accept. +fn envelope_only_proof(version: u32) -> Uint8Array { + let bytes = bincode::encode_to_vec(version, bincode::config::standard().with_big_endian()) + .expect("encode envelope version"); + Uint8Array::from(&bytes[..]) +} + +#[wasm_bindgen_test] +fn test_verify_identity_rejects_legacy_v0_envelope() { + let proof = envelope_only_proof(0); + let identity_id = Uint8Array::from(&mock_identifier()[..]); + let platform_version = test_platform_version(); + + let result = verify_full_identity_by_identity_id(&proof, false, &identity_id, platform_version); + assert_error_contains( + &result.map(|_| ()), + "unsupported GroveDB proof envelope version 0", + ); +} + +#[wasm_bindgen_test] +fn test_verify_identity_by_non_unique_public_key_hash_rejects_v0_inner_proof() { + let inner_proof = envelope_only_proof(0); + let outer_proof = envelope_only_proof(1); + let public_key_hash = Uint8Array::from(&[0u8; 20][..]); + let platform_version = test_platform_version(); + + let result = verify_full_identity_by_non_unique_public_key_hash( + Some(inner_proof), + &outer_proof, + &public_key_hash, + None, + platform_version, + ); + assert_error_contains( + &result.map(|_| ()), + "unsupported GroveDB proof envelope version 0", + ); +} + +#[wasm_bindgen_test] +fn test_verify_identity_by_non_unique_public_key_hash_rejects_v0_outer_proof() { + let outer_proof = envelope_only_proof(0); + let public_key_hash = Uint8Array::from(&[0u8; 20][..]); + let platform_version = test_platform_version(); + + let result = verify_full_identity_by_non_unique_public_key_hash( + None, + &outer_proof, + &public_key_hash, + None, + platform_version, + ); + assert_error_contains( + &result.map(|_| ()), + "unsupported GroveDB proof envelope version 0", + ); +} From d0cd0dbebbb84232d3b824353ad543e3e45fec2a Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 13 Sep 2026 16:59:50 +0700 Subject: [PATCH 3/7] test(sdk): re-encode recorded V0 proof vectors as V1 envelopes The offline rs-sdk vectors were recorded before GroveDB emitted V1 envelopes, so every replayed proof now fails the V1 requirement. Where a recorded V0 proof contains only Merk layers that the V1 verifier accepts, re-encode it as a V1 envelope with identical Merk layers; the signed root hash and every verified value are unchanged. That covers 70 files in 48 vector directories. Proofs that report an item in a KVValueHash node or a non-empty subtree without its child hash cannot be upgraded: V1 rejects exactly those shapes. Gate the 24 tests that replay them behind `offline-testing` ignores that say to regenerate against a running Platform (contested-name cases also need dashpay/platform#3720), and skip the live-network prerequisite check in offline runs so the error-path cases that never needed a proof keep running. Co-Authored-By: Claude Fable 5.1 --- .../rs-sdk/tests/fetch/contested_resource.rs | 48 +++++++++++++----- .../fetch/contested_resource_vote_state.rs | 18 +++++-- .../tests/fetch/contested_resource_voters.rs | 4 ++ packages/rs-sdk/tests/fetch/group_actions.rs | 4 ++ packages/rs-sdk/tests/fetch/identity.rs | 20 ++++++++ .../fetch/prefunded_specialized_balance.rs | 4 ++ .../fetch/tokens/identity_token_balances.rs | 8 +++ .../tests/fetch/tokens/token_total_supply.rs | 4 ++ ...6557d0524384797bb450e22f41f66743d5d11.json | Bin 32084 -> 32175 bytes ...9a380d88e7caeeb4cc3ab0cf2bb04e2f096af.json | Bin 47486 -> 47667 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220178 -> 220269 bytes ...dbd43fab2e54a98aa44bc88c049e1cf72f5fb.json | Bin 46358 -> 46584 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 218912 -> 219003 bytes ...d84b9984fd04a4ca40a146aea81c3ea5c39ef.json | Bin 48360 -> 48631 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220178 -> 220269 bytes ...f67620695a23f63dc7376bd4a509e93335ce9.json | Bin 56714 -> 57030 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220178 -> 220269 bytes ...d5387b9cca48a3062a4db8bf0341a839f2bae.json | Bin 60056 -> 60372 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220178 -> 220269 bytes ...c12823a7175b930f49aebb8d9844065da5b44.json | Bin 127487 -> 127983 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220178 -> 220269 bytes ...49e64e07602f543bda42d5a5d223f0e6102a9.json | Bin 71489 -> 71850 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220178 -> 220269 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220178 -> 220269 bytes ...1ad49d3ae7bc38d217d85b1570274493c4d7e.json | Bin 56948 -> 57264 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 220178 -> 220269 bytes ...96e8a6cdbd49b7bb7a3ac9cb6ab3035676772.json | Bin 172047 -> 172183 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 219023 -> 219114 bytes ...48c03122daf7ab2e77108f4bf44af1ad15eae.json | Bin 29036 -> 29082 bytes ...067bd9ccc29eca3092a5664a5a9ba3bb7e967.json | Bin 225321 -> 225412 bytes ...abbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json | Bin 27114 -> 27160 bytes ...eda09b939ada887a7461372b2de1a8ea09f04.json | Bin 36603 -> 36694 bytes ...61e18b4fb75c07eb5a3d9068740c6cc344365.json | Bin 34887 -> 34978 bytes ...baf567bad67f5d1deb80c70f0ef3a9a9da582.json | Bin 37435 -> 37526 bytes ...6caf3663c40a12d3b03827006d66058e439ac.json | Bin 70726 -> 70817 bytes ...48c03122daf7ab2e77108f4bf44af1ad15eae.json | Bin 62198 -> 62379 bytes ...add01a7428085ffdcf1e11cccf19c48c5f7a1.json | Bin 71813 -> 72084 bytes ...48c03122daf7ab2e77108f4bf44af1ad15eae.json | Bin 62198 -> 62379 bytes ...d592c8fe7361bed628d9a36747664c9789bf1.json | Bin 83652 -> 83923 bytes ...48c03122daf7ab2e77108f4bf44af1ad15eae.json | Bin 62198 -> 62379 bytes ...b0b93d9d2e841a5e3d60755f8e7be3b93315b.json | Bin 90906 -> 91402 bytes ...48c03122daf7ab2e77108f4bf44af1ad15eae.json | Bin 62198 -> 62379 bytes ...985c18e7a2310c75db42f4efe415726853928.json | Bin 43550 -> 43686 bytes ...e9a7bb2f706e5b458cde86f4eb66de7d8cc6f.json | Bin 30569 -> 30660 bytes ...8cbe3a47c21e93ea2e5326d36fa8581ed5bb9.json | Bin 31396 -> 31487 bytes ...2faa91c6f6f6d2f379d9e2937e515e3bead2a.json | Bin 56269 -> 56495 bytes ...fb7c29eda4cc524bc0c7fef3e89d58d206c00.json | Bin 50908 -> 51089 bytes ...d3782117d6bc7d324bde7f4a9de01bf66777c.json | Bin 56832 -> 57058 bytes ...e20382f1841ff8b5855aac598b3262c55f176.json | Bin 41786 -> 41922 bytes ...b561847a99d0556edd384640b0e9f316b94e8.json | Bin 34407 -> 34498 bytes ...bd7b33c0b9a6a6028ee966f2f2a6c4dbfad21.json | Bin 43629 -> 43765 bytes ...ebd0c7ebce314c7518a12b6e444f36b153156.json | Bin 38265 -> 38356 bytes ...d22dfc968b3a593f7330532e56489b2b4fe49.json | Bin 39973 -> 40064 bytes ...8378a0e4cc52357eb5e477c2f0e347cdbf48a.json | Bin 45860 -> 45996 bytes ...8378a0e4cc52357eb5e477c2f0e347cdbf48a.json | Bin 47669 -> 47805 bytes ...48c04146560bb24a5224d9090b567e78d272e.json | Bin 46842 -> 46978 bytes ...458111c67f95c7c711fb93f4076b6d29fb078.json | Bin 47377 -> 47513 bytes ...ebd0c7ebce314c7518a12b6e444f36b153156.json | Bin 38526 -> 38617 bytes ...48c03122daf7ab2e77108f4bf44af1ad15eae.json | Bin 23018 -> 23064 bytes ...9550f0ea4a6af6f68037e7d50ff4e4de74509.json | Bin 26613 -> 26704 bytes ...106e5eda740be44679cc960ea35f2134af628.json | Bin 33815 -> 33906 bytes ...bf1acc3394d29ac72f662d38e81344496631e.json | Bin 33771 -> 33862 bytes ...9b1a05862cb8d40c088b193b59ca3564210bc.json | Bin 34881 -> 34972 bytes ...22dfc69cc7b123be24b7ad993281979b2a3a2.json | Bin 34129 -> 34220 bytes ...daa7f11dfff63969ad07d74a36a45514c3d33.json | Bin 26727 -> 26806 bytes ...f961ab1e3f5f5355de3cf58b9f2c000ea0063.json | Bin 34979 -> 35070 bytes ...4ef834e6bbb89d21b2f08163de5106d9db335.json | Bin 49457 -> 49593 bytes ...4df85a544ca7ab40bb4fc7a1bd8e8ade47e62.json | Bin 61081 -> 61262 bytes ...59525067352d9440afaca1db61fb1f51e83ae.json | Bin 61445 -> 61626 bytes ...c61d0223027f3bca7edc99237362654f2bfb0.json | Bin 60988 -> 61169 bytes ...c362866cbab6d8388743fdcf5d797910561df.json | Bin 57619 -> 57800 bytes ...e36aa98b6acdcb910a746650383c174e884e8.json | Bin 61039 -> 61220 bytes ...7686a168bd79e8751279ec53efb41381dd431.json | Bin 96945 -> 97261 bytes ...0daadb7e1a4cc0c58c52450dd44d5ca462e4a.json | Bin 49024 -> 49160 bytes ...df8382ca43f73cf9e63aa985c1add075d0264.json | Bin 37361 -> 37452 bytes ...ca1b6ba4883a92f4533995dbfdbc5875d8bef.json | Bin 96869 -> 97185 bytes ...e942470ee2b9dff806909798d12c40bc6cf8b.json | Bin 96885 -> 97201 bytes ...ca1b6ba4883a92f4533995dbfdbc5875d8bef.json | Bin 96869 -> 97185 bytes 78 files changed, 91 insertions(+), 19 deletions(-) diff --git a/packages/rs-sdk/tests/fetch/contested_resource.rs b/packages/rs-sdk/tests/fetch/contested_resource.rs index 0e606007c95..f78e0718e6e 100644 --- a/packages/rs-sdk/tests/fetch/contested_resource.rs +++ b/packages/rs-sdk/tests/fetch/contested_resource.rs @@ -5,19 +5,17 @@ use crate::fetch::{ config::Config, }; use dash_sdk::{platform::FetchMany, Error}; -use dpp::{ - platform_value::Value, - voting::{ - contender_structs::ContenderWithSerializedDocument, - vote_polls::contested_document_resource_vote_poll::ContestedDocumentResourceVotePoll, - }, +use dpp::platform_value::Value; +#[cfg(not(feature = "offline-testing"))] +use dpp::voting::{ + contender_structs::ContenderWithSerializedDocument, + vote_polls::contested_document_resource_vote_poll::ContestedDocumentResourceVotePoll, }; -use drive::query::{ - vote_poll_vote_state_query::{ - ContestedDocumentVotePollDriveQuery, ContestedDocumentVotePollDriveQueryResultType, - }, - vote_polls_by_document_type_query::VotePollsByDocumentTypeQuery, +#[cfg(not(feature = "offline-testing"))] +use drive::query::vote_poll_vote_state_query::{ + ContestedDocumentVotePollDriveQuery, ContestedDocumentVotePollDriveQueryResultType, }; +use drive::query::vote_polls_by_document_type_query::VotePollsByDocumentTypeQuery; use drive_proof_verifier::types::ContestedResource; /// Test that we can fetch contested resources @@ -30,6 +28,10 @@ use drive_proof_verifier::types::ContestedResource; not(feature = "offline-testing"), ignore = "requires manual DPNS names setup for masternode voting tests; see fn check_mn_voting_prerequisites()" )] +#[cfg_attr( + feature = "offline-testing", + ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)" +)] async fn test_contested_resources_ok() { setup_logs(); @@ -67,6 +69,10 @@ fn base_query(cfg: &Config) -> VotePollsByDocumentTypeQuery { not(feature = "offline-testing"), ignore = "requires manual DPNS names setup for masternode voting tests; see fn check_mn_voting_prerequisites()" )] +#[cfg_attr( + feature = "offline-testing", + ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)" +)] /// Test [ContestedResource] start index (`start_at_value`) /// /// ## Preconditions @@ -147,6 +153,10 @@ async fn contested_resources_start_at_value() { not(feature = "offline-testing"), ignore = "requires manual DPNS names setup for masternode voting tests; see fn check_mn_voting_prerequisites()" )] +#[cfg_attr( + feature = "offline-testing", + ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)" +)] #[allow(non_snake_case)] async fn contested_resources_limit_PLAN_656() { // TODO: fails due to PLAN-656, not tested enough so it can be faulty @@ -230,14 +240,14 @@ async fn contested_resources_limit_PLAN_656() { /// ## Preconditions /// /// None -#[test_case::test_case(|_q| {}, Ok("ContestedResources([ContestedResource(Text(".into()); "unmodified base query is Ok")] +#[test_case::test_case(|_q| {}, Ok("ContestedResources([ContestedResource(Text(".into()) => ignore["recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)"]; "unmodified base query is Ok")] #[test_case::test_case(|q| q.start_index_values = vec![Value::Text("".to_string())], Ok("".into()); "index value empty string is Ok")] #[test_case::test_case(|q| q.document_type_name = "some random non-existing name".to_string(), Err(r#"status: InvalidArgument, message: "document type some random non-existing name not found"#); "non existing document type returns InvalidArgument")] #[test_case::test_case(|q| q.index_name = "nx index".to_string(), Err(r#"status: InvalidArgument, message: "index with name nx index is not the contested index"#); "non existing index returns InvalidArgument")] #[test_case::test_case(|q| q.index_name = "dashIdentityId".to_string(), Err(r#"status: InvalidArgument, message: "index with name dashIdentityId is not the contested index"#); "existing non-contested index returns InvalidArgument")] // Disabled due to bug PLAN-653 // #[test_case::test_case(|q| q.start_at_value = Some((Value::Array(vec![]), true)), Err(r#"status: InvalidArgument"#); "start_at_value wrong index type returns InvalidArgument PLAN-653")] -#[test_case::test_case(|q| q.start_index_values = vec![], Ok(r#"ContestedResources([ContestedResource(Text("dash"))])"#.into()); "start_index_values empty vec returns top-level keys")] +#[test_case::test_case(|q| q.start_index_values = vec![], Ok(r#"ContestedResources([ContestedResource(Text("dash"))])"#.into()) => ignore["recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)"]; "start_index_values empty vec returns top-level keys")] #[test_case::test_case(|q| q.start_index_values = vec![Value::Text("".to_string())], Ok(r#"ContestedResources([])"#.into()); "start_index_values empty string returns zero results")] #[test_case::test_case(|q| { q.start_index_values = vec![ @@ -248,7 +258,7 @@ async fn contested_resources_limit_PLAN_656() { #[test_case::test_case(|q| { q.start_index_values = vec![]; q.end_index_values = vec![Value::Text(TEST_DPNS_NAME.to_string())]; -}, Ok(r#"ContestedResources([ContestedResource(Text("dash"))])"#.into()); "end_index_values one value with empty start_index_values returns 'dash'")] +}, Ok(r#"ContestedResources([ContestedResource(Text("dash"))])"#.into()) => ignore["recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)"]; "end_index_values one value with empty start_index_values returns 'dash'")] #[test_case::test_case(|q| { q.start_index_values = vec![]; q.end_index_values = vec![Value::Text(TEST_DPNS_NAME.to_string()), Value::Text("non existing".to_string())]; @@ -370,7 +380,17 @@ async fn contested_resources_fields( } } +/// Ensure prerequisites for masternode voting tests are met. +/// +/// Offline runs replay recorded responses, so there is no live network state +/// to validate; the check only guards network runs. +#[cfg(feature = "offline-testing")] +pub async fn check_mn_voting_prerequisites(_cfg: &Config) -> Result<(), Vec> { + Ok(()) +} + /// Ensure prerequisites for masternode voting tests are met +#[cfg(not(feature = "offline-testing"))] pub async fn check_mn_voting_prerequisites(cfg: &Config) -> Result<(), Vec> { let sdk = cfg.setup_api("check_mn_voting_prerequisites").await; let mut errors = Vec::new(); diff --git a/packages/rs-sdk/tests/fetch/contested_resource_vote_state.rs b/packages/rs-sdk/tests/fetch/contested_resource_vote_state.rs index a2e3eecd069..86eb1c23b88 100644 --- a/packages/rs-sdk/tests/fetch/contested_resource_vote_state.rs +++ b/packages/rs-sdk/tests/fetch/contested_resource_vote_state.rs @@ -129,6 +129,10 @@ async fn contested_resource_vote_states_nx_contract() { not(feature = "offline-testing"), ignore = "requires manual DPNS names setup for masternode voting tests; see fn check_mn_voting_prerequisites()" )] +#[cfg_attr( + feature = "offline-testing", + ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)" +)] #[tokio::test(flavor = "multi_thread", worker_threads = 1)] async fn contested_resource_vote_states_ok() { setup_logs(); @@ -210,6 +214,10 @@ fn base_query(cfg: &Config) -> ContestedDocumentVotePollDriveQuery { not(feature = "offline-testing"), ignore = "requires manual DPNS names setup for masternode voting tests; see fn check_mn_voting_prerequisites()" )] +#[cfg_attr( + feature = "offline-testing", + ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)" +)] #[allow(non_snake_case)] async fn contested_resource_vote_states_with_limit_PLAN_674() { setup_logs(); @@ -280,7 +288,7 @@ type MutFn = fn(&mut ContestedDocumentVotePollDriveQuery); #[test_case(|q| q.limit = Some(0), Err("limit 0 out of bounds of [1, 100]"); "limit 0")] #[test_case(|q| q.limit = Some(u16::MAX), Err("limit 65535 out of bounds of [1, 100]"); "limit u16::MAX")] -#[test_case(|q| q.start_at = Some(([0x11; 32], true)), Ok("Contenders { winner: None, contenders: {Identifier("); "start_at does not exist should return next contenders")] +#[test_case(|q| q.start_at = Some(([0x11; 32], true)), Ok("Contenders { winner: None, contenders: {Identifier(") => ignore["recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)"]; "start_at does not exist should return next contenders")] #[test_case(|q| q.start_at = Some(([0xff; 32], true)), Ok("Contenders { winner: None, contenders: {}, abstain_vote_tally: None, lock_vote_tally: None }"); "start_at 0xff;32 should return zero contenders")] #[test_case(|q| q.vote_poll.document_type_name = "nx doctype".to_string(), Err(r#"status: InvalidArgument, message: "document type nx doctype not found"#); "non existing document type returns InvalidArgument")] #[test_case(|q| q.vote_poll.index_name = "nx index".to_string(), Err(r#"status: InvalidArgument, message: "index with name nx index is not the contested index"#); "non existing index returns InvalidArgument")] @@ -293,7 +301,7 @@ type MutFn = fn(&mut ContestedDocumentVotePollDriveQuery); Value::Text("dash".to_string()), Value::Text(TEST_DPNS_NAME.to_string()), ] -}, Ok("contenders: {Identifier("); "index_values with two values returns contenders")] +}, Ok("contenders: {Identifier(") => ignore["recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)"]; "index_values with two values returns contenders")] #[test_case(|q| { q.vote_poll.index_values = vec![ Value::Text("dash".to_string()), @@ -302,16 +310,16 @@ type MutFn = fn(&mut ContestedDocumentVotePollDriveQuery); ] }, Err("query uses index parentNameAndLabel, this index has 2 properties, but the query provided 3 index values instead"); "index_values too many items should return error")] #[test_case(|q| q.vote_poll.contract_id = Identifier::from([0xff; 32]), Err(r#"InvalidArgument, message: "contract not found error"#); "invalid contract id should cause InvalidArgument error")] -#[test_case(|q| q.allow_include_locked_and_abstaining_vote_tally = false, Ok(r#"contenders: {Identifier(IdentifierBytes32"#); "allow_include_locked_and_abstaining_vote_tally false should return some contenders")] +#[test_case(|q| q.allow_include_locked_and_abstaining_vote_tally = false, Ok(r#"contenders: {Identifier(IdentifierBytes32"#) => ignore["recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)"]; "allow_include_locked_and_abstaining_vote_tally false should return some contenders")] #[test_case(|q| { q.result_type = ContestedDocumentVotePollDriveQueryResultType::Documents }, Ok(r#"]), vote_tally: None })"#); "result_type Documents")] #[test_case(|q| { q.result_type = ContestedDocumentVotePollDriveQueryResultType::DocumentsAndVoteTally -}, Ok(r#"]), vote_tally: Some("#); "result_type DocumentsAndVoteTally")] +}, Ok(r#"]), vote_tally: Some("#) => ignore["recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)"]; "result_type DocumentsAndVoteTally")] #[test_case(|q| { q.result_type = ContestedDocumentVotePollDriveQueryResultType::VoteTally -}, Ok(r#"serialized_document: None, vote_tally: Some"#); "result_type VoteTally")] +}, Ok(r#"serialized_document: None, vote_tally: Some"#) => ignore["recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)"]; "result_type VoteTally")] #[tokio::test(flavor = "multi_thread", worker_threads = 1)] #[cfg_attr( not(feature = "offline-testing"), diff --git a/packages/rs-sdk/tests/fetch/contested_resource_voters.rs b/packages/rs-sdk/tests/fetch/contested_resource_voters.rs index 1919eb8d88f..92173f24038 100644 --- a/packages/rs-sdk/tests/fetch/contested_resource_voters.rs +++ b/packages/rs-sdk/tests/fetch/contested_resource_voters.rs @@ -78,6 +78,10 @@ async fn test_contested_resource_voters_for_identity_not_found() { not(feature = "offline-testing"), ignore = "requires manual DPNS names setup for masternode voting tests; see fn check_mn_voting_prerequisites()" )] +#[cfg_attr( + feature = "offline-testing", + ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)" +)] async fn contested_resource_voters_for_existing_contestant() { setup_logs(); diff --git a/packages/rs-sdk/tests/fetch/group_actions.rs b/packages/rs-sdk/tests/fetch/group_actions.rs index 773dbc6471a..f16f1ec8e20 100644 --- a/packages/rs-sdk/tests/fetch/group_actions.rs +++ b/packages/rs-sdk/tests/fetch/group_actions.rs @@ -189,6 +189,10 @@ async fn test_fetch_one_group_action_since_existing_one_with_limit() { /// Fetches group action signers #[tokio::test(flavor = "multi_thread", worker_threads = 1)] +#[cfg_attr( + feature = "offline-testing", + ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform" +)] async fn test_fetch_group_action_signers() { setup_logs(); diff --git a/packages/rs-sdk/tests/fetch/identity.rs b/packages/rs-sdk/tests/fetch/identity.rs index afd8cc270dd..85e5e783716 100644 --- a/packages/rs-sdk/tests/fetch/identity.rs +++ b/packages/rs-sdk/tests/fetch/identity.rs @@ -11,6 +11,10 @@ use super::{common::setup_logs, config::Config}; /// Given some existing identity ID, when I fetch the identity, and I get it. #[tokio::test(flavor = "multi_thread", worker_threads = 1)] +#[cfg_attr( + feature = "offline-testing", + ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform" +)] async fn test_identity_read() { setup_logs(); @@ -46,6 +50,10 @@ async fn test_identity_read_not_found() { /// Given some existing identity public key, when I fetch the identity, and I get it. #[tokio::test(flavor = "multi_thread", worker_threads = 1)] +#[cfg_attr( + feature = "offline-testing", + ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform" +)] async fn test_identity_read_by_key() { let cfg = Config::new(); let id = cfg.existing_identity_id; @@ -74,6 +82,10 @@ async fn test_identity_read_by_key() { /// Given some existing identity ID, when I fetch the identity balance, I get some number. #[tokio::test(flavor = "multi_thread", worker_threads = 1)] +#[cfg_attr( + feature = "offline-testing", + ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform" +)] async fn test_identity_balance_read() { setup_logs(); @@ -92,6 +104,10 @@ async fn test_identity_balance_read() { /// Given some existing identity ID, when I fetch the identity balance, I get some number. #[tokio::test(flavor = "multi_thread", worker_threads = 1)] +#[cfg_attr( + feature = "offline-testing", + ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform" +)] async fn test_identity_balance_revision_read() { setup_logs(); @@ -223,6 +239,10 @@ async fn test_identity_public_keys_specific_read() { /// Given some non-unique public key, when I fetch identity that uses this key, I get associated identities containing this key #[tokio::test(flavor = "multi_thread", worker_threads = 1)] +#[cfg_attr( + feature = "offline-testing", + ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform" +)] async fn test_fetch_identity_by_non_unique_public_keys() { /// Unique key hash, generated when creating test data const UNIQUE_KEY_HASH: [u8; 20] = [ diff --git a/packages/rs-sdk/tests/fetch/prefunded_specialized_balance.rs b/packages/rs-sdk/tests/fetch/prefunded_specialized_balance.rs index d8b86b1d941..a937b54cac7 100644 --- a/packages/rs-sdk/tests/fetch/prefunded_specialized_balance.rs +++ b/packages/rs-sdk/tests/fetch/prefunded_specialized_balance.rs @@ -30,6 +30,10 @@ async fn test_prefunded_specialized_balance_not_found() { not(feature = "offline-testing"), ignore = "requires manual DPNS names setup for masternode voting tests; see fn check_mn_voting_prerequisites()" )] +#[cfg_attr( + feature = "offline-testing", + ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)" +)] async fn test_prefunded_specialized_balance_ok() { setup_logs(); diff --git a/packages/rs-sdk/tests/fetch/tokens/identity_token_balances.rs b/packages/rs-sdk/tests/fetch/tokens/identity_token_balances.rs index 5c29208c49b..b0635c28ccb 100644 --- a/packages/rs-sdk/tests/fetch/tokens/identity_token_balances.rs +++ b/packages/rs-sdk/tests/fetch/tokens/identity_token_balances.rs @@ -14,6 +14,10 @@ use drive_proof_verifier::Length; /// Fetches token balances of multiple identities, including the one, which does not exist. #[tokio::test(flavor = "multi_thread", worker_threads = 1)] +#[cfg_attr( + feature = "offline-testing", + ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform" +)] async fn test_multiple_identity_token_balances() { setup_logs(); @@ -74,6 +78,10 @@ async fn test_multiple_identities_with_unknown_token_balance() { /// Fetches token balances of multiple identities, including the one, which does not exist. #[tokio::test(flavor = "multi_thread", worker_threads = 1)] +#[cfg_attr( + feature = "offline-testing", + ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform" +)] async fn test_multiple_identities_token_balances() { setup_logs(); diff --git a/packages/rs-sdk/tests/fetch/tokens/token_total_supply.rs b/packages/rs-sdk/tests/fetch/tokens/token_total_supply.rs index eedce4b4333..e01b6598771 100644 --- a/packages/rs-sdk/tests/fetch/tokens/token_total_supply.rs +++ b/packages/rs-sdk/tests/fetch/tokens/token_total_supply.rs @@ -7,6 +7,10 @@ use dpp::balances::total_single_token_balance::TotalSingleTokenBalance; /// Fetches total supply of a single token #[tokio::test(flavor = "multi_thread", worker_threads = 1)] +#[cfg_attr( + feature = "offline-testing", + ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform" +)] async fn test_token_total_supply() { setup_logs(); diff --git a/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_not_found/msg_GetContestedResourceIdentityVotesRequest_e000a8dfb1f42155770acb028f56557d0524384797bb450e22f41f66743d5d11.json b/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_not_found/msg_GetContestedResourceIdentityVotesRequest_e000a8dfb1f42155770acb028f56557d0524384797bb450e22f41f66743d5d11.json index 32d6ca86a82cc5b2c799e24327291a7bef36378d..4ec8e2583561a11a8912af8c707010679f5e31d0 100644 GIT binary patch delta 98 zcmccei*fyL#tj8boAa4`Stei5(4DMcX|(wrTcW{a15N$O0{kqK&4P6%M;7Z&{!pnm zSs~T{s6cn}10c5Z(*4eGm**imU^4jeG~X58?h-)?yYg#EFEL12mnH+ BBl!RT delta 53 zcmV-50LuTb`vKJY0kCiavvC4U1d||7ER#?|2eTaqU@($v2D7j?(G|0~Y diff --git a/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/msg_GetContestedResourceIdentityVotesRequest_8f3fcd0f5c5546dc3acb53577269a380d88e7caeeb4cc3ab0cf2bb04e2f096af.json b/packages/rs-sdk/tests/vectors/contested_resource_identity_votes_ok/msg_GetContestedResourceIdentityVotesRequest_8f3fcd0f5c5546dc3acb53577269a380d88e7caeeb4cc3ab0cf2bb04e2f096af.json index 83f2083ba9c650554c3b40a031f0f070b4834d07..5578440f109e316f62757401e03fc834473e8347 100644 GIT binary patch delta 210 zcmezOiD~l}rVWWqn-iGASSD{U)19oJsXO_A4%_5f1O3SYirSOUc^gb#(5*k&z>R(K z{Bq;TvR#^!FHB&ce14_QWCd}S$@91A0_6=RzjxA~9Kg-8`3y&)9?%dSs0N+M1?o|g z1?I3!l7*P9t+9P_L971cgz0*d6MEPtOBv{H&a+%44AL`c5!+^2Uw=_3dvaZ$-sA#v woyik+uuXojMr-o_ZiCJ5{0!MP$7J3GYXI8FzS+JuP-^laZpF>_rY}$g06!H|cmMzZ delta 147 zcmdn|h3VfXrVWWqo0FJAStdJZ>QDZl!!o(QTW9hGc9zNZidvI3eGDe|%r%-EP+>m# zf0yRu2Rtm3tCtvTPUm3JpX?yTHu-_S&g6OOQIiXR8uVm!frjW#j?~yb`Hy-G&=B^` yb1bh5Z(iUVB0712CfnrKZ6MXUn;Vkzq$VpYVw?Q8P6S;0OelU`zuqlYpTFlP~ZsmvF!VFqhm;12eNu2niaKfLtw?5Lp2P svs)tQE|Y*O!k2kaaWPvP}=>?)pnv<#wCOiCPnQS{-XYz&V z=93#DbS81LOyBLptUrB&EF;Tw{iTdLP!$H7eK;(orssz-vv1z1^i*&110j~?^MUQ> j0~xoU4`jOgVsb&EHlyX_i{eVtmqjzXZ5Os?j#2~wD{C@9 diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/msg_GetContestedResourceVoteStateRequest_8789d5d98ad7f00573a87fd0860dbd43fab2e54a98aa44bc88c049e1cf72f5fb.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/msg_GetContestedResourceVoteStateRequest_8789d5d98ad7f00573a87fd0860dbd43fab2e54a98aa44bc88c049e1cf72f5fb.json index e2371f8213edb06bf0bc2a0695d0e1e249e83f5e..78b2a76e6f0b61a56259496b4a6ee61e705fc155 100644 GIT binary patch delta 221 zcmbRCis{E|rVSY^o6}i*Stj4_j+*=+(`fPrK9n*7VdV6uX;-sET{qsjB!4JLoEW!e0~f3nDA17Tet$8htS zlu4ps&V@9V$>(fzC$CA--TWcDlX3Dn34_V?GMZq^*4KoCEr057JlVfke=s z4ZUoW{pagU5;mCpfP-anJdg3___}^JsOc<|bA0uI)@x0kAjz`Xzx5aIWFaoa$^Kj1 KHs76WsR#hKja#Jv delta 169 zcmezInrYfArVSY^n=@H_SSH6?=}uOd&NlhAk-=mIf33+O?fR1ws!YIQeNsA;6Q;6k z=HSZJpS)oX+vK%1K!H@<$q8Y)lRxCKO!oDUoSdh%W3obr0mz`u3#@MmPY&=jojjoy zs9*uhh3XAlAfd^}ef2jRv}y27{*bLZIf+Mc SvcYVf$+26dHt(NesR#gRr$glc diff --git a/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resource_vote_states_not_found/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 0854fe6f129edb87de99436d8db50e6466d4425e..6604fb5128f8fca2a2538ed00d0adf58bedc6a2d 100644 GIT binary patch delta 117 zcmZ3mj`#OE-VKi#H$P(ZWtl7xsyo@>vBBnew*S%~#$oW`pSlM$AT=w<)WuPo7|_JGnvJxLLrvUBH`hyMQ;7^Q*~^ SI2ETyhB3Qse{RZbsR#fDawz=( delta 259 zcmeypj(5R2-VKi#H$P$YVVP_YqPw|^jY($m96z(k2af4(mQj|`m^`74WwO7Z(e%4z zOeWI<{xNAz-ruM@`9d5EP>B{u&*WYneV{6~$+oJxlOKfZ!gNgT=K-3G9GwWtPS8cY*25eD4o$Wwc7s>|FVD_f)eJnsz9!@@=r#E>+lfiZeMJ8=Vpg9K9 zt}z-<50GavoSyKNQD^#rzl`RS1)k||54g;fz&3rtOeXfp`x7;%E0i;uPj~pnlr&v| oi^*X6g3pXrO=)dujN8(fZl9n0z($M7#By>Xo6`0_rp)z<0LZgqng9R* diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/msg_GetContestedResourcesRequest_80ba1d11caa6442b39ab0f05e7fd84b9984fd04a4ca40a146aea81c3ea5c39ef.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_473cf8e4a270ced75e199e5a3e907b4df4cd66b64365d1ac77c45bcaed443a03/msg_GetContestedResourcesRequest_80ba1d11caa6442b39ab0f05e7fd84b9984fd04a4ca40a146aea81c3ea5c39ef.json index 75cb49e82452f70c1621f5b1c7c03f2b34066cc4..75a00782c4d69d46173252d5856ff5bf8f9050ff 100644 GIT binary patch delta 212 zcmaFylj-|!rVZ@Oo7tGdSSBa5>rP%^p*wj(l+ok_U&G07C+JRoXQw~;fhGH9e~u~o zKuH}CXR<$s&Sal%!^!*EbtkX&*V#PZLS7Ui8O}cWnS;*e555wjljmFLP1ct;nC#oF zv$-R*mu>QcaJI<>OSL9Xu+s&aueVvhvXgQ00|&Or`s={vZnn>v!~@p0VG%@|US$9m vSl~dr{^Sq7hMVs<*Ybk}=KKT-x;^aRIbte1nk=oohJ4z7%Rk2v7 delta 153 zcmV;K0A~O9`vU0s06S;0OelU`zuqlYpTFlP~ZsmvF!VFqhm;12eNu2niaKfLtw?5Lp2P svs)tQE|Y*O!k2kaaWPvP}=>?)pnv<#wCOiCPnQS{-XYz&V z=93#DbS81LOyBLptUrB&EF;Tw{iTdLP!$H7eK;(orssz-vv1z1^i*&110j~?^MUQ> j0~xoU4`jOgVsb&EHlyX_i{eVtmqjzXZ5Os?j#2~wD{C@9 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/msg_GetContestedResourcesRequest_f06ea270a508a9d9c386b8da170f67620695a23f63dc7376bd4a509e93335ce9.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/msg_GetContestedResourcesRequest_f06ea270a508a9d9c386b8da170f67620695a23f63dc7376bd4a509e93335ce9.json index a0e087bdda23b6efde8bd0f93554df77a5ea6ddc..7a416e9c588d4b1cf6394ad6009c370f8152a2e5 100644 GIT binary patch delta 303 zcmeC$&3tSx^M-HCo4+!Lu}ps8r#tz>Jl)9?bXX_%&oh|3KvaA3&4~t+@7n86ez4Yf z@`1SqlO0yDZC=1>qz_c60~9owY|~>fS$~?=NCm#san|wfX`{WbJAhs@0o_+Fq zL*2>c()yDf!VM;cvTx3`b`b{a4X|UMyn9*fW&!`_B4CYj3I;&KbT%gxC$NEaZ&+(E zIRJ=(&e$wh)yX*dgDKnQ-#JHlz{-OTLzK%_1#p1{)_3SnP6#!aeD4y_B9qAhJjRpb zGYux&T``z^y$<4u1x4(W=V#~uO=X#U`?B%o-nMQtf_w;atk&i=Q#gfSF5J9( R*+Y@Zi|(XvHrNxT2mo#ri9`SZ delta 168 zcmX@Mm$_><^M-HCo4+%MvP@2h)t~&K(_r!iCB4b}d<`Z6xe6ZalLK;fCm)Dq+dQ8$ zQGaqmHQVHX^}3rAELVt57RY1UZ0+wNI{AVI%jOL!M@1(mD6?!{R<)7~EYi?=i+{2~ z63gc9scAwW#gnc5V<&I(G@f)rA0$5cOt{Wu14rY@8w}Vd$NB0`*56^gdF{#w;YrrI SlMk^gPX2$_ZFA1vC`AC+u|*F6 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_9f57b982b3e3b0286093d8b48ab27b87b22f67a172579913f2fec7a6b5ea31b7/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index e64b73d8a77bdd2ae7413c918f513e44a6315072..3ee6c22e507247caf63e04e3dc00856d1496eefe 100644 GIT binary patch delta 138 zcmV;50CoS8xDD;N4Y1<@v*H0(1e3snEs~xvmwrhDGLz6DDw9BL1e1`+ESDew0R)rq zJ1m!Q;sQ349X>6S;0OelU`zuqlYpTFlP~ZsmvF!VFqhm;12eNu2niaKfLtw?5Lp2P svs)tQE|Y*O!k2kaaWPvP}=>?)pnv<#wCOiCPnQS{-XYz&V z=93#DbS81LOyBLptUrB&EF;Tw{iTdLP!$H7eK;(orssz-vv1z1^i*&110j~?^MUQ> j0~xoU4`jOgVsb&EHlyX_i{eVtmqjzXZ5Os?j#2~wD{C@9 diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/msg_GetContestedResourcesRequest_7dd3b1061a019dac5fa1f385b8bd5387b9cca48a3062a4db8bf0341a839f2bae.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/msg_GetContestedResourcesRequest_7dd3b1061a019dac5fa1f385b8bd5387b9cca48a3062a4db8bf0341a839f2bae.json index 44352f58b79a9b903e5d86cede8e165edbf5fbed..2e27207daef093e27723278a10a29b5a0e9aa62e 100644 GIT binary patch delta 308 zcmW-cJxIe)6orw51Y03csDpxSagfCPye3_2p}L7mRRk3)G@+XmA=oYz1;I=r8hRWA zL0udK1>xc7;wFj-s5pr(4uTZX+2XUq8NPErxcBZqagWd3#Scfnxj7z0*5I=^IRTPs zAbC9qr$C^dSjc$>z9Is`I|b9WNDn*H29C29@}7p))&l%)p4vkbaaIy~J~brVS(9BMCj^a@4mpo>bdk`5wt5>Xc&GHMiDw1R^zeF#y&ZxwweBxOrrL@9}-_=~X#=R)QZz{3^35&K(A?MDev^<1){x zyJ?tHD$E@MLyw`nmV}|H=zC$}uT!O96^_tPMg9H)#hGJcrcSC?RCpr?J(!>Cz*`{m zNd~j1qHPdt-NevxZJgdRtPfJO#<|#YzZ0Udc;5?G;!Ylk2>s129DlHA8Wb`@D>>b` z&hSXc&LtzRTa1Hkq~JBOct1*^vJi*2MC1>G@-&kk2nU8x;}p53RH$X4H#kO{6z;a1 j4il+C5v+1y*4lb?IW6+_I}2m`1Q!Vl+UJDuABxsL?}dD= diff --git a/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_resources_fields_ccb199c48ee58a8bb98742b964cba7bda3b4469b740201d2628f15f926f39347/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index e64b73d8a77bdd2ae7413c918f513e44a6315072..3ee6c22e507247caf63e04e3dc00856d1496eefe 100644 GIT binary patch delta 138 zcmV;50CoS8xDD;N4Y1<@v*H0(1e3snEs~xvmwrhDGLz6DDw9BL1e1`+ESDew0R)rq zJ1m!Q;sQ349X>6S;0OelU`zuqlYpTFlP~ZsmvF!VFqhm;12eNu2niaKfLtw?5Lp2P svs)tQE|Y*O!k2kaaWPvP}=>?)pnv<#wCOiCPnQS{-XYz&V z=93#DbS81LOyBLptUrB&EF;Tw{iTdLP!$H7eK;(orssz-vv1z1^i*&110j~?^MUQ> j0~xoU4`jOgVsb&EHlyX_i{eVtmqjzXZ5Os?j#2~wD{C@9 diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/msg_GetContestedResourceVoteStateRequest_71f48f72373e5db9721e095e8cdc12823a7175b930f49aebb8d9844065da5b44.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/msg_GetContestedResourceVoteStateRequest_71f48f72373e5db9721e095e8cdc12823a7175b930f49aebb8d9844065da5b44.json index 860426250099d7e88b40466629ed477fc037bcfb..d7085b292b0a4ee631d23647ddf810a3e97c5d7e 100644 GIT binary patch delta 539 zcmZ{g!Alfj7{+;VnrWl9K@1PorchYh?97Lw6ieXHC9n_=WtXs(wu9n95wx;sAUsJl z^*}FC)_MvGYT<*1ENBb56yeq%AWH=i2rdzVhqTv$=wRKx_j{h-`#wBtU#z8XR(Y*K zuQv1<=*{L(=vG|vsU2No2l?qBDfAC{I!N91xb{dUbwjazK_0V*u)nS*rUXZ6%@lG<~%8Cb7bXg4u9cG2xY3l2jzNZrJ{5$dxqztwnQx4Ui zKDM1wXgRJ>c;oAtsW^>jT5-iBcm2M@^&_;rPNLrJqc+(Ww~SMrP@Yq;cPTsw{kX7) zn#{yA|I%T*lPm-s3cYO}Dz1g<7R9yA)QQZ^T=Efa7h&8$&ou}Ajk4#Qg(q(v9yvgk z&dkniy45W7+~1r!^YGbTIUv@P(#W6mmGg;3Dsp%*A{W64AL*l#c`J1wYBp~d$w4@3 z>gdDQ(;N9{F&9fq6U5kAY75GpJk}H1{Pkmv%Q-PzW7P1Ed6p&o3;4!Y&N z+WK5NE0H$?9P6_=^j>E$aSiOaoulxWC?>lUbao%0!e>yZum&0xmO-NQIxx|s4g)6{7&r<!jtI1$npmCJM3hPPeUPwO6LaSWs1yr; zs!)Gh16caW$U7v^cuOYx5itMM&6I?*ljqw9F)4fjir-T^u>-5WHX)}c;5(*^44VxL z?fg)Xz6uFo;Q>eIsMzqOPD>AkN4@v96YWmfWg1qB2Ckem{pBZzwQbQ5=mGO3I-5YW>T(wjmG(X$ytV1n9;qlcF_oqv(P{d(J>ENM&I7 k@PBQkIWRH2qqpI$fR*9OKXt@%{VW_oqibJKd;{LzKWgLPXaE2J diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__2c32c08bee77a2d062db8d1cdb999a841b21043ccc5e7fc5ff1507f9703754a9/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index e64b73d8a77bdd2ae7413c918f513e44a6315072..3ee6c22e507247caf63e04e3dc00856d1496eefe 100644 GIT binary patch delta 138 zcmV;50CoS8xDD;N4Y1<@v*H0(1e3snEs~xvmwrhDGLz6DDw9BL1e1`+ESDew0R)rq zJ1m!Q;sQ349X>6S;0OelU`zuqlYpTFlP~ZsmvF!VFqhm;12eNu2niaKfLtw?5Lp2P svs)tQE|Y*O!k2kaaWPvP}=>?)pnv<#wCOiCPnQS{-XYz&V z=93#DbS81LOyBLptUrB&EF;Tw{iTdLP!$H7eK;(orssz-vv1z1^i*&110j~?^MUQ> j0~xoU4`jOgVsb&EHlyX_i{eVtmqjzXZ5Os?j#2~wD{C@9 diff --git a/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/msg_GetContestedResourceVoteStateRequest_f7848301c15560f971e007963a349e64e07602f543bda42d5a5d223f0e6102a9.json b/packages/rs-sdk/tests/vectors/contested_rss_vote_state_fields__67dc63814e035b20ff705840e19ebb329026b51129b8dd9cd029d26a0a77408b/msg_GetContestedResourceVoteStateRequest_f7848301c15560f971e007963a349e64e07602f543bda42d5a5d223f0e6102a9.json index 1bdf34fd449184b81ebdefaf2e383c34add2b838..3a6666beefbd214f54d75d30a8ac79ac3522f541 100644 GIT binary patch delta 272 zcmX@Oj%C$GmJMcXn@!omSSBk3>P~LhqBD6xyYb`&;kuJ0rWj6^b<&?ap@402L!0g- zUbf8}xRdmOYIG+H*s@JN|66x*-+G|>aNW)Gto=nH647jvMO{FG2All@Ux-Yeut|6F zhKmN14QlkJ&*Ng$pRAzFw)t&DINM}})9jPqXX;E&h=|x6SJTNj*}#HrvvvMa9JmY?JTJ1KT;dp@e1fJa2>P z)dE1P8X^rQ2kc?r{BEVJ3Rqh~JIiE&`$m%=h-+`oIrm&`vXYSE^eQn%x6RMLMkxXS D8k2D* delta 367 zcmXYtKS%;`9K|uNy9mQ06rv$?Fi`LO{rW2b;?% zA{%pvv)|B`7Sz&^Q$sb_56S;0OelU`zuqlYpTFlP~ZsmvF!VFqhm;12eNu2niaKfLtw?5Lp2P svs)tQE|Y*O!k2kaaWPvP}=>?)pnv<#wCOiCPnQS{-XYz&V z=93#DbS81LOyBLptUrB&EF;Tw{iTdLP!$H7eK;(orssz-vv1z1^i*&110j~?^MUQ> j0~xoU4`jOgVsb&EHlyX_i{eVtmqjzXZ5Os?j#2~wD{C@9 diff --git a/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_list_bug_value_text_decode_base58/msg_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index e64b73d8a77bdd2ae7413c918f513e44a6315072..3ee6c22e507247caf63e04e3dc00856d1496eefe 100644 GIT binary patch delta 138 zcmV;50CoS8xDD;N4Y1<@v*H0(1e3snEs~xvmwrhDGLz6DDw9BL1e1`+ESDew0R)rq zJ1m!Q;sQ349X>6S;0OelU`zuqlYpTFlP~ZsmvF!VFqhm;12eNu2niaKfLtw?5Lp2P svs)tQE|Y*O!k2kaaWPvP}=>?)pnv<#wCOiCPnQS{-XYz&V z=93#DbS81LOyBLptUrB&EF;Tw{iTdLP!$H7eK;(orssz-vv1z1^i*&110j~?^MUQ> j0~xoU4`jOgVsb&EHlyX_i{eVtmqjzXZ5Os?j#2~wD{C@9 diff --git a/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/msg_GetContestedResourceVotersForIdentityRequest_365e8cc19afcc569d90d85a2a371ad49d3ae7bc38d217d85b1570274493c4d7e.json b/packages/rs-sdk/tests/vectors/test_contested_resource_voters_for_identity_not_found/msg_GetContestedResourceVotersForIdentityRequest_365e8cc19afcc569d90d85a2a371ad49d3ae7bc38d217d85b1570274493c4d7e.json index 3d8f0402e565c2fca102b024099cb388996e823d..803d93db30d8fbcd649f9df5b2edab1f5da59b2f 100644 GIT binary patch delta 281 zcmW-bJxIeq0ELkrDKwH6OA(|)3l0);$(chztKd{cu_+2gyI34L2`%UprOnbV9SlAk z+g;EQxIyrTcGSVy$scqV2ltv}c*}ddkMHjx<_}~3HxXZ?LXcA_oFL^D31ibhxuU|E zCV0M}DA@*5F2|=V!5^qttHm*VqT)V547ddjy+iTS+Yb-ITHeY8B@=yXJ%hHYBe~1) zZc|Y@IgoH(n8(1=FgmNk?-HS$b|;WZn;0Dj&?AoVp$0Y=$L}^pZk9o57+_g~m!bx@ z%|)}ZDu-C%+1H7P-;&Khmx{YiD;X_Im-VSo0e!26jZF^k)qt}=pwu-q8Nr9X81emE UF7&ItG@qbK}RpYcC0u(9jSj`fVG+?f!?a_= zs7Nr{5+-)i^3DtqFB0cFbN8?tyZJB@``vfM>sLJQCgFEcJ(z4e^Z7w+`)K( z;k|A{9a}iaQ^aKlERoQ=FQ8SCdAyONdARqyh?39+PlQi`V-?Z71K%VV)Lj1CuIhrZ zgp|z0{>Z^?=wi1^an@AO*eBuuLB2=9R<;nI6A_}o3mIBf8-CNpUEe`=neixO`hOhP RhMyU*F2PME$Bl6S;0OelU`zuqlYpTFlP~ZsmvF!VFqhm;12eNu2niaKfLtw?5Lp2P svs)tQE|Y*O!k2kaaWPvP}=>?)pnv<#wCOiCPnQS{-XYz&V z=93#DbS81LOyBLptUrB&EF;Tw{iTdLP!$H7eK;(orssz-vv1z1^i*&110j~?^MUQ> j0~xoU4`jOgVsb&EHlyX_i{eVtmqjzXZ5Os?j#2~wD{C@9 diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_GetDataContractHistoryRequest_05485e622b540237cadaa7fda2a96e8a6cdbd49b7bb7a3ac9cb6ab3035676772.json b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_GetDataContractHistoryRequest_05485e622b540237cadaa7fda2a96e8a6cdbd49b7bb7a3ac9cb6ab3035676772.json index ef8726a337ac56feaba311591de2ace0da6dd980..bcc08a36ca1aafa9327dedf0e682a9bbe0533046 100644 GIT binary patch delta 155 zcmeA_z%~6K*9IM?&Du<1ER**;>rQUS)t#&m$~xVkpGkMRfDNPW^bg)l29vWQj3*21 zHlCc?WiUNv0+YdX{t70;$=MP5lj2#X-L1oS)tfq^DmBNl9L6 GC;|ZKkvO*i delta 247 zcmbP!kgNXy*9IM?&ALpXEYky=84WhyXL~O_c|#)GbcY@$-N_BPx|0nyvP@UF!>Bv? zL#yuO0AJS4`;;y8ruQviG@Qo7WH7zq4x`re2Xh%?rY|r7Dr&fCFxh{<_VfdsjQW$k z#0){E>QAq~!>G5}KctRtdcq7wXJQ#v~>&sZ@)}#B#DCx6Wn;$XyvP|x0)14d;t~*`8o|$#>UulEMddKuO?`P|k28m8CFlU=A zU~Vv3|Cr|H)k>Ng(--J6>rS6AiOFpGdpRcEX->>+llua-CmXcs12t+RO!~K9YjS}K z+vHU)dO$%Ph?YJVX2Z!2szyMiVA;*9T(sDxH#}hiso4T_3e1ow7<+R-_+94hKua?i zK~}dS+2=&aznDw^aF~F=F=D0Fdm+sAjf1pJwBLGfBJ?eOo=c_gXt4;7+IPh b#I`?(W!(NCmTBMh$%i-;x4$uEUaSZJuG?e@ delta 93 zcmV-j0HXiuuMLl{4Y1<@v*ZCx1e0)9EtAhG1+$L^>l>4d95Rz&Uj&mNA}W)clrNKz zCI_=UBl0JcKp6ysU`vN!O98iFO9IB~lV1iclVS!Tmmp9BESFDL0~)uDHUnKD(DEWP diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json index bd8f1bdd637a228d42a8ebe4563bbc794a769615..a88505bff8c5aa180eff13526690001a20ef5945 100644 GIT binary patch delta 76 zcmV-S0JHz>;sKiD0kE?Hv$6qA1e0F|Et6XfER&Ex2b0blFOm%^lRyjylR!5xlMEm* iv+@Qh88Ay0CO%{k| X+q_moQ+;xRh3@1{1?ih@17Z~cv9uZz diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json index c1129991c4524b8ca4ef6d7bc14342567a8765ac..1d31e7f0b41589917c885b3ffa3baecf760da428 100644 GIT binary patch delta 100 zcmZ4afVbr#?}Q^85BsuAE@0K&EWj!(Gr1sFck%-XmdSIHjV8b6(Vl)bkW{2p>YL{zx6est+&(9n>Da5uO2CuXw^2_6Ga+NL9DM)) diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json b/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json index 2d144b2fe77508e363d133a0d40a1910964fdc5f..e7f45787ce0c0a3c520a375b29f113e59ff89664 100644 GIT binary patch delta 67 zcmV-J0KEU|(*c;&0g%M8!%YN}P&6&G5CtwAlfPLolWjLKlcYB+vz{S;CX)hbXOqNY ZL6eXp1e2FiER)~~1d}WuEVEKcm>{?|8gKvr delta 55 zcmV-70LcHC)B)<#0g%M8#Y_aVJ_Rluli*-9lb>BIlVAn}v;84^CX+w~Et6sgA(K!~ NER%g{8nfR>IU$#)75)GK diff --git a/packages/rs-sdk/tests/vectors/test_direct_prices_duplicate_token/msg_GetTokenDirectPurchasePricesRequest_91156f16981151657eec7a09309eda09b939ada887a7461372b2de1a8ea09f04.json b/packages/rs-sdk/tests/vectors/test_direct_prices_duplicate_token/msg_GetTokenDirectPurchasePricesRequest_91156f16981151657eec7a09309eda09b939ada887a7461372b2de1a8ea09f04.json index a823a90acb0e54a97bce7ecc9a49dbc016fa057d..d7b507e2bb80952a9f3770c5f532df80a62ee90a 100644 GIT binary patch delta 117 zcmex8m+9I(rVUywn>AT{Stb`)=uQ@J*Pp!G$9QtTiuPt^&Qtn80iDSWqU@9PEA&Bv zlNxk4M_Cq0gT*h@u}^+epg;MKtoCGENBzkcl#C}|sAHQfX=^Z9zrkSggA(J(1$u0o Sb;GWRP5#8AxY<8%voHzEFOv`(1(Fgilb{za zlh7wEv$Z*L8;foai1rVV^dn|YahStiHv=}g|mXR^7MO~qhxx0J!;`J6_R6Zo_z=R4_cwlgo1 f1`6s=)+#du3kU?;3Qsm-Q=Ht;?zZ`1TACsN4OJS< delta 77 zcmZ29k?HsZrVV^doB5f1SSI_s>Q7FPW10NVOMmi)Annbf?5Ff6Unn#Mb8^h*OHXd7 gXWeWYJVSVLL53ESiRI)%PNm7W+ub(Xq^BtY0AQOP2><{9 diff --git a/packages/rs-sdk/tests/vectors/test_direct_prices_tokens_ok/msg_GetTokenDirectPurchasePricesRequest_126bb11190a05480b657dbd7b77baf567bad67f5d1deb80c70f0ef3a9a9da582.json b/packages/rs-sdk/tests/vectors/test_direct_prices_tokens_ok/msg_GetTokenDirectPurchasePricesRequest_126bb11190a05480b657dbd7b77baf567bad67f5d1deb80c70f0ef3a9a9da582.json index 1dfccfb52bf0929276cffcbbab0ae751c98769d7..c77a77d0f2acc24ddaf354ee796c0b6d76ad018c 100644 GIT binary patch delta 82 zcmdnJglXDRrVZR|o4MG0Stc(q)}34st2;TM!)WpYE4|H6xK8N<1#~7CNU=?x$7?XT kKuvqHL$mH?YwIFuu!KMi`{vDIeUg)dxD_||7pzeP00AN%)c^nh delta 70 zcmV-M0J;B`r2@O80wQ@!-#5^mTyRNe@&XR_&Hq_Mv?eP^>P?<7g>ACjMBT~v6?G@` zo9Ive@6kT_!XZ7d!Uvu^CL7oq0NIg~FHB;e9N(b3`KKYxCKJHuHYAR0IGm4mSt@ delta 109 zcmV-z0FwWqsRYKT1dxESflLIGkQywLV0H(S5S=fRfR!zi5TXRLjRmwRlYl-1laMtq zlOS>|laS~!lQ0@Dvo0_!p_8B@29q8XEtA0SS(Bia1e0*|Et8NMEVFRZksy=6>n)Sg P1RBxgq=WB^>imyvP@3k)7iXXl@u$`#&)2M`ja0_)tWq^LvPZIsL6Jj`jZW~ d*eCnR>Tc%SD6KG=iCb~9{wKH1doNll0szxsNJRhu delta 166 zcmZ4eocY^R<_((}H*aC|VVRtuuD>~kt-x+lIr}Ep&3c<36#ti)ynusk^6d}0lQ$^o zOqvlrIboyzTYTIC)m9!Q>6+*(cX+(F7Vc PdA+y}Q2A!B%ZUmA0pUo` diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json index a318f1db630f691dc2dee43042f20f977591d202..29bdc91594eb31809ab4fc0a1292791169fd9145 100644 GIT binary patch delta 193 zcmZqO$TDR!%Y?>_4ZbXs1Cn(oPf#w3;pTu3lh`I7=+gyp zCKnt5N=WH$&VNwLKKVX7jI)v*zt#!s4JR+S15^E#ZSo}+#p(OR8QnJfe795t0Ai|E Au>b%7 delta 107 zcmbQTnWc3j%Y?>_O+GA>10;1PU*KTdtj8*%HMzjbc=B0)-N^xgER${d^e1n4XfU~M zmEPtA1JQ+>10L40PYTur(sk^U*G<*|GFGuecnLWmo&r0QiRI*n>`K$mN-(-@j{ae( F2mk{mD@6bR diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetIdentityRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_GetIdentityRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json index 062e1a558b8869babead812a7ccf47b09a54dd3e..b8e5748d1774067c1e61b73c60f1aa66e309bf70 100644 GIT binary patch delta 177 zcmezNlzH`Y<_((}H*aF}WtlACraSq-Lfy&oTa6}v0J0aHWZB%$#&0)SpjU6w9plYs zS8B0MZup=(`Msk4q~f^A29ElZ74)??3;1}bPZn6IKY4?)@ni*ez0JFe=SYAACY@s0 z9NS|f3o>Bxgq=WB^>imyvP@3k)7iXXl@u$`#&)2M`ja0_)tWq^LvPZIsL6Jj`jZW~ d*eCnR>Tc%SD6KG=iCb~9{wKH1doNll0szxsNJRhu delta 166 zcmZ4eocY^R<_((}H*aC|VVRtuuD>~kt-x+lIr}Ep&3c<36#ti)ynusk^6d}0lQ$^o zOqvlrIboyzTYTIC)m9!Q>6+*(cX+(F7Vc PdA+y}Q2A!B%ZUmA0pUo` diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json index 895a47b5cc8d4dd3da5122947f01f86b5c1a588d..d7adf26296ddb03e1255757bd004b201c5a603ee 100644 GIT binary patch delta 295 zcmX@o%X+z=bwbm|Mqif6A71HBE-2BNoFK?PJ)fIVfAWSEdXxK|4L0|&wrfszU}H3x zoM6E+{k|}x?&JfRx|7fN=}%8^X4IQp#cMEm?gstI4!P`;*FV#l?68}CvTml%J2!cPl-}e%R)fh0p6EGB1FA^4}H|d7#K{brg~JY)mGWlNWL-P3LiEblW~ljnPsO E0I=&cqyPW_ diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetIdentityRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_GetIdentityRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json index 062e1a558b8869babead812a7ccf47b09a54dd3e..b8e5748d1774067c1e61b73c60f1aa66e309bf70 100644 GIT binary patch delta 177 zcmezNlzH`Y<_((}H*aF}WtlACraSq-Lfy&oTa6}v0J0aHWZB%$#&0)SpjU6w9plYs zS8B0MZup=(`Msk4q~f^A29ElZ74)??3;1}bPZn6IKY4?)@ni*ez0JFe=SYAACY@s0 z9NS|f3o>Bxgq=WB^>imyvP@3k)7iXXl@u$`#&)2M`ja0_)tWq^LvPZIsL6Jj`jZW~ d*eCnR>Tc%SD6KG=iCb~9{wKH1doNll0szxsNJRhu delta 166 zcmZ4eocY^R<_((}H*aC|VVRtuuD>~kt-x+lIr}Ep&3c<36#ti)ynusk^6d}0lQ$^o zOqvlrIboyzTYTIC)m9!Q>6+*(cX+(F7Vc PdA+y}Q2A!B%ZUmA0pUo` diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json index 7a1cc4509834d16464f8eaab3faf1f3c4c49f633..4fcc380518b03171ce764bd00cff9fbbeee7befe 100644 GIT binary patch delta 218 zcmbPrjJ4|&>x8C_jlL|C7kt&7K7pIjV0ykjqtWDm1l`GYR}CkB_+v0xL6~)N?@Qgy zA6Qj2Cr?l_n10Wk(QxvEINiznQ}m}V&|=iyd_lkH=;R4fdYeD|X<(l`-%JO}S;LMH z{ci)d0B8x8C_%|0yCR2U7Wf8b;^nk;ZdZ}I~#gX#6Gj0Te%!q_Iie5o_J;fula zga}5K$zsMjlMD3Orsu^l>Q4S(z&5$zxE5Gu^Ha7sjm-u6y2rL3&|$1%2THO}_WrAb z#A|r3yB%oi8g?YH36;nyUNj=}3cA3&M)v6m9*kh-TCmmz_Q~h3>VgbWU}rM1oUWL{ zm@)lHETiM}&AyBV(*%L;7C6B&*Bxgq=WB^>imyvP@3k)7iXXl@u$`#&)2M`ja0_)tWq^LvPZIsL6Jj`jZW~ d*eCnR>Tc%SD6KG=iCb~9{wKH1doNll0szxsNJRhu delta 166 zcmZ4eocY^R<_((}H*aC|VVRtuuD>~kt-x+lIr}Ep&3c<36#ti)ynusk^6d}0lQ$^o zOqvlrIboyzTYTIC)m9!Q>6+*(cX+(F7Vc PdA+y}Q2A!B%ZUmA0pUo` diff --git a/packages/rs-sdk/tests/vectors/test_fetch_1_groups_since_0/msg_GetGroupInfosRequest_c3dbb328a30709970a146c7513a985c18e7a2310c75db42f4efe415726853928.json b/packages/rs-sdk/tests/vectors/test_fetch_1_groups_since_0/msg_GetGroupInfosRequest_c3dbb328a30709970a146c7513a985c18e7a2310c75db42f4efe415726853928.json index 6da855cfb5309131b767da73e17b15c7f5292a45..6d77c7c91b255a51cb2b521fda9594df9ae1c760 100644 GIT binary patch delta 163 zcmbPtg=yJUrVZ&#o70$lStc7~>rQ^JsJrEVd_vC;NBkPc{%>ne1Sw zyZL{>3^B04d_%*@2Ff~<1#)yJ{|B-`iUMj`Cdaqy!r8S^Amj8WJE&-F7Rb?J1`>;z vHg6~dvNjZ!F@f}Mo?yF>b#ei_F4!=jm6Ia%H^)_f=9wJCqquo~N4+8dtqVO4 delta 163 zcmV;U09^m3)dHT>0dEuJis&~PoY;88yolOUM}ll7x5lQ4T)lP)qalRsK8vpH$aACnML REt6siA(P*!Mzd{+IUy)~KK%dy diff --git a/packages/rs-sdk/tests/vectors/test_fetch_address_info/msg_GetAddressInfoRequest_9daaf029e6ac9943bb15ea90cd7e9a7bb2f706e5b458cde86f4eb66de7d8cc6f.json b/packages/rs-sdk/tests/vectors/test_fetch_address_info/msg_GetAddressInfoRequest_9daaf029e6ac9943bb15ea90cd7e9a7bb2f706e5b458cde86f4eb66de7d8cc6f.json index ed26e81523af5e9cd612d18e5c577c71702cb6bd..6186af517d97b36ce95354eac32411ddd6c28133 100644 GIT binary patch delta 72 zcmaF)j`7HQ#tp%Yn}ZkwSSB|p>P}MDovhDh45T*evn3i%R`Au`Ji&YkFNiT&A;x@j awyT4{j8wb?#QOA!FUR~fMY delta 52 zcmV-40L%Zx?*ZxV0kBg6vs3|31hdcu?lF__BLuVWH=qr(yhV2qlORhg0XdUF3nG*K Kc1E+BRw^N6wiTQJ diff --git a/packages/rs-sdk/tests/vectors/test_fetch_addresses_infos/msg_GetAddressesInfosRequest_446d97c31acd0e7b72e15a6d19e8cbe3a47c21e93ea2e5326d36fa8581ed5bb9.json b/packages/rs-sdk/tests/vectors/test_fetch_addresses_infos/msg_GetAddressesInfosRequest_446d97c31acd0e7b72e15a6d19e8cbe3a47c21e93ea2e5326d36fa8581ed5bb9.json index 62e0c4503f6d5dbcd3e9790d834f4615e538405c..3a5f38a47884fd920695def8ade072d2a1a4eaa6 100644 GIT binary patch delta 171 zcmZ4TmGS>q#to7zn)}4GHRCjWNINRpg9P14yH~8yL4k%*T>}R!r7tHw| zWiZ(xk!^B%K=kAd$}y7-_}M1!ivcRqGoS+21DdJ7`CbS=rNJsH-^%tliyowO*YVGpIl(BGx>oa%jTV&`wb=+ z7_e+!X|;fNa)2+(^$p>UuCch1cojf7HVDbTLYGPfWnfja4Lirgds}$%@PIHLc byx(sM*W?Gvx|4-?6(?I%xozGR>8c0-g)L7< diff --git a/packages/rs-sdk/tests/vectors/test_fetch_all_group_actions/msg_GetGroupActionsRequest_e11730d47bec719aa135407aaf42faa91c6f6f6d2f379d9e2937e515e3bead2a.json b/packages/rs-sdk/tests/vectors/test_fetch_all_group_actions/msg_GetGroupActionsRequest_e11730d47bec719aa135407aaf42faa91c6f6f6d2f379d9e2937e515e3bead2a.json index 55cea88ac8f1ff4e8945c59be274c3e9dfb83143..51a7e88aa2d29f6af7cf6ac6952dd6695cf264a4 100644 GIT binary patch delta 514 zcmX@Roq7FE<_%g*n>CpNSSBsdovg4~e{!XQ!DIy`y~*bjStlRJ(E_vcB8?|IoYS9d zPywX(ux0U>=0NP|iO2nzYX32W~(Efo8~O>P+%r-+aQQn;WdI!HR8i!79Va z0yaQ1B3UL^nHq0?6R=toESaFoHkrQ;=vtsF6*5>S$ERyeE(m6yETE+``G641=GgRy zQgGMVh9J8R>d4_rfnrd1@&j)D$qLTlpzztew(~6yIM5DkXWzVFnvL@0Ny3Vgd9LVe J4%=0(2mqDr*irxh delta 177 zcmZ3#llkm+<_%g*o3)wzSthyYOyXsmyh=fL@&+%x$pyLkU|Q#d!Q=ycY?J@))|q^P zhh_4rM$^qY95YNND>SoA?zGgI%pa$>+21x^c=85**3AzB?8PQ;aAlo*qz+=tg`2FC z|MhE4K9I;h*-i^=!@qv*$shKxP2S6)JNaj=@#GH{`jdFsH{Z^XklL)!93wJWz>sb8 a`sp^xlQ#tDPCmq;IQiWboy``z%M}5U;z)S_ diff --git a/packages/rs-sdk/tests/vectors/test_fetch_all_groups_since_1_inclusive/msg_GetGroupInfosRequest_1eb17b2aea7fc0d0afc0176d93ffb7c29eda4cc524bc0c7fef3e89d58d206c00.json b/packages/rs-sdk/tests/vectors/test_fetch_all_groups_since_1_inclusive/msg_GetGroupInfosRequest_1eb17b2aea7fc0d0afc0176d93ffb7c29eda4cc524bc0c7fef3e89d58d206c00.json index ee7ade2c8dcc0a83f453438a2c745b4627e16126..9f40d50a21c0a096804ded2ca559595e89306b73 100644 GIT binary patch delta 180 zcmcc9%RI54c|#`C<_xA_mdOtSbSFjVP8QH&-TapAqv_-eoqCfeaOqDzuvvF;j}qHv zYv&@~NfA1e1)A9=-_g;Xd?DLlGk@R)agf*oarVjlK{}J<3?}7hO)d~;+3cTrM*$?0 zu*eu8I@v!n5+pl$u&y#Rm2K3Giq~z@*9@P1~gBq;#@;s4iGPh}}I)XYz+Ey~+C)7=Xk!Z|L!o SoNN%GJGqHRakKQYGDQHP*fIJ5 diff --git a/packages/rs-sdk/tests/vectors/test_fetch_one_group_action_since_existing_one_with_limit/msg_GetGroupActionsRequest_626170b2b5665f3b4021607da73d3782117d6bc7d324bde7f4a9de01bf66777c.json b/packages/rs-sdk/tests/vectors/test_fetch_one_group_action_since_existing_one_with_limit/msg_GetGroupActionsRequest_626170b2b5665f3b4021607da73d3782117d6bc7d324bde7f4a9de01bf66777c.json index 9fdf5763f8d784a412db2534dbb4af46d767cb81..0df0d8a306f7633b9424071c6270cee90d438a75 100644 GIT binary patch delta 125 zcmZqJ!~AG3^9CE1&DJadER#RDMotb0XWP7&vfH+3fmoMxZwdq)SXuQv0(6jrOtPWHeb|q3+}ddhDBhIH#FTHc({QENs71cya(A z>*jw!_F|Lo%du@P$XqB5lA8QlS7-8veBH?n(FOyI4Z-f`Pu#M3ZO>btNq5X9JE&`d z{Q_~P?&J&G4JKPF=ubYs-Cz>XSK_ljDNa^!)1A!3p*UIYy3SWYFnA6nTb=Qrz4Hc$pB)|*^uXaE$~ p-CU6VS8{UDqV&lka~vlNsIW|a-mNqFKq%Yf1=ZS{7dK5;00039JL3QV delta 87 zcmV-d0I2`M#{#;>0N=A*RIzXN V3Gfq{Y{aHGc|oh&X1!EPMF4y&8GQf% delta 57 zcmV-90LK5qjRNP40pEt8#rHj|J;Ewk$ez%{ejJjoN2P)7!{)KE?o PlOQN60yH_ZA!VT<#>5uW diff --git a/packages/rs-sdk/tests/vectors/test_identities_token_infos/msg_GetIdentitiesTokenInfosRequest_2584cf846ab27ed84d67d449becbd7b33c0b9a6a6028ee966f2f2a6c4dbfad21.json b/packages/rs-sdk/tests/vectors/test_identities_token_infos/msg_GetIdentitiesTokenInfosRequest_2584cf846ab27ed84d67d449becbd7b33c0b9a6a6028ee966f2f2a6c4dbfad21.json index 85a579f1893a03165835b996bb6ce35884399499..f6d6401ccefbc5374a929c432e19db0011fc27f1 100644 GIT binary patch delta 132 zcmaERh3V^6rVWyun!?=*0E-qhfdBvi delta 124 zcmex*mFevjrVWyuo258?SSDXk)R~+R!ajL}i_YW%JH5>cd>{2EZ%AUDEFh)3xxntA z^yC0#v&r*iv^MXH`mZ)Q!Ow8=9RuCT`V diff --git a/packages/rs-sdk/tests/vectors/test_identities_unknown_token_infos/msg_GetIdentitiesTokenInfosRequest_99b04982176768547364176c995ebd0c7ebce314c7518a12b6e444f36b153156.json b/packages/rs-sdk/tests/vectors/test_identities_unknown_token_infos/msg_GetIdentitiesTokenInfosRequest_99b04982176768547364176c995ebd0c7ebce314c7518a12b6e444f36b153156.json index 46a6c12e3b5dd66dc766a19936a18ddb72d0e5a6..c75b57607206127d35ca76995b899d1b3c4d32f1 100644 GIT binary patch delta 157 zcmeylis{N~rVTGSHoxHTWtnUzqchpB)o`+>l+k1d8STkCBa9{oNU%)qouE5;Lb&nd z-7)%;AE>ZQmX+6;oZxOSc>}-kBzN}7oVxm(1Nf8mCi}PQOcu~)pIj@T57vJnRcEq8 zioxc5J9BBU7#%N@urex>FbXlF;9we)Z#OCeG&z$o3nG)bn?|!odpRK<^C2<- diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_GetIdentityKeysRequest_a2eb219e18333048b42849f8f8f8378a0e4cc52357eb5e477c2f0e347cdbf48a.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_GetIdentityKeysRequest_a2eb219e18333048b42849f8f8f8378a0e4cc52357eb5e477c2f0e347cdbf48a.json index 4e078c3bd71d583e16f0450dc33a322addf13840..2fdf98bdf4055c073147d1676de0d39caff6abe2 100644 GIT binary patch delta 143 zcmZ4TjA_ktrVS2Eo9&r=StcJa(w!_&rZZVUf_?LTHg(O(0iA}E6CCv?U$A7E?9Zz? zxj~a<@&rDe%@+*ZStmE7wNGBR0jQ%x7pOC4@&jd-$r}RoCmCu@K3Ad#G^lNIfgJnf ubyE#CJ6Xi30R?n7FNpgi3Svz5+hDx;d`XAQWFv0H$+4TK32nLhfuq~6|A}q78 TbzB^i5Qr_4k_I8OEs}pBvJxzl diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_specific_read/msg_GetIdentityKeysRequest_a2eb219e18333048b42849f8f8f8378a0e4cc52357eb5e477c2f0e347cdbf48a.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_specific_read/msg_GetIdentityKeysRequest_a2eb219e18333048b42849f8f8f8378a0e4cc52357eb5e477c2f0e347cdbf48a.json index 2a70e7f6bbc25b89d6ac0cecad9f4aad115cd47d..0f361191f87080777256e33339d7510b9a61d6e6 100644 GIT binary patch delta 126 zcmV-^0D=Ft^a8#00fX(^MCtTdCpWh|3mvILXR4llECF&720Hu5Nw zKuQIZkQXtNU^6YVf?tFclQ295lfb4flTCMFOyJv1d~vR wDU;wH2a{_+ER*0K2b0h{ER#?e2eYeqW+0O=cPjxolhF$zlkKuBvtF5BA#5%>X#fBK diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_specific_read/msg_GetIdentityKeysRequest_e72db3c9386781ed78db57de2ca48c04146560bb24a5224d9090b567e78d272e.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_specific_read/msg_GetIdentityKeysRequest_e72db3c9386781ed78db57de2ca48c04146560bb24a5224d9090b567e78d272e.json index f5b03df915c1562b7459648260240a2eb4b6c1a1..bedee48067768cfcbb6f6d528f1fe43abf2782e9 100644 GIT binary patch delta 137 zcmezMmZ|AI(}o#Lo2N4cvrID9oorBNuvv=TQgd=atKQ@THf)o7SLsYXFqdU>mqDuD zWCuQ-$sZQ8P2MGLIN1QG`hTGQWIkPkN$c4rulEE>bFfY>u+p6zpu)acE@6iVSbc#! p`{er^I+G{NWtsf8C2aDAvZ%=ygjqHpC{2`~EVM0s^VX@ZiU6DXHlhFk delta 130 zcmZpA&-Cjp(}o#Ln`bfwu}pr@W-ytj+i0?Yn)c+q4i=m5vM zR2b0elFO#24E0bwiGLxyaF_S=8Gqc+c zTQ8F^8Zwi>94?a}tt_+eK4u$}z?uh>OsFi9d|s2kkS()7TOl=*P-p~`jbbgczmPfy QlTd>#lcEqIvl^IxA?|@KE&u=k diff --git a/packages/rs-sdk/tests/vectors/test_multiple_identities_with_unknown_token_balance/msg_GetIdentitiesTokenBalancesRequest_99b04982176768547364176c995ebd0c7ebce314c7518a12b6e444f36b153156.json b/packages/rs-sdk/tests/vectors/test_multiple_identities_with_unknown_token_balance/msg_GetIdentitiesTokenBalancesRequest_99b04982176768547364176c995ebd0c7ebce314c7518a12b6e444f36b153156.json index c37784a0f0a8c97b8abeccf6624d9cdc0417a1a8..4dfcb0c5527079390326d8755ef530767632f09e 100644 GIT binary patch delta 82 zcmeyjhUw;7rVTGSHoxHTWtm*>qC5F~vcY6eDWk~_GTNID@qW~wyuL(#@`nJH$+k5* klk0#A_C)DzcCho30ZTm4V%a<)N>OTZlYrvp|0VT`0L_FVv;Y7A delta 100 zcmV-q0Gt2Wtpfh60nW4JNiMS*Farpa0$FF1#8N?% Pl?yPFzcnzkQaP9)sAm>z delta 56 zcmV-80LTBBv;pd~0kE?Hv$O$B1d|XHEt9|!2D4xW=P9#vFa!vb@JT8HG&z$o1|pMC OKP;1dSsJt7I5{C-`V=Vu diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json index bdd6703bac17d1944cabfa4f7d88f178377d1d78..a3cf2d159f110c60338d9c34c00dfffa479dc131 100644 GIT binary patch delta 98 zcmex*p7Fv3#tF6?ZG2fK_nYWWJ{@kbc_&Mf!Q=;KdYffT-T6U`$@Qtalh3&7PM#0M s^{F~wF&|TqY9L#YW%2`O&B+s7^gw(j6N|}=oJy1R(%m-iakEqe0Q{^cFaQ7m delta 63 zcmV-F0Kosy&;j+&0gyehK1>9Yzz{F9<^*Fflb{p?vwAf|50efzEt4=61hX7PlmU}4 VHYx%%Ig?=oB9n<{Mza@3IUxj&6`ueA diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json index 47c11ff99db814bacb28ee211d84518d677c900d..336acf3340c3992c9a07fed1f8ba111442fe343c 100644 GIT binary patch delta 70 zcmbQrQ@S Zpu4%i=a%T?ByPpY0nKik?VR{`d0)j p=)lW9`Kp%g=KEgu;**&&eJ2MrOHDpn<2ZRrjsZx=X7%JF3IJ)}Bk%wK delta 64 zcmV-G0Kfmnhyv?}0+4XAaZCi0z+o(tAPNMt8Uux#Ru|s@ diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json index e01ab5a342ec4b1af1f4eb1f054ca02d2539ffaf..7d5cce2c40e8347e43140b3bac1c1f4a9a82e4a1 100644 GIT binary patch delta 62 zcmX>&foaY}rVS!Yn}wNtStbkU>uye9n`|&SflX)f22u9SKh45LAsl}8&0#)rQj-^P PD^9LzciYU7Zm9?Wkqi{k delta 57 zcmV-90LK5EkpjVx0Q0=`SQ_jE9mphyOj=`t#lEJ`nvJzO!9&`~mzuwgKh YKv@Q}Do$DzlcEVBlZu2!vlwJKA?WZeqW}N^ delta 49 zcmV-10M7rcivrP#0v=pG<8RlTcGC0yH_3kqaWT HEo6To;71YF diff --git a/packages/rs-sdk/tests/vectors/test_sync_address_balances/msg_GetAddressesTrunkStateRequest_c49aeef007d9b94685bb7a38fa0daa7f11dfff63969ad07d74a36a45514c3d33.json b/packages/rs-sdk/tests/vectors/test_sync_address_balances/msg_GetAddressesTrunkStateRequest_c49aeef007d9b94685bb7a38fa0daa7f11dfff63969ad07d74a36a45514c3d33.json index 3c86865d44bd64cb492ccf96c3f6d9e3eea54c40..b1c9f1b6fe9eabbdd8208a5ec1e8e7f02cd8fa8f 100644 GIT binary patch delta 84 zcmaEUfpObK#tAALl@%B#@3l~ye85(H@&!4T&AE(gw85ML36{;Wx*xc~oCYba$@kgV kH``gZ@J%jam!7;oPHi%8s?=oHc>BpU!n&I`cx;yk0Em?!MF0Q* delta 182 zcmdmXk@5Kj#tAALRpl8c3)rbm77$>Yd{$cniLE{Pfu!2x1IjF$9hexkCvRY5nVc)G zK3UFHeR2b@`ebb>&B+C}>XSlQCchNZoLp}OQm;IjUzu(4T}xG<61B+&nk<{|J0546 zd_li<@@{tZ$q!sZC$E%RHF*LP`{ZqYT9bSEwKg9!p2j-)fRWbbwU*s{lM5VF87(I( dGRjQmi&vW*lPWcNO1%B#CBnL!|9fng2LQ0YLC63A diff --git a/packages/rs-sdk/tests/vectors/test_token_status/msg_GetTokenStatusesRequest_c9fe572d4f1f27b839d33a16c49f961ab1e3f5f5355de3cf58b9f2c000ea0063.json b/packages/rs-sdk/tests/vectors/test_token_status/msg_GetTokenStatusesRequest_c9fe572d4f1f27b839d33a16c49f961ab1e3f5f5355de3cf58b9f2c000ea0063.json index b8c211da67846c94481c051cef31fb133a977242..8edf4d4e63eee7c1c6327a59d919d6e89cf207d3 100644 GIT binary patch delta 66 zcmZ2Hk?G$=rVabqH}7NjWtr^IsxvuHL~n9HIooDC9&dxm`64=#6*Sp5_uF_Xfn+w{ VjQh(zc@m%Ed4VVRuotvgxY$7u2bE0)O)BASz5I~Y&qYcZU>L6U8=K5vKq zWcxtV$@U_8leu(^C-2YF2P;(YH`sjFHcWAILi|7W$@4|Dm`p4uH*za&u1~L51OWUw BBb)#L diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_0cb9ee36247bc1ceaf62016370f4ef834e6bbb89d21b2f08163de5106d9db335.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_0cb9ee36247bc1ceaf62016370f4ef834e6bbb89d21b2f08163de5106d9db335.json index 0372ec584a4930b5541193315a08b2542e12f501..5eaa014152d3de17c675c33e541dbc59b92eb094 100644 GIT binary patch delta 63 zcmV-F0KosTf&;mO1F%^EvseLE1e32iEwio#hcJ`wh%>W0HbNJZfNL(Zeod-0lkP(> Vvnzra9g|`RA(LvrMzhzSS|KTs8M^=g delta 81 zcmV-X0IvVJg9EXG1F%^EvswXF1e0KjFq5D!GLwH>E3;_^`Y*GPHb@tfASwj22~MXp nlW=GTlC3SX5QFF(limd?0yH_3feIp%&894q9>E&3U!Ync@@XFm diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_0dde395b4b415889954d709f63d4df85a544ca7ab40bb4fc7a1bd8e8ade47e62.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_0dde395b4b415889954d709f63d4df85a544ca7ab40bb4fc7a1bd8e8ade47e62.json index 540dedcfe4ea07da1f72a1c775ee7b26f8659def..cffb48bc43da8c9571fb511f8a4918bec15b5c4e 100644 GIT binary patch delta 251 zcmbPvm-*a1<_!^yo5LBySSEk)(VgtDPG|A~MfS}PSVIhe9D~i~X0GCs?bqo}77%CI z+~E7)2`H*R`N0jA$q#PoPTml#GkL)YmdX89I+Gi6*(V3Q0n+KllM5o*H%~~p&k8bP za^7Zrun7gVERzd_bRg_Vw#j`Q29pC8vuv)NAuNu~)Xn`>$!tWLu#0E%zQ_6?<0k7L q)tT&Y(`2&#ezVC1hmAMuAFW}ZEX1ZbdF^GL$^YI;ZMHufr3e7oUu;tV delta 234 zcmX?ik9p=@<_!^ynQN{koF{4zNs~w?cRF$$9#d3m&siey~V? zvVN7`&Io8ITWE9)v4Ucp;uS@Y{+sr@1Oae_t zYw}+M-OUBnTp-!Iyp!dZ=}!)@FrIv16U*fHho?<`vs4G@T$9QDu9_fcZJu}RJ=rP$}r#m^oo^A594E@Ohe%h0L59@EvVmqx5l+c;H zVIliwYcnVDNuj!v9e7wKuWQzyB&;|2!YLqSxY^E6*af6)bHJpDa$v@T4d$|wlQ}A^;XnE%g8Z delta 213 zcmdn>kh%2%^M**q%~6b@ERz*x=}!Kj$Tqn^UuW_MHI~T}Ts0>vEM=M8pRPN(YJvXb z2M5e2f4HPG`GP9@WbTJLlM51ACf|Mwk~7%6pM8nm<_TsV;*$d!**Ej}opqUfL7#21 zzq0P+eQgk>Qcv_J%l4XVJ~R20?BoO|)=78tP~<)Yux!pQb7h-+V5afp^NVzW?lG7= zUr1-N{4Bl6AIw-M3nUs$J|M+1nRmIt9 diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_5a13e820a6f3aa36accabe630aac61d0223027f3bca7edc99237362654f2bfb0.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_5a13e820a6f3aa36accabe630aac61d0223027f3bca7edc99237362654f2bfb0.json index 2730aa198a04b53b762e886bbdcdc46ddb40a92d..e5b8644a62ea8981522bbb0acf7336c5d4222fc2 100644 GIT binary patch delta 168 zcmdmUhxy}O<_!^yo5LBySSEk)(Ve_uo5AG&8v2tHV)Z81A2XPoz^*@e!veF-=h;$$ zjBPrT9UP6pk{e{%HqSD9BsO{dHp9&gz8ubA*#-LSlNFSK#suq3{*ccydCo)q%?DyN z*g%q#%uIlk?&kB;J;lL_8*Z>qet#52@nnY+ESuM@Um!DCh)r>Fz-67yC(e{80szFn BOi2I$ delta 230 zcmex(mwC?}<_!^ynrq1MmJeJ89mT65^SYa^P>ypuAn*}DD z|FNa$PyV3BHu>5Ogn|dUY?J$?K^iSLN14}(O%}*xpIp#{P;lN+A8uMgD%<1_FLfqg zcxya)feQQNd~1WvasHbeCtt{7o9w5oySZRutlVUQ2;<2G6B9PiFY#alI!b@?gZ+kJ z$0=~IOs>n&1+za0vrRrX$zZa>Qj^ICHW+NKnyJpSx&FvTj>-G`btfODvsVFD1e5SgEs|9%lfWSdv)~0(Fp^a;vo|(H7n2Z}F|&Y8 z5krzyFO&ZUGm|jgDzosA-yV`xFOv{K1d|{mEt9ZQER*n%Fq5D!2b0-~Fte4g>>HC3 K1|hT0%%CB>EGvZo delta 144 zcmV;B0B`@K-UIL41F%>DvsnRE1e0)WEt3#H29q!;ER%qAE|dJiFO!hl1e1W$FO#sp zG?SmaER%pZ2D2~+GB1Kn9brKQOacH-8qBaCHW=3QiA0 ylh7pwlW*BAvw4vVACq8r29pniER%SVU9&*3BOH?-Y%P<*2qBYQ?nbl9%~~N~d^v>x diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_8af1fe2b83fc914ad833914a6f47686a168bd79e8751279ec53efb41381dd431.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_8af1fe2b83fc914ad833914a6f47686a168bd79e8751279ec53efb41381dd431.json index a9482783b70f06beedcf118167984b66cac29130..cc9936ca2a6343ae7ba4847d9b6383d9f681b75e 100644 GIT binary patch delta 477 zcmZ{gKWI}?6vjDl^IjAUk3e-O`3G4V?#sJR5`_{mC^~eBODhqffevYF8?%Xn*sYTq z@*#H+q`25cc<~NzXoR<9Eg9NDC{!Fo0xh8>xEb$D#i8PME}Z-QzTfGLB1b2&ygd&Il6&zOvv%7ezgk3@Y(0eGWYWk+d};) z-n}XVMmB0)1CQU^*eK=kdS1Xf;n)!Fr|lHU;3k`PgcnOyJ5qMX?oo>LOQk@&KW$t#t;nopC$>z_ad}&3H=XF zdygTdv)YlN;pOCnx;U znf^e6(Rk7X_R0ErI$&M%4n2^WEa1etdBc56c@*uN>a^LmUtndtCJvIHEI&^VVRFJl z^Ub|eMA@bT<&7shtkaqNp-XS_+Ia?GM=vmA-M*iVaW~KQ2qVTGE@bW7fezavGkt>! RqweHO{EFLsqZk(`0szt>VygfE diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_8dd8d6620ba68bceb5a65a1c2b80daadb7e1a4cc0c58c52450dd44d5ca462e4a.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_8dd8d6620ba68bceb5a65a1c2b80daadb7e1a4cc0c58c52450dd44d5ca462e4a.json index ce2797542019b61cc3dbb27ab344f4485c11f658..69eca593fbc29f7d9bf9ab63d2b972834d6aa79b 100644 GIT binary patch delta 103 zcmV-t0GR)P{{o1B1F%>DvsVFD1e5SgEt9ZKFq8i%FOx7uEt4RW1hYK`_b-!xXfU%k zHbobcuT3+PcU~^DuuaD@lYnS1lZ{s~lh0KwlQ4}0lQ3s2lTexjlYo6HvowKT9Fr0T JA+z9}pdnk;DIEX+ delta 112 zcmeBZU~c%&v>}3Vb0lLZ%jESP29xLO8%;J4*4~`K_Dg^A2Q{|MQ_Y;jC+%jN{69_) ztl)kbP#mbZ-&J$cZsW-ZgjqKK_G2-cd_k3Ma>7=f&2fz{WhTd^X)&2tPCm$?G+Ab; P&g9(vQk&P!i&6vtJk>6q diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_f1f82e9e31d7112f92816896406df8382ca43f73cf9e63aa985c1add075d0264.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_limit/msg_GetVotePollsByEndDateRequest_f1f82e9e31d7112f92816896406df8382ca43f73cf9e63aa985c1add075d0264.json index 586068b1ce6449ad21f4958b346d5d471ea8c1fa..5632a3d6a370e92ba3ad136b450a200e28b81a97 100644 GIT binary patch delta 66 zcmeyknCZ+CrVWvdn`!BPQHc1zg fkYEP03{HO{lmBHZ0yH_3feIp%V0SFD*l=_q10x%? diff --git a/packages/rs-sdk/tests/vectors/vote_polls_by_ts_ok/msg_GetVotePollsByEndDateRequest_90f99444544de47f7e78de44bcaca1b6ba4883a92f4533995dbfdbc5875d8bef.json b/packages/rs-sdk/tests/vectors/vote_polls_by_ts_ok/msg_GetVotePollsByEndDateRequest_90f99444544de47f7e78de44bcaca1b6ba4883a92f4533995dbfdbc5875d8bef.json index cce948bda87798ddd679144dc61de456b005391f..3c11f996f3a7c24bf3225ba32e428e5adb8a1ad8 100644 GIT binary patch delta 234 zcmaF*g>~U~)(Lwz?g?X=tWd2xc|kD{>lsbn;LbAnys6ga`K-V6Cp$bf-aOybNqq8# zRK02DjBJw?7U@i$uu^xLBBR0NGpf3q=lMDm0aXE2%CSs#sMOgka3EI>B(S;uo{c=R z%w&NB31C&K{yLLC7_v;)4`bBdyy4$$S&*vfan_8zlNBP_r^{3@>P)_{k!`ZSuHNJW zQf!kyl;}(@_`tGRe#&}Qpi<+>{_lV;eQGfMK?)<-+1mwF7=6S+rfdhAA}KpLh*NR; Oyh=v5?c9-!QHlVU8(n$; delta 300 zcmZ4Zo%QJ#)(Lwz?h9qv?7-S?FgYO3Xz~Xa-N_C&*(cwT)t#IW%QoFUj8SLuhe>Rk z_nXy0!=x;%4Bmx`ejy- zDU%%8C*RN0nVw+9sJD6jvv=YsmQ7EPVPxN&@c)-A&;+*WaVCtq(-X3QZUj1HvI7^} zW`QYgV8;NB*}l&i=$`HNMvReM7^)2?uRo--`TQy_WYtPylP}b0F_~CS-pHji{Z~b1)(QJI?hRv^Y~ZImc|oe~W(U?NgUJC;jW;habrPRE;kVx85AAG|qe~1X zUkKBh+~BW2xj@fwQnJowhlwhTlLM5Drx!3X>VOn(Zt%}50BY6W{9*rGIWVLDo{c<+ zG5N#(36lf(SvG6es<44fpFDpNSkL4FYkiR3?FuT42Y9yY3o+_&fiz6dvu5m_oY2O; vxi`%fq9gtt$bklv9~6Kc3ew>t4pO@vs8&*TauAo|^mUbtZri0J8KV>dm^oYj delta 331 zcmZvXKS%;$0LA&@?gT4ph@_z~x9t9Wcm=hIK@bFY6cGvL7#*P(I0=DsgjtWcwN@iK z`=DzGvx1CX_Tq%fTbj+>J>OHtP5 zpA;0T0&7jj0tha0a5L)R$b^+k5EWG5P`?ke{WqOh?j}({w*+Qu4<;I~0^If*6Xk$x0i~U~)(Lwz?g?X=tWd2xc|kD{>lsbn;LbAnys6ga`K-V6Cp$bf-aOybNqq8# zRK02DjBJw?7U@i$uu^xLBBR0NGpf3q=lMDm0aXE2%CSs#sMOgka3EI>B(S;uo{c=R z%w&NB31C&K{yLLC7_v;)4`bBdyy4$$S&*vfan_8zlNBP_r^{3@>P)_{k!`ZSuHNJW zQf!kyl;}(@_`tGRe#&}Qpi<+>{_lV;eQGfMK?)<-+1mwF7=6S+rfdhAA}KpLh*NR; Oyh=v5?c9-!QHlVU8(n$; delta 300 zcmZ4Zo%QJ#)(Lwz?h9qv?7-S?FgYO3Xz~Xa-N_C&*(cwT)t#IW%QoFUj8SLuhe>Rk z_nXy0!=x;%4Bmx`ejy- zDU%%8C*RN0nVw+9sJD6jvv=YsmQ7EPVPxN&@c)-A&;+*WaVCtq(-X3QZUj1HvI7^} zW`QYgV8;NB*}l&i=$`HNMvReM7^)2?uRo--`TQy_WYtPylP}b0F_~CS-pHji{Z Date: Sun, 13 Sep 2026 19:11:55 +0700 Subject: [PATCH 4/7] test(sdk): gate FFI replays of V0 vectors and verify a recorded V1 proof in WASM rs-sdk-ffi replays the rs-sdk vector directories through the FFI mock handle, so the seven tests that hit the V0-only recordings get the same ignore reason as their rs-sdk counterparts. In wasm-drive-verify, the shared mock proof now starts with the bincode-encoded V1 envelope discriminant so the empty-request success tests still reach Drive, and a recorded V1 identity-balance proof from the drive-proof-verifier corpus is verified through the exported verifyIdentityBalanceForIdentityId, pinning its root hash and balance. Co-Authored-By: Claude Fable 5.1 --- .../integration_tests/contested_resource.rs | 4 +++ .../tests/integration_tests/identity.rs | 2 ++ .../tests/integration_tests/token.rs | 1 + .../wasm-drive-verify/tests/common/mod.rs | 11 +++++-- .../wasm-drive-verify/tests/identity_tests.rs | 32 +++++++++++++++++++ 5 files changed, 48 insertions(+), 2 deletions(-) diff --git a/packages/rs-sdk-ffi/tests/integration_tests/contested_resource.rs b/packages/rs-sdk-ffi/tests/integration_tests/contested_resource.rs index 489f0ebedd1..54e4a1f6379 100644 --- a/packages/rs-sdk-ffi/tests/integration_tests/contested_resource.rs +++ b/packages/rs-sdk-ffi/tests/integration_tests/contested_resource.rs @@ -41,6 +41,7 @@ fn test_contested_resource_identity_votes() { /// Test fetching contested resources #[test] +#[ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)"] fn test_contested_resources() { setup_logs(); @@ -84,6 +85,7 @@ fn test_contested_resources() { /// Test fetching vote state for a contested resource #[test] +#[ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)"] fn test_contested_resource_vote_state() { setup_logs(); @@ -135,6 +137,7 @@ fn test_contested_resource_vote_state() { /// Test fetching voters for a specific identity in a contested resource #[test] +#[ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)"] fn test_contested_resource_voters_for_identity() { setup_logs(); @@ -189,6 +192,7 @@ fn test_contested_resource_voters_for_identity() { /// Test complex contested resource vote state query #[test] +#[ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform with the contested-name prerequisites (dashpay/platform#3720)"] fn test_contested_resource_vote_state_complex() { setup_logs(); diff --git a/packages/rs-sdk-ffi/tests/integration_tests/identity.rs b/packages/rs-sdk-ffi/tests/integration_tests/identity.rs index 165c92ccda5..aa59d7f7018 100644 --- a/packages/rs-sdk-ffi/tests/integration_tests/identity.rs +++ b/packages/rs-sdk-ffi/tests/integration_tests/identity.rs @@ -29,6 +29,7 @@ fn test_identity_read_not_found() { /// Test fetching an existing identity #[test] +#[ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform"] fn test_identity_read() { setup_logs(); @@ -58,6 +59,7 @@ fn test_identity_read() { /// Test fetching identity balance #[test] +#[ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform"] fn test_identity_balance() { setup_logs(); diff --git a/packages/rs-sdk-ffi/tests/integration_tests/token.rs b/packages/rs-sdk-ffi/tests/integration_tests/token.rs index 67ece97dcb4..3ac46f6fa40 100644 --- a/packages/rs-sdk-ffi/tests/integration_tests/token.rs +++ b/packages/rs-sdk-ffi/tests/integration_tests/token.rs @@ -78,6 +78,7 @@ fn test_token_identities_balances() { /// Test fetching total supply for a token #[test] +#[ignore = "recorded vectors carry GroveDB V0 proofs; regenerate against a running Platform"] fn test_token_total_supply() { setup_logs(); diff --git a/packages/wasm-drive-verify/tests/common/mod.rs b/packages/wasm-drive-verify/tests/common/mod.rs index 43842a67aca..6093720dbe7 100644 --- a/packages/wasm-drive-verify/tests/common/mod.rs +++ b/packages/wasm-drive-verify/tests/common/mod.rs @@ -4,9 +4,16 @@ use wasm_bindgen_test::*; wasm_bindgen_test_configure!(run_in_browser); -/// Generate a mock proof for testing +/// Generate a mock proof for testing. +/// +/// The buffer starts with the bincode-encoded GroveDB V1 envelope +/// discriminant so it clears the envelope policy that every public entry +/// point applies first; the rest is filler that never decodes as a proof. pub fn mock_proof(size: usize) -> Vec { - vec![0xAB; size] + let mut proof = bincode::encode_to_vec(1u32, bincode::config::standard().with_big_endian()) + .expect("encode V1 envelope discriminant"); + proof.resize(size.max(proof.len()), 0xAB); + proof } /// Generate a mock 32-byte identifier diff --git a/packages/wasm-drive-verify/tests/identity_tests.rs b/packages/wasm-drive-verify/tests/identity_tests.rs index f68e7f132ba..4a02e1a2078 100644 --- a/packages/wasm-drive-verify/tests/identity_tests.rs +++ b/packages/wasm-drive-verify/tests/identity_tests.rs @@ -164,3 +164,35 @@ fn test_verify_identity_by_non_unique_public_key_hash_rejects_v0_outer_proof() { "unsupported GroveDB proof envelope version 0", ); } + +/// A recorded V1 identity-balance proof from the `drive-proof-verifier` +/// regression corpus, verified through the exported WASM entry point so a +/// valid V1 envelope is known to survive the `Uint8Array` copy and the +/// envelope gate. +#[wasm_bindgen_test] +fn test_verify_identity_balance_accepts_recorded_v1_proof() { + const PROOF_HEX: &str = + include_str!("../../rs-drive-proof-verifier/tests/vectors/identity-balance/proof.hex"); + const EXPECTED_ROOT_HASH_HEX: &str = + "dad905d8fddd7a31089ed57521ff006ec5946b5648d48056bce493357675ab72"; + const RECORDED_PLATFORM_VERSION: u32 = 12; + + let proof_bytes = hex::decode(PROOF_HEX.trim()).expect("decode recorded proof"); + assert_eq!(proof_bytes[0], 1, "corpus fixture must be a V1 envelope"); + let proof = Uint8Array::from(&proof_bytes[..]); + let identity_id = Uint8Array::from(&[0x77u8; 32][..]); + + let result = verify_identity_balance_for_identity_id( + &proof, + &identity_id, + false, + RECORDED_PLATFORM_VERSION, + ) + .expect("recorded V1 proof must verify"); + + assert_eq!( + hex::encode(result.root_hash().to_vec()), + EXPECTED_ROOT_HASH_HEX + ); + assert_eq!(result.balance(), Some(5_000_000_000)); +} From d159a5446f5707bbd804be2c80dcdf66abccb5cf Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 13 Sep 2026 19:54:23 +0700 Subject: [PATCH 5/7] fix(sdk)!: tie the GroveDB proof envelope floor to the protocol version Replace the hard-coded "envelope must be V1" check with a per-protocol- version floor: SystemLimits::minimum_grovedb_proof_envelope_version is 0 for every shipped protocol version and 1 from v14, and the gates reject only envelopes below it. Newer envelopes pass the gate and fail in GroveDB's own decoder if the client does not know them. drive-proof-verifier reads the floor in supported_grovedb_proof_bytes and verify_tenderdash_proof (platform_version is now threaded through), wasm-drive-verify in supported_grovedb_proof for the JavaScript and native entry points, and Drive's compacted address proof v1 for its two nested proofs. The error now names the envelope version, the floor, and the protocol version that set it. Tests cover both sides of the boundary: v14 rejects V0, v13 still lets it through, and V1 and newer pass the gate. Co-Authored-By: Claude Fable 5.1 --- packages/rs-drive-proof-verifier/src/error.rs | 10 +- packages/rs-drive-proof-verifier/src/proof.rs | 187 +++++++++--------- .../src/proof/chained_document.rs | 9 +- .../src/proof/composite_document.rs | 9 +- .../src/proof/document_average.rs | 25 +-- .../src/proof/document_count.rs | 35 ++-- .../src/proof/document_having.rs | 9 +- .../src/proof/document_ranked.rs | 9 +- .../src/proof/document_sum.rs | 28 +-- .../src/proof/groups.rs | 18 +- .../src/proof/identity_token_balance.rs | 10 +- .../src/proof/token_contract_info.rs | 6 +- .../src/proof/token_direct_purchase.rs | 6 +- .../src/proof/token_info.rs | 10 +- ...token_perpetual_distribution_last_claim.rs | 12 +- .../token_pre_programmed_distributions.rs | 6 +- .../src/proof/token_status.rs | 6 +- .../src/proof/token_total_supply.rs | 6 +- .../rs-drive-proof-verifier/src/verify.rs | 140 +++++++++---- .../v1/mod.rs | 31 ++- .../src/version/mocks/v2_test.rs | 1 + .../src/version/system_limits/mod.rs | 15 ++ .../src/version/system_limits/v1.rs | 1 + .../src/version/system_limits/v2.rs | 1 + .../src/version/system_limits/v3.rs | 1 + .../src/version/system_limits/v4.rs | 6 +- .../rs-platform-version/src/version/v14.rs | 10 +- .../src/contract/verify_contract.rs | 4 +- .../src/contract/verify_contract_history.rs | 4 +- .../src/document/verify_proof.rs | 7 +- .../document/verify_proof_keep_serialized.rs | 7 +- .../verify_start_at_document_in_proof.rs | 4 +- .../src/group/verify_action_signers.rs | 6 +- .../verify_action_signers_total_power.rs | 4 +- .../src/group/verify_active_action_infos.rs | 6 +- .../src/group/verify_group_info.rs | 4 +- .../group/verify_group_infos_in_contract.rs | 6 +- ...fy_full_identities_by_public_key_hashes.rs | 6 +- .../verify_full_identity_by_identity_id.rs | 4 +- ..._identity_by_non_unique_public_key_hash.rs | 6 +- ...full_identity_by_unique_public_key_hash.rs | 4 +- .../verify_identities_contract_keys.rs | 4 +- ...ty_balance_and_revision_for_identity_id.rs | 4 +- ...verify_identity_balance_for_identity_id.rs | 4 +- ...rify_identity_balances_for_identity_ids.rs | 6 +- .../verify_identity_contract_nonce.rs | 4 +- ...entity_id_by_non_unique_public_key_hash.rs | 4 +- ...y_identity_id_by_unique_public_key_hash.rs | 4 +- ...dentity_ids_by_unique_public_key_hashes.rs | 6 +- .../verify_identity_keys_by_identity_id.rs | 4 +- .../src/identity/verify_identity_nonce.rs | 4 +- ...erify_identity_revision_for_identity_id.rs | 4 +- packages/wasm-drive-verify/src/native.rs | 130 +++++++----- .../single_document/verify_single_document.rs | 4 +- ...tate_transition_was_executed_with_proof.rs | 4 +- .../src/system/verify_epoch_infos.rs | 4 +- .../src/system/verify_epoch_proposers.rs | 10 +- .../system/verify_total_credits_in_system.rs | 4 +- .../src/system/verify_upgrade_state.rs | 10 +- .../src/system/verify_upgrade_vote_status.rs | 4 +- .../verify_token_balance_for_identity_id.rs | 4 +- .../verify_token_balances_for_identity_id.rs | 6 +- .../verify_token_balances_for_identity_ids.rs | 6 +- .../src/tokens/verify_token_contract_info.rs | 4 +- .../verify_token_direct_selling_price.rs | 4 +- .../verify_token_direct_selling_prices.rs | 6 +- .../verify_token_info_for_identity_id.rs | 4 +- .../verify_token_infos_for_identity_id.rs | 6 +- .../verify_token_infos_for_identity_ids.rs | 6 +- ...n_perpetual_distribution_last_paid_time.rs | 4 +- ...rify_token_pre_programmed_distributions.rs | 6 +- .../src/tokens/verify_token_status.rs | 4 +- .../src/tokens/verify_token_statuses.rs | 6 +- ..._supply_and_aggregated_identity_balance.rs | 4 +- packages/wasm-drive-verify/src/utils/proof.rs | 64 ++++-- .../src/voting/verify_contests_proof.rs | 7 +- .../verify_identity_votes_given_proof.rs | 6 +- .../src/voting/verify_masternode_vote.rs | 4 +- .../src/voting/verify_specialized_balance.rs | 4 +- .../verify_vote_poll_vote_state_proof.rs | 7 +- .../voting/verify_vote_poll_votes_proof.rs | 7 +- .../verify_vote_polls_end_date_query.rs | 12 +- .../wasm-drive-verify/tests/identity_tests.rs | 15 +- 83 files changed, 664 insertions(+), 429 deletions(-) diff --git a/packages/rs-drive-proof-verifier/src/error.rs b/packages/rs-drive-proof-verifier/src/error.rs index 019ac0c4eb1..84d34416f34 100644 --- a/packages/rs-drive-proof-verifier/src/error.rs +++ b/packages/rs-drive-proof-verifier/src/error.rs @@ -44,11 +44,15 @@ pub enum Error { #[error("no proof in result")] NoProofInResult, - /// Legacy or unknown GroveDB proof envelope version + /// GroveDB proof envelope older than the protocol version's floor #[error( - "unsupported GroveDB proof envelope version {version}: current-state responses require V1" + "GroveDB proof envelope version {version} is below the minimum {minimum} required by protocol version {protocol_version}" )] - UnsupportedGroveDBProofVersion { version: u32 }, + UnsupportedGroveDBProofVersion { + version: u32, + minimum: u32, + protocol_version: u32, + }, /// Requested object not found #[error("requested object not found")] diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index d088762bcab..0f19c84eb82 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -47,7 +47,7 @@ pub mod token_total_supply; use crate::from_request::TryFromRequest; use crate::verify::{ - current_grovedb_proof_bytes, require_current_grovedb_proof_bytes, verify_tenderdash_proof, verify_tenderdash_signature, + supported_grovedb_proof_bytes, require_supported_grovedb_proof_bytes, verify_tenderdash_proof, verify_tenderdash_signature, }; use crate::{types::*, ContextProvider, DataContractProvider, Error}; use dapi_grpc::platform::v0::get_evonodes_proposed_epoch_blocks_by_range_request::get_evonodes_proposed_epoch_blocks_by_range_request_v0::Start; @@ -326,14 +326,14 @@ impl FromProof for Identity { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_full_identity_by_identity_id( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, false, id.into_buffer(), platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((maybe_identity, mtd.clone(), proof.clone())) } @@ -375,13 +375,13 @@ impl FromProof for Identity { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_full_identity_by_unique_public_key_hash( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, public_key_hash, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((maybe_identity, mtd.clone(), proof.clone())) } @@ -449,10 +449,10 @@ impl FromProof for Identit let proof = proved_response .grovedb_identity_public_key_hash_proof .ok_or(Error::NoProofInResult)?; - require_current_grovedb_proof_bytes(&proof.grovedb_proof)?; + require_supported_grovedb_proof_bytes(&proof.grovedb_proof, platform_version)?; if let Some(identity_proof) = proved_response.identity_proof_bytes.as_deref() { - require_current_grovedb_proof_bytes(identity_proof)?; + require_supported_grovedb_proof_bytes(identity_proof, platform_version)?; } let proof_tuple = IdentityAndNonUniquePublicKeyHashDoubleProof { @@ -487,7 +487,7 @@ impl FromProof for Identit _ => e.into(), })?; - verify_tenderdash_proof(&proof, &mtd, &root_hash, provider)?; + verify_tenderdash_proof(&proof, &mtd, &root_hash, provider, platform_version)?; Ok((maybe_identity, mtd.clone(), proof)) } @@ -543,7 +543,7 @@ impl FromProof for IdentityPublicKeys { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_identity_keys_by_identity_id( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, key_request, false, false, @@ -576,7 +576,7 @@ impl FromProof for IdentityPublicKeys { None }; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((maybe_keys, mtd.clone(), proof.clone())) } @@ -671,14 +671,14 @@ impl FromProof for IdentityNonceFetcher { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_nonce) = Drive::verify_identity_nonce( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, identity_id.into_buffer(), false, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(( maybe_nonce.map(IdentityNonceFetcher), @@ -725,7 +725,7 @@ impl FromProof for IdentityContractNo // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_identity_contract_nonce( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, identity_id.into_buffer(), contract_id.into_buffer(), false, @@ -733,7 +733,7 @@ impl FromProof for IdentityContractNo ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(( maybe_identity.map(IdentityContractNonceFetcher), @@ -774,14 +774,14 @@ impl FromProof for IdentityBalance { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_identity_balance_for_identity_id( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, id.into_buffer(), false, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((maybe_identity, mtd.clone(), proof.clone())) } @@ -823,14 +823,14 @@ impl FromProof for IdentityBalances { }) .collect::, Error>>()?; let (root_hash, balances) = Drive::verify_identity_balances_for_identity_ids( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, false, &identity_ids, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((Some(balances), mtd.clone(), proof.clone())) } @@ -869,14 +869,14 @@ impl FromProof for IdentityBalan // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_identity) = Drive::verify_identity_balance_and_revision_for_identity_id( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, id.into_buffer(), false, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((maybe_identity, mtd.clone(), proof.clone())) } @@ -910,14 +910,14 @@ impl FromProof for AddressInfo { }; let (root_hash, maybe_info) = Drive::verify_address_info( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, &address, false, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; let info = maybe_info.map(|(nonce, balance)| AddressInfo { address, @@ -966,14 +966,14 @@ impl FromProof for AddressInfos { _, Vec<(PlatformAddress, Option<(AddressNonce, Credits)>)>, >( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, addresses.iter(), false, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; let infos = entries .into_iter() @@ -1024,7 +1024,7 @@ impl FromProof for RecentAddres let (root_hash, verified_changes) = if start_height_exclusive { Drive::verify_recent_address_balance_changes_after( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, start_height, limit, false, @@ -1033,7 +1033,7 @@ impl FromProof for RecentAddres .map_drive_error(proof, mtd)? } else { Drive::verify_recent_address_balance_changes( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, start_height, limit, false, @@ -1042,7 +1042,7 @@ impl FromProof for RecentAddres .map_drive_error(proof, mtd)? }; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; let result = RecentAddressBalanceChanges( verified_changes @@ -1100,7 +1100,7 @@ impl FromProof .verify_compacted_address_balance_changes == 0 { - require_current_grovedb_proof_bytes(&proof.grovedb_proof)?; + require_supported_grovedb_proof_bytes(&proof.grovedb_proof, platform_version)?; } let (root_hash, verified_changes) = Drive::verify_compacted_address_balance_changes( @@ -1215,7 +1215,7 @@ impl FromProof for DataContract { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_contract) = Drive::verify_contract( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, None, false, false, @@ -1224,7 +1224,7 @@ impl FromProof for DataContract { ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((maybe_contract, mtd.clone(), proof.clone())) } @@ -1262,7 +1262,7 @@ impl FromProof for (DataContract, Vec) { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_contract) = Drive::verify_contract_return_serialization( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, None, false, false, @@ -1271,7 +1271,7 @@ impl FromProof for (DataContract, Vec) { ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((maybe_contract, mtd.clone(), proof.clone())) } @@ -1314,14 +1314,14 @@ impl FromProof for DataContracts { // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, contracts) = Drive::verify_contracts( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, false, ids.as_slice(), platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; let contracts = contracts .into_iter() .map(|(k, v)| { @@ -1379,7 +1379,7 @@ impl FromProof for DataContractHistory // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, maybe_history) = Drive::verify_contract_history( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, id.into_buffer(), start_at_ms, limit, @@ -1388,7 +1388,7 @@ impl FromProof for DataContractHistory ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(( maybe_history.map(IndexMap::from_iter), @@ -1455,7 +1455,7 @@ impl FromProof for DocumentHistory { })?; let (root_hash, maybe_history) = Drive::verify_document_history( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, contract_id.into_buffer(), &document_type_name, document_type, @@ -1467,7 +1467,7 @@ impl FromProof for DocumentHistory { ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; // Preserve the distinction between a verified-but-empty history page // (e.g. an offset/start_at_ms past the last revision) and an absent @@ -1531,13 +1531,13 @@ impl FromProof for StateTransitionPro let (root_hash, outcome) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, &block_info, - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, &contracts_provider_fn, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((Some(outcome), mtd.clone(), proof.clone())) } @@ -1621,7 +1621,7 @@ impl FromProof for ExtendedEpochInfos { let count = try_u32_to_u16(count)?; let (root_hash, epoch_info) = Drive::verify_epoch_infos( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, current_epoch, start_epoch, count, @@ -1642,7 +1642,7 @@ impl FromProof for ExtendedEpochInfos { }) .collect::(); - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((epoch_info.into_option(), mtd.clone(), proof.clone())) } @@ -1687,7 +1687,7 @@ impl FromProof for FinalizedEpochInfos let end_epoch_index: EpochIndex = try_u32_to_u16(end_epoch_index)?; let (root_hash, epoch_info) = Drive::verify_finalized_epoch_infos( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, start_epoch_index, start_epoch_index_included, end_epoch_index, @@ -1701,7 +1701,7 @@ impl FromProof for FinalizedEpochInfos .map(|(epoch_index, finalized_epoch_info)| (epoch_index, Some(finalized_epoch_info))) .collect::(); - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((epoch_info.into_option(), mtd.clone(), proof.clone())) } @@ -1733,11 +1733,13 @@ impl FromProof for ProtocolVersionUpgrade let proof = response.proof().or(Err(Error::NoProofInResult))?; let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; - let (root_hash, objects) = - Drive::verify_upgrade_state(current_grovedb_proof_bytes(proof)?, platform_version) - .map_drive_error(proof, mtd)?; + let (root_hash, objects) = Drive::verify_upgrade_state( + supported_grovedb_proof_bytes(proof, platform_version)?, + platform_version, + ) + .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; // Convert objects to a map of Option values let response: Self = objects.into_iter().map(|(k, v)| (k, Some(v))).collect(); @@ -1784,14 +1786,14 @@ impl FromProof for MasternodeProtoco let count = try_u32_to_u16(request_v0.count)?; let (root_hash, objects) = Drive::verify_upgrade_vote_status( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, start_pro_tx_hash, count, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; if objects.is_empty() { return Ok((None, mtd.clone(), proof.clone())); @@ -1848,14 +1850,14 @@ impl FromProof for Elements { let keys = request_v0.keys; let (root_hash, objects) = Drive::verify_elements( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, path, keys, platform_version, )?; let elements: Elements = Elements::from_iter(objects); - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((elements.into_option(), mtd.clone(), proof.clone())) } @@ -1896,7 +1898,10 @@ where let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, documents) = request - .verify_proof(current_grovedb_proof_bytes(proof)?, platform_version) + .verify_proof( + supported_grovedb_proof_bytes(proof, platform_version)?, + platform_version, + ) .map_drive_error(proof, mtd)?; let documents = documents @@ -1904,7 +1909,7 @@ where .map(|d| (d.id(), Some(d))) .collect::(); - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((documents.into_option(), mtd.clone(), proof.clone())) } @@ -1971,7 +1976,7 @@ impl FromProof for IdentitiesContrac // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, identities_contract_keys) = Drive::verify_identities_contract_keys( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, identities_ids.as_slice(), &contract_id, document_type_name, @@ -1981,7 +1986,7 @@ impl FromProof for IdentitiesContrac ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; if identities_contract_keys.is_empty() { return Ok((None, mtd.clone(), proof.clone())); @@ -2019,10 +2024,13 @@ impl FromProof for ContestedResources { let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, items) = resolved_request - .verify_contests_proof(current_grovedb_proof_bytes(proof)?, platform_version) + .verify_contests_proof( + supported_grovedb_proof_bytes(proof, platform_version)?, + platform_version, + ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; let resources: ContestedResources = items.into_iter().map(ContestedResource).collect(); @@ -2062,12 +2070,12 @@ impl FromProof for Contenders { let (root_hash, contested_resource_vote_state) = resolved_request .verify_vote_poll_vote_state_proof( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; let contenders = contested_resource_vote_state .contenders @@ -2116,10 +2124,13 @@ impl FromProof for Voters { let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, voters) = resolved_request - .verify_vote_poll_votes_proof(current_grovedb_proof_bytes(proof)?, platform_version) + .verify_vote_poll_votes_proof( + supported_grovedb_proof_bytes(proof, platform_version)?, + platform_version, + ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; if voters.is_empty() { return Ok((None, mtd.clone(), proof.clone())); @@ -2157,13 +2168,13 @@ impl FromProof for ResourceV let contract_provider_fn = provider.as_contract_lookup_fn(platform_version); let (root_hash, voters) = drive_query .verify_identity_votes_given_proof::>( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, &contract_provider_fn, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; let response: ResourceVotesByIdentity = voters .into_iter() @@ -2200,12 +2211,12 @@ impl FromProof for VotePollsGroupedByTim let (root_hash, vote_polls) = drive_query .verify_vote_polls_by_end_date_proof::>( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; let response = VotePollsGroupedByTimestamp(vote_polls).sorted(drive_query.order_ascending); @@ -2243,14 +2254,14 @@ impl FromProof for PrefundedSpe let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, balance) = Drive::verify_specialized_balance( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, balance_id.into_buffer(), false, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((balance.map(|v| v.into()), mtd.clone(), proof.clone())) } @@ -2336,7 +2347,7 @@ impl FromProof for TotalCreditsInPla let core_subsidy_halving_interval = network.core_subsidy_halving_interval(); let (root_hash, credits) = Drive::verify_total_credits_in_system( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, core_subsidy_halving_interval, || { provider.get_platform_activation_height().map_err(|e| { @@ -2348,7 +2359,7 @@ impl FromProof for TotalCreditsInPla ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(( Some(TotalCreditsInPlatform(credits)), @@ -2393,14 +2404,14 @@ impl FromProof for Propose }; let (root_hash, proposer_block_counts) = Drive::verify_epoch_proposers( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, epoch_index, ProposerQueryType::ByIds(ids), platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(( Some(ProposerBlockCounts(proposer_block_counts)), @@ -2463,14 +2474,14 @@ impl FromProof for Propo let checked_limit = limit.map(try_u32_to_u16).transpose()?; let (root_hash, proposer_block_counts) = Drive::verify_epoch_proposers( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, epoch_index, ProposerQueryType::ByRange(checked_limit, formatted_start), platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(( Some(ProposerBlockCounts(proposer_block_counts)), @@ -2518,13 +2529,13 @@ impl FromProof for ShieldedPoolState { let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, maybe_balance) = Drive::verify_shielded_pool_state( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, false, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(( maybe_balance.map(ShieldedPoolState), @@ -2557,13 +2568,13 @@ impl FromProof for ShieldedNotesCount { // `total_count` out of the `CommitmentTree` element rather than a // `SumItem` balance. let (root_hash, maybe_count) = Drive::verify_shielded_notes_count( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, false, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(( maybe_count.map(ShieldedNotesCount), @@ -2592,13 +2603,13 @@ impl FromProof for ShieldedAnchors { let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, anchors) = Drive::verify_shielded_anchors( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, false, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; let result = if anchors.is_empty() { None @@ -2629,13 +2640,13 @@ impl FromProof for MostRecentShiel let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, maybe_anchor) = Drive::verify_most_recent_shielded_anchor( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, false, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(( maybe_anchor.map(MostRecentShieldedAnchor), @@ -2678,7 +2689,7 @@ impl FromProof for ShieldedEncrypted * (1u32 << drive::drive::shielded::paths::SHIELDED_NOTES_CHUNK_POWER); let (root_hash, notes, total_count) = Drive::verify_shielded_encrypted_notes( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, start_index, count, max_elements, @@ -2687,7 +2698,7 @@ impl FromProof for ShieldedEncrypted ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; // `total_count` (the on-chain total note count) is extracted from the // same proof, so it is available even when this chunk returned no @@ -2737,14 +2748,14 @@ impl FromProof for ShieldedNullifierStat }; let (root_hash, statuses) = Drive::verify_shielded_nullifiers( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, &nullifiers, false, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; let result = if statuses.is_empty() { None @@ -3717,7 +3728,7 @@ mod tests { assert!(matches!( err, - Error::UnsupportedGroveDBProofVersion { version: 0 } + Error::UnsupportedGroveDBProofVersion { version: 0, .. } )); } @@ -3769,7 +3780,7 @@ mod tests { assert!(matches!( err, - Error::UnsupportedGroveDBProofVersion { version: 0 } + Error::UnsupportedGroveDBProofVersion { version: 0, .. } )); } diff --git a/packages/rs-drive-proof-verifier/src/proof/chained_document.rs b/packages/rs-drive-proof-verifier/src/proof/chained_document.rs index c6a25c449a1..bad9bb2412f 100644 --- a/packages/rs-drive-proof-verifier/src/proof/chained_document.rs +++ b/packages/rs-drive-proof-verifier/src/proof/chained_document.rs @@ -22,7 +22,7 @@ //! chooses, but the canonical path proves. use crate::error::MapGroveDbError; -use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; +use crate::verify::{supported_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{GetDocumentsResponse, Proof, ResponseMetadata}; use dapi_grpc::platform::VersionedGrpcResponse; @@ -68,10 +68,13 @@ pub fn verify_chained_documents_proof( provider: &dyn ContextProvider, ) -> Result<(RootHash, ChainedDocuments), Error> { let (root_hash, result) = query - .verify_chained_documents_proof(current_grovedb_proof_bytes(proof)?, platform_version) + .verify_chained_documents_proof( + supported_grovedb_proof_bytes(proof, platform_version)?, + platform_version, + ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(( root_hash, diff --git a/packages/rs-drive-proof-verifier/src/proof/composite_document.rs b/packages/rs-drive-proof-verifier/src/proof/composite_document.rs index c063ffccbf2..1db6aefb27f 100644 --- a/packages/rs-drive-proof-verifier/src/proof/composite_document.rs +++ b/packages/rs-drive-proof-verifier/src/proof/composite_document.rs @@ -21,7 +21,7 @@ //! path proves. use crate::error::MapGroveDbError; -use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; +use crate::verify::{supported_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{GetDocumentsResponse, Proof, ResponseMetadata}; use dapi_grpc::platform::VersionedGrpcResponse; @@ -63,10 +63,13 @@ pub fn verify_composite_documents_proof( provider: &dyn ContextProvider, ) -> Result<(RootHash, CompositeDocuments), Error> { let (root_hash, result) = query - .verify_composite_documents_proof(current_grovedb_proof_bytes(proof)?, platform_version) + .verify_composite_documents_proof( + supported_grovedb_proof_bytes(proof, platform_version)?, + platform_version, + ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(( root_hash, diff --git a/packages/rs-drive-proof-verifier/src/proof/document_average.rs b/packages/rs-drive-proof-verifier/src/proof/document_average.rs index c6e23317bda..b8e5ddf0b1e 100644 --- a/packages/rs-drive-proof-verifier/src/proof/document_average.rs +++ b/packages/rs-drive-proof-verifier/src/proof/document_average.rs @@ -22,7 +22,7 @@ //! `DocumentAverageMode`. use crate::error::MapGroveDbError; -use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; +use crate::verify::{supported_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error}; use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; use dpp::version::PlatformVersion; @@ -47,12 +47,12 @@ pub fn verify_point_lookup_count_and_sum_proof( ) -> Result, Error> { let (root_hash, entries) = query .verify_point_lookup_count_and_sum_proof( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(entries) } @@ -78,14 +78,14 @@ pub fn verify_distinct_count_and_sum_proof( ) -> Result, Error> { let (root_hash, entries) = query .verify_distinct_count_and_sum_proof( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, limit, left_to_right, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(entries) } @@ -148,10 +148,13 @@ pub fn verify_aggregate_count_and_sum_proof( provider: &dyn ContextProvider, ) -> Result<(u64, i64), Error> { let (root_hash, count, sum) = query - .verify_aggregate_count_and_sum_proof(current_grovedb_proof_bytes(proof)?, platform_version) + .verify_aggregate_count_and_sum_proof( + supported_grovedb_proof_bytes(proof, platform_version)?, + platform_version, + ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((count, sum)) } @@ -177,14 +180,14 @@ pub fn verify_primary_key_count_sum_tree_proof( provider: &dyn ContextProvider, ) -> Result<(u64, i64), Error> { let (root_hash, count, sum) = DriveDocumentSumQuery::verify_primary_key_count_sum_tree_proof( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, contract_id, document_type_name, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((count, sum)) } @@ -219,14 +222,14 @@ pub fn verify_carrier_aggregate_count_and_sum_proof( ) -> Result, Error> { let (root_hash, per_key_count_sum) = query .verify_carrier_aggregate_count_and_sum_proof( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, limit, left_to_right, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; let entries = per_key_count_sum .into_iter() diff --git a/packages/rs-drive-proof-verifier/src/proof/document_count.rs b/packages/rs-drive-proof-verifier/src/proof/document_count.rs index ca433717b4b..98c8ec02276 100644 --- a/packages/rs-drive-proof-verifier/src/proof/document_count.rs +++ b/packages/rs-drive-proof-verifier/src/proof/document_count.rs @@ -1,5 +1,5 @@ use crate::error::MapGroveDbError; -use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; +use crate::verify::{supported_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{GetDocumentsResponse, Proof, ResponseMetadata}; use dapi_grpc::platform::VersionedGrpcResponse; @@ -45,12 +45,15 @@ where let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, documents) = request - .verify_proof(current_grovedb_proof_bytes(proof)?, platform_version) + .verify_proof( + supported_grovedb_proof_bytes(proof, platform_version)?, + platform_version, + ) .map_drive_error(proof, mtd)?; let count = documents.len() as u64; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((Some(DocumentCount(count)), mtd.clone(), proof.clone())) } @@ -82,10 +85,13 @@ pub fn verify_aggregate_count_proof( provider: &dyn ContextProvider, ) -> Result { let (root_hash, count) = query - .verify_aggregate_count_proof(current_grovedb_proof_bytes(proof)?, platform_version) + .verify_aggregate_count_proof( + supported_grovedb_proof_bytes(proof, platform_version)?, + platform_version, + ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(count) } @@ -124,14 +130,14 @@ pub fn verify_distinct_count_proof( ) -> Result, Error> { let (root_hash, entries) = query .verify_distinct_count_proof( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, limit, left_to_right, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(entries) } @@ -188,10 +194,13 @@ pub fn verify_point_lookup_count_proof( provider: &dyn ContextProvider, ) -> Result, Error> { let (root_hash, entries) = query - .verify_point_lookup_count_proof(current_grovedb_proof_bytes(proof)?, platform_version) + .verify_point_lookup_count_proof( + supported_grovedb_proof_bytes(proof, platform_version)?, + platform_version, + ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(entries) } @@ -215,14 +224,14 @@ pub fn verify_primary_key_count_tree_proof( provider: &dyn ContextProvider, ) -> Result { let (root_hash, count) = DriveDocumentCountQuery::verify_primary_key_count_tree_proof( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, contract_id, document_type_name, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(count) } @@ -278,14 +287,14 @@ pub fn verify_carrier_aggregate_count_proof( ) -> Result, Error> { let (root_hash, per_key_counts) = query .verify_carrier_aggregate_count_proof( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, limit, left_to_right, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; // Map drive's `Vec<(Vec, u64)>` carrier shape onto the // SDK's `Vec` so the call sites can stay diff --git a/packages/rs-drive-proof-verifier/src/proof/document_having.rs b/packages/rs-drive-proof-verifier/src/proof/document_having.rs index 757763058d2..008cbe9c3c0 100644 --- a/packages/rs-drive-proof-verifier/src/proof/document_having.rs +++ b/packages/rs-drive-proof-verifier/src/proof/document_having.rs @@ -27,7 +27,7 @@ use crate::error::MapGroveDbError; use crate::proof::document_ranked::{ranked_entry_from_proto, result_variant_name}; -use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; +use crate::verify::{supported_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::get_documents_response::get_documents_response_v1::{ result_data, ResultData, @@ -174,10 +174,13 @@ pub fn verify_having_range_proof( provider: &dyn ContextProvider, ) -> Result<(RootHash, Vec), Error> { let (root_hash, entries) = query - .verify_having_range_proof(current_grovedb_proof_bytes(proof)?, platform_version) + .verify_having_range_proof( + supported_grovedb_proof_bytes(proof, platform_version)?, + platform_version, + ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((root_hash, entries)) } diff --git a/packages/rs-drive-proof-verifier/src/proof/document_ranked.rs b/packages/rs-drive-proof-verifier/src/proof/document_ranked.rs index 5499b0dcc29..6c3a96c7fb8 100644 --- a/packages/rs-drive-proof-verifier/src/proof/document_ranked.rs +++ b/packages/rs-drive-proof-verifier/src/proof/document_ranked.rs @@ -26,7 +26,7 @@ //! contract, which this crate does not carry. use crate::error::MapGroveDbError; -use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; +use crate::verify::{supported_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::get_documents_response::get_documents_response_v1::{ ranked_entry, result_data, RankedEntry as ProtoRankedEntry, ResultData, @@ -332,10 +332,13 @@ pub fn verify_ranked_top_k_proof( provider: &dyn ContextProvider, ) -> Result<(RootHash, RankedPage), Error> { let (root_hash, page) = query - .verify_ranked_top_k_proof(current_grovedb_proof_bytes(proof)?, platform_version) + .verify_ranked_top_k_proof( + supported_grovedb_proof_bytes(proof, platform_version)?, + platform_version, + ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok((root_hash, page)) } diff --git a/packages/rs-drive-proof-verifier/src/proof/document_sum.rs b/packages/rs-drive-proof-verifier/src/proof/document_sum.rs index f5a2c9503c2..4814b3d4d4b 100644 --- a/packages/rs-drive-proof-verifier/src/proof/document_sum.rs +++ b/packages/rs-drive-proof-verifier/src/proof/document_sum.rs @@ -17,7 +17,7 @@ //! `DocumentSumMode`. use crate::error::MapGroveDbError; -use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; +use crate::verify::{supported_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error}; use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; use dpp::version::PlatformVersion; @@ -61,10 +61,13 @@ pub fn verify_aggregate_sum_proof( provider: &dyn ContextProvider, ) -> Result { let (root_hash, sum) = query - .verify_aggregate_sum_proof(current_grovedb_proof_bytes(proof)?, platform_version) + .verify_aggregate_sum_proof( + supported_grovedb_proof_bytes(proof, platform_version)?, + platform_version, + ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(sum) } @@ -88,14 +91,14 @@ pub fn verify_primary_key_sum_tree_proof( provider: &dyn ContextProvider, ) -> Result { let (root_hash, sum) = DriveDocumentSumQuery::verify_primary_key_sum_tree_proof( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, contract_id, document_type_name, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(sum) } @@ -119,10 +122,13 @@ pub fn verify_point_lookup_sum_proof( provider: &dyn ContextProvider, ) -> Result, Error> { let (root_hash, entries) = query - .verify_point_lookup_sum_proof(current_grovedb_proof_bytes(proof)?, platform_version) + .verify_point_lookup_sum_proof( + supported_grovedb_proof_bytes(proof, platform_version)?, + platform_version, + ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(entries) } @@ -149,14 +155,14 @@ pub fn verify_distinct_sum_proof( ) -> Result, Error> { let (root_hash, entries) = query .verify_distinct_sum_proof( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, limit, left_to_right, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; Ok(entries) } @@ -191,14 +197,14 @@ pub fn verify_carrier_aggregate_sum_proof( ) -> Result, Error> { let (root_hash, per_key_sums) = query .verify_carrier_aggregate_sum_proof( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, limit, left_to_right, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; // Map drive's `Vec<(Vec, i64)>` carrier shape onto the // SDK's `Vec` so the call sites stay uniform. diff --git a/packages/rs-drive-proof-verifier/src/proof/groups.rs b/packages/rs-drive-proof-verifier/src/proof/groups.rs index 993997cc8a7..bd8f8ac3d46 100644 --- a/packages/rs-drive-proof-verifier/src/proof/groups.rs +++ b/packages/rs-drive-proof-verifier/src/proof/groups.rs @@ -1,6 +1,6 @@ use crate::error::MapGroveDbError; use crate::types::groups::{GroupActionSigners, GroupActions, Groups}; -use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; +use crate::verify::{supported_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{ get_group_action_signers_request, get_group_actions_request, get_group_info_request, @@ -60,7 +60,7 @@ impl FromProof for Group { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_group_info( - current_grovedb_proof_bytes(&proof)?, + supported_grovedb_proof_bytes(&proof, platform_version)?, contract_id, group_contract_position, false, @@ -68,7 +68,7 @@ impl FromProof for Group { ) .map_drive_error(&proof, &metadata)?; - verify_tenderdash_proof(&proof, &metadata, &root_hash, provider)?; + verify_tenderdash_proof(&proof, &metadata, &root_hash, provider, platform_version)?; Ok((result, metadata, proof)) } @@ -123,7 +123,7 @@ impl FromProof for Groups { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_group_infos_in_contract( - current_grovedb_proof_bytes(&proof)?, + supported_grovedb_proof_bytes(&proof, platform_version)?, contract_id, start_at_group_contract_position, count, @@ -142,7 +142,7 @@ impl FromProof for Groups { ) .map_drive_error(&proof, &metadata)?; - verify_tenderdash_proof(&proof, &metadata, &root_hash, provider)?; + verify_tenderdash_proof(&proof, &metadata, &root_hash, provider, platform_version)?; Ok((Some(result), metadata, proof)) } @@ -221,7 +221,7 @@ impl FromProof for GroupActions { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_action_infos_in_contract( - current_grovedb_proof_bytes(&proof)?, + supported_grovedb_proof_bytes(&proof, platform_version)?, contract_id, group_contract_position, status, @@ -242,7 +242,7 @@ impl FromProof for GroupActions { ) .map_drive_error(&proof, &metadata)?; - verify_tenderdash_proof(&proof, &metadata, &root_hash, provider)?; + verify_tenderdash_proof(&proof, &metadata, &root_hash, provider, platform_version)?; Ok((Some(result), metadata, proof)) } @@ -300,7 +300,7 @@ impl FromProof for GroupActionSigners { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_action_signers( - current_grovedb_proof_bytes(&proof)?, + supported_grovedb_proof_bytes(&proof, platform_version)?, contract_id, group_contract_position, status, @@ -320,7 +320,7 @@ impl FromProof for GroupActionSigners { ) .map_drive_error(&proof, &metadata)?; - verify_tenderdash_proof(&proof, &metadata, &root_hash, provider)?; + verify_tenderdash_proof(&proof, &metadata, &root_hash, provider, platform_version)?; Ok((Some(result), metadata, proof)) } diff --git a/packages/rs-drive-proof-verifier/src/proof/identity_token_balance.rs b/packages/rs-drive-proof-verifier/src/proof/identity_token_balance.rs index 516545912c4..770af0ca9b5 100644 --- a/packages/rs-drive-proof-verifier/src/proof/identity_token_balance.rs +++ b/packages/rs-drive-proof-verifier/src/proof/identity_token_balance.rs @@ -1,6 +1,6 @@ use crate::error::MapGroveDbError; use crate::types::identity_token_balance::{IdentitiesTokenBalances, IdentityTokenBalances}; -use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; +use crate::verify::{supported_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{ get_identities_token_balances_request, get_identity_token_balances_request, @@ -57,7 +57,7 @@ impl FromProof for IdentityTokenBalances { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_balances_for_identity_id( - current_grovedb_proof_bytes(&proof)?, + supported_grovedb_proof_bytes(&proof, platform_version)?, &token_ids, identity_id, false, @@ -65,7 +65,7 @@ impl FromProof for IdentityTokenBalances { ) .map_drive_error(&proof, &metadata)?; - verify_tenderdash_proof(&proof, &metadata, &root_hash, provider)?; + verify_tenderdash_proof(&proof, &metadata, &root_hash, provider, platform_version)?; Ok((Some(result), metadata, proof)) } @@ -117,7 +117,7 @@ impl FromProof for IdentitiesTokenBalances { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_balances_for_identity_ids( - current_grovedb_proof_bytes(&proof)?, + supported_grovedb_proof_bytes(&proof, platform_version)?, token_id, &identity_ids, false, @@ -125,7 +125,7 @@ impl FromProof for IdentitiesTokenBalances { ) .map_drive_error(&proof, &metadata)?; - verify_tenderdash_proof(&proof, &metadata, &root_hash, provider)?; + verify_tenderdash_proof(&proof, &metadata, &root_hash, provider, platform_version)?; Ok((Some(result), metadata, proof)) } diff --git a/packages/rs-drive-proof-verifier/src/proof/token_contract_info.rs b/packages/rs-drive-proof-verifier/src/proof/token_contract_info.rs index 3083f373d9b..fc4732f4226 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_contract_info.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_contract_info.rs @@ -1,5 +1,5 @@ use crate::error::MapGroveDbError; -use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; +use crate::verify::{supported_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{ get_token_contract_info_request, GetTokenContractInfoRequest, GetTokenContractInfoResponse, @@ -44,14 +44,14 @@ impl FromProof for TokenContractInfo { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_contract_info( - current_grovedb_proof_bytes(&proof)?, + supported_grovedb_proof_bytes(&proof, platform_version)?, token_id, false, platform_version, ) .map_drive_error(&proof, &metadata)?; - verify_tenderdash_proof(&proof, &metadata, &root_hash, provider)?; + verify_tenderdash_proof(&proof, &metadata, &root_hash, provider, platform_version)?; Ok((result, metadata, proof)) } diff --git a/packages/rs-drive-proof-verifier/src/proof/token_direct_purchase.rs b/packages/rs-drive-proof-verifier/src/proof/token_direct_purchase.rs index 7b26f80841b..0a4d2256791 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_direct_purchase.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_direct_purchase.rs @@ -1,4 +1,4 @@ -use crate::verify::current_grovedb_proof_bytes; +use crate::verify::supported_grovedb_proof_bytes; use std::collections::BTreeSet; use dapi_grpc::platform::{ @@ -58,14 +58,14 @@ impl FromProof for TokenDirectPurchasePrice // Extract content from proof and verify Drive/GroveDB proofs let (root_hash, tokens): (_, Self) = Drive::verify_token_direct_selling_prices( - current_grovedb_proof_bytes(proof)?, + supported_grovedb_proof_bytes(proof, platform_version)?, &token_ids, false, platform_version, ) .map_drive_error(proof, mtd)?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, mtd, &root_hash, provider, platform_version)?; if tokens.is_empty() { return Ok((None, mtd.clone(), proof.clone())); diff --git a/packages/rs-drive-proof-verifier/src/proof/token_info.rs b/packages/rs-drive-proof-verifier/src/proof/token_info.rs index 3d7425d68df..91052483ebd 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_info.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_info.rs @@ -1,6 +1,6 @@ use crate::error::MapGroveDbError; use crate::types::token_info::{IdentitiesTokenInfos, IdentityTokenInfos}; -use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; +use crate::verify::{supported_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{ get_identities_token_infos_request, get_identity_token_infos_request, @@ -57,7 +57,7 @@ impl FromProof for IdentityTokenInfos { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_infos_for_identity_id( - current_grovedb_proof_bytes(&proof)?, + supported_grovedb_proof_bytes(&proof, platform_version)?, &token_ids, identity_id, false, @@ -65,7 +65,7 @@ impl FromProof for IdentityTokenInfos { ) .map_drive_error(&proof, &metadata)?; - verify_tenderdash_proof(&proof, &metadata, &root_hash, provider)?; + verify_tenderdash_proof(&proof, &metadata, &root_hash, provider, platform_version)?; Ok((Some(result), metadata, proof)) } @@ -116,7 +116,7 @@ impl FromProof for IdentitiesTokenInfos { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_infos_for_identity_ids( - current_grovedb_proof_bytes(&proof)?, + supported_grovedb_proof_bytes(&proof, platform_version)?, token_id, &identity_ids, false, @@ -124,7 +124,7 @@ impl FromProof for IdentitiesTokenInfos { ) .map_drive_error(&proof, &metadata)?; - verify_tenderdash_proof(&proof, &metadata, &root_hash, provider)?; + verify_tenderdash_proof(&proof, &metadata, &root_hash, provider, platform_version)?; Ok((Some(result), metadata, proof)) } diff --git a/packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs b/packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs index e41cb755b00..38136c1eb30 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_perpetual_distribution_last_claim.rs @@ -1,4 +1,4 @@ -use crate::verify::current_grovedb_proof_bytes; +use crate::verify::supported_grovedb_proof_bytes; use dapi_grpc::platform::v0::{ get_token_perpetual_distribution_last_claim_request::Version as RequestVersion, get_token_perpetual_distribution_last_claim_response::{ @@ -96,7 +96,7 @@ impl FromProof for RewardDistribu Some(distribution_type) => { let (root_hash, moment_opt) = Drive::verify_token_perpetual_distribution_last_paid_time( - current_grovedb_proof_bytes(&proof_msg)?, + supported_grovedb_proof_bytes(&proof_msg, platform_version)?, token_id, identity_id, &distribution_type, @@ -104,7 +104,13 @@ impl FromProof for RewardDistribu platform_version, )?; - verify_tenderdash_proof(&proof_msg, &metadata, &root_hash, provider)?; + verify_tenderdash_proof( + &proof_msg, + &metadata, + &root_hash, + provider, + platform_version, + )?; // May be None if identity has not yet claimed Ok((moment_opt, metadata, proof_msg)) diff --git a/packages/rs-drive-proof-verifier/src/proof/token_pre_programmed_distributions.rs b/packages/rs-drive-proof-verifier/src/proof/token_pre_programmed_distributions.rs index 7ff5e89caa9..637b7d069fe 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_pre_programmed_distributions.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_pre_programmed_distributions.rs @@ -1,5 +1,5 @@ use crate::error::MapGroveDbError; -use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; +use crate::verify::{supported_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{types::TokenPreProgrammedDistributions, ContextProvider, Error}; use dapi_grpc::platform::v0::{ get_token_pre_programmed_distributions_request, GetTokenPreProgrammedDistributionsRequest, @@ -86,7 +86,7 @@ impl FromProof for TokenPreProgrammed let (root_hash, result): ([u8; 32], TokenPreProgrammedDistributions) = Drive::verify_token_pre_programmed_distributions( - current_grovedb_proof_bytes(&proof)?, + supported_grovedb_proof_bytes(&proof, platform_version)?, token_id, start_at, limit, @@ -95,7 +95,7 @@ impl FromProof for TokenPreProgrammed ) .map_drive_error(&proof, &metadata)?; - verify_tenderdash_proof(&proof, &metadata, &root_hash, provider)?; + verify_tenderdash_proof(&proof, &metadata, &root_hash, provider, platform_version)?; if result.0.is_empty() { Ok((None, metadata, proof)) diff --git a/packages/rs-drive-proof-verifier/src/proof/token_status.rs b/packages/rs-drive-proof-verifier/src/proof/token_status.rs index 7e8bb8dcbeb..ae6403ad176 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_status.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_status.rs @@ -1,6 +1,6 @@ use crate::error::MapGroveDbError; use crate::types::token_status::TokenStatuses; -use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; +use crate::verify::{supported_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{ get_token_statuses_request, GetTokenStatusesRequest, GetTokenStatusesResponse, Proof, @@ -47,14 +47,14 @@ impl FromProof for TokenStatuses { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_statuses( - current_grovedb_proof_bytes(&proof)?, + supported_grovedb_proof_bytes(&proof, platform_version)?, &token_ids, false, platform_version, ) .map_drive_error(&proof, &metadata)?; - verify_tenderdash_proof(&proof, &metadata, &root_hash, provider)?; + verify_tenderdash_proof(&proof, &metadata, &root_hash, provider, platform_version)?; Ok((Some(result), metadata, proof)) } diff --git a/packages/rs-drive-proof-verifier/src/proof/token_total_supply.rs b/packages/rs-drive-proof-verifier/src/proof/token_total_supply.rs index 81d7f62f8f1..297b3a2cdfd 100644 --- a/packages/rs-drive-proof-verifier/src/proof/token_total_supply.rs +++ b/packages/rs-drive-proof-verifier/src/proof/token_total_supply.rs @@ -1,5 +1,5 @@ use crate::error::MapGroveDbError; -use crate::verify::{current_grovedb_proof_bytes, verify_tenderdash_proof}; +use crate::verify::{supported_grovedb_proof_bytes, verify_tenderdash_proof}; use crate::{ContextProvider, Error, FromProof}; use dapi_grpc::platform::v0::{ get_token_total_supply_request, GetTokenTotalSupplyRequest, GetTokenTotalSupplyResponse, Proof, @@ -43,14 +43,14 @@ impl FromProof for TotalSingleTokenBalance { let proof = response.proof_owned().or(Err(Error::NoProofInResult))?; let (root_hash, result) = Drive::verify_token_total_supply_and_aggregated_identity_balance( - current_grovedb_proof_bytes(&proof)?, + supported_grovedb_proof_bytes(&proof, platform_version)?, token_id, false, platform_version, ) .map_drive_error(&proof, &metadata)?; - verify_tenderdash_proof(&proof, &metadata, &root_hash, provider)?; + verify_tenderdash_proof(&proof, &metadata, &root_hash, provider, platform_version)?; Ok((Some(result), metadata, proof)) } diff --git a/packages/rs-drive-proof-verifier/src/verify.rs b/packages/rs-drive-proof-verifier/src/verify.rs index ea582b12997..e46f28e2177 100644 --- a/packages/rs-drive-proof-verifier/src/verify.rs +++ b/packages/rs-drive-proof-verifier/src/verify.rs @@ -9,13 +9,17 @@ use tenderdash_abci::{ }; use crate::ContextProvider; - -const CURRENT_GROVEDB_PROOF_ENVELOPE_VERSION: u32 = 1; - -/// Reject legacy GroveDB proof envelopes before accepting a current-state -/// response. GroveDB's envelope enum is encoded by bincode as a `u32` -/// discriminant followed by the version-specific payload. -pub(crate) fn require_current_grovedb_proof_bytes(grovedb_proof: &[u8]) -> Result<(), Error> { +use dpp::version::PlatformVersion; + +/// Reject GroveDB proof envelopes older than the floor the protocol version +/// sets in `SystemLimits::minimum_grovedb_proof_envelope_version`. GroveDB's +/// envelope enum is encoded by bincode as a `u32` discriminant followed by +/// the version-specific payload; newer discriminants pass here and fail in +/// GroveDB's own decoder if the client does not know them. +pub(crate) fn require_supported_grovedb_proof_bytes( + grovedb_proof: &[u8], + platform_version: &PlatformVersion, +) -> Result<(), Error> { let config = bincode::config::standard() .with_big_endian() .with_limit::<16>(); @@ -26,23 +30,29 @@ pub(crate) fn require_current_grovedb_proof_bytes(grovedb_proof: &[u8]) -> Resul } })?; - if version != CURRENT_GROVEDB_PROOF_ENVELOPE_VERSION { - return Err(Error::UnsupportedGroveDBProofVersion { version }); + let minimum = platform_version + .system_limits + .minimum_grovedb_proof_envelope_version; + if version < minimum { + return Err(Error::UnsupportedGroveDBProofVersion { + version, + minimum, + protocol_version: platform_version.protocol_version, + }); } Ok(()) } /// Validate a direct GroveDB proof envelope before handing its bytes to Drive. -pub(crate) fn current_grovedb_proof_bytes(proof: &Proof) -> Result<&[u8], Error> { - require_current_grovedb_proof_bytes(&proof.grovedb_proof)?; +pub(crate) fn supported_grovedb_proof_bytes<'a>( + proof: &'a Proof, + platform_version: &PlatformVersion, +) -> Result<&'a [u8], Error> { + require_supported_grovedb_proof_bytes(&proof.grovedb_proof, platform_version)?; Ok(&proof.grovedb_proof) } -fn require_current_grovedb_proof(proof: &Proof) -> Result<(), Error> { - require_current_grovedb_proof_bytes(&proof.grovedb_proof) -} - /// Verify cryptographic proof generated by Tenderdash /// /// This function verifies the cryptographic proof generated by Tenderdash. @@ -66,8 +76,9 @@ pub(crate) fn verify_tenderdash_proof( mtd: &ResponseMetadata, root_hash: &[u8], provider: &dyn ContextProvider, + platform_version: &PlatformVersion, ) -> Result<(), Error> { - require_current_grovedb_proof(proof)?; + require_supported_grovedb_proof_bytes(&proof.grovedb_proof, platform_version)?; verify_tenderdash_signature(proof, mtd, root_hash, provider) } @@ -296,7 +307,13 @@ mod tests { let provider = StubContextProvider; - let result = verify_tenderdash_proof(&proof, &metadata, &[0u8; 32], &provider); + let result = verify_tenderdash_proof( + &proof, + &metadata, + &[0u8; 32], + &provider, + PlatformVersion::latest(), + ); let err = result.expect_err("expected error for out-of-range quorum_type"); let err_msg = err.to_string(); assert!( @@ -324,32 +341,45 @@ mod tests { chain_id: "test-chain".to_string(), }; - let result = verify_tenderdash_proof(&proof, &metadata, &[0u8; 32], &StubContextProvider); + let result = verify_tenderdash_proof( + &proof, + &metadata, + &[0u8; 32], + &StubContextProvider, + PlatformVersion::latest(), + ); assert!(matches!( result, - Err(Error::UnsupportedGroveDBProofVersion { version: 0 }) + Err(Error::UnsupportedGroveDBProofVersion { + version: 0, + minimum: 1, + .. + }) )); } + /// The floor is a protocol-version table entry: a client verifying with + /// the last generation before it still replays V0 envelopes. #[test] - fn test_unknown_grovedb_proof_version_is_rejected() { - let grovedb_proof = - bincode::encode_to_vec(2u32, bincode::config::standard().with_big_endian()) - .expect("test proof version should encode"); - let proof = Proof { - grovedb_proof, - quorum_hash: vec![0u8; 32], - signature: vec![0u8; 96], - round: 1, - block_id_hash: vec![0u8; 32], - quorum_type: 1, - }; + fn test_legacy_grovedb_v0_proof_passes_the_gate_before_protocol_version_14() { + let platform_version = PlatformVersion::get(13).expect("protocol version 13 exists"); - assert!(matches!( - require_current_grovedb_proof(&proof), - Err(Error::UnsupportedGroveDBProofVersion { version: 2 }) - )); + require_supported_grovedb_proof_bytes(&grovedb_proof_bytes(0), platform_version) + .expect("protocol version 13 accepts V0 envelopes"); + } + + #[test] + fn test_envelopes_at_or_above_the_minimum_pass_the_gate() { + let config = bincode::config::standard().with_big_endian(); + + for version in [1u32, 2u32] { + let grovedb_proof = + bincode::encode_to_vec(version, config).expect("test proof version should encode"); + + require_supported_grovedb_proof_bytes(&grovedb_proof, PlatformVersion::latest()) + .unwrap_or_else(|error| panic!("envelope {version} must pass the gate: {error}")); + } } /// Helper: create a deterministic BLS key pair for testing. @@ -479,7 +509,13 @@ mod tests { let metadata = test_metadata(); let provider = StubContextProvider; - let result = verify_tenderdash_proof(&proof, &metadata, &[0u8; 32], &provider); + let result = verify_tenderdash_proof( + &proof, + &metadata, + &[0u8; 32], + &provider, + PlatformVersion::latest(), + ); let err = result.expect_err("expected error for invalid quorum hash size"); let err_msg = err.to_string(); assert!( @@ -506,7 +542,13 @@ mod tests { let metadata = test_metadata(); let provider = ValidKeyContextProvider::new(); - let result = verify_tenderdash_proof(&proof, &metadata, &[0u8; 32], &provider); + let result = verify_tenderdash_proof( + &proof, + &metadata, + &[0u8; 32], + &provider, + PlatformVersion::latest(), + ); let err = result.expect_err("expected error for invalid signature size"); let err_msg = err.to_string(); assert!( @@ -563,7 +605,13 @@ mod tests { let metadata = test_metadata(); let provider = ErroringProvider; - let result = verify_tenderdash_proof(&proof, &metadata, &[0u8; 32], &provider); + let result = verify_tenderdash_proof( + &proof, + &metadata, + &[0u8; 32], + &provider, + PlatformVersion::latest(), + ); let err = result.expect_err("expected provider error to propagate"); let err_msg = err.to_string(); assert!( @@ -619,7 +667,13 @@ mod tests { let metadata = test_metadata(); let provider = BadKeyProvider; - let result = verify_tenderdash_proof(&proof, &metadata, &[0u8; 32], &provider); + let result = verify_tenderdash_proof( + &proof, + &metadata, + &[0u8; 32], + &provider, + PlatformVersion::latest(), + ); let err = result.expect_err("expected InvalidPublicKey"); // `PublicKey::try_from([0u8; 48])` deterministically fails in the // BLS12-381 library (the infinity/identity encoding is a `0xC0` prefix, @@ -650,7 +704,13 @@ mod tests { let metadata = test_metadata(); let provider = ValidKeyContextProvider::new(); - let result = verify_tenderdash_proof(&proof, &metadata, &[0u8; 32], &provider); + let result = verify_tenderdash_proof( + &proof, + &metadata, + &[0u8; 32], + &provider, + PlatformVersion::latest(), + ); let err = result.expect_err("expected error for empty signature"); let err_msg = err.to_string(); assert!( diff --git a/packages/rs-drive/src/verify/address_funds/verify_compacted_address_balance_changes/v1/mod.rs b/packages/rs-drive/src/verify/address_funds/verify_compacted_address_balance_changes/v1/mod.rs index 699e074948c..8076225988b 100644 --- a/packages/rs-drive/src/verify/address_funds/verify_compacted_address_balance_changes/v1/mod.rs +++ b/packages/rs-drive/src/verify/address_funds/verify_compacted_address_balance_changes/v1/mod.rs @@ -16,7 +16,6 @@ const MAX_COMPACTED_PROOF_DECODE_BYTES: usize = 16 * 1024 * 1024; /// A compacted row contains at most one configured address chunk. Keep a /// separate semantic-object budget after the GroveDB envelope is decoded. const MAX_COMPACTED_BALANCE_ROW_DECODE_BYTES: usize = 1024 * 1024; -const CURRENT_GROVEDB_PROOF_ENVELOPE_VERSION: u32 = 1; use dpp::balances::credits::BlockAwareCreditOperation; use grovedb::{GroveDb, PathQuery, Query, SizedQuery}; use platform_version::version::PlatformVersion; @@ -24,7 +23,13 @@ use std::collections::BTreeMap; use super::{CompactedAddressBalanceProof, VerifiedCompactedAddressBalanceChanges}; -fn require_current_grovedb_proof(proof: &[u8], label: &str) -> Result<(), Error> { +/// Reject a nested GroveDB proof envelope older than the floor the protocol +/// version sets in `SystemLimits::minimum_grovedb_proof_envelope_version`. +fn require_supported_grovedb_proof( + proof: &[u8], + label: &str, + platform_version: &PlatformVersion, +) -> Result<(), Error> { let config = bincode::config::standard() .with_big_endian() .with_limit::<16>(); @@ -35,9 +40,13 @@ fn require_current_grovedb_proof(proof: &[u8], label: &str) -> Result<(), Error> ))) })?; - if version != CURRENT_GROVEDB_PROOF_ENVELOPE_VERSION { + let minimum = platform_version + .system_limits + .minimum_grovedb_proof_envelope_version; + if version < minimum { return Err(Error::Proof(ProofError::CorruptedProof(format!( - "unsupported {label} GroveDB proof envelope version {version}: current-state responses require V1" + "{label} GroveDB proof envelope version {version} is below the minimum {minimum} required by protocol version {}", + platform_version.protocol_version )))); } @@ -79,8 +88,16 @@ impl Drive { ))); } - require_current_grovedb_proof(&proof_envelope.predecessor_proof, "predecessor")?; - require_current_grovedb_proof(&proof_envelope.forward_proof, "forward")?; + require_supported_grovedb_proof( + &proof_envelope.predecessor_proof, + "predecessor", + platform_version, + )?; + require_supported_grovedb_proof( + &proof_envelope.forward_proof, + "forward", + platform_version, + )?; let path = vec![ vec![RootTree::SavedBlockTransactions as u8], @@ -343,7 +360,7 @@ mod tests { assert!( error .to_string() - .contains("current-state responses require V1"), + .contains("GroveDB proof envelope version 0 is below the minimum 1"), "unexpected error: {error}" ); } diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 76579f3a0d7..b24689e5d5f 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -516,6 +516,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { max_token_redemption_cycles: 128, max_shielded_transition_actions: 16, max_time_range_overlap_factor: None, + minimum_grovedb_proof_envelope_version: 0, }, consensus: ConsensusVersions { tenderdash_consensus_version: 0, diff --git a/packages/rs-platform-version/src/version/system_limits/mod.rs b/packages/rs-platform-version/src/version/system_limits/mod.rs index 0854a6c6f3b..25a84946e43 100644 --- a/packages/rs-platform-version/src/version/system_limits/mod.rs +++ b/packages/rs-platform-version/src/version/system_limits/mod.rs @@ -100,6 +100,21 @@ pub struct SystemLimits { /// time-range indexes (nothing to bound: the `timeRange` keyword does not /// parse there). pub max_time_range_overlap_factor: Option, + /// Lowest GroveDB proof envelope version a client accepts from a + /// current-state response. + /// + /// Read by `drive-proof-verifier`'s `supported_grovedb_proof_bytes` and + /// `verify_tenderdash_proof`, by `wasm-drive-verify`'s + /// `supported_grovedb_proof`, and by Drive's + /// `verify_compacted_address_balance_changes` v1 for its nested proofs. + /// + /// `0` keeps accepting the legacy V0 envelope. Protocol version 14 raises + /// the floor to `1`: V0's item binding lets a prover return different + /// item bytes under the same authenticated root, so a quorum signature on + /// the root does not make a V0 payload safe. GroveDB emits V1 from grove + /// version 3 (protocol version 13), so every live network already serves + /// V1 by the time the floor applies. + pub minimum_grovedb_proof_envelope_version: u32, } #[cfg(test)] diff --git a/packages/rs-platform-version/src/version/system_limits/v1.rs b/packages/rs-platform-version/src/version/system_limits/v1.rs index 57f51ca806f..d3c06d00458 100644 --- a/packages/rs-platform-version/src/version/system_limits/v1.rs +++ b/packages/rs-platform-version/src/version/system_limits/v1.rs @@ -50,4 +50,5 @@ pub const SYSTEM_LIMITS_V1: SystemLimits = SystemLimits { // `seed_pool_batch_fits_max_state_transition_size` signing test. max_shielded_transition_actions: 16, max_time_range_overlap_factor: None, + minimum_grovedb_proof_envelope_version: 0, // V0 envelopes stay accepted until v14 }; diff --git a/packages/rs-platform-version/src/version/system_limits/v2.rs b/packages/rs-platform-version/src/version/system_limits/v2.rs index 3b3f46d5e43..67e75879c46 100644 --- a/packages/rs-platform-version/src/version/system_limits/v2.rs +++ b/packages/rs-platform-version/src/version/system_limits/v2.rs @@ -31,4 +31,5 @@ pub const SYSTEM_LIMITS_V2: SystemLimits = SystemLimits { // `seed_pool_batch_fits_max_state_transition_size` signing test. max_shielded_transition_actions: 16, max_time_range_overlap_factor: None, + minimum_grovedb_proof_envelope_version: 0, // V0 envelopes stay accepted until v14 }; diff --git a/packages/rs-platform-version/src/version/system_limits/v3.rs b/packages/rs-platform-version/src/version/system_limits/v3.rs index cdf3248de17..377483e40f5 100644 --- a/packages/rs-platform-version/src/version/system_limits/v3.rs +++ b/packages/rs-platform-version/src/version/system_limits/v3.rs @@ -33,4 +33,5 @@ pub const SYSTEM_LIMITS_V3: SystemLimits = SystemLimits { // `seed_pool_batch_fits_max_state_transition_size` signing test. max_shielded_transition_actions: 16, max_time_range_overlap_factor: None, + minimum_grovedb_proof_envelope_version: 0, // V0 envelopes stay accepted until v14 }; diff --git a/packages/rs-platform-version/src/version/system_limits/v4.rs b/packages/rs-platform-version/src/version/system_limits/v4.rs index efc8d72578e..020fb1bc0fd 100644 --- a/packages/rs-platform-version/src/version/system_limits/v4.rs +++ b/packages/rs-platform-version/src/version/system_limits/v4.rs @@ -2,7 +2,7 @@ use crate::version::system_limits::SystemLimits; /// System limits for protocol version 14 and above. /// -/// Identical to [`super::v3::SYSTEM_LIMITS_V3`] except for two changes: +/// Identical to [`super::v3::SYSTEM_LIMITS_V3`] except for three changes: /// /// * The daily withdrawal limit becomes relative: `daily_withdrawal_limit_percent` is set to 15, /// so Platform pools at most 15% of the total credits it held a day ago into asset unlock @@ -14,6 +14,9 @@ use crate::version::system_limits::SystemLimits; /// 24 overlapping windows per timestamp (a day-long window sliding hourly). The rule cannot /// exist before v14 because the `timeRange` keyword itself is only admitted by the v14 /// document meta-schema. +/// * `minimum_grovedb_proof_envelope_version` becomes 1: clients verifying with v14 reject +/// the legacy GroveDB V0 proof envelope, whose item binding leaves returned item bytes +/// unauthenticated. Every live network has emitted V1 envelopes since v13. pub const SYSTEM_LIMITS_V4: SystemLimits = SystemLimits { estimated_contract_max_serialized_size: 16384, max_field_value_size: 5120, //5 KiB @@ -41,4 +44,5 @@ pub const SYSTEM_LIMITS_V4: SystemLimits = SystemLimits { // `seed_pool_batch_fits_max_state_transition_size` signing test. max_shielded_transition_actions: 16, max_time_range_overlap_factor: Some(24), + minimum_grovedb_proof_envelope_version: 1, // clients reject legacy V0 GroveDB proof envelopes from v14 }; diff --git a/packages/rs-platform-version/src/version/v14.rs b/packages/rs-platform-version/src/version/v14.rs index fd384bcac9c..f4e0d988d50 100644 --- a/packages/rs-platform-version/src/version/v14.rs +++ b/packages/rs-platform-version/src/version/v14.rs @@ -203,6 +203,14 @@ pub const PROTOCOL_VERSION_14: ProtocolVersion = 14; /// lookups are ever needed. Reads dispatch on the byte prefix, so /// formats 0–2 (all pre-v14 documents) deserialize exactly as before with /// an unstamped (pre-annotation) layout. +/// 7. **Client-side GroveDB proof envelope floor**: +/// `SYSTEM_LIMITS_V4.minimum_grovedb_proof_envelope_version` becomes 1, so +/// a client verifying with v14 tables rejects the legacy V0 proof +/// envelope before its bytes reach Drive (`drive-proof-verifier`, +/// `wasm-drive-verify`, and the nested compacted address proofs). V0's +/// item binding lets a prover return different item bytes under the same +/// authenticated root; every live network has emitted V1 envelopes since +/// v13 (grove version 3), so no honest response is affected. /// /// The wire surface changes only additively: `GetDocumentsRequestV1` /// already carries `selects` / `group_by` / `order_by` / `limit` / @@ -240,7 +248,7 @@ pub const PLATFORM_V14: PlatformVersion = PlatformVersion { }, system_data_contracts: SYSTEM_DATA_CONTRACT_VERSIONS_V3, // changed: DashPay v2 adds profile payment address fields (DIP-33) fee_version: FEE_VERSION2, - system_limits: SYSTEM_LIMITS_V4, // changed: daily withdrawal limit becomes 15% of the total credits a day ago + time-range overlap-factor cap (24) + system_limits: SYSTEM_LIMITS_V4, // changed: daily withdrawal limit becomes 15% of the total credits a day ago + time-range overlap-factor cap (24) + GroveDB proof envelope floor (V1) consensus: ConsensusVersions { tenderdash_consensus_version: 1, }, diff --git a/packages/wasm-drive-verify/src/contract/verify_contract.rs b/packages/wasm-drive-verify/src/contract/verify_contract.rs index ae142071464..f87de2b57e6 100644 --- a/packages/wasm-drive-verify/src/contract/verify_contract.rs +++ b/packages/wasm-drive-verify/src/contract/verify_contract.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -45,7 +45,7 @@ pub fn verify_contract( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, contract_option) = Drive::verify_contract( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, contract_known_keeps_history, is_proof_subset, in_multiple_contract_proof_form, diff --git a/packages/wasm-drive-verify/src/contract/verify_contract_history.rs b/packages/wasm-drive-verify/src/contract/verify_contract_history.rs index 17b365e2f9b..1ccf063c213 100644 --- a/packages/wasm-drive-verify/src/contract/verify_contract_history.rs +++ b/packages/wasm-drive-verify/src/contract/verify_contract_history.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::{Object, Reflect, Uint8Array}; @@ -45,7 +45,7 @@ pub fn verify_contract_history( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, contract_history_option) = Drive::verify_contract_history( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, contract_id_bytes, start_at_date, limit, diff --git a/packages/wasm-drive-verify/src/document/verify_proof.rs b/packages/wasm-drive-verify/src/document/verify_proof.rs index 8e59ab032ed..8765d8c1f8b 100644 --- a/packages/wasm-drive-verify/src/document/verify_proof.rs +++ b/packages/wasm-drive-verify/src/document/verify_proof.rs @@ -5,7 +5,7 @@ use crate::utils::error::{ }; use crate::utils::getters::VecU8ToUint8Array; use crate::utils::platform_version::get_platform_version_with_validation; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::document_to_js_value; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; @@ -120,7 +120,10 @@ pub fn verify_document_proof( }; let (root_hash, documents) = query - .verify_proof(current_grovedb_proof(&proof_vec)?, platform_version) + .verify_proof( + supported_grovedb_proof(&proof_vec, platform_version)?, + platform_version, + ) .map_err(|e| format_result_error(ErrorCategory::VerificationError, e))?; // Convert documents to JS array diff --git a/packages/wasm-drive-verify/src/document/verify_proof_keep_serialized.rs b/packages/wasm-drive-verify/src/document/verify_proof_keep_serialized.rs index cd426f176a2..e2ec7aa2876 100644 --- a/packages/wasm-drive-verify/src/document/verify_proof_keep_serialized.rs +++ b/packages/wasm-drive-verify/src/document/verify_proof_keep_serialized.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; use dpp::platform_value::Value; @@ -111,7 +111,10 @@ pub fn verify_document_proof_keep_serialized( }; let (root_hash, serialized_docs) = query - .verify_proof_keep_serialized(current_grovedb_proof(&proof_vec)?, platform_version) + .verify_proof_keep_serialized( + supported_grovedb_proof(&proof_vec, platform_version)?, + platform_version, + ) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert serialized documents to JS array of Uint8Arrays diff --git a/packages/wasm-drive-verify/src/document/verify_start_at_document_in_proof.rs b/packages/wasm-drive-verify/src/document/verify_start_at_document_in_proof.rs index 237eef9e6d0..4bb3791ac83 100644 --- a/packages/wasm-drive-verify/src/document/verify_start_at_document_in_proof.rs +++ b/packages/wasm-drive-verify/src/document/verify_start_at_document_in_proof.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::document_to_js_value; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; @@ -120,7 +120,7 @@ pub fn verify_start_at_document_in_proof( let (root_hash, document_option) = query .verify_start_at_document_in_proof( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, is_proof_subset, document_id_bytes, platform_version, diff --git a/packages/wasm-drive-verify/src/group/verify_action_signers.rs b/packages/wasm-drive-verify/src/group/verify_action_signers.rs index 4e928d7c51a..e793bbf715f 100644 --- a/packages/wasm-drive-verify/src/group/verify_action_signers.rs +++ b/packages/wasm-drive-verify/src/group/verify_action_signers.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::data_contract::group::GroupMemberPower; use dpp::group::group_action_status::GroupActionStatus; use dpp::identifier::Identifier; @@ -64,7 +64,7 @@ pub fn verify_action_signers_vec( let (root_hash, signers_vec): (RootHash, Vec<(Identifier, GroupMemberPower)>) = Drive::verify_action_signers( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, Identifier::from(contract_id_bytes), group_contract_position, action_status_enum, @@ -125,7 +125,7 @@ pub fn verify_action_signers_map( let (root_hash, signers_map): (RootHash, BTreeMap) = Drive::verify_action_signers( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, Identifier::from(contract_id_bytes), group_contract_position, action_status_enum, diff --git a/packages/wasm-drive-verify/src/group/verify_action_signers_total_power.rs b/packages/wasm-drive-verify/src/group/verify_action_signers_total_power.rs index 1ad0045fc11..f95f180e106 100644 --- a/packages/wasm-drive-verify/src/group/verify_action_signers_total_power.rs +++ b/packages/wasm-drive-verify/src/group/verify_action_signers_total_power.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::group::group_action_status::GroupActionStatus; use dpp::identifier::Identifier; use dpp::version::PlatformVersion; @@ -73,7 +73,7 @@ pub fn verify_action_signers_total_power( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, status, total_power) = Drive::verify_action_signer_and_total_power( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, Identifier::from(contract_id_bytes), group_contract_position, action_status_enum, diff --git a/packages/wasm-drive-verify/src/group/verify_active_action_infos.rs b/packages/wasm-drive-verify/src/group/verify_active_action_infos.rs index 7745279031b..4e1046b7394 100644 --- a/packages/wasm-drive-verify/src/group/verify_active_action_infos.rs +++ b/packages/wasm-drive-verify/src/group/verify_active_action_infos.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::group::action_event::GroupActionEvent; use dpp::group::group_action::GroupAction; use dpp::group::group_action_status::GroupActionStatus; @@ -128,7 +128,7 @@ pub fn verify_action_infos_in_contract_vec( let (root_hash, actions_vec): (RootHash, Vec<(Identifier, GroupAction)>) = Drive::verify_action_infos_in_contract( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, Identifier::from(contract_id_bytes), group_contract_position, action_status_enum, @@ -210,7 +210,7 @@ pub fn verify_action_infos_in_contract_map( let (root_hash, actions_map): (RootHash, BTreeMap) = Drive::verify_action_infos_in_contract( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, Identifier::from(contract_id_bytes), group_contract_position, action_status_enum, diff --git a/packages/wasm-drive-verify/src/group/verify_group_info.rs b/packages/wasm-drive-verify/src/group/verify_group_info.rs index dc668f90628..da3d30e7566 100644 --- a/packages/wasm-drive-verify/src/group/verify_group_info.rs +++ b/packages/wasm-drive-verify/src/group/verify_group_info.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::identifier::Identifier; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -45,7 +45,7 @@ pub fn verify_group_info( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, group_option) = Drive::verify_group_info( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, Identifier::from(contract_id_bytes), group_contract_position, is_proof_subset, diff --git a/packages/wasm-drive-verify/src/group/verify_group_infos_in_contract.rs b/packages/wasm-drive-verify/src/group/verify_group_infos_in_contract.rs index ae0066212fe..c2333bc8a40 100644 --- a/packages/wasm-drive-verify/src/group/verify_group_infos_in_contract.rs +++ b/packages/wasm-drive-verify/src/group/verify_group_infos_in_contract.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::data_contract::group::Group; use dpp::data_contract::GroupContractPosition; use dpp::identifier::Identifier; @@ -68,7 +68,7 @@ pub fn verify_group_infos_in_contract_vec( let (root_hash, groups_vec): (RootHash, Vec<(GroupContractPosition, Group)>) = Drive::verify_group_infos_in_contract( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, Identifier::from(contract_id_bytes), start_position, limit, @@ -137,7 +137,7 @@ pub fn verify_group_infos_in_contract_map( let (root_hash, groups_map): (RootHash, BTreeMap) = Drive::verify_group_infos_in_contract( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, Identifier::from(contract_id_bytes), start_position, limit, diff --git a/packages/wasm-drive-verify/src/identity/verify_full_identities_by_public_key_hashes.rs b/packages/wasm-drive-verify/src/identity/verify_full_identities_by_public_key_hashes.rs index 942b6950251..437a73c6337 100644 --- a/packages/wasm-drive-verify/src/identity/verify_full_identities_by_public_key_hashes.rs +++ b/packages/wasm-drive-verify/src/identity/verify_full_identities_by_public_key_hashes.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::{bytes_to_base58, identity_to_js_value}; use dpp::prelude::Identity; use dpp::version::PlatformVersion; @@ -63,7 +63,7 @@ pub fn verify_full_identities_by_public_key_hashes_vec( let (root_hash, identities_vec): (RootHash, Vec<([u8; 20], Option)>) = Drive::verify_full_identities_by_public_key_hashes( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, &public_key_hashes_vec, platform_version, ) @@ -133,7 +133,7 @@ pub fn verify_full_identities_by_public_key_hashes_map( let (root_hash, identities_map): (RootHash, BTreeMap<[u8; 20], Option>) = Drive::verify_full_identities_by_public_key_hashes( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, &public_key_hashes_vec, platform_version, ) diff --git a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_identity_id.rs b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_identity_id.rs index e22f4cffee0..9d1a504881f 100644 --- a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_identity_id.rs +++ b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_identity_id.rs @@ -2,7 +2,7 @@ use crate::utils::error::{format_error, format_result_error, ErrorCategory}; use crate::utils::getters::VecU8ToUint8Array; use crate::utils::logging::{debug, error, PerfLogger}; use crate::utils::platform_version::get_platform_version_with_validation; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::identity_to_js_value; use drive::drive::Drive; use js_sys::Uint8Array; @@ -54,7 +54,7 @@ pub fn verify_full_identity_by_identity_id( let platform_version = get_platform_version_with_validation(platform_version_number)?; let (root_hash, identity_option) = Drive::verify_full_identity_by_identity_id( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, is_proof_subset, identity_id_bytes, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_non_unique_public_key_hash.rs b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_non_unique_public_key_hash.rs index f35f11fd7c4..86b2f493ae5 100644 --- a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_non_unique_public_key_hash.rs +++ b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_non_unique_public_key_hash.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::identity_to_js_value; use dpp::version::PlatformVersion; use drive::drive::identity::identity_and_non_unique_public_key_hash_double_proof::IdentityAndNonUniquePublicKeyHashDoubleProof; @@ -57,9 +57,9 @@ pub fn verify_full_identity_by_non_unique_public_key_hash( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; if let Some(identity_proof) = identity_proof_vec.as_deref() { - current_grovedb_proof(identity_proof)?; + supported_grovedb_proof(identity_proof, platform_version)?; } - current_grovedb_proof(&identity_id_public_key_hash_proof_vec)?; + supported_grovedb_proof(&identity_id_public_key_hash_proof_vec, platform_version)?; let proof = IdentityAndNonUniquePublicKeyHashDoubleProof { identity_proof: identity_proof_vec, diff --git a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_unique_public_key_hash.rs b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_unique_public_key_hash.rs index c91d9d08dc9..6697b8f65d8 100644 --- a/packages/wasm-drive-verify/src/identity/verify_full_identity_by_unique_public_key_hash.rs +++ b/packages/wasm-drive-verify/src/identity/verify_full_identity_by_unique_public_key_hash.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::identity_to_js_value; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -42,7 +42,7 @@ pub fn verify_full_identity_by_unique_public_key_hash( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, identity_option) = Drive::verify_full_identity_by_unique_public_key_hash( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, public_key_hash_bytes, platform_version, ) diff --git a/packages/wasm-drive-verify/src/identity/verify_identities_contract_keys.rs b/packages/wasm-drive-verify/src/identity/verify_identities_contract_keys.rs index c4caa6e1ad3..af3e32095f0 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identities_contract_keys.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identities_contract_keys.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::identity::Purpose; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -81,7 +81,7 @@ pub fn verify_identities_contract_keys( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, keys) = Drive::verify_identities_contract_keys( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, &identity_ids_vec, &contract_id_bytes, document_type_name, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_balance_and_revision_for_identity_id.rs b/packages/wasm-drive-verify/src/identity/verify_identity_balance_and_revision_for_identity_id.rs index c05faee1e2e..9a4832a66cb 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_balance_and_revision_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_balance_and_revision_for_identity_id.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -49,7 +49,7 @@ pub fn verify_identity_balance_and_revision_for_identity_id( let (root_hash, balance_and_revision_option) = Drive::verify_identity_balance_and_revision_for_identity_id( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, identity_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_balance_for_identity_id.rs b/packages/wasm-drive-verify/src/identity/verify_identity_balance_for_identity_id.rs index 4dd6dec753d..af1bd4ddeca 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_balance_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_balance_for_identity_id.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -42,7 +42,7 @@ pub fn verify_identity_balance_for_identity_id( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, balance_option) = Drive::verify_identity_balance_for_identity_id( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, identity_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_balances_for_identity_ids.rs b/packages/wasm-drive-verify/src/identity/verify_identity_balances_for_identity_ids.rs index 2d9b0917bcb..7a05daa61ee 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_balances_for_identity_ids.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_balances_for_identity_ids.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::fee::Credits; use dpp::version::PlatformVersion; @@ -64,7 +64,7 @@ pub fn verify_identity_balances_for_identity_ids_vec( let (root_hash, balances_vec): (RootHash, Vec<([u8; 32], Option)>) = Drive::verify_identity_balances_for_identity_ids( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, is_proof_subset, &identity_ids_vec, platform_version, @@ -135,7 +135,7 @@ pub fn verify_identity_balances_for_identity_ids_map( let (root_hash, balances_map): (RootHash, BTreeMap<[u8; 32], Option>) = Drive::verify_identity_balances_for_identity_ids( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, is_proof_subset, &identity_ids_vec, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_contract_nonce.rs b/packages/wasm-drive-verify/src/identity/verify_identity_contract_nonce.rs index 888090cd0fe..440341f7154 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_contract_nonce.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_contract_nonce.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -48,7 +48,7 @@ pub fn verify_identity_contract_nonce( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, nonce_option) = Drive::verify_identity_contract_nonce( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, identity_id_bytes, contract_id_bytes, verify_subset_of_proof, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_id_by_non_unique_public_key_hash.rs b/packages/wasm-drive-verify/src/identity/verify_identity_id_by_non_unique_public_key_hash.rs index 7a4015628d7..0b104fb0b8a 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_id_by_non_unique_public_key_hash.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_id_by_non_unique_public_key_hash.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -54,7 +54,7 @@ pub fn verify_identity_id_by_non_unique_public_key_hash( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, identity_id_option) = Drive::verify_identity_id_by_non_unique_public_key_hash( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, is_proof_subset, public_key_hash_bytes, after_bytes, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_id_by_unique_public_key_hash.rs b/packages/wasm-drive-verify/src/identity/verify_identity_id_by_unique_public_key_hash.rs index e79c0804dae..5cdb768a5b4 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_id_by_unique_public_key_hash.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_id_by_unique_public_key_hash.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -42,7 +42,7 @@ pub fn verify_identity_id_by_unique_public_key_hash( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, identity_id_option) = Drive::verify_identity_id_by_unique_public_key_hash( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, is_proof_subset, public_key_hash_bytes, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_ids_by_unique_public_key_hashes.rs b/packages/wasm-drive-verify/src/identity/verify_identity_ids_by_unique_public_key_hashes.rs index a5c5678cfdd..c86ef1686a6 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_ids_by_unique_public_key_hashes.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_ids_by_unique_public_key_hashes.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::{bytes_to_base58, identifier_to_base58}; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -63,7 +63,7 @@ pub fn verify_identity_ids_by_unique_public_key_hashes_vec( let (root_hash, identity_ids_vec): (RootHash, Vec<([u8; 20], Option<[u8; 32]>)>) = Drive::verify_identity_ids_by_unique_public_key_hashes( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, is_proof_subset, &public_key_hashes_vec, platform_version, @@ -135,7 +135,7 @@ pub fn verify_identity_ids_by_unique_public_key_hashes_map( let (root_hash, identity_ids_map): (RootHash, BTreeMap<[u8; 20], Option<[u8; 32]>>) = Drive::verify_identity_ids_by_unique_public_key_hashes( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, is_proof_subset, &public_key_hashes_vec, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_keys_by_identity_id.rs b/packages/wasm-drive-verify/src/identity/verify_identity_keys_by_identity_id.rs index e4a71066321..4209a23b589 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_keys_by_identity_id.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_keys_by_identity_id.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::identity::identity_public_key::IdentityPublicKey; use dpp::identity::PartialIdentity; use dpp::version::PlatformVersion; @@ -154,7 +154,7 @@ pub fn verify_identity_keys_by_identity_id( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, identity_option) = Drive::verify_identity_keys_by_identity_id( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, key_request, with_revision, with_balance, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_nonce.rs b/packages/wasm-drive-verify/src/identity/verify_identity_nonce.rs index b78eef64f5c..8f9ed5bf6f1 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_nonce.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_nonce.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -42,7 +42,7 @@ pub fn verify_identity_nonce( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, nonce_option) = Drive::verify_identity_nonce( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, identity_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/identity/verify_identity_revision_for_identity_id.rs b/packages/wasm-drive-verify/src/identity/verify_identity_revision_for_identity_id.rs index 01f224cbc16..27c8a24f6c5 100644 --- a/packages/wasm-drive-verify/src/identity/verify_identity_revision_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/identity/verify_identity_revision_for_identity_id.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -42,7 +42,7 @@ pub fn verify_identity_revision_for_identity_id( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, revision_option) = Drive::verify_identity_revision_for_identity_id( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, identity_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/native.rs b/packages/wasm-drive-verify/src/native.rs index b1757d00b1e..78a503295af 100644 --- a/packages/wasm-drive-verify/src/native.rs +++ b/packages/wasm-drive-verify/src/native.rs @@ -3,7 +3,7 @@ //! This module provides Rust-native functions for proof verification, //! allowing other Rust/WASM projects to use wasm-drive-verify as a library. -use crate::utils::proof::validate_current_grovedb_proof; +use crate::utils::proof::validate_supported_grovedb_proof; use dpp::data_contract::DataContract; use dpp::document::Document; use dpp::identity::Identity; @@ -12,8 +12,11 @@ use drive::drive::Drive; use drive::error::proof::ProofError; use drive::query::DriveDocumentQuery; -fn current_grovedb_proof(proof: &[u8]) -> Result<&[u8], drive::error::Error> { - validate_current_grovedb_proof(proof) +fn supported_grovedb_proof<'a>( + proof: &'a [u8], + platform_version: &PlatformVersion, +) -> Result<&'a [u8], drive::error::Error> { + validate_supported_grovedb_proof(proof, platform_version) .map_err(|error| drive::error::Error::Proof(ProofError::CorruptedProof(error)))?; Ok(proof) } @@ -26,7 +29,7 @@ pub fn verify_full_identity_by_identity_id( platform_version: &PlatformVersion, ) -> Result<([u8; 32], Option), drive::error::Error> { Drive::verify_full_identity_by_identity_id( - current_grovedb_proof(proof)?, + supported_grovedb_proof(proof, platform_version)?, is_proof_subset, identity_id, platform_version, @@ -43,7 +46,7 @@ pub fn verify_contract( platform_version: &PlatformVersion, ) -> Result<([u8; 32], Option), drive::error::Error> { Drive::verify_contract( - current_grovedb_proof(proof)?, + supported_grovedb_proof(proof, platform_version)?, contract_known_keeps_history, is_proof_subset, in_multiple_contract_proof_form, @@ -58,7 +61,10 @@ pub fn verify_documents_with_query( query: &DriveDocumentQuery, platform_version: &PlatformVersion, ) -> Result<([u8; 32], Vec), drive::error::Error> { - query.verify_proof(current_grovedb_proof(proof)?, platform_version) + query.verify_proof( + supported_grovedb_proof(proof, platform_version)?, + platform_version, + ) } #[cfg(test)] @@ -80,18 +86,24 @@ mod tests { .expect("encode envelope version") } - fn assert_rejected_envelope(result: Result<(), Error>, version: u32) { + fn assert_rejected_envelope(result: Result<(), Error>) { match result { Err(Error::Proof(ProofError::CorruptedProof(message))) => assert!( - message.contains(&format!( - "unsupported GroveDB proof envelope version {version}" - )), + message.contains("GroveDB proof envelope version 0 is below the minimum 1"), "unexpected message: {message}" ), other => panic!("expected envelope rejection, got {other:?}"), } } + fn assert_not_an_envelope_rejection(result: Result<(), Error>) { + let error = result.expect_err("payload without a proof body cannot verify"); + assert!( + !error.to_string().contains("GroveDB proof envelope"), + "must not be rejected by the envelope policy: {error}" + ); + } + fn dpns_domain_query<'a>( contract: &'a DataContract, platform_version: &PlatformVersion, @@ -106,55 +118,71 @@ mod tests { } #[test] - fn identity_entry_point_rejects_legacy_and_unknown_envelopes() { - let platform_version = PlatformVersion::latest(); + fn identity_entry_point_rejects_legacy_envelope() { + let result = verify_full_identity_by_identity_id( + &envelope_only_proof(0), + false, + [0u8; 32], + PlatformVersion::latest(), + ) + .map(|_| ()); + assert_rejected_envelope(result); + } - for version in [0u32, 2u32] { - let result = verify_full_identity_by_identity_id( - &envelope_only_proof(version), - false, - [0u8; 32], - platform_version, - ) - .map(|_| ()); - assert_rejected_envelope(result, version); - } + #[test] + fn contract_entry_point_rejects_legacy_envelope() { + let result = verify_contract( + &envelope_only_proof(0), + None, + false, + false, + [0u8; 32], + PlatformVersion::latest(), + ) + .map(|_| ()); + assert_rejected_envelope(result); } #[test] - fn contract_entry_point_rejects_legacy_and_unknown_envelopes() { + fn documents_entry_point_rejects_legacy_envelope() { let platform_version = PlatformVersion::latest(); + let contract = load_system_data_contract(SystemDataContract::DPNS, platform_version) + .expect("DPNS contract"); + let query = dpns_domain_query(&contract, platform_version); - for version in [0u32, 2u32] { - let result = verify_contract( - &envelope_only_proof(version), - None, - false, - false, - [0u8; 32], - platform_version, - ) + let result = verify_documents_with_query(&envelope_only_proof(0), &query, platform_version) .map(|_| ()); - assert_rejected_envelope(result, version); - } + assert_rejected_envelope(result); } + /// The floor is a protocol-version table entry: the last generation + /// before it still lets a V0 envelope reach Drive. #[test] - fn documents_entry_point_rejects_legacy_and_unknown_envelopes() { - let platform_version = PlatformVersion::latest(); + fn entry_points_accept_legacy_envelope_before_protocol_version_14() { + let platform_version = PlatformVersion::get(13).expect("protocol version 13 exists"); let contract = load_system_data_contract(SystemDataContract::DPNS, platform_version) .expect("DPNS contract"); let query = dpns_domain_query(&contract, platform_version); + let truncated_v0 = envelope_only_proof(0); - for version in [0u32, 2u32] { - let result = verify_documents_with_query( - &envelope_only_proof(version), - &query, + assert_not_an_envelope_rejection( + verify_full_identity_by_identity_id(&truncated_v0, false, [0u8; 32], platform_version) + .map(|_| ()), + ); + assert_not_an_envelope_rejection( + verify_contract( + &truncated_v0, + None, + false, + false, + [0u8; 32], platform_version, ) - .map(|_| ()); - assert_rejected_envelope(result, version); - } + .map(|_| ()), + ); + assert_not_an_envelope_rejection( + verify_documents_with_query(&truncated_v0, &query, platform_version).map(|_| ()), + ); } #[test] @@ -167,9 +195,11 @@ mod tests { // A V1 discriminant with no payload clears the envelope gate and is // then rejected by Drive's own decoder, never by the envelope policy. - let results: Vec> = vec![ + assert_not_an_envelope_rejection( verify_full_identity_by_identity_id(&truncated_v1, false, [0u8; 32], platform_version) .map(|_| ()), + ); + assert_not_an_envelope_rejection( verify_contract( &truncated_v1, None, @@ -179,15 +209,9 @@ mod tests { platform_version, ) .map(|_| ()), + ); + assert_not_an_envelope_rejection( verify_documents_with_query(&truncated_v1, &query, platform_version).map(|_| ()), - ]; - - for result in results { - let error = result.expect_err("truncated V1 payload cannot verify"); - assert!( - !error.to_string().contains("GroveDB proof envelope"), - "V1 envelope must not be rejected by the envelope policy: {error}" - ); - } + ); } } diff --git a/packages/wasm-drive-verify/src/single_document/verify_single_document.rs b/packages/wasm-drive-verify/src/single_document/verify_single_document.rs index 94944670937..340f15c1ff9 100644 --- a/packages/wasm-drive-verify/src/single_document/verify_single_document.rs +++ b/packages/wasm-drive-verify/src/single_document/verify_single_document.rs @@ -1,4 +1,4 @@ -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::version::PlatformVersion; use drive::query::{SingleDocumentDriveQuery, SingleDocumentDriveQueryContestedStatus}; use wasm_bindgen::prelude::*; @@ -135,7 +135,7 @@ pub fn verify_single_document_proof_keep_serialized( // Verify the proof keeping it serialized match query.inner.verify_proof_keep_serialized( is_subset, - current_grovedb_proof(&proof)?, + supported_grovedb_proof(&proof, platform_version)?, platform_version, ) { Ok((root_hash, maybe_serialized_document)) => Ok(SingleDocumentProofResult { diff --git a/packages/wasm-drive-verify/src/state_transition/verify_state_transition_was_executed_with_proof.rs b/packages/wasm-drive-verify/src/state_transition/verify_state_transition_was_executed_with_proof.rs index 482d609fc03..ce880edd231 100644 --- a/packages/wasm-drive-verify/src/state_transition/verify_state_transition_was_executed_with_proof.rs +++ b/packages/wasm-drive-verify/src/state_transition/verify_state_transition_was_executed_with_proof.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; @@ -85,7 +85,7 @@ pub fn verify_state_transition_was_executed_with_proof( let (root_hash, outcome) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, &block_info, - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, &contract_lookup_fn, platform_version, ) diff --git a/packages/wasm-drive-verify/src/system/verify_epoch_infos.rs b/packages/wasm-drive-verify/src/system/verify_epoch_infos.rs index 6d2fd427d0b..ca71593cc51 100644 --- a/packages/wasm-drive-verify/src/system/verify_epoch_infos.rs +++ b/packages/wasm-drive-verify/src/system/verify_epoch_infos.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -41,7 +41,7 @@ pub fn verify_epoch_infos( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, epoch_infos_vec) = Drive::verify_epoch_infos( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, current_epoch, start_epoch, count, diff --git a/packages/wasm-drive-verify/src/system/verify_epoch_proposers.rs b/packages/wasm-drive-verify/src/system/verify_epoch_proposers.rs index 8512488967b..ed076521cb3 100644 --- a/packages/wasm-drive-verify/src/system/verify_epoch_proposers.rs +++ b/packages/wasm-drive-verify/src/system/verify_epoch_proposers.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::bytes_to_base58; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -59,7 +59,7 @@ pub fn verify_epoch_proposers_by_range_vec( let (root_hash, proposers_vec): (RootHash, Vec<(Vec, u64)>) = Drive::verify_epoch_proposers( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, epoch_index, proposer_query_type, platform_version, @@ -118,7 +118,7 @@ pub fn verify_epoch_proposers_by_range_map( let (root_hash, proposers_map): (RootHash, BTreeMap, u64>) = Drive::verify_epoch_proposers( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, epoch_index, proposer_query_type, platform_version, @@ -177,7 +177,7 @@ pub fn verify_epoch_proposers_by_ids_vec( let (root_hash, proposers_vec): (RootHash, Vec<(Vec, u64)>) = Drive::verify_epoch_proposers( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, epoch_index, proposer_query_type, platform_version, @@ -238,7 +238,7 @@ pub fn verify_epoch_proposers_by_ids_map( let (root_hash, proposers_map): (RootHash, BTreeMap, u64>) = Drive::verify_epoch_proposers( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, epoch_index, proposer_query_type, platform_version, diff --git a/packages/wasm-drive-verify/src/system/verify_total_credits_in_system.rs b/packages/wasm-drive-verify/src/system/verify_total_credits_in_system.rs index b3e8ed2911a..a0a96dbfd98 100644 --- a/packages/wasm-drive-verify/src/system/verify_total_credits_in_system.rs +++ b/packages/wasm-drive-verify/src/system/verify_total_credits_in_system.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::prelude::CoreBlockHeight; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -43,7 +43,7 @@ pub fn verify_total_credits_in_system( || -> Result { Ok(activation_core_height) }; let (root_hash, total_credits) = Drive::verify_total_credits_in_system( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, core_subsidy_halving_interval, request_activation_core_height, current_core_height, diff --git a/packages/wasm-drive-verify/src/system/verify_upgrade_state.rs b/packages/wasm-drive-verify/src/system/verify_upgrade_state.rs index ef65fd4257a..2c2398e2958 100644 --- a/packages/wasm-drive-verify/src/system/verify_upgrade_state.rs +++ b/packages/wasm-drive-verify/src/system/verify_upgrade_state.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::{Object, Reflect, Uint8Array}; @@ -34,9 +34,11 @@ pub fn verify_upgrade_state( let platform_version = PlatformVersion::get(platform_version_number) .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; - let (root_hash, upgrade_state_map) = - Drive::verify_upgrade_state(current_grovedb_proof(&proof_vec)?, platform_version) - .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; + let (root_hash, upgrade_state_map) = Drive::verify_upgrade_state( + supported_grovedb_proof(&proof_vec, platform_version)?, + platform_version, + ) + .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert IntMap to JS object let js_obj = Object::new(); diff --git a/packages/wasm-drive-verify/src/system/verify_upgrade_vote_status.rs b/packages/wasm-drive-verify/src/system/verify_upgrade_vote_status.rs index 77dc7fcd22c..8d347d345ac 100644 --- a/packages/wasm-drive-verify/src/system/verify_upgrade_vote_status.rs +++ b/packages/wasm-drive-verify/src/system/verify_upgrade_vote_status.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -54,7 +54,7 @@ pub fn verify_upgrade_vote_status( }; let (root_hash, vote_status_map) = Drive::verify_upgrade_vote_status( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, start_protx_hash_array, count, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_balance_for_identity_id.rs b/packages/wasm-drive-verify/src/tokens/verify_token_balance_for_identity_id.rs index fca46fa4955..781217f8fc9 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_balance_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_balance_for_identity_id.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -48,7 +48,7 @@ pub fn verify_token_balance_for_identity_id( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, balance_option) = Drive::verify_token_balance_for_identity_id( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, token_id_bytes, identity_id_bytes, verify_subset_of_proof, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_id.rs b/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_id.rs index 251aff4ea87..d555f197fc1 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_id.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::balances::credits::TokenAmount; use dpp::version::PlatformVersion; @@ -69,7 +69,7 @@ pub fn verify_token_balances_for_identity_id_vec( let (root_hash, balances_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_balances_for_identity_id( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, &token_ids_vec, identity_id_bytes, verify_subset_of_proof, @@ -147,7 +147,7 @@ pub fn verify_token_balances_for_identity_id_map( let (root_hash, balances_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_balances_for_identity_id( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, &token_ids_vec, identity_id_bytes, verify_subset_of_proof, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_ids.rs b/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_ids.rs index 722b9283e7c..524286df462 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_ids.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_balances_for_identity_ids.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::balances::credits::TokenAmount; use dpp::version::PlatformVersion; @@ -69,7 +69,7 @@ pub fn verify_token_balances_for_identity_ids_vec( let (root_hash, balances_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_balances_for_identity_ids( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, token_id_bytes, &identity_ids_vec, is_proof_subset, @@ -147,7 +147,7 @@ pub fn verify_token_balances_for_identity_ids_map( let (root_hash, balances_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_balances_for_identity_ids( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, token_id_bytes, &identity_ids_vec, is_proof_subset, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_contract_info.rs b/packages/wasm-drive-verify/src/tokens/verify_token_contract_info.rs index e305c13a1ee..1a0bf9b5ce2 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_contract_info.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_contract_info.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::tokens::contract_info::v0::TokenContractInfoV0Accessors; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -43,7 +43,7 @@ pub fn verify_token_contract_info( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, contract_info_option) = Drive::verify_token_contract_info( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, token_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_price.rs b/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_price.rs index c3435f70a8c..1e87322b0cf 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_price.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_price.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::tokens::token_pricing_schedule::TokenPricingSchedule; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -43,7 +43,7 @@ pub fn verify_token_direct_selling_price( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, price_option) = Drive::verify_token_direct_selling_price( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, token_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_prices.rs b/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_prices.rs index 201c0a1698a..b89e54d45b2 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_prices.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_direct_selling_prices.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::tokens::token_pricing_schedule::TokenPricingSchedule; use dpp::version::PlatformVersion; @@ -63,7 +63,7 @@ pub fn verify_token_direct_selling_prices_vec( let (root_hash, prices_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_direct_selling_prices( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, &token_ids_vec, verify_subset_of_proof, platform_version, @@ -172,7 +172,7 @@ pub fn verify_token_direct_selling_prices_map( let (root_hash, prices_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_direct_selling_prices( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, &token_ids_vec, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_info_for_identity_id.rs b/packages/wasm-drive-verify/src/tokens/verify_token_info_for_identity_id.rs index ae7b4e7f386..cba3e7fee37 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_info_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_info_for_identity_id.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::tokens::info::IdentityTokenInfo; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -49,7 +49,7 @@ pub fn verify_token_info_for_identity_id( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, token_info_option) = Drive::verify_token_info_for_identity_id( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, token_id_bytes, identity_id_bytes, verify_subset_of_proof, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_id.rs b/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_id.rs index dae299752e7..75e1abaf377 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_id.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_id.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::tokens::info::IdentityTokenInfo; use dpp::version::PlatformVersion; @@ -82,7 +82,7 @@ pub fn verify_token_infos_for_identity_id_vec( let (root_hash, token_infos_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_infos_for_identity_id( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, &token_ids_vec, identity_id_bytes, verify_subset_of_proof, @@ -160,7 +160,7 @@ pub fn verify_token_infos_for_identity_id_map( let (root_hash, token_infos_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_infos_for_identity_id( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, &token_ids_vec, identity_id_bytes, verify_subset_of_proof, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_ids.rs b/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_ids.rs index 73acdb22a51..1b1c29f4959 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_ids.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_infos_for_identity_ids.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::tokens::info::IdentityTokenInfo; use dpp::version::PlatformVersion; @@ -82,7 +82,7 @@ pub fn verify_token_infos_for_identity_ids_vec( let (root_hash, token_infos_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_infos_for_identity_ids( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, token_id_bytes, &identity_ids_vec, is_proof_subset, @@ -156,7 +156,7 @@ pub fn verify_token_infos_for_identity_ids_map( let (root_hash, token_infos_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_infos_for_identity_ids( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, token_id_bytes, &identity_ids_vec, is_proof_subset, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_perpetual_distribution_last_paid_time.rs b/packages/wasm-drive-verify/src/tokens/verify_token_perpetual_distribution_last_paid_time.rs index 8ffb8ba24e9..68a2d1b2c8d 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_perpetual_distribution_last_paid_time.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_perpetual_distribution_last_paid_time.rs @@ -1,4 +1,4 @@ -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::version::PlatformVersion; use dpp::data_contract::associated_token::token_perpetual_distribution::reward_distribution_type::RewardDistributionType; use crate::utils::getters::VecU8ToUint8Array; @@ -56,7 +56,7 @@ pub fn verify_token_perpetual_distribution_last_paid_time( let (root_hash, last_paid_time_option) = Drive::verify_token_perpetual_distribution_last_paid_time( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, token_id_bytes, identity_id_bytes, &distribution_type, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_pre_programmed_distributions.rs b/packages/wasm-drive-verify/src/tokens/verify_token_pre_programmed_distributions.rs index 29e184f13a0..386ebc7d420 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_pre_programmed_distributions.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_pre_programmed_distributions.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::balances::credits::TokenAmount; use dpp::identifier::Identifier; @@ -75,7 +75,7 @@ pub fn verify_token_pre_programmed_distributions_vec( type DistributionVec = Vec<(Identifier, TokenAmount)>; let (root_hash, distributions_vec): (RootHash, Vec<(TimestampMillis, DistributionVec)>) = drive::drive::Drive::verify_token_pre_programmed_distributions( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, token_id_bytes, start_at, limit, @@ -156,7 +156,7 @@ pub fn verify_token_pre_programmed_distributions_map( type DistributionMap = BTreeMap; let (root_hash, distributions_map): (RootHash, BTreeMap) = drive::drive::Drive::verify_token_pre_programmed_distributions( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, token_id_bytes, start_at, limit, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_status.rs b/packages/wasm-drive-verify/src/tokens/verify_token_status.rs index 4c911bf887f..f8d410ca253 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_status.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_status.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::tokens::status::TokenStatus; use dpp::version::PlatformVersion; use drive::drive::Drive; @@ -44,7 +44,7 @@ pub fn verify_token_status( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, status_option) = Drive::verify_token_status( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, token_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_statuses.rs b/packages/wasm-drive-verify/src/tokens/verify_token_statuses.rs index d8ad1914db2..c203973a064 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_statuses.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_statuses.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::tokens::status::TokenStatus; use dpp::version::PlatformVersion; @@ -64,7 +64,7 @@ pub fn verify_token_statuses_vec( let (root_hash, statuses_vec): (RootHash, Vec<([u8; 32], Option)>) = drive::drive::Drive::verify_token_statuses( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, &token_ids_vec, verify_subset_of_proof, platform_version, @@ -141,7 +141,7 @@ pub fn verify_token_statuses_map( let (root_hash, statuses_map): (RootHash, BTreeMap<[u8; 32], Option>) = drive::drive::Drive::verify_token_statuses( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, &token_ids_vec, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/tokens/verify_token_total_supply_and_aggregated_identity_balance.rs b/packages/wasm-drive-verify/src/tokens/verify_token_total_supply_and_aggregated_identity_balance.rs index b07f4c6c98c..754a831b015 100644 --- a/packages/wasm-drive-verify/src/tokens/verify_token_total_supply_and_aggregated_identity_balance.rs +++ b/packages/wasm-drive-verify/src/tokens/verify_token_total_supply_and_aggregated_identity_balance.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::{Object, Reflect, Uint8Array}; @@ -43,7 +43,7 @@ pub fn verify_token_total_supply_and_aggregated_identity_balance( let (root_hash, total_balance) = Drive::verify_token_total_supply_and_aggregated_identity_balance( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, token_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/utils/proof.rs b/packages/wasm-drive-verify/src/utils/proof.rs index 3c8562fcf3b..1f1ba2126d7 100644 --- a/packages/wasm-drive-verify/src/utils/proof.rs +++ b/packages/wasm-drive-verify/src/utils/proof.rs @@ -1,51 +1,79 @@ //! GroveDB proof-envelope policy for public WASM verification entry points. use crate::utils::error::{format_error, ErrorCategory}; +use dpp::version::PlatformVersion; use wasm_bindgen::JsValue; -const CURRENT_GROVEDB_PROOF_ENVELOPE_VERSION: u32 = 1; - -pub(crate) fn validate_current_grovedb_proof(proof: &[u8]) -> Result<(), String> { +/// Reject GroveDB proof envelopes older than the floor the protocol version +/// sets in `SystemLimits::minimum_grovedb_proof_envelope_version`. Newer +/// discriminants pass here and fail in GroveDB's own decoder if this build +/// does not know them. +pub(crate) fn validate_supported_grovedb_proof( + proof: &[u8], + platform_version: &PlatformVersion, +) -> Result<(), String> { let config = bincode::config::standard() .with_big_endian() .with_limit::<16>(); let (version, _): (u32, usize) = bincode::decode_from_slice(proof, config) .map_err(|error| format!("invalid GroveDB proof envelope: {error}"))?; - if version != CURRENT_GROVEDB_PROOF_ENVELOPE_VERSION { + let minimum = platform_version + .system_limits + .minimum_grovedb_proof_envelope_version; + if version < minimum { return Err(format!( - "unsupported GroveDB proof envelope version {version}: current-state responses require V1" + "GroveDB proof envelope version {version} is below the minimum {minimum} required by protocol version {}", + platform_version.protocol_version )); } Ok(()) } -pub(crate) fn current_grovedb_proof(proof: &[u8]) -> Result<&[u8], JsValue> { - validate_current_grovedb_proof(proof) +pub(crate) fn supported_grovedb_proof<'a>( + proof: &'a [u8], + platform_version: &PlatformVersion, +) -> Result<&'a [u8], JsValue> { + validate_supported_grovedb_proof(proof, platform_version) .map_err(|error| format_error(ErrorCategory::VerificationError, &error))?; Ok(proof) } #[cfg(test)] mod tests { - use super::validate_current_grovedb_proof; + use super::validate_supported_grovedb_proof; + use dpp::version::PlatformVersion; + + fn envelope(version: u32) -> Vec { + bincode::encode_to_vec(version, bincode::config::standard().with_big_endian()) + .expect("encode proof version") + } #[test] - fn rejects_legacy_and_unknown_proof_envelopes() { - let config = bincode::config::standard().with_big_endian(); + fn rejects_legacy_v0_envelope_at_the_latest_protocol_version() { + let error = validate_supported_grovedb_proof(&envelope(0), PlatformVersion::latest()) + .expect_err("V0 must be rejected"); - for version in [0u32, 2u32] { - let proof = bincode::encode_to_vec(version, config).expect("encode proof version"); - assert!(validate_current_grovedb_proof(&proof).is_err()); - } + assert!( + error.contains("version 0 is below the minimum 1"), + "unexpected message: {error}" + ); } #[test] - fn accepts_v1_proof_envelope() { - let proof = bincode::encode_to_vec(1u32, bincode::config::standard().with_big_endian()) - .expect("encode proof version"); + fn accepts_legacy_v0_envelope_before_protocol_version_14() { + let platform_version = PlatformVersion::get(13).expect("protocol version 13 exists"); - assert!(validate_current_grovedb_proof(&proof).is_ok()); + validate_supported_grovedb_proof(&envelope(0), platform_version) + .expect("protocol version 13 accepts V0 envelopes"); + } + + #[test] + fn accepts_envelopes_at_or_above_the_minimum() { + for version in [1u32, 2u32] { + validate_supported_grovedb_proof(&envelope(version), PlatformVersion::latest()) + .unwrap_or_else(|error| panic!("envelope {version} must pass: {error}")); + } } } diff --git a/packages/wasm-drive-verify/src/voting/verify_contests_proof.rs b/packages/wasm-drive-verify/src/voting/verify_contests_proof.rs index ecdd6cac2f2..bb904d87881 100644 --- a/packages/wasm-drive-verify/src/voting/verify_contests_proof.rs +++ b/packages/wasm-drive-verify/src/voting/verify_contests_proof.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::data_contract::DataContract; use dpp::platform_value::Value; use dpp::version::PlatformVersion; @@ -81,7 +81,10 @@ pub fn verify_contests_proof( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, contests_vec) = query - .verify_contests_proof(current_grovedb_proof(&proof_vec)?, platform_version) + .verify_contests_proof( + supported_grovedb_proof(&proof_vec, platform_version)?, + platform_version, + ) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert Values to JS array diff --git a/packages/wasm-drive-verify/src/voting/verify_identity_votes_given_proof.rs b/packages/wasm-drive-verify/src/voting/verify_identity_votes_given_proof.rs index 8a1c80cdcf8..d182064212a 100644 --- a/packages/wasm-drive-verify/src/voting/verify_identity_votes_given_proof.rs +++ b/packages/wasm-drive-verify/src/voting/verify_identity_votes_given_proof.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use crate::utils::serialization::identifier_to_base58; use dpp::data_contract::DataContract; use dpp::identifier::Identifier; @@ -97,7 +97,7 @@ pub fn verify_identity_votes_given_proof_vec( let (root_hash, votes_vec): (RootHash, Vec<(Identifier, ResourceVote)>) = query .verify_identity_votes_given_proof( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, &*contract_lookup_fn, platform_version, ) @@ -150,7 +150,7 @@ pub fn verify_identity_votes_given_proof_map( let (root_hash, votes_map): (RootHash, BTreeMap) = query .verify_identity_votes_given_proof( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, &*contract_lookup_fn, platform_version, ) diff --git a/packages/wasm-drive-verify/src/voting/verify_masternode_vote.rs b/packages/wasm-drive-verify/src/voting/verify_masternode_vote.rs index 111aedbbe22..f1323559dae 100644 --- a/packages/wasm-drive-verify/src/voting/verify_masternode_vote.rs +++ b/packages/wasm-drive-verify/src/voting/verify_masternode_vote.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::data_contract::DataContract; use dpp::serialization::PlatformDeserializableWithPotentialValidationFromVersionedStructure; use dpp::version::PlatformVersion; @@ -59,7 +59,7 @@ pub fn verify_masternode_vote( .map_err(|e| JsValue::from_str(&format!("Failed to deserialize data contract: {:?}", e)))?; let (root_hash, vote_option) = Drive::verify_masternode_vote( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, masternode_pro_tx_hash_bytes, &vote, &data_contract, diff --git a/packages/wasm-drive-verify/src/voting/verify_specialized_balance.rs b/packages/wasm-drive-verify/src/voting/verify_specialized_balance.rs index 65e5f0f8d70..b0438fb46d3 100644 --- a/packages/wasm-drive-verify/src/voting/verify_specialized_balance.rs +++ b/packages/wasm-drive-verify/src/voting/verify_specialized_balance.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::version::PlatformVersion; use drive::drive::Drive; use js_sys::Uint8Array; @@ -42,7 +42,7 @@ pub fn verify_specialized_balance( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, balance_option) = Drive::verify_specialized_balance( - current_grovedb_proof(&proof_vec)?, + supported_grovedb_proof(&proof_vec, platform_version)?, specialized_balance_id_bytes, verify_subset_of_proof, platform_version, diff --git a/packages/wasm-drive-verify/src/voting/verify_vote_poll_vote_state_proof.rs b/packages/wasm-drive-verify/src/voting/verify_vote_poll_vote_state_proof.rs index cbd01271287..4455a001633 100644 --- a/packages/wasm-drive-verify/src/voting/verify_vote_poll_vote_state_proof.rs +++ b/packages/wasm-drive-verify/src/voting/verify_vote_poll_vote_state_proof.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; use dpp::identifier::Identifier; @@ -96,7 +96,10 @@ pub fn verify_vote_poll_vote_state_proof( .map_err(|e| JsValue::from_str(&format!("Failed to resolve query: {:?}", e)))?; let (root_hash, execution_result) = resolved_query - .verify_vote_poll_vote_state_proof(current_grovedb_proof(&proof_vec)?, platform_version) + .verify_vote_poll_vote_state_proof( + supported_grovedb_proof(&proof_vec, platform_version)?, + platform_version, + ) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert execution result to JS object diff --git a/packages/wasm-drive-verify/src/voting/verify_vote_poll_votes_proof.rs b/packages/wasm-drive-verify/src/voting/verify_vote_poll_votes_proof.rs index 81476fb89ba..4e25b19727b 100644 --- a/packages/wasm-drive-verify/src/voting/verify_vote_poll_votes_proof.rs +++ b/packages/wasm-drive-verify/src/voting/verify_vote_poll_votes_proof.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; use dpp::identifier::Identifier; @@ -106,7 +106,10 @@ pub fn verify_vote_poll_votes_proof( .map_err(|e| JsValue::from_str(&format!("Failed to resolve query: {:?}", e)))?; let (root_hash, votes_vec) = resolved_query - .verify_vote_poll_votes_proof(current_grovedb_proof(&proof_vec)?, platform_version) + .verify_vote_poll_votes_proof( + supported_grovedb_proof(&proof_vec, platform_version)?, + platform_version, + ) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert identifiers to JS array diff --git a/packages/wasm-drive-verify/src/voting/verify_vote_polls_end_date_query.rs b/packages/wasm-drive-verify/src/voting/verify_vote_polls_end_date_query.rs index fb440edae57..71dfd2c1bfb 100644 --- a/packages/wasm-drive-verify/src/voting/verify_vote_polls_end_date_query.rs +++ b/packages/wasm-drive-verify/src/voting/verify_vote_polls_end_date_query.rs @@ -1,5 +1,5 @@ use crate::utils::getters::VecU8ToUint8Array; -use crate::utils::proof::current_grovedb_proof; +use crate::utils::proof::supported_grovedb_proof; use bincode; use dpp::prelude::TimestampMillis; use dpp::version::PlatformVersion; @@ -48,7 +48,10 @@ pub fn verify_vote_polls_end_date_query_vec( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, polls_vec): (RootHash, Vec<(TimestampMillis, Vec)>) = query - .verify_vote_polls_by_end_date_proof(current_grovedb_proof(&proof_vec)?, platform_version) + .verify_vote_polls_by_end_date_proof( + supported_grovedb_proof(&proof_vec, platform_version)?, + platform_version, + ) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert to JS array of tuples @@ -99,7 +102,10 @@ pub fn verify_vote_polls_end_date_query_map( .map_err(|e| JsValue::from_str(&format!("Invalid platform version: {:?}", e)))?; let (root_hash, polls_map): (RootHash, BTreeMap>) = query - .verify_vote_polls_by_end_date_proof(current_grovedb_proof(&proof_vec)?, platform_version) + .verify_vote_polls_by_end_date_proof( + supported_grovedb_proof(&proof_vec, platform_version)?, + platform_version, + ) .map_err(|e| JsValue::from_str(&format!("Verification failed: {:?}", e)))?; // Convert to JS object with timestamp as string key diff --git a/packages/wasm-drive-verify/tests/identity_tests.rs b/packages/wasm-drive-verify/tests/identity_tests.rs index 4a02e1a2078..3fc2c0dc754 100644 --- a/packages/wasm-drive-verify/tests/identity_tests.rs +++ b/packages/wasm-drive-verify/tests/identity_tests.rs @@ -1,5 +1,6 @@ //! Tests for identity verification functions +use dpp::version::PlatformVersion; use js_sys::Uint8Array; use wasm_bindgen_test::*; use wasm_drive_verify::identity_verification::*; @@ -106,7 +107,7 @@ fn test_verify_identity_nonce_invalid_identity_id() { } /// A bincode-encoded GroveDB proof envelope discriminant with no payload. -/// Version 1 is the only envelope the public entry points accept. +/// The latest protocol version requires at least version 1. fn envelope_only_proof(version: u32) -> Uint8Array { let bytes = bincode::encode_to_vec(version, bincode::config::standard().with_big_endian()) .expect("encode envelope version"); @@ -117,12 +118,12 @@ fn envelope_only_proof(version: u32) -> Uint8Array { fn test_verify_identity_rejects_legacy_v0_envelope() { let proof = envelope_only_proof(0); let identity_id = Uint8Array::from(&mock_identifier()[..]); - let platform_version = test_platform_version(); + let platform_version = PlatformVersion::latest().protocol_version; let result = verify_full_identity_by_identity_id(&proof, false, &identity_id, platform_version); assert_error_contains( &result.map(|_| ()), - "unsupported GroveDB proof envelope version 0", + "GroveDB proof envelope version 0 is below the minimum 1", ); } @@ -131,7 +132,7 @@ fn test_verify_identity_by_non_unique_public_key_hash_rejects_v0_inner_proof() { let inner_proof = envelope_only_proof(0); let outer_proof = envelope_only_proof(1); let public_key_hash = Uint8Array::from(&[0u8; 20][..]); - let platform_version = test_platform_version(); + let platform_version = PlatformVersion::latest().protocol_version; let result = verify_full_identity_by_non_unique_public_key_hash( Some(inner_proof), @@ -142,7 +143,7 @@ fn test_verify_identity_by_non_unique_public_key_hash_rejects_v0_inner_proof() { ); assert_error_contains( &result.map(|_| ()), - "unsupported GroveDB proof envelope version 0", + "GroveDB proof envelope version 0 is below the minimum 1", ); } @@ -150,7 +151,7 @@ fn test_verify_identity_by_non_unique_public_key_hash_rejects_v0_inner_proof() { fn test_verify_identity_by_non_unique_public_key_hash_rejects_v0_outer_proof() { let outer_proof = envelope_only_proof(0); let public_key_hash = Uint8Array::from(&[0u8; 20][..]); - let platform_version = test_platform_version(); + let platform_version = PlatformVersion::latest().protocol_version; let result = verify_full_identity_by_non_unique_public_key_hash( None, @@ -161,7 +162,7 @@ fn test_verify_identity_by_non_unique_public_key_hash_rejects_v0_outer_proof() { ); assert_error_contains( &result.map(|_| ()), - "unsupported GroveDB proof envelope version 0", + "GroveDB proof envelope version 0 is below the minimum 1", ); } From b8142415fe0d397ba392ebeff0b3ea880c757018 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 13 Sep 2026 20:27:17 +0700 Subject: [PATCH 6/7] fix(sdk)!: type the GroveDB proof envelope rejections A policy rejection is not a corrupted proof, so Drive gains two ProofError variants instead of reusing CorruptedProof: InvalidGroveDBProofEnvelope when the bytes carry no decodable discriminant, and UnsupportedGroveDBProofEnvelopeVersion when the envelope is below the protocol version's floor. Both name which proof was read (the proof, the predecessor proof, or the forward proof) so the compacted address verifier can say which half failed. wasm-drive-verify builds the same variants for its JavaScript and native entry points, and drive-proof-verifier maps the version variant onto its own Error::UnsupportedGroveDBProofVersion, which now carries the proof label too, so SDK callers see one variant for direct and nested rejections alike. Co-Authored-By: Claude Fable 5.1 --- packages/rs-drive-proof-verifier/src/error.rs | 26 ++++++-- .../rs-drive-proof-verifier/src/verify.rs | 1 + packages/rs-drive/src/error/proof.rs | 28 +++++++++ .../v1/mod.rs | 42 +++++++++---- packages/wasm-drive-verify/src/native.rs | 30 ++++++--- packages/wasm-drive-verify/src/utils/proof.rs | 63 ++++++++++++++++--- .../wasm-drive-verify/tests/identity_tests.rs | 6 +- 7 files changed, 157 insertions(+), 39 deletions(-) diff --git a/packages/rs-drive-proof-verifier/src/error.rs b/packages/rs-drive-proof-verifier/src/error.rs index 84d34416f34..9acc81f5804 100644 --- a/packages/rs-drive-proof-verifier/src/error.rs +++ b/packages/rs-drive-proof-verifier/src/error.rs @@ -1,5 +1,6 @@ use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; use dpp::ProtocolError; +use drive::error::proof::ProofError; use drive::grovedb::Error as GroveError; use drive::query::PathQuery; @@ -44,11 +45,15 @@ pub enum Error { #[error("no proof in result")] NoProofInResult, - /// GroveDB proof envelope older than the protocol version's floor + /// GroveDB proof envelope older than the floor the protocol version sets in + /// `SystemLimits::minimum_grovedb_proof_envelope_version`; the payload is + /// refused before Drive verifies it. #[error( - "GroveDB proof envelope version {version} is below the minimum {minimum} required by protocol version {protocol_version}" + "unsupported GroveDB proof envelope version {version} in the {proof}: protocol version {protocol_version} requires at least version {minimum}" )] UnsupportedGroveDBProofVersion { + /// Which proof was being read: "proof", "predecessor proof", "forward proof" + proof: &'static str, version: u32, minimum: u32, protocol_version: u32, @@ -109,8 +114,21 @@ pub enum Error { impl From for Error { fn from(error: drive::error::Error) -> Self { - Self::DriveError { - error: error.to_string(), + match error { + drive::error::Error::Proof(ProofError::UnsupportedGroveDBProofEnvelopeVersion { + proof, + version, + minimum, + protocol_version, + }) => Self::UnsupportedGroveDBProofVersion { + proof, + version, + minimum, + protocol_version, + }, + error => Self::DriveError { + error: error.to_string(), + }, } } } diff --git a/packages/rs-drive-proof-verifier/src/verify.rs b/packages/rs-drive-proof-verifier/src/verify.rs index e46f28e2177..d8173e955af 100644 --- a/packages/rs-drive-proof-verifier/src/verify.rs +++ b/packages/rs-drive-proof-verifier/src/verify.rs @@ -35,6 +35,7 @@ pub(crate) fn require_supported_grovedb_proof_bytes( .minimum_grovedb_proof_envelope_version; if version < minimum { return Err(Error::UnsupportedGroveDBProofVersion { + proof: "proof", version, minimum, protocol_version: platform_version.protocol_version, diff --git a/packages/rs-drive/src/error/proof.rs b/packages/rs-drive/src/error/proof.rs index b2c14a57ed7..024bdb88ce7 100644 --- a/packages/rs-drive/src/error/proof.rs +++ b/packages/rs-drive/src/error/proof.rs @@ -73,6 +73,32 @@ pub enum ProofError { /// The actual path actual: Path, }, + + /// The bytes do not start with a decodable GroveDB proof envelope discriminant. + #[error("invalid GroveDB proof envelope in the {proof}: {reason}")] + InvalidGroveDBProofEnvelope { + /// Which proof was being read: "proof", "predecessor proof", "forward proof" + proof: &'static str, + /// The decoder's own error + reason: String, + }, + + /// The GroveDB proof envelope is older than the floor the protocol version sets in + /// `SystemLimits::minimum_grovedb_proof_envelope_version`, so its payload is refused + /// before Drive verifies it. + #[error( + "unsupported GroveDB proof envelope version {version} in the {proof}: protocol version {protocol_version} requires at least version {minimum}" + )] + UnsupportedGroveDBProofEnvelopeVersion { + /// Which proof was being read: "proof", "predecessor proof", "forward proof" + proof: &'static str, + /// The envelope version found in the bytes + version: u32, + /// The floor the protocol version sets + minimum: u32, + /// The protocol version the verifier ran with + protocol_version: u32, + }, } #[allow(dead_code)] #[deprecated(note = "This function is marked as unused.")] @@ -93,5 +119,7 @@ fn get_error_code(error: &ProofError) -> u32 { ProofError::InvalidMetadata(_) => 6011, ProofError::MissingContextRequirement(_) => 6012, ProofError::UnexpectedResultProof(_) => 6013, + ProofError::InvalidGroveDBProofEnvelope { .. } => 6014, + ProofError::UnsupportedGroveDBProofEnvelopeVersion { .. } => 6015, } } diff --git a/packages/rs-drive/src/verify/address_funds/verify_compacted_address_balance_changes/v1/mod.rs b/packages/rs-drive/src/verify/address_funds/verify_compacted_address_balance_changes/v1/mod.rs index 8076225988b..07ba37b8b8f 100644 --- a/packages/rs-drive/src/verify/address_funds/verify_compacted_address_balance_changes/v1/mod.rs +++ b/packages/rs-drive/src/verify/address_funds/verify_compacted_address_balance_changes/v1/mod.rs @@ -27,7 +27,7 @@ use super::{CompactedAddressBalanceProof, VerifiedCompactedAddressBalanceChanges /// version sets in `SystemLimits::minimum_grovedb_proof_envelope_version`. fn require_supported_grovedb_proof( proof: &[u8], - label: &str, + label: &'static str, platform_version: &PlatformVersion, ) -> Result<(), Error> { let config = bincode::config::standard() @@ -35,19 +35,24 @@ fn require_supported_grovedb_proof( .with_limit::<16>(); let (version, _): (u32, usize) = bincode::decode_from_slice(proof, config).map_err(|error| { - Error::Proof(ProofError::CorruptedProof(format!( - "invalid {label} GroveDB proof envelope: {error}" - ))) + Error::Proof(ProofError::InvalidGroveDBProofEnvelope { + proof: label, + reason: error.to_string(), + }) })?; let minimum = platform_version .system_limits .minimum_grovedb_proof_envelope_version; if version < minimum { - return Err(Error::Proof(ProofError::CorruptedProof(format!( - "{label} GroveDB proof envelope version {version} is below the minimum {minimum} required by protocol version {}", - platform_version.protocol_version - )))); + return Err(Error::Proof( + ProofError::UnsupportedGroveDBProofEnvelopeVersion { + proof: label, + version, + minimum, + protocol_version: platform_version.protocol_version, + }, + )); } Ok(()) @@ -90,12 +95,12 @@ impl Drive { require_supported_grovedb_proof( &proof_envelope.predecessor_proof, - "predecessor", + "predecessor proof", platform_version, )?; require_supported_grovedb_proof( &proof_envelope.forward_proof, - "forward", + "forward proof", platform_version, )?; @@ -357,10 +362,21 @@ mod tests { platform_version, ) .expect_err("V0 nested proof must be rejected"); + let expected_proof = if predecessor { + "predecessor proof" + } else { + "forward proof" + }; assert!( - error - .to_string() - .contains("GroveDB proof envelope version 0 is below the minimum 1"), + matches!( + &error, + Error::Proof(ProofError::UnsupportedGroveDBProofEnvelopeVersion { + proof, + version: 0, + minimum: 1, + .. + }) if *proof == expected_proof + ), "unexpected error: {error}" ); } diff --git a/packages/wasm-drive-verify/src/native.rs b/packages/wasm-drive-verify/src/native.rs index 78a503295af..28564466e3d 100644 --- a/packages/wasm-drive-verify/src/native.rs +++ b/packages/wasm-drive-verify/src/native.rs @@ -9,15 +9,13 @@ use dpp::document::Document; use dpp::identity::Identity; use dpp::version::PlatformVersion; use drive::drive::Drive; -use drive::error::proof::ProofError; use drive::query::DriveDocumentQuery; fn supported_grovedb_proof<'a>( proof: &'a [u8], platform_version: &PlatformVersion, ) -> Result<&'a [u8], drive::error::Error> { - validate_supported_grovedb_proof(proof, platform_version) - .map_err(|error| drive::error::Error::Proof(ProofError::CorruptedProof(error)))?; + validate_supported_grovedb_proof(proof, platform_version)?; Ok(proof) } @@ -87,19 +85,31 @@ mod tests { } fn assert_rejected_envelope(result: Result<(), Error>) { - match result { - Err(Error::Proof(ProofError::CorruptedProof(message))) => assert!( - message.contains("GroveDB proof envelope version 0 is below the minimum 1"), - "unexpected message: {message}" + let error = result.expect_err("V0 envelope must be rejected"); + assert!( + matches!( + error, + Error::Proof(ProofError::UnsupportedGroveDBProofEnvelopeVersion { + proof: "proof", + version: 0, + minimum: 1, + .. + }) ), - other => panic!("expected envelope rejection, got {other:?}"), - } + "expected envelope rejection, got {error:?}" + ); } fn assert_not_an_envelope_rejection(result: Result<(), Error>) { let error = result.expect_err("payload without a proof body cannot verify"); assert!( - !error.to_string().contains("GroveDB proof envelope"), + !matches!( + error, + Error::Proof( + ProofError::UnsupportedGroveDBProofEnvelopeVersion { .. } + | ProofError::InvalidGroveDBProofEnvelope { .. } + ) + ), "must not be rejected by the envelope policy: {error}" ); } diff --git a/packages/wasm-drive-verify/src/utils/proof.rs b/packages/wasm-drive-verify/src/utils/proof.rs index 1f1ba2126d7..8f8bef959a1 100644 --- a/packages/wasm-drive-verify/src/utils/proof.rs +++ b/packages/wasm-drive-verify/src/utils/proof.rs @@ -2,6 +2,8 @@ use crate::utils::error::{format_error, ErrorCategory}; use dpp::version::PlatformVersion; +use drive::error::proof::ProofError; +use drive::error::Error; use wasm_bindgen::JsValue; /// Reject GroveDB proof envelopes older than the floor the protocol version @@ -11,20 +13,29 @@ use wasm_bindgen::JsValue; pub(crate) fn validate_supported_grovedb_proof( proof: &[u8], platform_version: &PlatformVersion, -) -> Result<(), String> { +) -> Result<(), Error> { let config = bincode::config::standard() .with_big_endian() .with_limit::<16>(); - let (version, _): (u32, usize) = bincode::decode_from_slice(proof, config) - .map_err(|error| format!("invalid GroveDB proof envelope: {error}"))?; + let (version, _): (u32, usize) = + bincode::decode_from_slice(proof, config).map_err(|error| { + Error::Proof(ProofError::InvalidGroveDBProofEnvelope { + proof: "proof", + reason: error.to_string(), + }) + })?; let minimum = platform_version .system_limits .minimum_grovedb_proof_envelope_version; if version < minimum { - return Err(format!( - "GroveDB proof envelope version {version} is below the minimum {minimum} required by protocol version {}", - platform_version.protocol_version + return Err(Error::Proof( + ProofError::UnsupportedGroveDBProofEnvelopeVersion { + proof: "proof", + version, + minimum, + protocol_version: platform_version.protocol_version, + }, )); } @@ -36,7 +47,7 @@ pub(crate) fn supported_grovedb_proof<'a>( platform_version: &PlatformVersion, ) -> Result<&'a [u8], JsValue> { validate_supported_grovedb_proof(proof, platform_version) - .map_err(|error| format_error(ErrorCategory::VerificationError, &error))?; + .map_err(|error| format_error(ErrorCategory::VerificationError, &error.to_string()))?; Ok(proof) } @@ -44,6 +55,8 @@ pub(crate) fn supported_grovedb_proof<'a>( mod tests { use super::validate_supported_grovedb_proof; use dpp::version::PlatformVersion; + use drive::error::proof::ProofError; + use drive::error::Error; fn envelope(version: u32) -> Vec { bincode::encode_to_vec(version, bincode::config::standard().with_big_endian()) @@ -56,8 +69,40 @@ mod tests { .expect_err("V0 must be rejected"); assert!( - error.contains("version 0 is below the minimum 1"), - "unexpected message: {error}" + matches!( + error, + Error::Proof(ProofError::UnsupportedGroveDBProofEnvelopeVersion { + proof: "proof", + version: 0, + minimum: 1, + .. + }) + ), + "unexpected error: {error}" + ); + let Error::Proof(proof_error) = error else { + panic!("expected a proof error"); + }; + assert_eq!( + proof_error.to_string(), + format!( + "unsupported GroveDB proof envelope version 0 in the proof: protocol version {} requires at least version 1", + PlatformVersion::latest().protocol_version + ) + ); + } + + #[test] + fn rejects_bytes_without_an_envelope_discriminant() { + let error = validate_supported_grovedb_proof(&[], PlatformVersion::latest()) + .expect_err("empty bytes carry no envelope"); + + assert!( + matches!( + error, + Error::Proof(ProofError::InvalidGroveDBProofEnvelope { proof: "proof", .. }) + ), + "unexpected error: {error}" ); } diff --git a/packages/wasm-drive-verify/tests/identity_tests.rs b/packages/wasm-drive-verify/tests/identity_tests.rs index 3fc2c0dc754..9b0d5d3b7c2 100644 --- a/packages/wasm-drive-verify/tests/identity_tests.rs +++ b/packages/wasm-drive-verify/tests/identity_tests.rs @@ -123,7 +123,7 @@ fn test_verify_identity_rejects_legacy_v0_envelope() { let result = verify_full_identity_by_identity_id(&proof, false, &identity_id, platform_version); assert_error_contains( &result.map(|_| ()), - "GroveDB proof envelope version 0 is below the minimum 1", + "unsupported GroveDB proof envelope version 0 in the proof", ); } @@ -143,7 +143,7 @@ fn test_verify_identity_by_non_unique_public_key_hash_rejects_v0_inner_proof() { ); assert_error_contains( &result.map(|_| ()), - "GroveDB proof envelope version 0 is below the minimum 1", + "unsupported GroveDB proof envelope version 0 in the proof", ); } @@ -162,7 +162,7 @@ fn test_verify_identity_by_non_unique_public_key_hash_rejects_v0_outer_proof() { ); assert_error_contains( &result.map(|_| ()), - "GroveDB proof envelope version 0 is below the minimum 1", + "unsupported GroveDB proof envelope version 0 in the proof", ); } From 7b80d8db89cce5f70610e85fcb308a8fa91d02a5 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 13 Sep 2026 20:35:18 +0700 Subject: [PATCH 7/7] test(sdk): drive every direct-proof FromProof path with a legacy envelope Gating the recorded V0 vectors took most of the FromProof paths out of the offline suite, so add a table-driven regression that feeds a V0 GroveDB envelope to each direct-proof FromProof implementation at the latest protocol version and expects the typed rejection. The provider panics if touched, so a path that lost its gate fails loudly rather than reaching Drive or the context provider. Co-Authored-By: Claude Fable 5.1 --- packages/rs-drive-proof-verifier/src/proof.rs | 886 ++++++++++++++++++ 1 file changed, 886 insertions(+) diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index 0f19c84eb82..e5e2a6be4d3 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -6295,4 +6295,890 @@ mod tests { .unwrap_err(); assert!(matches!(err, Error::ProtocolError { .. }), "got: {err:?}"); } + + /// Every direct-proof `FromProof` path rejects a legacy envelope before + /// its bytes reach Drive, whatever else the request carries. The provider + /// panics if touched, so a case that reaches it has lost the gate. + mod legacy_envelope_gate { + use super::*; + use crate::types::groups::{GroupActionSigners, GroupActions, Groups}; + use crate::types::identity_token_balance::{ + IdentitiesTokenBalances, IdentityTokenBalances, + }; + use crate::types::token_info::{IdentitiesTokenInfos, IdentityTokenInfos}; + use crate::types::token_status::TokenStatuses; + use dpp::balances::total_single_token_balance::TotalSingleTokenBalance; + use dpp::data_contract::group::Group; + use dpp::tokens::contract_info::TokenContractInfo; + + fn legacy_proof() -> Proof { + Proof { + grovedb_proof: bincode::encode_to_vec( + 0u32, + bincode::config::standard().with_big_endian(), + ) + .expect("V0 envelope discriminant should encode"), + ..Proof::default() + } + } + + fn id(byte: u8) -> Vec { + vec![byte; 32] + } + + macro_rules! request { + ($module:ident, $v0:ident, $request:ident { $($field:ident: $value:expr),* $(,)? }) => { + { + // Some request bodies list every field; keep one macro + // shape for all of them. + #[allow(clippy::needless_update)] + let body = platform::$module::$v0 { + $($field: $value,)* + ..Default::default() + }; + platform::$request { + version: Some(platform::$module::Version::V0(body)), + } + } + }; + } + + macro_rules! legacy_response { + ($module:ident, $v0_module:ident, $v0:ident, $response:ident) => { + platform::$response { + version: Some(platform::$module::Version::V0(platform::$module::$v0 { + result: Some(platform::$module::$v0_module::Result::Proof(legacy_proof())), + metadata: Some(ResponseMetadata::default()), + })), + } + }; + } + + macro_rules! assert_rejects_legacy_envelope { + ($target:ty, $request_type:ty, $request:expr, $response:expr) => {{ + let error = <$target as FromProof<$request_type>>::maybe_from_proof( + $request, + $response, + Network::Testnet, + PlatformVersion::latest(), + &unreachable_provider(), + ) + .expect_err(concat!( + stringify!($target), + " must reject a legacy envelope" + )); + assert!( + matches!( + error, + Error::UnsupportedGroveDBProofVersion { + version: 0, + minimum: 1, + .. + } + ), + "{}: {error:?}", + stringify!($target) + ); + }}; + } + + #[test] + fn identity_queries() { + assert_rejects_legacy_envelope!( + Identity, + platform::GetIdentityRequest, + request!( + get_identity_request, + GetIdentityRequestV0, + GetIdentityRequest { + id: id(1), + prove: true + } + ), + legacy_response!( + get_identity_response, + get_identity_response_v0, + GetIdentityResponseV0, + GetIdentityResponse + ) + ); + assert_rejects_legacy_envelope!( + Identity, + platform::GetIdentityByPublicKeyHashRequest, + request!( + get_identity_by_public_key_hash_request, + GetIdentityByPublicKeyHashRequestV0, + GetIdentityByPublicKeyHashRequest { + public_key_hash: vec![1; 20], + prove: true + } + ), + legacy_response!( + get_identity_by_public_key_hash_response, + get_identity_by_public_key_hash_response_v0, + GetIdentityByPublicKeyHashResponseV0, + GetIdentityByPublicKeyHashResponse + ) + ); + assert_rejects_legacy_envelope!( + IdentityPublicKeys, + platform::GetIdentityKeysRequest, + request!( + get_identity_keys_request, + GetIdentityKeysRequestV0, + GetIdentityKeysRequest { + identity_id: id(1), + request_type: Some(platform::KeyRequestType { + request: Some(platform::key_request_type::Request::AllKeys( + platform::AllKeys {} + )), + }), + prove: true + } + ), + legacy_response!( + get_identity_keys_response, + get_identity_keys_response_v0, + GetIdentityKeysResponseV0, + GetIdentityKeysResponse + ) + ); + assert_rejects_legacy_envelope!( + IdentityNonceFetcher, + platform::GetIdentityNonceRequest, + request!( + get_identity_nonce_request, + GetIdentityNonceRequestV0, + GetIdentityNonceRequest { + identity_id: id(1), + prove: true + } + ), + legacy_response!( + get_identity_nonce_response, + get_identity_nonce_response_v0, + GetIdentityNonceResponseV0, + GetIdentityNonceResponse + ) + ); + assert_rejects_legacy_envelope!( + IdentityContractNonceFetcher, + platform::GetIdentityContractNonceRequest, + request!( + get_identity_contract_nonce_request, + GetIdentityContractNonceRequestV0, + GetIdentityContractNonceRequest { + identity_id: id(1), + contract_id: id(2), + prove: true + } + ), + legacy_response!( + get_identity_contract_nonce_response, + get_identity_contract_nonce_response_v0, + GetIdentityContractNonceResponseV0, + GetIdentityContractNonceResponse + ) + ); + assert_rejects_legacy_envelope!( + IdentityBalance, + platform::GetIdentityBalanceRequest, + request!( + get_identity_balance_request, + GetIdentityBalanceRequestV0, + GetIdentityBalanceRequest { + id: id(1), + prove: true + } + ), + legacy_response!( + get_identity_balance_response, + get_identity_balance_response_v0, + GetIdentityBalanceResponseV0, + GetIdentityBalanceResponse + ) + ); + assert_rejects_legacy_envelope!( + IdentityBalances, + platform::GetIdentitiesBalancesRequest, + request!( + get_identities_balances_request, + GetIdentitiesBalancesRequestV0, + GetIdentitiesBalancesRequest { + ids: vec![id(1)], + prove: true + } + ), + legacy_response!( + get_identities_balances_response, + get_identities_balances_response_v0, + GetIdentitiesBalancesResponseV0, + GetIdentitiesBalancesResponse + ) + ); + assert_rejects_legacy_envelope!( + IdentityBalanceAndRevision, + platform::GetIdentityBalanceAndRevisionRequest, + request!( + get_identity_balance_and_revision_request, + GetIdentityBalanceAndRevisionRequestV0, + GetIdentityBalanceAndRevisionRequest { + id: id(1), + prove: true + } + ), + legacy_response!( + get_identity_balance_and_revision_response, + get_identity_balance_and_revision_response_v0, + GetIdentityBalanceAndRevisionResponseV0, + GetIdentityBalanceAndRevisionResponse + ) + ); + assert_rejects_legacy_envelope!( + IdentitiesContractKeys, + platform::GetIdentitiesContractKeysRequest, + request!( + get_identities_contract_keys_request, + GetIdentitiesContractKeysRequestV0, + GetIdentitiesContractKeysRequest { + identities_ids: vec![id(1)], + contract_id: id(2), + prove: true + } + ), + legacy_response!( + get_identities_contract_keys_response, + get_identities_contract_keys_response_v0, + GetIdentitiesContractKeysResponseV0, + GetIdentitiesContractKeysResponse + ) + ); + } + + #[test] + fn contract_and_address_queries() { + assert_rejects_legacy_envelope!( + DataContract, + platform::GetDataContractRequest, + request!( + get_data_contract_request, + GetDataContractRequestV0, + GetDataContractRequest { + id: id(1), + prove: true + } + ), + legacy_response!( + get_data_contract_response, + get_data_contract_response_v0, + GetDataContractResponseV0, + GetDataContractResponse + ) + ); + assert_rejects_legacy_envelope!( + (DataContract, Vec), + platform::GetDataContractRequest, + request!( + get_data_contract_request, + GetDataContractRequestV0, + GetDataContractRequest { + id: id(1), + prove: true + } + ), + legacy_response!( + get_data_contract_response, + get_data_contract_response_v0, + GetDataContractResponseV0, + GetDataContractResponse + ) + ); + assert_rejects_legacy_envelope!( + DataContracts, + platform::GetDataContractsRequest, + request!( + get_data_contracts_request, + GetDataContractsRequestV0, + GetDataContractsRequest { + ids: vec![id(1)], + prove: true + } + ), + legacy_response!( + get_data_contracts_response, + get_data_contracts_response_v0, + GetDataContractsResponseV0, + GetDataContractsResponse + ) + ); + assert_rejects_legacy_envelope!( + DataContractHistory, + platform::GetDataContractHistoryRequest, + request!( + get_data_contract_history_request, + GetDataContractHistoryRequestV0, + GetDataContractHistoryRequest { + id: id(1), + prove: true + } + ), + legacy_response!( + get_data_contract_history_response, + get_data_contract_history_response_v0, + GetDataContractHistoryResponseV0, + GetDataContractHistoryResponse + ) + ); + assert_rejects_legacy_envelope!( + AddressInfos, + platform::GetAddressesInfosRequest, + request!( + get_addresses_infos_request, + GetAddressesInfosRequestV0, + GetAddressesInfosRequest { prove: true } + ), + legacy_response!( + get_addresses_infos_response, + get_addresses_infos_response_v0, + GetAddressesInfosResponseV0, + GetAddressesInfosResponse + ) + ); + assert_rejects_legacy_envelope!( + RecentAddressBalanceChanges, + platform::GetRecentAddressBalanceChangesRequest, + request!( + get_recent_address_balance_changes_request, + GetRecentAddressBalanceChangesRequestV0, + GetRecentAddressBalanceChangesRequest { + start_height: 1, + prove: true + } + ), + legacy_response!( + get_recent_address_balance_changes_response, + get_recent_address_balance_changes_response_v0, + GetRecentAddressBalanceChangesResponseV0, + GetRecentAddressBalanceChangesResponse + ) + ); + assert_rejects_legacy_envelope!( + PrefundedSpecializedBalance, + platform::GetPrefundedSpecializedBalanceRequest, + request!( + get_prefunded_specialized_balance_request, + GetPrefundedSpecializedBalanceRequestV0, + GetPrefundedSpecializedBalanceRequest { + id: id(1), + prove: true + } + ), + legacy_response!( + get_prefunded_specialized_balance_response, + get_prefunded_specialized_balance_response_v0, + GetPrefundedSpecializedBalanceResponseV0, + GetPrefundedSpecializedBalanceResponse + ) + ); + assert_rejects_legacy_envelope!( + VotePollsGroupedByTimestamp, + platform::GetVotePollsByEndDateRequest, + request!( + get_vote_polls_by_end_date_request, + GetVotePollsByEndDateRequestV0, + GetVotePollsByEndDateRequest { prove: true } + ), + legacy_response!( + get_vote_polls_by_end_date_response, + get_vote_polls_by_end_date_response_v0, + GetVotePollsByEndDateResponseV0, + GetVotePollsByEndDateResponse + ) + ); + } + + #[test] + fn system_queries() { + assert_rejects_legacy_envelope!( + ExtendedEpochInfos, + platform::GetEpochsInfoRequest, + request!( + get_epochs_info_request, + GetEpochsInfoRequestV0, + GetEpochsInfoRequest { + count: 1, + ascending: true, + prove: true + } + ), + legacy_response!( + get_epochs_info_response, + get_epochs_info_response_v0, + GetEpochsInfoResponseV0, + GetEpochsInfoResponse + ) + ); + assert_rejects_legacy_envelope!( + FinalizedEpochInfos, + platform::GetFinalizedEpochInfosRequest, + request!( + get_finalized_epoch_infos_request, + GetFinalizedEpochInfosRequestV0, + GetFinalizedEpochInfosRequest { + end_epoch_index: 1, + prove: true + } + ), + legacy_response!( + get_finalized_epoch_infos_response, + get_finalized_epoch_infos_response_v0, + GetFinalizedEpochInfosResponseV0, + GetFinalizedEpochInfosResponse + ) + ); + assert_rejects_legacy_envelope!( + ProtocolVersionUpgrades, + platform::GetProtocolVersionUpgradeStateRequest, + request!( + get_protocol_version_upgrade_state_request, + GetProtocolVersionUpgradeStateRequestV0, + GetProtocolVersionUpgradeStateRequest { prove: true } + ), + legacy_response!( + get_protocol_version_upgrade_state_response, + get_protocol_version_upgrade_state_response_v0, + GetProtocolVersionUpgradeStateResponseV0, + GetProtocolVersionUpgradeStateResponse + ) + ); + assert_rejects_legacy_envelope!( + MasternodeProtocolVotes, + platform::GetProtocolVersionUpgradeVoteStatusRequest, + request!( + get_protocol_version_upgrade_vote_status_request, + GetProtocolVersionUpgradeVoteStatusRequestV0, + GetProtocolVersionUpgradeVoteStatusRequest { + count: 1, + prove: true + } + ), + legacy_response!( + get_protocol_version_upgrade_vote_status_response, + get_protocol_version_upgrade_vote_status_response_v0, + GetProtocolVersionUpgradeVoteStatusResponseV0, + GetProtocolVersionUpgradeVoteStatusResponse + ) + ); + assert_rejects_legacy_envelope!( + Elements, + platform::GetPathElementsRequest, + request!( + get_path_elements_request, + GetPathElementsRequestV0, + GetPathElementsRequest { prove: true } + ), + legacy_response!( + get_path_elements_response, + get_path_elements_response_v0, + GetPathElementsResponseV0, + GetPathElementsResponse + ) + ); + assert_rejects_legacy_envelope!( + TotalCreditsInPlatform, + platform::GetTotalCreditsInPlatformRequest, + request!( + get_total_credits_in_platform_request, + GetTotalCreditsInPlatformRequestV0, + GetTotalCreditsInPlatformRequest { prove: true } + ), + legacy_response!( + get_total_credits_in_platform_response, + get_total_credits_in_platform_response_v0, + GetTotalCreditsInPlatformResponseV0, + GetTotalCreditsInPlatformResponse + ) + ); + assert_rejects_legacy_envelope!( + ProposerBlockCounts, + platform::GetEvonodesProposedEpochBlocksByIdsRequest, + request!( + get_evonodes_proposed_epoch_blocks_by_ids_request, + GetEvonodesProposedEpochBlocksByIdsRequestV0, + GetEvonodesProposedEpochBlocksByIdsRequest { + epoch: Some(1), + ids: vec![id(1)], + prove: true + } + ), + legacy_response!( + get_evonodes_proposed_epoch_blocks_response, + get_evonodes_proposed_epoch_blocks_response_v0, + GetEvonodesProposedEpochBlocksResponseV0, + GetEvonodesProposedEpochBlocksResponse + ) + ); + assert_rejects_legacy_envelope!( + ProposerBlockCounts, + platform::GetEvonodesProposedEpochBlocksByRangeRequest, + request!( + get_evonodes_proposed_epoch_blocks_by_range_request, + GetEvonodesProposedEpochBlocksByRangeRequestV0, + GetEvonodesProposedEpochBlocksByRangeRequest { + epoch: Some(1), + prove: true + } + ), + legacy_response!( + get_evonodes_proposed_epoch_blocks_response, + get_evonodes_proposed_epoch_blocks_response_v0, + GetEvonodesProposedEpochBlocksResponseV0, + GetEvonodesProposedEpochBlocksResponse + ) + ); + } + + #[test] + fn shielded_queries() { + assert_rejects_legacy_envelope!( + ShieldedPoolState, + platform::GetShieldedPoolStateRequest, + request!( + get_shielded_pool_state_request, + GetShieldedPoolStateRequestV0, + GetShieldedPoolStateRequest { prove: true } + ), + legacy_response!( + get_shielded_pool_state_response, + get_shielded_pool_state_response_v0, + GetShieldedPoolStateResponseV0, + GetShieldedPoolStateResponse + ) + ); + assert_rejects_legacy_envelope!( + ShieldedNotesCount, + platform::GetShieldedNotesCountRequest, + request!( + get_shielded_notes_count_request, + GetShieldedNotesCountRequestV0, + GetShieldedNotesCountRequest { prove: true } + ), + legacy_response!( + get_shielded_notes_count_response, + get_shielded_notes_count_response_v0, + GetShieldedNotesCountResponseV0, + GetShieldedNotesCountResponse + ) + ); + assert_rejects_legacy_envelope!( + ShieldedAnchors, + platform::GetShieldedAnchorsRequest, + request!( + get_shielded_anchors_request, + GetShieldedAnchorsRequestV0, + GetShieldedAnchorsRequest { prove: true } + ), + legacy_response!( + get_shielded_anchors_response, + get_shielded_anchors_response_v0, + GetShieldedAnchorsResponseV0, + GetShieldedAnchorsResponse + ) + ); + assert_rejects_legacy_envelope!( + MostRecentShieldedAnchor, + platform::GetMostRecentShieldedAnchorRequest, + request!( + get_most_recent_shielded_anchor_request, + GetMostRecentShieldedAnchorRequestV0, + GetMostRecentShieldedAnchorRequest { prove: true } + ), + legacy_response!( + get_most_recent_shielded_anchor_response, + get_most_recent_shielded_anchor_response_v0, + GetMostRecentShieldedAnchorResponseV0, + GetMostRecentShieldedAnchorResponse + ) + ); + assert_rejects_legacy_envelope!( + ShieldedEncryptedNotes, + platform::GetShieldedEncryptedNotesRequest, + request!( + get_shielded_encrypted_notes_request, + GetShieldedEncryptedNotesRequestV0, + GetShieldedEncryptedNotesRequest { + count: 1, + prove: true + } + ), + legacy_response!( + get_shielded_encrypted_notes_response, + get_shielded_encrypted_notes_response_v0, + GetShieldedEncryptedNotesResponseV0, + GetShieldedEncryptedNotesResponse + ) + ); + assert_rejects_legacy_envelope!( + ShieldedNullifierStatuses, + platform::GetShieldedNullifiersRequest, + request!( + get_shielded_nullifiers_request, + GetShieldedNullifiersRequestV0, + GetShieldedNullifiersRequest { + nullifiers: vec![id(1)], + prove: true + } + ), + legacy_response!( + get_shielded_nullifiers_response, + get_shielded_nullifiers_response_v0, + GetShieldedNullifiersResponseV0, + GetShieldedNullifiersResponse + ) + ); + } + + #[test] + fn token_and_group_queries() { + assert_rejects_legacy_envelope!( + IdentityTokenBalances, + platform::GetIdentityTokenBalancesRequest, + request!( + get_identity_token_balances_request, + GetIdentityTokenBalancesRequestV0, + GetIdentityTokenBalancesRequest { + identity_id: id(1), + token_ids: vec![id(2)], + prove: true + } + ), + legacy_response!( + get_identity_token_balances_response, + get_identity_token_balances_response_v0, + GetIdentityTokenBalancesResponseV0, + GetIdentityTokenBalancesResponse + ) + ); + assert_rejects_legacy_envelope!( + IdentitiesTokenBalances, + platform::GetIdentitiesTokenBalancesRequest, + request!( + get_identities_token_balances_request, + GetIdentitiesTokenBalancesRequestV0, + GetIdentitiesTokenBalancesRequest { + token_id: id(2), + identity_ids: vec![id(1)], + prove: true + } + ), + legacy_response!( + get_identities_token_balances_response, + get_identities_token_balances_response_v0, + GetIdentitiesTokenBalancesResponseV0, + GetIdentitiesTokenBalancesResponse + ) + ); + assert_rejects_legacy_envelope!( + IdentityTokenInfos, + platform::GetIdentityTokenInfosRequest, + request!( + get_identity_token_infos_request, + GetIdentityTokenInfosRequestV0, + GetIdentityTokenInfosRequest { + identity_id: id(1), + token_ids: vec![id(2)], + prove: true + } + ), + legacy_response!( + get_identity_token_infos_response, + get_identity_token_infos_response_v0, + GetIdentityTokenInfosResponseV0, + GetIdentityTokenInfosResponse + ) + ); + assert_rejects_legacy_envelope!( + IdentitiesTokenInfos, + platform::GetIdentitiesTokenInfosRequest, + request!( + get_identities_token_infos_request, + GetIdentitiesTokenInfosRequestV0, + GetIdentitiesTokenInfosRequest { + token_id: id(2), + identity_ids: vec![id(1)], + prove: true + } + ), + legacy_response!( + get_identities_token_infos_response, + get_identities_token_infos_response_v0, + GetIdentitiesTokenInfosResponseV0, + GetIdentitiesTokenInfosResponse + ) + ); + assert_rejects_legacy_envelope!( + TokenStatuses, + platform::GetTokenStatusesRequest, + request!( + get_token_statuses_request, + GetTokenStatusesRequestV0, + GetTokenStatusesRequest { + token_ids: vec![id(2)], + prove: true + } + ), + legacy_response!( + get_token_statuses_response, + get_token_statuses_response_v0, + GetTokenStatusesResponseV0, + GetTokenStatusesResponse + ) + ); + assert_rejects_legacy_envelope!( + TotalSingleTokenBalance, + platform::GetTokenTotalSupplyRequest, + request!( + get_token_total_supply_request, + GetTokenTotalSupplyRequestV0, + GetTokenTotalSupplyRequest { + token_id: id(2), + prove: true + } + ), + legacy_response!( + get_token_total_supply_response, + get_token_total_supply_response_v0, + GetTokenTotalSupplyResponseV0, + GetTokenTotalSupplyResponse + ) + ); + assert_rejects_legacy_envelope!( + TokenContractInfo, + platform::GetTokenContractInfoRequest, + request!( + get_token_contract_info_request, + GetTokenContractInfoRequestV0, + GetTokenContractInfoRequest { + token_id: id(2), + prove: true + } + ), + legacy_response!( + get_token_contract_info_response, + get_token_contract_info_response_v0, + GetTokenContractInfoResponseV0, + GetTokenContractInfoResponse + ) + ); + assert_rejects_legacy_envelope!( + TokenDirectPurchasePrices, + platform::GetTokenDirectPurchasePricesRequest, + request!( + get_token_direct_purchase_prices_request, + GetTokenDirectPurchasePricesRequestV0, + GetTokenDirectPurchasePricesRequest { + token_ids: vec![id(2)], + prove: true + } + ), + legacy_response!( + get_token_direct_purchase_prices_response, + get_token_direct_purchase_prices_response_v0, + GetTokenDirectPurchasePricesResponseV0, + GetTokenDirectPurchasePricesResponse + ) + ); + assert_rejects_legacy_envelope!( + TokenPreProgrammedDistributions, + platform::GetTokenPreProgrammedDistributionsRequest, + request!( + get_token_pre_programmed_distributions_request, + GetTokenPreProgrammedDistributionsRequestV0, + GetTokenPreProgrammedDistributionsRequest { + token_id: id(2), + prove: true + } + ), + legacy_response!( + get_token_pre_programmed_distributions_response, + get_token_pre_programmed_distributions_response_v0, + GetTokenPreProgrammedDistributionsResponseV0, + GetTokenPreProgrammedDistributionsResponse + ) + ); + assert_rejects_legacy_envelope!( + Group, + platform::GetGroupInfoRequest, + request!( + get_group_info_request, + GetGroupInfoRequestV0, + GetGroupInfoRequest { + contract_id: id(2), + prove: true + } + ), + legacy_response!( + get_group_info_response, + get_group_info_response_v0, + GetGroupInfoResponseV0, + GetGroupInfoResponse + ) + ); + assert_rejects_legacy_envelope!( + Groups, + platform::GetGroupInfosRequest, + request!( + get_group_infos_request, + GetGroupInfosRequestV0, + GetGroupInfosRequest { + contract_id: id(2), + prove: true + } + ), + legacy_response!( + get_group_infos_response, + get_group_infos_response_v0, + GetGroupInfosResponseV0, + GetGroupInfosResponse + ) + ); + assert_rejects_legacy_envelope!( + GroupActions, + platform::GetGroupActionsRequest, + request!( + get_group_actions_request, + GetGroupActionsRequestV0, + GetGroupActionsRequest { + contract_id: id(2), + prove: true + } + ), + legacy_response!( + get_group_actions_response, + get_group_actions_response_v0, + GetGroupActionsResponseV0, + GetGroupActionsResponse + ) + ); + assert_rejects_legacy_envelope!( + GroupActionSigners, + platform::GetGroupActionSignersRequest, + request!( + get_group_action_signers_request, + GetGroupActionSignersRequestV0, + GetGroupActionSignersRequest { + contract_id: id(2), + action_id: id(3), + prove: true + } + ), + legacy_response!( + get_group_action_signers_response, + get_group_action_signers_response_v0, + GetGroupActionSignersResponseV0, + GetGroupActionSignersResponse + ) + ); + } + } }