diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs index be2b355af51..1e20ce66a78 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs @@ -15,9 +15,12 @@ use crate::error::execution::ExecutionError; use crate::execution::check_tx::CheckTxLevel; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::common::asset_lock::proof::verify_is_not_spent::AssetLockProofVerifyIsNotSpent; -use crate::execution::validation::state_transition::processor::v0::{StateTransitionIdentityBalanceValidationV0, StateTransitionBasicStructureValidationV0, StateTransitionNonceValidationV0, StateTransitionIdentityBasedSignatureValidationV0, StateTransitionStructureKnownInStateValidationV0, StateTransitionIsAllowedValidationV0, StateTransitionHasNonceValidationV0}; +use crate::execution::validation::state_transition::processor::v0::{StateTransitionIdentityBalanceValidationV0, StateTransitionBasicStructureValidationV0, StateTransitionNonceValidationV0, StateTransitionIdentityBasedSignatureValidationV0, StateTransitionStructureKnownInStateValidationV0, StateTransitionIsAllowedValidationV0, StateTransitionHasNonceValidationV0, StateTransitionStateValidationV0}; use crate::execution::validation::state_transition::ValidationMode; +/// Changes the state transition to the execution event. +/// As this is for check tx it normally does not need to be versioned. +/// We keep the version here just in case for a future radical change. pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPCLike>( platform: &'a PlatformRef, state_transition: StateTransition, @@ -182,6 +185,29 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC } } + let action = if state_transition.validates_full_state_on_check_tx() { + // Validating structure + let result = state_transition.validate_state( + action, + platform, + ValidationMode::CheckTx, + platform.state.last_block_info(), + &mut state_transition_execution_context, + None, + )?; + + if !result.is_valid() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + result.errors, + ), + ); + } + result.data + } else { + None + }; + let action = if let Some(action) = action { action } else { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index f54a186a4ab..43ddd76932d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -510,6 +510,13 @@ pub(crate) trait StateTransitionStateValidationV0: execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error>; + + /// Validates full state on check tx, this is only the case for masternode voting. + /// This is because masternodes do not pay for the voting, so we need to make sure they can + /// actually vote + fn validates_full_state_on_check_tx(&self) -> bool { + false + } } impl StateTransitionBasicStructureValidationV0 for StateTransition { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/mod.rs index a2f6fe4e573..ec908eef27b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/mod.rs @@ -79,6 +79,10 @@ impl StateTransitionStateValidationV0 for MasternodeVoteTransition { })), } } + + fn validates_full_state_on_check_tx(&self) -> bool { + true + } } #[cfg(test)]