diff --git a/packages/rs-dpp/src/identity/state_transition/mod.rs b/packages/rs-dpp/src/identity/state_transition/mod.rs index a2b4256eb68..874928f8c58 100644 --- a/packages/rs-dpp/src/identity/state_transition/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/mod.rs @@ -16,3 +16,11 @@ pub trait AssetLockProved { /// Get asset lock proof fn asset_lock_proof(&self) -> &AssetLockProof; } + +/// Only state transitions funded with Asset Lock Transactions have Asset Lock Proofs +pub trait OptionallyAssetLockProved { + /// Returns asset lock proof if state transition implements it + fn optional_asset_lock_proof(&self) -> Option<&AssetLockProof> { + None + } +} diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index d0e75d8a65f..b874db79903 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -36,6 +36,7 @@ use crate::consensus::ConsensusError; use crate::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use crate::identity::signer::Signer; +use crate::identity::state_transition::OptionallyAssetLockProved; use crate::identity::{IdentityPublicKey, KeyID, KeyType, Purpose, SecurityLevel}; use crate::prelude::AssetLockProof; pub use state_transitions::*; @@ -244,12 +245,13 @@ pub enum StateTransition { IdentityCreditTransfer(IdentityCreditTransferTransition), } -impl StateTransition { - /// Uses asset locks for funding - pub fn asset_lock(&self) -> Option<&AssetLockProof> { - call_method!(self, asset_lock) +impl OptionallyAssetLockProved for StateTransition { + fn optional_asset_lock_proof(&self) -> Option<&AssetLockProof> { + call_method!(self, optional_asset_lock_proof) } +} +impl StateTransition { pub fn is_identity_signed(&self) -> bool { !matches!( self, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs index 0d3e8ae0f78..929946cda53 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs @@ -27,6 +27,7 @@ use platform_versioning::PlatformVersioned; use serde::{Deserialize, Serialize}; use crate::data_contract::created_data_contract::CreatedDataContract; +use crate::identity::state_transition::OptionallyAssetLockProved; pub use v0::*; pub type DataContractCreateTransitionLatest = DataContractCreateTransitionV0; @@ -146,6 +147,8 @@ impl DataContractCreateTransition { } } +impl OptionallyAssetLockProved for DataContractCreateTransition {} + #[cfg(test)] mod test { use crate::data_contract::conversion::json::DataContractJsonConversionMethodsV0; @@ -155,7 +158,6 @@ mod test { use crate::data_contract::accessors::v0::DataContractV0Getters; use crate::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0; use crate::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; - use crate::state_transition::state_transitions::common_fields::property_names; use crate::state_transition::traits::StateTransitionLike; use crate::state_transition::{StateTransitionType, StateTransitionValueConvert}; use crate::tests::fixtures::get_data_contract_fixture; @@ -185,7 +187,7 @@ mod test { ), ), ( - property_names::ENTROPY, + ENTROPY, Value::Bytes32(created_data_contract.entropy_used().to_buffer()), ), ( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs index 56b7003ac0c..7d95c8f68e7 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs @@ -27,6 +27,7 @@ use platform_version::{TryFromPlatformVersioned, TryIntoPlatformVersioned}; use crate::data_contract::DataContract; +use crate::identity::state_transition::OptionallyAssetLockProved; pub use v0::*; pub type DataContractUpdateTransitionLatest = DataContractUpdateTransitionV0; @@ -99,6 +100,8 @@ impl StateTransitionFieldTypes for DataContractUpdateTransition { } } +impl OptionallyAssetLockProved for DataContractUpdateTransition {} + #[cfg(test)] mod test { use crate::data_contract::DataContract; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs index 51678da4b61..d3c905890c9 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs @@ -41,6 +41,7 @@ use crate::state_transition::data_contract_update_transition::{ use crate::state_transition::documents_batch_transition::fields::property_names; +use crate::identity::state_transition::OptionallyAssetLockProved; pub use v0::*; #[derive( @@ -593,3 +594,4 @@ pub fn get_security_level_requirement(v: &Value, default: SecurityLevel) -> Secu // assert_eq!(hex::encode(expected_bytes), hex::encode(bytes)); // } // } +impl OptionallyAssetLockProved for DocumentsBatchTransition {} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/proved.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/proved.rs index 79954d54f93..cee34c9d4be 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/proved.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/proved.rs @@ -1,8 +1,14 @@ -use crate::identity::state_transition::AssetLockProved; +use crate::identity::state_transition::{AssetLockProved, OptionallyAssetLockProved}; use crate::prelude::AssetLockProof; use crate::state_transition::identity_create_transition::IdentityCreateTransition; use crate::ProtocolError; +impl OptionallyAssetLockProved for IdentityCreateTransition { + fn optional_asset_lock_proof(&self) -> Option<&AssetLockProof> { + Some(self.asset_lock_proof()) + } +} + impl AssetLockProved for IdentityCreateTransition { fn set_asset_lock_proof( &mut self, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/state_transition_like.rs index d4c5627a0d8..06d6a06d543 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/state_transition_like.rs @@ -1,5 +1,3 @@ -use crate::identity::state_transition::AssetLockProved; -use crate::prelude::AssetLockProof; use crate::state_transition::identity_create_transition::IdentityCreateTransition; use crate::state_transition::{StateTransitionLike, StateTransitionType}; use crate::version::FeatureVersion; @@ -48,10 +46,4 @@ impl StateTransitionLike for IdentityCreateTransition { IdentityCreateTransition::V0(transition) => transition.owner_id(), } } - - fn asset_lock(&self) -> Option<&AssetLockProof> { - match self { - IdentityCreateTransition::V0(transition) => transition.asset_lock(), - } - } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/state_transition_like.rs index 379eef7fe4d..54a321e9887 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/state_transition_like.rs @@ -1,6 +1,5 @@ use platform_value::BinaryData; -use crate::prelude::AssetLockProof; use crate::state_transition::identity_create_transition::IdentityCreateTransition; use crate::{ prelude::Identifier, @@ -50,8 +49,4 @@ impl StateTransitionLike for IdentityCreateTransitionV0 { fn owner_id(&self) -> Identifier { self.identity_id } - - fn asset_lock(&self) -> Option<&AssetLockProof> { - Some(&self.asset_lock_proof) - } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/mod.rs index ebe10ef16a9..eee8925ca7f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/mod.rs @@ -15,6 +15,7 @@ use crate::state_transition::identity_credit_transfer_transition::v0::IdentityCr use crate::state_transition::identity_credit_transfer_transition::v0::IdentityCreditTransferTransitionV0Signable; use crate::state_transition::StateTransitionFieldTypes; +use crate::identity::state_transition::OptionallyAssetLockProved; use crate::ProtocolError; use bincode::{Decode, Encode}; use derive_more::From; @@ -71,6 +72,8 @@ impl IdentityCreditTransferTransition { } } +impl OptionallyAssetLockProved for IdentityCreditTransferTransition {} + impl StateTransitionFieldTypes for IdentityCreditTransferTransition { fn signature_property_paths() -> Vec<&'static str> { vec![SIGNATURE] diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs index 7dc6a29030f..c7b052160e2 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs @@ -15,6 +15,7 @@ mod version; use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0Signable; use crate::state_transition::StateTransitionFieldTypes; +use crate::identity::state_transition::OptionallyAssetLockProved; use crate::ProtocolError; use bincode::{Decode, Encode}; use data_contracts::withdrawals_contract::document_types::withdrawal::properties::OUTPUT_SCRIPT; @@ -65,3 +66,5 @@ impl StateTransitionFieldTypes for IdentityCreditWithdrawalTransition { vec![SIGNATURE, OUTPUT_SCRIPT] } } + +impl OptionallyAssetLockProved for IdentityCreditWithdrawalTransition {} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/proved.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/proved.rs index 3d992128085..d664ee5ab91 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/proved.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/proved.rs @@ -1,8 +1,14 @@ -use crate::identity::state_transition::AssetLockProved; +use crate::identity::state_transition::{AssetLockProved, OptionallyAssetLockProved}; use crate::prelude::AssetLockProof; use crate::state_transition::identity_topup_transition::IdentityTopUpTransition; use crate::ProtocolError; +impl OptionallyAssetLockProved for IdentityTopUpTransition { + fn optional_asset_lock_proof(&self) -> Option<&AssetLockProof> { + Some(self.asset_lock_proof()) + } +} + impl AssetLockProved for IdentityTopUpTransition { fn set_asset_lock_proof( &mut self, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/state_transition_like.rs index 53ee88428fb..63bec1d429f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/state_transition_like.rs @@ -1,4 +1,3 @@ -use crate::prelude::AssetLockProof; use crate::state_transition::identity_topup_transition::IdentityTopUpTransition; use crate::state_transition::{StateTransitionLike, StateTransitionType}; use crate::version::FeatureVersion; @@ -47,10 +46,4 @@ impl StateTransitionLike for IdentityTopUpTransition { IdentityTopUpTransition::V0(transition) => transition.owner_id(), } } - - fn asset_lock(&self) -> Option<&AssetLockProof> { - match self { - IdentityTopUpTransition::V0(transition) => transition.asset_lock(), - } - } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs index 233d5bee690..c1fee0d3a77 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs @@ -1,6 +1,5 @@ use platform_value::BinaryData; -use crate::prelude::AssetLockProof; use crate::state_transition::identity_topup_transition::IdentityTopUpTransition; use crate::{ prelude::Identifier, @@ -50,8 +49,4 @@ impl StateTransitionLike for IdentityTopUpTransitionV0 { fn owner_id(&self) -> Identifier { self.identity_id } - - fn asset_lock(&self) -> Option<&AssetLockProof> { - Some(&self.asset_lock_proof) - } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/mod.rs index 0ef9d4c5d7e..f1649265804 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/mod.rs @@ -17,6 +17,7 @@ use crate::state_transition::identity_update_transition::v0::IdentityUpdateTrans use crate::state_transition::StateTransitionFieldTypes; use fields::*; +use crate::identity::state_transition::OptionallyAssetLockProved; use crate::ProtocolError; use bincode::{Decode, Encode}; use derive_more::From; @@ -70,6 +71,8 @@ impl IdentityUpdateTransition { } } +impl OptionallyAssetLockProved for IdentityUpdateTransition {} + impl StateTransitionFieldTypes for IdentityUpdateTransition { fn binary_property_paths() -> Vec<&'static str> { vec![SIGNATURE, ADD_PUBLIC_KEYS_SIGNATURE] diff --git a/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs b/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs index 722005d8cdd..28d53f16dc7 100644 --- a/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs @@ -2,7 +2,7 @@ use std::fmt::Debug; use platform_value::BinaryData; -use crate::prelude::{AssetLockProof, Identifier}; +use crate::prelude::Identifier; use crate::version::FeatureVersion; use crate::state_transition::StateTransitionType; @@ -56,8 +56,4 @@ pub trait StateTransitionLike: /// Get owner ID fn owner_id(&self) -> Identifier; - - fn asset_lock(&self) -> Option<&AssetLockProof> { - None - } } 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 4287606aa77..7b60bd960fa 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 @@ -4,6 +4,7 @@ use crate::execution::validation::state_transition::transformer::StateTransition use crate::platform_types::platform::PlatformRef; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::rpc::core::CoreRPCLike; +use dpp::identity::state_transition::OptionallyAssetLockProved; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::{StateTransition}; @@ -11,7 +12,6 @@ use dpp::version::{DefaultForPlatformVersion, PlatformVersion}; 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::common::validate_state_transition_identity_signed::{ValidateStateTransitionIdentitySignature}; use crate::execution::validation::state_transition::processor::process_state_transition; use crate::execution::validation::state_transition::processor::v0::{StateTransitionSignatureValidationV0, StateTransitionStructureValidationV0}; @@ -145,10 +145,11 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC } } CheckTxLevel::Recheck => { - if let Some(asset_lock) = state_transition.asset_lock() { + if let Some(asset_lock_proof) = state_transition.optional_asset_lock_proof() { // we should check that the asset lock is still valid let validation_result = - asset_lock.verify_is_not_spent(platform, None, platform_version)?; + asset_lock_proof.verify_is_not_spent(platform, None, platform_version)?; + if validation_result.is_valid() { Ok(ConsensusValidationResult::>::new_with_data(None)) } else { @@ -159,8 +160,11 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC ) } } else { + // TODO: We aren't calculating processing fees atm. We probably should reconsider this + let state_transition_action_result = state_transition.transform_into_action(platform, true, None)?; + if !state_transition_action_result.is_valid_with_data() { return Ok( ConsensusValidationResult::>::new_with_errors(