Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions packages/rs-dpp/src/identity/state_transition/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
10 changes: 6 additions & 4 deletions packages/rs-dpp/src/state_transition/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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::*;
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -146,6 +147,8 @@ impl DataContractCreateTransition {
}
}

impl OptionallyAssetLockProved for DataContractCreateTransition {}

#[cfg(test)]
mod test {
use crate::data_contract::conversion::json::DataContractJsonConversionMethodsV0;
Expand All @@ -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;
Expand Down Expand Up @@ -185,7 +187,7 @@ mod test {
),
),
(
property_names::ENTROPY,
ENTROPY,
Value::Bytes32(created_data_contract.entropy_used().to_buffer()),
),
(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -99,6 +100,8 @@ impl StateTransitionFieldTypes for DataContractUpdateTransition {
}
}

impl OptionallyAssetLockProved for DataContractUpdateTransition {}

#[cfg(test)]
mod test {
use crate::data_contract::DataContract;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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 {}
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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(),
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use platform_value::BinaryData;

use crate::prelude::AssetLockProof;
use crate::state_transition::identity_create_transition::IdentityCreateTransition;
use crate::{
prelude::Identifier,
Expand Down Expand Up @@ -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)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -71,6 +72,8 @@ impl IdentityCreditTransferTransition {
}
}

impl OptionallyAssetLockProved for IdentityCreditTransferTransition {}

impl StateTransitionFieldTypes for IdentityCreditTransferTransition {
fn signature_property_paths() -> Vec<&'static str> {
vec![SIGNATURE]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -65,3 +66,5 @@ impl StateTransitionFieldTypes for IdentityCreditWithdrawalTransition {
vec![SIGNATURE, OUTPUT_SCRIPT]
}
}

impl OptionallyAssetLockProved for IdentityCreditWithdrawalTransition {}
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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(),
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use platform_value::BinaryData;

use crate::prelude::AssetLockProof;
use crate::state_transition::identity_topup_transition::IdentityTopUpTransition;
use crate::{
prelude::Identifier,
Expand Down Expand Up @@ -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)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -56,8 +56,4 @@ pub trait StateTransitionLike:

/// Get owner ID
fn owner_id(&self) -> Identifier;

fn asset_lock(&self) -> Option<&AssetLockProof> {
None
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ 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};
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};

Expand Down Expand Up @@ -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::<Option<ExecutionEvent>>::new_with_data(None))
} else {
Expand All @@ -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::<Option<ExecutionEvent>>::new_with_errors(
Expand Down