From 295e70232f2db6b5f0c2f0ac2aaddc1fbf511758 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Thu, 11 Dec 2025 06:56:44 +0700 Subject: [PATCH] fix(dpp): Return UnsupportedFeatureError for legacy state transition structure validation --- packages/rs-dpp/src/state_transition/mod.rs | 44 ++++++++----------- .../src/platform/transition/validation.rs | 26 ++++++++++- 2 files changed, 43 insertions(+), 27 deletions(-) diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index bf918fa950..4f14f59ba2 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -44,6 +44,8 @@ mod traits; // pub mod state_transition_fee; +#[cfg(feature = "state-transition-validation")] +use crate::consensus::basic::UnsupportedFeatureError; #[cfg(feature = "state-transition-signing")] use crate::consensus::signature::InvalidSignaturePublicKeySecurityLevelError; #[cfg(feature = "state-transition-validation")] @@ -1167,32 +1169,22 @@ impl StateTransitionStructureValidation for StateTransition { platform_version: &PlatformVersion, ) -> crate::validation::SimpleConsensusValidationResult { match self { - StateTransition::DataContractCreate(_) => { - crate::validation::SimpleConsensusValidationResult::default() - } - StateTransition::DataContractUpdate(_) => { - crate::validation::SimpleConsensusValidationResult::default() - } - StateTransition::Batch(_) => { - crate::validation::SimpleConsensusValidationResult::default() - } - StateTransition::IdentityCreate(_) => { - crate::validation::SimpleConsensusValidationResult::default() - } - StateTransition::IdentityTopUp(_) => { - crate::validation::SimpleConsensusValidationResult::default() - } - StateTransition::IdentityCreditWithdrawal(_) => { - crate::validation::SimpleConsensusValidationResult::default() - } - StateTransition::IdentityUpdate(_) => { - crate::validation::SimpleConsensusValidationResult::default() - } - StateTransition::IdentityCreditTransfer(_) => { - crate::validation::SimpleConsensusValidationResult::default() - } - StateTransition::MasternodeVote(_) => { - crate::validation::SimpleConsensusValidationResult::default() + StateTransition::DataContractCreate(_) + | StateTransition::DataContractUpdate(_) + | StateTransition::Batch(_) + | StateTransition::IdentityCreate(_) + | StateTransition::IdentityTopUp(_) + | StateTransition::IdentityCreditWithdrawal(_) + | StateTransition::IdentityUpdate(_) + | StateTransition::IdentityCreditTransfer(_) + | StateTransition::MasternodeVote(_) => { + crate::validation::SimpleConsensusValidationResult::new_with_error( + UnsupportedFeatureError::new( + "structure validation for identity-based state transitions".to_string(), + platform_version.protocol_version, + ) + .into(), + ) } StateTransition::IdentityCreditTransferToAddresses(transition) => { transition.validate_structure(platform_version) diff --git a/packages/rs-sdk/src/platform/transition/validation.rs b/packages/rs-sdk/src/platform/transition/validation.rs index c876a5649f..846d9ddae2 100644 --- a/packages/rs-sdk/src/platform/transition/validation.rs +++ b/packages/rs-sdk/src/platform/transition/validation.rs @@ -1,10 +1,24 @@ use crate::Error; use dpp::{ + consensus::{basic::BasicError, ConsensusError}, state_transition::{StateTransition, StateTransitionStructureValidation}, version::PlatformVersion, }; +/// Checks if an error is an UnsupportedFeatureError +fn is_unsupported_feature_error(error: &ConsensusError) -> bool { + matches!( + error, + ConsensusError::BasicError(BasicError::UnsupportedFeatureError(_)) + ) +} + /// Ensures a state transition passes structure validation before broadcasting. +/// +/// Note: UnsupportedFeatureError is allowed to pass through, as it indicates +/// that structure validation is not implemented for that state transition type +/// (e.g., identity-based state transitions). The platform will still perform +/// validation during execution. pub(crate) fn ensure_valid_state_transition_structure( state_transition: &StateTransition, platform_version: &PlatformVersion, @@ -13,6 +27,16 @@ pub(crate) fn ensure_valid_state_transition_structure( if validation_result.is_valid() { Ok(()) } else { - Err(validation_result.into()) + // Allow UnsupportedFeatureError to pass through - this means structure + // validation is not implemented for this state transition type + let all_unsupported_feature_errors = validation_result + .errors + .iter() + .all(is_unsupported_feature_error); + if all_unsupported_feature_errors { + Ok(()) + } else { + Err(validation_result.into()) + } } }