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::